pax_global_header00006660000000000000000000000064140475157370014527gustar00rootroot0000000000000052 comment=faad2c3290b4302e4e92071558496678c7ec7269 jsofa-20210512_JSOFA_Release/000077500000000000000000000000001404751573700154515ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/.github/000077500000000000000000000000001404751573700170115ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/.github/workflows/000077500000000000000000000000001404751573700210465ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/.github/workflows/maven.yml000066400000000000000000000010361404751573700226770ustar00rootroot00000000000000# This workflow will build a Java project with Maven # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven name: Java CI with Maven on: push: branches: [ master ] pull_request: branches: [ master ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build with Maven run: mvn -B package --file pom.xml jsofa-20210512_JSOFA_Release/.gitignore000066400000000000000000000001021404751573700174320ustar00rootroot00000000000000/target .classpath .project .settings /sofa_c-* /.DS_Store /sofa/ jsofa-20210512_JSOFA_Release/LICENSE.txt000066400000000000000000000120671404751573700173020ustar00rootroot00000000000000 Copyright © 2019 Paul Harrison, University of Manchester. This JSOFA software is derived from the International Astronomical Union's (IAU) "Standards Of Fundamental Astronomy" (SOFA) library - official C release. The intention is to reproduce the functionality and algorithms of the IAU SOFA library in a pure Java form. The responsibility for the maintenance and supply of the JSOFA library lies with the author (not the IAU SOFA Board). However, The JSOFA software is provided "as is" and the author makes no warranty as to its use or performance. The author does not and cannot warrant the performance or results which the user may obtain by using the JSOFA software. The author makes no warranties, express or implied, as to non-infringement of third party rights, merchantability, or fitness for any particular purpose. In no event will the author be liable to the user for any consequential, incidental, or special damages, including any lost profits or lost savings, even if the author has been advised of such damages, or for any claim by any third party. Other conditions of the original license (reproduced below) are carried over as applicable. --------------------------------------------------------------------- Copyright (C) 2019 Standards Of Fundamental Astronomy Board of the International Astronomical Union. ===================== SOFA Software License ===================== NOTICE TO USER: BY USING THIS SOFTWARE YOU ACCEPT THE FOLLOWING SIX TERMS AND CONDITIONS WHICH APPLY TO ITS USE. 1. The Software is owned by the IAU SOFA Board ("SOFA"). 2. Permission is granted to anyone to use the SOFA software for any purpose, including commercial applications, free of charge and without payment of royalties, subject to the conditions and restrictions listed below. 3. You (the user) may copy and distribute SOFA source code to others, and use and adapt its code and algorithms in your own software, on a world-wide, royalty-free basis. That portion of your distribution that does not consist of intact and unchanged copies of SOFA source code files is a "derived work" that must comply with the following requirements: a) Your work shall be marked or carry a statement that it (i) uses routines and computations derived by you from software provided by SOFA under license to you; and (ii) does not itself constitute software provided by and/or endorsed by SOFA. b) The source code of your derived work must contain descriptions of how the derived work is based upon, contains and/or differs from the original SOFA software. c) The names of all routines in your derived work shall not include the prefix "iau" or "sofa" or trivial modifications thereof such as changes of case. d) The origin of the SOFA components of your derived work must not be misrepresented; you must not claim that you wrote the original software, nor file a patent application for SOFA software or algorithms embedded in the SOFA software. e) These requirements must be reproduced intact in any source distribution and shall apply to anyone to whom you have granted a further right to modify the source code of your derived work. Note that, as originally distributed, the SOFA software is intended to be a definitive implementation of the IAU standards, and consequently third-party modifications are discouraged. All variations, no matter how minor, must be explicitly marked as such, as explained above. 4. You shall not cause the SOFA software to be brought into disrepute, either by misuse, or use for inappropriate tasks, or by inappropriate modification. 5. The SOFA software is provided "as is" and SOFA makes no warranty as to its use or performance. SOFA does not and cannot warrant the performance or results which the user may obtain by using the SOFA software. SOFA makes no warranties, express or implied, as to non-infringement of third party rights, merchantability, or fitness for any particular purpose. In no event will SOFA be liable to the user for any consequential, incidental, or special damages, including any lost profits or lost savings, even if a SOFA representative has been advised of such damages, or for any claim by any third party. 6. The provision of any version of the SOFA software under the terms and conditions specified herein does not imply that future versions will also be made available under the same terms and conditions. In any published work or commercial product which uses the SOFA software directly, acknowledgement (see www.iausofa.org) is appreciated. Correspondence concerning SOFA software should be addressed as follows: By email: sofa@ukho.gov.uk By post: IAU SOFA Center HM Nautical Almanac Office UK Hydrographic Office Admiralty Way, Taunton Somerset, TA1 2DN United Kingdom jsofa-20210512_JSOFA_Release/README.md000066400000000000000000000006141404751573700167310ustar00rootroot00000000000000JSOFA ===== [![CI build of JSOFA](../../workflows/Java%20CI%20with%20Maven/badge.svg)](../../actions) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.javastro/jsofa/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.javastro/jsofa/) This is a java translation of the official IAU SOFA library. For more information see jsofa-20210512_JSOFA_Release/ghsite.sh000077500000000000000000000006641404751573700173010ustar00rootroot00000000000000#!/bin/bash tmpdir=$(mktemp -d) version=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) git clone git@github.com:Javastro/jsofa.git --branch gh-pages --single-branch $tmpdir/ghpages mvn clean site site:stage -DstagingDirectory=$tmpdir/site rsync -avz $tmpdir/site/ $tmpdir/ghpages/ git -C $tmpdir/ghpages add . git -C $tmpdir/ghpages commit -m "new jsofa site for $version" git -C $tmpdir/ghpages push rm -rf $tmpdirjsofa-20210512_JSOFA_Release/pom.xml000066400000000000000000000335621404751573700167770ustar00rootroot00000000000000 4.0.0 org.javastro jsofa JSOFA jar 20210512 github ${env.GITHUB_OAUTH_TOKEN} junit junit 4.13.1 test https://javastro.github.com/jsofa/ 2010 pah Paul Harrison paul.harrison@manchester.ac.uk Manchester University, JBCA http://www.jb.man.ac.uk/ Developer Admin org.apache.maven.plugins maven-compiler-plugin 3.2 org.apache.maven.plugins maven-jar-plugin 2.5 org.apache.maven.plugins maven-source-plugin 2.4 org.apache.maven.plugins maven-clean-plugin 2.6.1 org.apache.maven.plugins maven-deploy-plugin 2.8.2 org.apache.maven.plugins maven-surefire-plugin 2.18.1 org.apache.maven.plugins maven-shade-plugin 2.3 org.apache.maven.plugins maven-site-plugin 3.4 org.apache.maven.plugins maven-resources-plugin 2.7 org.apache.maven.plugins maven-javadoc-plugin 2.10.1 org.jacoco jacoco-maven-plugin 0.6.3.201306030806 org.apache.maven.plugins maven-project-info-reports-plugin 2.8 org.openclover clover-maven-plugin 4.4.1 org.apache.maven.wagon wagon-ssh-external 2.8 maven-site-plugin true maven-compiler-plugin true 1.8 1.8 false maven-surefire-plugin -ea -DSOFAVERSION=${project.version} false **/*Test.java org.openclover clover-maven-plugin 80% verify instrument check false org.apache.maven.wagon wagon-ssh-external org.apache.maven.plugins maven-project-info-reports-plugin 2.7 index dependencies project-team issue-tracking scm license summary maven-surefire-report-plugin 2.13 true maven-javadoc-plugin 2.9 false 8 org.apache.maven.plugins maven-jxr-plugin 2.3 true jxr test-jxr org.codehaus.mojo taglist-maven-plugin 2.4 FIXME TODO @todo IMPL @deprecated org.openclover clover-maven-plugin org.apache.maven.plugins maven-changes-plugin 2.9 changes-report ossrh https://oss.sonatype.org/content/repositories/snapshots ghpages github http://javastro.github.io/jsofa/ JBCA, University of Manchester http://www.jb.man.ac.uk/ A pure Java translation of the SOFA library ${basedir}/LICENSE.txt Modified SOFA Licence https://github.com/Javastro/jsofa scm:git:git://github.com/Javastro/jsofa.git scm:git:git@github.com:Javastro/jsofa.git https://github.com/Javastro/jsofa/issues jsweet-plugins-release plugins-release http://repository.jsweet.org/artifactory/plugins-release-local jsweet-plugins-snapshots plugins-snapshot http://repository.jsweet.org/artifactory/plugins-snapshot-local release org.apache.maven.plugins maven-javadoc-plugin attach-javadocs jar -Xdoclint:none false 8 org.apache.maven.plugins maven-gpg-plugin 1.6 sign-artifacts verify sign org.apache.maven.plugins maven-source-plugin attach-sources jar-no-fork org.sonatype.plugins nexus-staging-maven-plugin 1.6.8 true ossrh https://oss.sonatype.org/ false js org.jsweet jsweet-maven-plugin 3.0.0-RC1 true target/js ES6 es2015 true false generate-js generate-sources jsweet jsofa-20210512_JSOFA_Release/src/000077500000000000000000000000001404751573700162405ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/src/.gitignore000066400000000000000000000000131404751573700202220ustar00rootroot00000000000000/.DS_Store jsofa-20210512_JSOFA_Release/src/changes/000077500000000000000000000000001404751573700176505ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/src/changes/changes.xml000066400000000000000000000124051404751573700220040ustar00rootroot00000000000000 JSOFA Paul Harrison Update to be in line with IAU sofa 2021-05-12 (see https://www.iausofa.org/2021_0512_C.html) the positions and velocities for the planets for jauPlan94 are returned as the function value rather than being given as a parameter - this is an incompatible API change, but seems more natural. The other consequence is that "dubious" dates\ (i.e. outside the range that give the most accurate results) are no longer flagged. some convienience overloaded vector initialization methods have been added that create vectors internally, rather than having to pass them in, as for the official API. Update to be in line with IAU sofa 2021-01-25 (as updated 2021-02-24) (see https://www.iausofa.org/changes_2021_0125.html) Update to be in line with IAU sofa 2020-07-21 (see http://www.iausofa.org/changes_2020_0721.html) Now compiled to need a version 1.8 of Java as a minimum - difficult to test on earlier than this now. In addition there has been some other rearrangement of private nested classes, that does not alter functionality nor the API Update to be in line with IAU sofa 2019-07-22 (see http://www.iausofa.org/changes_2019_0722.html) Added some non-sofa utility functions for managing leap seconds. Update to be in line with IAU sofa 2018-01-30 . Update to be in line with IAU sofa 2017-04-20 - updating the astronomical unit definition to IAU 2012 update error for pv matrix documentation of jauPlan94 Fields of SphericalCoordinateEO made public. Update the release to IAU SOFA 2016-07-29_a - Updated Jan 1 2017 leap second and added long-term precession <-> Ecliptic coordinate routines. Update the release to the IAU SOFA 2015-02-09 release - Updated 2015 leap second and added ICRS<->galactic routines. update release to IAU SOFA 2012-07-10 b - Added the "Astrometry" routines. Java 1.7 now minimum required version update release to IAU SOFA 2012-07-10. update release to IAU SOFA 2012-03-01. First official release based on IAU SOFA 2010-12-01 jsofa-20210512_JSOFA_Release/src/main/000077500000000000000000000000001404751573700171645ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/src/main/java/000077500000000000000000000000001404751573700201055ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/src/main/java/org/000077500000000000000000000000001404751573700206745ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/src/main/java/org/jastronomy/000077500000000000000000000000001404751573700231015ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/src/main/java/org/jastronomy/jsofa/000077500000000000000000000000001404751573700242035ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/src/main/java/org/jastronomy/jsofa/JSOFA.java000066400000000000000000053743721404751573700257350ustar00rootroot00000000000000/* * $Id$ * * Created on 26 Jan 2010 by Paul Harrison (paul.harrison@manchester.ac.uk) * * Adapted from official SOFA C implementation http://www.iausofa.org/ */ package org.jastronomy.jsofa; import static java.lang.Math.cos; import static java.lang.Math.sin; import static java.lang.Math.atan; import static java.lang.Math.atan2; import static java.lang.Math.min; import static java.lang.Math.max; import static java.lang.Math.ceil; import static java.lang.Math.floor; import static java.lang.Math.sqrt; import static java.lang.Math.abs; import static java.lang.Math.pow; /** * Java implementation of Standards of Fundamental Astronomy. http://www.iausofa.org/ * * This code has been created by hand translating the official C version. * * @author Paul Harrison (paul.harrison@manchester.ac.uk) 02 Apr 2014 * @version JSOFA Release 20180130 * @since 26 Jan 2010 */ public class JSOFA { /** tracked IAU SOFA release {@value}. */ public final static String SOFA_RELEASE = "2021-05-12"; /** JSOFA release {@value}*/ public final static String JSOFA_RELEASE = "20210512"; /** tracked IAU SOFA revision {@value}. */ public final static String SOFA_REVISION = "18"; /** Release year for this version of jauDat {@value} */ public final static int IYV = 2021; /** The latest confirmed omission of a leap second form IERS */ public final static JulianDate latestConfirmedNoLeapSecondChange; static { JulianDate tmpval = new JulianDate(0,0); try { tmpval = jauCal2jd(2021,06,30); // this is from the IERS } catch (JSOFAIllegalParameter e) { // should not happen e.printStackTrace(); } latestConfirmedNoLeapSecondChange = tmpval; } static class LeapInfo { final public int iyear, month; final public double delat; public LeapInfo(int i, int m, double t) { iyear = i; month = m; delat = t; } } /* Dates and Delta(AT)s */ static final LeapInfo leapSeconds[] = { new LeapInfo( 1960, 1, 1.4178180 ), new LeapInfo( 1961, 1, 1.4228180 ), new LeapInfo( 1961, 8, 1.3728180 ), new LeapInfo( 1962, 1, 1.8458580 ), new LeapInfo( 1963, 11, 1.9458580 ), new LeapInfo( 1964, 1, 3.2401300 ), new LeapInfo( 1964, 4, 3.3401300 ), new LeapInfo( 1964, 9, 3.4401300 ), new LeapInfo( 1965, 1, 3.5401300 ), new LeapInfo( 1965, 3, 3.6401300 ), new LeapInfo( 1965, 7, 3.7401300 ), new LeapInfo( 1965, 9, 3.8401300 ), new LeapInfo( 1966, 1, 4.3131700 ), new LeapInfo( 1968, 2, 4.2131700 ), new LeapInfo( 1972, 1, 10.0 ), new LeapInfo( 1972, 7, 11.0 ), new LeapInfo( 1973, 1, 12.0 ), new LeapInfo( 1974, 1, 13.0 ), new LeapInfo( 1975, 1, 14.0 ), new LeapInfo( 1976, 1, 15.0 ), new LeapInfo( 1977, 1, 16.0 ), new LeapInfo( 1978, 1, 17.0 ), new LeapInfo( 1979, 1, 18.0 ), new LeapInfo( 1980, 1, 19.0 ), new LeapInfo( 1981, 7, 20.0 ), new LeapInfo( 1982, 7, 21.0 ), new LeapInfo( 1983, 7, 22.0 ), new LeapInfo( 1985, 7, 23.0 ), new LeapInfo( 1988, 1, 24.0 ), new LeapInfo( 1990, 1, 25.0 ), new LeapInfo( 1991, 1, 26.0 ), new LeapInfo( 1992, 7, 27.0 ), new LeapInfo( 1993, 7, 28.0 ), new LeapInfo( 1994, 7, 29.0 ), new LeapInfo( 1996, 1, 30.0 ), new LeapInfo( 1997, 7, 31.0 ), new LeapInfo( 1999, 1, 32.0 ), new LeapInfo( 2006, 1, 33.0 ), new LeapInfo( 2009, 1, 34.0 ), new LeapInfo( 2012, 7, 35.0 ), new LeapInfo( 2015, 7, 36.0 ), new LeapInfo( 2017, 1, 37.0 ) }; /** Seconds of time to radians {@value} */ public final static double DS2R = (7.272205216643039903848712e-5); /** Pi {@value}*/ public final static double DPI = (3.141592653589793238462643); /** 2Pi {@value}*/ public final static double D2PI = (6.283185307179586476925287); /** Radians to degrees {@value} */ public final static double DR2D = (57.29577951308232087679815); /** Degrees to radians {@value}*/ public final static double DD2R = (1.745329251994329576923691e-2); /** Radians to arcseconds {@value}*/ public final static double DR2AS = (206264.8062470963551564734); /** Arcseconds to radians {@value}*/ public final static double DAS2R = (4.848136811095359935899141e-6); /** Arcseconds in a full circle {@value}*/ public final static double TURNAS = (1296000.0); /** Milliarcseconds to radians {@value}*/ public final static double DMAS2R = (DAS2R / 1e3); /** Length of tropical year B1900 (days) {@value}*/ public final static double DTY = (365.242198781); /** Reference epoch (J2000.0), Julian Date {@value}*/ public final static double DJ00 = (2451545.0); /** Julian Date of Modified Julian Date zero {@value}*/ public final static double DJM0 = (2400000.5); /** Reference epoch (J2000.0), Modified Julian Date {@value} */ public final static double DJM00 = (51544.5); /** Seconds per day. {@value}*/ public final static double DAYSEC = (86400.0); /** Days per Julian year */ public final static double DJY = (365.25); /** Days per Julian century {@value} */ public final static double DJC = (36525.0); /** Days per Julian millennium {@value} */ public final static double DJM = (365250.0); /** 1977 Jan 1.0 as MJD */ public final static double DJM77 = (43144.0); /** TT minus TAI (s) */ public final static double TTMTAI = (32.184); /** Astronomical unit (m) IAU 2012 {@value} */ public final static double DAU = (149597870.7e3); /** Speed of light (m/s) {@value} */ public final static double CMPS = 299792458.0; /** Light time for 1 au (s) {@value} */ public final static double AULT = (DAU/CMPS); /** Speed of light (au per day) {@value} */ public final static double DC = (DAYSEC / AULT); /** L_G = 1 - d(TT)/d(TCG) */ public final static double ELG = (6.969290134e-10); /** L_B = 1 - d(TDB)/d(TCB) at TAI 1977/1/1.0 */ public final static double ELB = (1.550519768e-8); /** Schwarzschild radius of the Sun (au) {@value} = 2 * 1.32712440041e20 / (2.99792458e8)^2 / 1.49597870700e11 */ public final static double SRS = 1.97412574336e-8; /** TDB (s) at TAI 1977/1/1.0 */ public final static double TDB0 = (-6.55e-5); private final static double TANGENT_TINY = 1e-6; private static final double DBL_EPSILON = Math.ulp(1.0); /** dint(A) - truncate to nearest whole number towards zero (double) */ private static double dint(final double A){ return ((A)<0.0?ceil(A):floor(A));} /** dnint(A) - round to nearest whole number (double) */ private static double dnint(final double A){return (abs(A)<0.5?0.0 :((A)<0.0?ceil((A)-0.5):floor((A)+0.5)));} /** dsign(A,B) - magnitude of A with sign of B (double) */ private static double dsign(final double A, double B){return ((B)<0.0?-abs(A):abs(A));} /** * Julian Date representation. The actual date is djm0+djm1, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
     *            djm0          djm1
     *
     *         2450123.7           0.0       (JD method)
     *         2451545.0       -1421.3       (J2000 method)
     *         2400000.5       50123.2       (MJD method)
     *         2450123.5           0.2       (date &time method)
     *
* * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date &time methods * are both good compromises between resolution and convenience. * * @author Paul Harrison (paul.harrison@manchester.ac.uk) 28 Jan 2010 * * */ public static class JulianDate implements Comparable{ /** MJD zero-point */ public double djm0; /** MJD offset */ public double djm1; public JulianDate(double d1, double d2) { djm0 = d1; djm1 = d2; } /** * {@inheritDoc} * overrides @see java.lang.Comparable#compareTo(java.lang.Object) */ @Override public int compareTo(JulianDate o) { if(this == o) return 0; final Double thismjd = this.djm0 + this.djm1; final Double thatmjd = o.djm0 + o.djm1; return thismjd.compareTo(thatmjd); } /** * {@inheritDoc} * overrides @see java.lang.Object#hashCode() */ @Override public int hashCode() { final int prime = 31; int result = 1; long temp; temp = Double.doubleToLongBits(djm0); result = prime * result + (int) (temp ^ (temp >>> 32)); temp = Double.doubleToLongBits(djm1); result = prime * result + (int) (temp ^ (temp >>> 32)); return result; } /** * {@inheritDoc} * overrides @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof JulianDate)) return false; JulianDate other = (JulianDate) obj; if (Double.doubleToLongBits(djm0) != Double .doubleToLongBits(other.djm0)) return false; if (Double.doubleToLongBits(djm1) != Double .doubleToLongBits(other.djm1)) return false; return true; } /** * {@inheritDoc} * overrides @see java.lang.Object#toString() */ @Override public String toString() { return "MJD=" +Double.toString(djm0 + djm1 - DJM0); } } /** * Decompose radians into degrees, arcminutes, arcseconds, fraction. * * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * *

Called:

*

Notes: *

    *
  1. The argument ndp is interpreted as follows: * *
        *     ndp         resolution
        *      :      ...0000 00 00
        *     -7         1000 00 00
        *     -6          100 00 00
        *     -5           10 00 00
        *     -4            1 00 00
        *     -3            0 10 00
        *     -2            0 01 00
        *     -1            0 00 10
        *      0            0 00 01
        *      1            0 00 00.1
        *      2            0 00 00.01
        *      3            0 00 00.001
        *      :            0 00 00.000...
        *
    *
  2. The largest positive useful value for ndp is determined by the * size of angle, the format of doubles on the target platform, and * the risk of overflowing idmsf[3]. On a typical platform, for * angle up to 2pi, the available floating-point precision might * correspond to ndp=12. However, the practical limit is typically * ndp=9, set by the capacity of a 32-bit int, or ndp=4 if int is * only 16 bits. * *
  3. The absolute value of angle may exceed 2pi. In cases where it * does not, it is up to the caller to test for and handle the * case where angle is very nearly 2pi and rounds up to 360 degrees, * by testing for idmsf[0]=360 and setting idmsf[0-3] to zero. *
*@version 2008 May 27 * * @since Release 20101201 * * * * @param ndp int resolution (Note 1) * @param angle double angle in radians * @param idmsf int[4] returned degrees, arcminutes, arcseconds, fraction * * @return sign char '+' or '-' */ public static char jauA2af(final int ndp, final double angle, int idmsf[] ){ /* Hours to degrees * radians to turns */ final double F = 15.0 / D2PI; /* Scale then use days to h,m,s function. */ char retval = jauD2tf(ndp, angle*F, idmsf); return retval; } /** * Decompose radians into hours, minutes, seconds, fraction. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param ndp int resolution (Note 1) * @param angle double angle in radians * * * @param ihmsf int[4] returned hours, minutes, seconds, fraction * @return sign char returned '+' or '-' * *

Called:

*

Notes: *

    * *
  1. The argument ndp is interpreted as follows: *
        *     ndp         resolution
        *      :      ...0000 00 00
        *     -7         1000 00 00
        *     -6          100 00 00
        *     -5           10 00 00
        *     -4            1 00 00
        *     -3            0 10 00
        *     -2            0 01 00
        *     -1            0 00 10
        *      0            0 00 01
        *      1            0 00 00.1
        *      2            0 00 00.01
        *      3            0 00 00.001
        *      :            0 00 00.000...
        *
    *
  2. The largest positive useful value for ndp is determined by the * size of angle, the format of doubles on the target platform, and * the risk of overflowing ihmsf[3]. On a typical platform, for * angle up to 2pi, the available floating-point precision might * correspond to ndp=12. However, the practical limit is typically * ndp=9, set by the capacity of a 32-bit int, or ndp=4 if int is * only 16 bits. * *
  3. The absolute value of angle may exceed 2pi. In cases where it * does not, it is up to the caller to test for and handle the * case where angle is very nearly 2pi and rounds up to 24 hours, * by testing for ihmsf[0]=24 and setting ihmsf(0-3) to zero. *
* @version 2008 May 11 * * @since Release 20101201 * * */ public static char jauA2tf(final int ndp, final double angle, int ihmsf[]) { /* Scale then use days to h,m,s function. */ return jauD2tf(ndp, angle/D2PI, ihmsf); } /** * Normalize angle into the range {@code 0 <= a < 2pi}. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param a double angle (radians) * * * @return double angle in range 0-2pi * *@version 2008 May 16 * * @since Release 20101201 * * */ public static double jauAnp(final double a) { double w; w = fmod(a, D2PI); if (w < 0) w += D2PI; return w; } /** * Normalize angle into the range {@code -pi <= a < +pi}. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param a double angle (radians) * * * @return double angle in range +/-pi * *@version 2008 May 16 * * @since Release 20101201 * * */ public static double jauAnpm(final double a) { double w; w = fmod(a, D2PI); if (abs(w) >= DPI) w -= dsign(D2PI, a); return w; } /** * Frame bias components of IAU 2000 precession-nutation models. * @author Paul Harrison (paul.harrison@manchester.ac.uk) 2 Feb 2010 * * @since AIDA Stage 1 */ public static class FrameBias { /** longitude corrections */ public double dpsibi; /**obliquity corrections */ public double depsbi; /** the ICRS RA of the J2000.0 mean equinox */ public double dra; }; /** * Frame bias components of IAU 2000 precession-nutation models part * of the Mathews-Herring-Buffett (MHB2000) nutation series, with additions. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @return dpsibi,depsbi double returned longitude and obliquity corrections * dra double returned the ICRS RA of the J2000.0 mean equinox * *

Notes: *

    * *
  1. The frame bias corrections in longitude and obliquity (radians) * are required in order to correct for the offset between the GCRS * pole and the mean J2000.0 pole. They define, with respect to the * GCRS frame, a J2000.0 mean pole that is consistent with the rest * of the IAU 2000A precession-nutation model. * *
  2. In addition to the displacement of the pole, the complete * description of the frame bias requires also an offset in right * ascension. This is not part of the IAU 2000A model, and is from * Chapront et al. (2002). It is returned in radians. * *
  3. This is a supplemented implementation of one aspect of the IAU * 2000A nutation model, formally adopted by the IAU General * Assembly in 2000, namely MHB2000 (Mathews et al. 2002). *
*

References: * * Chapront, J., Chapront-Touze, M. &Francou, G., Astron. * Astrophys., 387, 700, 2002. * *

Mathews, P.M., Herring, T.A., Buffet, B.A., "Modeling of nutation * and precession New nutation series for nonrigid Earth and * insights into the Earth's interior", J.Geophys.Res., 107, B4, * 2002. The MHB2000 code itself was obtained on 9th September 2002 * from ftp://maia.usno.navy.mil/conv2000/chapter5/IAU2000A. * *@version 2009 December 17 * * @since Release 20101201 * * */ public static FrameBias jauBi00() { /* The frame bias corrections in longitude and obliquity */ final double DPBIAS = -0.041775 * DAS2R, DEBIAS = -0.0068192 * DAS2R; /* The ICRS RA of the J2000.0 equinox (Chapront et al., 2002) */ final double DRA0 = -0.0146 * DAS2R; /* Return the results (which are fixed). */ FrameBias retval = new FrameBias(); retval.dpsibi = DPBIAS; retval.depsbi = DEBIAS; retval.dra = DRA0; return retval; } /** * Frame bias and precession, IAU 2000. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @param rb double[3][3] returned frame bias matrix (Note 2) * @param rp double[3][3] returned precession matrix (Note 3) * @param rbp double[3][3] returned bias-precession matrix (Note 4) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *             date1         date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date &time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date &time methods * are both good compromises between resolution and convenience. * *
  2. The matrix rb transforms vectors from GCRS to mean J2000.0 by * applying frame bias. * *
  3. The matrix rp transforms vectors from J2000.0 mean equator and * equinox to mean equator and equinox of date by applying * precession. * *
  4. The matrix rbp transforms vectors from GCRS to mean equator and * equinox of date by applying frame bias then precession. It is * the product rp x rb. * *
  5. It is permissible to re-use the same array in the returned * arguments. The arrays are filled in the order given. *
*

Called:

*

Reference: * "Expressions for the Celestial Intermediate Pole and Celestial * Ephemeris Origin consistent with the IAU 2000A precession- * nutation model", Astron.Astrophys. 400, 1145-1154 (2003) * * n.b. The celestial ephemeris origin (CEO) was renamed "celestial * intermediate origin" (CIO) by IAU 2006 Resolution 2. * *@version 2010 January 18 * * @since Release 20101201 * * */ public static void jauBp00(final double date1, final double date2, double rb[][], double rp[][], double rbp[][]) { /* J2000.0 obliquity (Lieske et al. 1977) */ final double EPS0 = 84381.448 * DAS2R; double t, dpsibi, depsbi; double dra0, psia77, oma77, chia, dpsipr, depspr, psia, oma, rbw[][] = new double[3][3]; /* Interval between fundamental epoch J2000.0 and current date (JC). */ t = ((date1 - DJ00) + date2) / DJC; /* Frame bias. */ FrameBias fb = jauBi00(); dpsibi = fb.dpsibi; depsbi = fb.depsbi; dra0 = fb.dra; /* Precession angles (Lieske et al. 1977) */ psia77 = (5038.7784 + (-1.07259 + (-0.001147) * t) * t) * t * DAS2R; oma77 = EPS0 + ((0.05127 + (-0.007726) * t) * t) * t * DAS2R; chia = ( 10.5526 + (-2.38064 + (-0.001125) * t) * t) * t * DAS2R; /* Apply IAU 2000 precession corrections. */ PrecessionDeltaTerms pc = jauPr00(date1, date2); dpsipr = pc.dpsipr; depspr = pc.depspr; psia = psia77 + dpsipr; oma = oma77 + depspr; /* Frame bias matrix: GCRS to J2000.0. */ jauIr(rbw); jauRz(dra0, rbw); jauRy(dpsibi * sin(EPS0), rbw); jauRx(-depsbi, rbw); jauCr(rbw, rb); /* Precession matrix: J2000.0 to mean of date. */ jauIr(rp); jauRx(EPS0, rp); jauRz(-psia, rp); jauRx(-oma, rp); jauRz(chia, rp); /* Bias-precession matrix: GCRS to mean of date. */ double[][] rt = jauRxr(rp, rbw ); jauCr(rt, rbp); return; } /** * Frame bias and precession, IAU 2006. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @param rb double[3][3] returned frame bias matrix (Note 2) * @param rp double[3][3] returned precession matrix (Note 3) * @param rbp double[3][3] returned bias-precession matrix (Note 4) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *             date1         date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date &time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date &time methods * are both good compromises between resolution and convenience. * *
  2. The matrix rb transforms vectors from GCRS to mean J2000.0 by * applying frame bias. * *
  3. The matrix rp transforms vectors from mean J2000.0 to mean of * date by applying precession. * *
  4. The matrix rbp transforms vectors from GCRS to mean of date by * applying frame bias then precession. It is the product rp x rb. * *
  5. It is permissible to re-use the same array in the returned * arguments. The arrays are filled in the order given. *
*

Called:

*

References: * *

Capitaine, N. &Wallace, P.T., 2006, Astron.Astrophys. 450, 855 * *

Wallace, P.T. &Capitaine, N., 2006, Astron.Astrophys. 459, 981 * *@version 2009 December 17 * * @since Release 20101201 * * */ public static void jauBp06(final double date1, final double date2, double rb[][], double rp[][], double rbp[][]) { double rbt[][]; /* B matrix. */ FWPrecessionAngles fw = jauPfw06(DJM0, DJM00); double[][] rt = jauFw2m(fw.gamb, fw.phib, fw.psib, fw.epsa); jauCr(rt, rb); /* PxB matrix. */ rt = jauPmat06(date1, date2 ); jauCr(rt, rbp); /* P matrix. */ rbt = jauTr(rb); rt = jauRxr(rbp, rbt); jauCr(rt, rp); return; } /** * The components x,y are components of the Celestial Intermediate * Pole unit vector in the Geocentric Celestial Reference System. * * @author Paul Harrison (paul.harrison@manchester.ac.uk) 29 Jan 2010 * * @since AIDA Stage 1 */ public static class CelestialIntermediatePole { public double x; public double y; public CelestialIntermediatePole(double x, double y) { this.x = x; this.y = y; } } /** * Extract from the bias-precession-nutation matrix the X,Y coordinates * of the Celestial Intermediate Pole. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param rbpn double[3][3] celestial-to-true matrix (Note 1) * * * @return returned Celestial Intermediate Pole (Note 2) * *

Notes: *

    * *
  1. The matrix rbpn transforms vectors from GCRS to true equator (and * CIO or equinox) of date, and therefore the Celestial Intermediate * Pole unit vector is the bottom row of the matrix. * *
  2. The arguments x,y are components of the Celestial Intermediate * Pole unit vector in the Geocentric Celestial Reference System. *
*

Reference: * * "Expressions for the Celestial Intermediate Pole and Celestial * Ephemeris Origin consistent with the IAU 2000A precession- * nutation model", Astron.Astrophys. 400, 1145-1154 * (2003) * * n.b. The celestial ephemeris origin (CEO) was renamed "celestial * intermediate origin" (CIO) by IAU 2006 Resolution 2. * *@version 2010 January 18 * * @since Release 20101201 * * */ public static CelestialIntermediatePole jauBpn2xy(double rbpn[][]) { /* Extract the X,Y coordinates. */ return new CelestialIntermediatePole(rbpn[2][0], rbpn[2][1]); } /** * Form the celestial-to-intermediate matrix for a given date using the * IAU 2000A precession-nutation model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return rc2i double[3][3] returned celestial-to-intermediate matrix (Note 2) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date &time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date &time methods * are both good compromises between resolution and convenience. * *
  2. The matrix rc2i is the first stage in the transformation from * celestial to terrestrial coordinates: * * [TRS] = RPOM * R_3(ERA) * rc2i * [CRS] * * = rc2t * [CRS] * * where [CRS] is a vector in the Geocentric Celestial Reference * System and [TRS] is a vector in the International Terrestrial * Reference System (see IERS Conventions 2003), ERA is the Earth * Rotation Angle and RPOM is the polar motion matrix. * *
  3. A faster, but slightly less accurate, result (about 1 mas), can be * obtained by using instead the jauC2i00b function. *
*

Called:

*

References: *

*@version 2010 January 18 * * @since Release 20101201 * * */ public static double[][] jauC2i00a(double date1, double date2) { /* Obtain the celestial-to-true matrix (IAU 2000A). */ double rbpn[][] = jauPnm00a(date1, date2); /* Form the celestial-to-intermediate matrix. */ double rc2i[][] =jauC2ibpn(date1, date2, rbpn); return rc2i; } /** * Form the celestial-to-intermediate matrix for a given date using the * IAU 2000B precession-nutation model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return rc2i double[3][3] returned celestial-to-intermediate matrix (Note 2) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date &time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date &time methods * are both good compromises between resolution and convenience. * *
  2. The matrix rc2i is the first stage in the transformation from * celestial to terrestrial coordinates: * * [TRS] = RPOM * R_3(ERA) * rc2i * [CRS] * * = rc2t * [CRS] * * where [CRS] is a vector in the Geocentric Celestial Reference * System and [TRS] is a vector in the International Terrestrial * Reference System (see IERS Conventions 2003), ERA is the Earth * Rotation Angle and RPOM is the polar motion matrix. * *
  3. The present function is faster, but slightly less accurate (about * 1 mas), than the jauC2i00a function. *
*

Called:

*

References: * *

"Expressions for the Celestial Intermediate Pole and Celestial * Ephemeris Origin consistent with the IAU 2000A precession- * nutation model", Astron.Astrophys. 400, 1145-1154 * (2003) * * n.b. The celestial ephemeris origin (CEO) was renamed "celestial * intermediate origin" (CIO) by IAU 2006 Resolution 2. * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2010 January 18 * * @since Release 20101201 * * */ public static double[][] jauC2i00b(double date1, double date2) { double rbpn[][]; double rc2i[][]; /* Obtain the celestial-to-true matrix (IAU 2000B). */ rbpn = jauPnm00b(date1, date2 ); /* Form the celestial-to-intermediate matrix. */ rc2i = jauC2ibpn(date1, date2, rbpn); return rc2i; } /** * Form the celestial-to-intermediate matrix for a given date using the * IAU 2006 precession and IAU 2000A nutation models. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return rc2i double[3][3] returned celestial-to-intermediate matrix (Note 2) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date &time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date &time methods * are both good compromises between resolution and convenience. * *
  2. The matrix rc2i is the first stage in the transformation from * celestial to terrestrial coordinates: * * [TRS] = RPOM * R_3(ERA) * rc2i * [CRS] * * = RC2T * [CRS] * * where [CRS] is a vector in the Geocentric Celestial Reference * System and [TRS] is a vector in the International Terrestrial * Reference System (see IERS Conventions 2003), ERA is the Earth * Rotation Angle and RPOM is the polar motion matrix. *
*

Called:

*

References: * *

McCarthy, D. D., Petit, G. (eds.), 2004, IERS Conventions (2003), * IERS Technical Note No. 32, BKG * *@version 2008 May 13 * * @since Release 20101201 * * */ public static double[][] jauC2i06a(double date1, double date2) { double rbpn[][], s, rc2i[][]; /* Obtain the celestial-to-true matrix (IAU 2006/2000A). */ rbpn = jauPnm06a(date1, date2); /* Extract the X,Y coordinates. */ CelestialIntermediatePole cip = jauBpn2xy(rbpn); /* Obtain the CIO locator. */ s = jauS06(date1, date2, cip.x, cip.y); /* Form the celestial-to-intermediate matrix. */ rc2i = jauC2ixys(cip.x, cip.y, s); return rc2i; } /** * Form the celestial-to-intermediate matrix for a given date given * the bias-precession-nutation matrix. IAU 2000. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * @param rbpn double[3][3] celestial-to-true matrix (Note 2) * * * @return rc2i double[3][3] returned celestial-to-intermediate matrix (Note 3) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date &time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date &time methods * are both good compromises between resolution and convenience. * *
  2. The matrix rbpn transforms vectors from GCRS to true equator (and * CIO or equinox) of date. Only the CIP (bottom row) is used. * *
  3. The matrix rc2i is the first stage in the transformation from * celestial to terrestrial coordinates: * * [TRS] = RPOM * R_3(ERA) * rc2i * [CRS] * * = RC2T * [CRS] * * where [CRS] is a vector in the Geocentric Celestial Reference * System and [TRS] is a vector in the International Terrestrial * Reference System (see IERS Conventions 2003), ERA is the Earth * Rotation Angle and RPOM is the polar motion matrix. * *
  4. Although its name does not include "00", This function is in fact * specific to the IAU 2000 models. *
*

Called:

*

References: *

"Expressions for the Celestial Intermediate Pole and Celestial * Ephemeris Origin consistent with the IAU 2000A precession- * nutation model", Astron.Astrophys. 400, 1145-1154 (2003) * *

n.b. The celestial ephemeris origin (CEO) was renamed "celestial * intermediate origin" (CIO) by IAU 2006 Resolution 2. * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2010 January 18 * * @since Release 20101201 * * */ public static double[][] jauC2ibpn(double date1, double date2, double rbpn[][]) { /* Extract the X,Y coordinates. */ CelestialIntermediatePole cip = jauBpn2xy(rbpn); /* Form the celestial-to-intermediate matrix (n.b. IAU 2000 specific). */ double rc2i[][] =jauC2ixy(date1, date2, cip.x, cip.y); return rc2i; } /** * Form the celestial to intermediate-frame-of-date matrix for a given * date when the CIP X,Y coordinates are known. IAU 2000. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * @param x double Celestial Intermediate Pole (Note 2) * @param y double Celestial Intermediate Pole (Note 2) * * * @return rc2i double[3][3] returned celestial-to-intermediate matrix (Note 3) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date &time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date &time methods * are both good compromises between resolution and convenience. * *
  2. The Celestial Intermediate Pole coordinates are the x,y components * of the unit vector in the Geocentric Celestial Reference System. * *
  3. The matrix rc2i is the first stage in the transformation from * celestial to terrestrial coordinates: * * [TRS] = RPOM * R_3(ERA) * rc2i * [CRS] * * = RC2T * [CRS] * * where [CRS] is a vector in the Geocentric Celestial Reference * System and [TRS] is a vector in the International Terrestrial * Reference System (see IERS Conventions 2003), ERA is the Earth * Rotation Angle and RPOM is the polar motion matrix. * *
  4. Although its name does not include "00", This function is in fact * specific to the IAU 2000 models. *
*

Called:

*

Reference: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2008 May 11 * * @since Release 20101201 * * */ public static double[][] jauC2ixy(double date1, double date2, double x, double y) { /* Compute s and then the matrix. */ double rc2i[][] = jauC2ixys(x, y, jauS00(date1, date2, x, y)); return rc2i; } /** * Form the celestial to intermediate-frame-of-date matrix given the CIP * X,Y and the CIO locator s. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param x double Celestial Intermediate Pole (Note 1) * @param y double Celestial Intermediate Pole (Note 1) * @param s double the CIO locator s (Note 2) * * * @return rc2i double[3][3] returned celestial-to-intermediate matrix (Note 3) * *

Notes: *

    * *
  1. The Celestial Intermediate Pole coordinates are the x,y * components of the unit vector in the Geocentric Celestial * Reference System. * *
  2. The CIO locator s (in radians) positions the Celestial * Intermediate Origin on the equator of the CIP. * *
  3. The matrix rc2i is the first stage in the transformation from * celestial to terrestrial coordinates: * * [TRS] = RPOM * R_3(ERA) * rc2i * [CRS] * * = RC2T * [CRS] * * where [CRS] is a vector in the Geocentric Celestial Reference * System and [TRS] is a vector in the International Terrestrial * Reference System (see IERS Conventions 2003), ERA is the Earth * Rotation Angle and RPOM is the polar motion matrix. *
*

Called:

*

Reference: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2008 May 11 * * @since Release 20101201 * * */ public static double[][] jauC2ixys(double x, double y, double s) { double r2, e, d; double rc2i[][] = new double[3][3]; /* Obtain the spherical angles E and d. */ r2 = x*x + y*y; e = (r2 > 0.0) ? atan2(y, x) : 0.0; d = atan(sqrt(r2 / (1.0 - r2))); /* Form the matrix. */ jauIr(rc2i); jauRz(e, rc2i); jauRy(d, rc2i); jauRz(-(e+s), rc2i); return rc2i; } /** * P-vector to spherical coordinates. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param p double[3] p-vector * * * @return theta double returned longitude angle (radians) * phi double returned latitude angle (radians) * *

Notes: *

    * *
  1. The vector p can have any magnitude; only its direction is used. * *
  2. If p is null, zero theta and phi are returned. * *
  3. At either pole, zero theta is returned. *
*@version 2008 May 11 * * @since Release 20101201 * * */ public static SphericalCoordinate jauC2s(double p[]) { double x, y, z, d2; x = p[0]; y = p[1]; z = p[2]; d2 = x*x + y*y; double theta = (d2 == 0.0) ? 0.0 : atan2(y, x); double phi = (z == 0.0) ? 0.0 : atan2(z, sqrt(d2)); return new SphericalCoordinate(theta, phi); } /** * Form the celestial to terrestrial matrix given the date, the UT1 and * the polar motion, using the IAU 2000A nutation model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param tta double TT as a 2-part Julian Date (Note 1) * @param ttb double TT as a 2-part Julian Date (Note 1) * @param uta double UT1 as a 2-part Julian Date (Note 1) * @param utb double UT1 as a 2-part Julian Date (Note 1) * @param xp double CIP coordinates (radians, Note 2) * @param yp double CIP coordinates (radians, Note 2) * * * @return rc2t double[3][3] returned celestial-to-terrestrial matrix (Note 3) * *

Notes: *

    * *
  1. The TT and UT1 dates tta+ttb and uta+utb are Julian Dates, * apportioned in any convenient way between the arguments uta and * utb. For example, JD(UT1)=2450123.7 could be expressed in any of * these ways, among others: *
        *             uta            utb
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date &time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution is * acceptable. The J2000 and MJD methods are good compromises * between resolution and convenience. In the case of uta,utb, the * date &time method is best matched to the Earth rotation angle * algorithm used: maximum precision is delivered when the uta * argument is for 0hrs UT1 on the day in question and the utb * argument lies in the range 0 to 1, or vice versa. * *
  2. The arguments xp and yp are the coordinates (in radians) of the * Celestial Intermediate Pole with respect to the International * Terrestrial Reference System (see IERS Conventions 2003), * measured along the meridians 0 and 90 deg west respectively. * *
  3. The matrix rc2t transforms from celestial to terrestrial * coordinates: * * [TRS] = RPOM * R_3(ERA) * RC2I * [CRS] * * = rc2t * [CRS] * * where [CRS] is a vector in the Geocentric Celestial Reference * System and [TRS] is a vector in the International Terrestrial * Reference System (see IERS Conventions 2003), RC2I is the * celestial-to-intermediate matrix, ERA is the Earth rotation * angle and RPOM is the polar motion matrix. * *
  4. A faster, but slightly less accurate, result (about 1 mas), can * be obtained by using instead the jauC2t00b function. *
*

Called:

*

Reference: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2009 April 1 * * @since Release 20101201 * * */ public static double[][] jauC2t00a(final double tta, final double ttb, final double uta, final double utb, final double xp, final double yp) { double rc2i[][]= new double[3][3], era, sp, rpom[][]; /* Form the celestial-to-intermediate matrix for this TT (IAU 2000A). */ rc2i = jauC2i00a(tta, ttb); /* Predict the Earth rotation angle for this UT1. */ era = jauEra00(uta, utb); /* Estimate s'. */ sp = jauSp00(tta, ttb); /* Form the polar motion matrix. */ rpom = jauPom00(xp, yp, sp ); /* Combine to form the celestial-to-terrestrial matrix. */ double[][] rc2t = jauC2tcio(rc2i, era, rpom ); return rc2t; } /** * Form the celestial to terrestrial matrix given the date, the UT1 and * the polar motion, using the IAU 2000B precession-nutation model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param tta double TT as a 2-part Julian Date (Note 1) * @param ttb double TT as a 2-part Julian Date (Note 1) * @param uta double UT1 as a 2-part Julian Date (Note 1) * @param utb double UT1 as a 2-part Julian Date (Note 1) * @param xp double coordinates of the pole (radians, Note 2) * @param yp double coordinates of the pole (radians, Note 2) * * * @return rc2t double[3][3] returned celestial-to-terrestrial matrix (Note 3) * *

Notes: *

    * *
  1. The TT and UT1 dates tta+ttb and uta+utb are Julian Dates, * apportioned in any convenient way between the arguments uta and * utb. For example, JD(UT1)=2450123.7 could be expressed in any of * these ways, among others: *
        *             uta            utb
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date &time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution is * acceptable. The J2000 and MJD methods are good compromises * between resolution and convenience. In the case of uta,utb, the * date &time method is best matched to the Earth rotation angle * algorithm used: maximum precision is delivered when the uta * argument is for 0hrs UT1 on the day in question and the utb * argument lies in the range 0 to 1, or vice versa. * *
  2. The arguments xp and yp are the coordinates (in radians) of the * Celestial Intermediate Pole with respect to the International * Terrestrial Reference System (see IERS Conventions 2003), * measured along the meridians 0 and 90 deg west respectively. * *
  3. The matrix rc2t transforms from celestial to terrestrial * coordinates: * * [TRS] = RPOM * R_3(ERA) * RC2I * [CRS] * * = rc2t * [CRS] * * where [CRS] is a vector in the Geocentric Celestial Reference * System and [TRS] is a vector in the International Terrestrial * Reference System (see IERS Conventions 2003), RC2I is the * celestial-to-intermediate matrix, ERA is the Earth rotation * angle and RPOM is the polar motion matrix. * *
  4. The present function is faster, but slightly less accurate (about * 1 mas), than the jauC2t00a function. *
*

Called:

*

Reference: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2009 April 1 * * @since Release 20101201 * * */ public static double[][] jauC2t00b(final double tta, final double ttb, final double uta, final double utb, final double xp, final double yp ) { double rc2i[][], era, rpom[][]; double rc2t[][]; /* Form the celestial-to-intermediate matrix for this TT (IAU 2000B). */ rc2i =jauC2i00b(tta, ttb); /* Predict the Earth rotation angle for this UT1. */ era = jauEra00(uta, utb); /* Form the polar motion matrix (neglecting s'). */ rpom = jauPom00(xp, yp, 0.0 ); /* Combine to form the celestial-to-terrestrial matrix. */ rc2t = jauC2tcio(rc2i, era, rpom ); return rc2t; } /** * Form the celestial to terrestrial matrix given the date, the UT1 and * the polar motion, using the IAU 2006/2000A precession-nutation * nutation model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param tta double TT as a 2-part Julian Date (Note 1) * @param ttb double TT as a 2-part Julian Date (Note 1) * @param uta double UT1 as a 2-part Julian Date (Note 1) * @param utb double UT1 as a 2-part Julian Date (Note 1) * @param xp double coordinates of the pole (radians, Note 2) * @param yp double coordinates of the pole (radians, Note 2) * * * @return rc2t double[3][3] returned celestial-to-terrestrial matrix (Note 3) * *

Notes: *

    * *
  1. The TT and UT1 dates tta+ttb and uta+utb are Julian Dates, * apportioned in any convenient way between the arguments uta and * utb. For example, JD(UT1)=2450123.7 could be expressed in any of * these ways, among others: *
        *             uta            utb
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date &time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution is * acceptable. The J2000 and MJD methods are good compromises * between resolution and convenience. In the case of uta,utb, the * date &time method is best matched to the Earth rotation angle * algorithm used: maximum precision is delivered when the uta * argument is for 0hrs UT1 on the day in question and the utb * argument lies in the range 0 to 1, or vice versa. * *
  2. The arguments xp and yp are the coordinates (in radians) of the * Celestial Intermediate Pole with respect to the International * Terrestrial Reference System (see IERS Conventions 2003), * measured along the meridians 0 and 90 deg west respectively. * *
  3. The matrix rc2t transforms from celestial to terrestrial * coordinates: * * [TRS] = RPOM * R_3(ERA) * RC2I * [CRS] * * = rc2t * [CRS] * * where [CRS] is a vector in the Geocentric Celestial Reference * System and [TRS] is a vector in the International Terrestrial * Reference System (see IERS Conventions 2003), RC2I is the * celestial-to-intermediate matrix, ERA is the Earth rotation * angle and RPOM is the polar motion matrix. *
*

Called:

*

Reference: * *

McCarthy, D. D., Petit, G. (eds.), 2004, IERS Conventions (2003), * IERS Technical Note No. 32, BKG * *@version 2009 April 1 * * @since Release 20101201 * * */ public static double[][] jauC2t06a(final double tta, final double ttb, final double uta, final double utb, final double xp, final double yp) { double rc2i[][], era, sp, rpom[][], rc2t[][]; /* Form the celestial-to-intermediate matrix for this TT. */ rc2i = jauC2i06a(tta, ttb); /* Predict the Earth rotation angle for this UT1. */ era = jauEra00(uta, utb); /* Estimate s'. */ sp = jauSp00(tta, ttb); /* Form the polar motion matrix. */ rpom = jauPom00(xp, yp, sp ); /* Combine to form the celestial-to-terrestrial matrix. */ rc2t = jauC2tcio(rc2i, era, rpom ); return rc2t; } /** * Assemble the celestial to terrestrial matrix from CIO-based * components (the celestial-to-intermediate matrix, the Earth Rotation * Angle and the polar motion matrix). * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param rc2i double[3][3] celestial-to-intermediate matrix * @param era double Earth rotation angle (radians) * @param rpom double[3][3] polar-motion matrix * * * @return rc2t double[3][3] returned celestial-to-terrestrial matrix * *

Notes: *

    * *
  1. This function constructs the rotation matrix that transforms * vectors in the celestial system into vectors in the terrestrial * system. It does so starting from precomputed components, namely * the matrix which rotates from celestial coordinates to the * intermediate frame, the Earth rotation angle and the polar motion * matrix. One use of the present function is when generating a * series of celestial-to-terrestrial matrices where only the Earth * Rotation Angle changes, avoiding the considerable overhead of * recomputing the precession-nutation more often than necessary to * achieve given accuracy objectives. * *
  2. The relationship between the arguments is as follows: * * [TRS] = RPOM * R_3(ERA) * rc2i * [CRS] * * = rc2t * [CRS] * * where [CRS] is a vector in the Geocentric Celestial Reference * System and [TRS] is a vector in the International Terrestrial * Reference System (see IERS Conventions 2003). *
*

Called:

*

Reference: * *

McCarthy, D. D., Petit, G. (eds.), 2004, IERS Conventions (2003), * IERS Technical Note No. 32, BKG * *@version 2008 May 11 * * @since Release 20101201 * * */ public static double[][] jauC2tcio(final double rc2i[][], final double era, final double rpom[][]) { double r[][] = new double[3][3]; /* Construct the matrix. */ jauCr(rc2i, r); jauRz(era, r); double[][] rc2t = jauRxr(rpom, r); return rc2t; } /** * Assemble the celestial to terrestrial matrix from equinox-based * components (the celestial-to-true matrix, the Greenwich Apparent * Sidereal Time and the polar motion matrix). * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param rbpn double[3][3] celestial-to-true matrix * @param gst double Greenwich (apparent) Sidereal Time (radians) * @param rpom double[3][3] polar-motion matrix * * * @return rc2t double[3][3] returned celestial-to-terrestrial matrix (Note 2) * *

Notes: *

    * *
  1. This function constructs the rotation matrix that transforms * vectors in the celestial system into vectors in the terrestrial * system. It does so starting from precomputed components, namely * the matrix which rotates from celestial coordinates to the * true equator and equinox of date, the Greenwich Apparent Sidereal * Time and the polar motion matrix. One use of the present function * is when generating a series of celestial-to-terrestrial matrices * where only the Sidereal Time changes, avoiding the considerable * overhead of recomputing the precession-nutation more often than * necessary to achieve given accuracy objectives. * *
  2. The relationship between the arguments is as follows: * * [TRS] = rpom * R_3(gst) * rbpn * [CRS] * * = rc2t * [CRS] * * where [CRS] is a vector in the Geocentric Celestial Reference * System and [TRS] is a vector in the International Terrestrial * Reference System (see IERS Conventions 2003). *
*

Called:

*

Reference: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2008 May 11 * * @since Release 20101201 * * */ public static double[][] jauC2teqx(final double rbpn[][], final double gst, final double rpom[][] ) { double r[][] = new double[3][3], rc2t[][]; /* Construct the matrix. */ jauCr(rbpn, r); jauRz(gst, r); rc2t = jauRxr(rpom, r); return rc2t; } /** * Form the celestial to terrestrial matrix given the date, the UT1, * the nutation and the polar motion. IAU 2000. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param tta double TT as a 2-part Julian Date (Note 1) * @param ttb double TT as a 2-part Julian Date (Note 1) * @param uta double UT1 as a 2-part Julian Date (Note 1) * @param utb double UT1 as a 2-part Julian Date (Note 1) * @param dpsi double nutation (Note 2) * @param deps double nutation (Note 2) * @param xp double coordinates of the pole (radians, Note 3) * @param yp double coordinates of the pole (radians, Note 3) * * * @return rc2t double[3][3] returned celestial-to-terrestrial matrix (Note 4) * *

Notes: *

    * *
  1. The TT and UT1 dates tta+ttb and uta+utb are Julian Dates, * apportioned in any convenient way between the arguments uta and * utb. For example, JD(UT1)=2450123.7 could be expressed in any of * these ways, among others: *
        *             uta            utb
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date &time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution is * acceptable. The J2000 and MJD methods are good compromises * between resolution and convenience. In the case of uta,utb, the * date &time method is best matched to the Earth rotation angle * algorithm used: maximum precision is delivered when the uta * argument is for 0hrs UT1 on the day in question and the utb * argument lies in the range 0 to 1, or vice versa. * *
  2. The caller is responsible for providing the nutation components; * they are in longitude and obliquity, in radians and are with * respect to the equinox and ecliptic of date. For high-accuracy * applications, free core nutation should be included as well as * any other relevant corrections to the position of the CIP. * *
  3. The arguments xp and yp are the coordinates (in radians) of the * Celestial Intermediate Pole with respect to the International * Terrestrial Reference System (see IERS Conventions 2003), * measured along the meridians 0 and 90 deg west respectively. * *
  4. The matrix rc2t transforms from celestial to terrestrial * coordinates: * * [TRS] = RPOM * R_3(GST) * RBPN * [CRS] * * = rc2t * [CRS] * * where [CRS] is a vector in the Geocentric Celestial Reference * System and [TRS] is a vector in the International Terrestrial * Reference System (see IERS Conventions 2003), RBPN is the * bias-precession-nutation matrix, GST is the Greenwich (apparent) * Sidereal Time and RPOM is the polar motion matrix. * *
  5. Although its name does not include "00", This function is in fact * specific to the IAU 2000 models. *
*

Called:

*

Reference: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2009 April 1 * * @since Release 20101201 * * */ public static double[][] jauC2tpe(final double tta, final double ttb, final double uta, final double utb, final double dpsi, final double deps, final double xp, final double yp) { double rpom[][]; /* Form the celestial-to-true matrix for this TT. */ PrecessionNutation pn = jauPn00(tta, ttb, dpsi, deps); /* Predict the Greenwich Mean Sidereal Time for this UT1 and TT. */ double gmst = jauGmst00(uta, utb, tta, ttb); /* Predict the equation of the equinoxes given TT and nutation. */ double ee = jauEe00(tta, ttb, pn.epsa, dpsi); /* Estimate s'. */ double sp = jauSp00(tta, ttb); /* Form the polar motion matrix. */ rpom = jauPom00(xp, yp, sp); /* Combine to form the celestial-to-terrestrial matrix. */ double[][] rc2t = jauC2teqx(pn.rbpn, gmst + ee, rpom ); return rc2t; } /** * Form the celestial to terrestrial matrix given the date, the UT1, * the CIP coordinates and the polar motion. IAU 2000. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param tta double TT as a 2-part Julian Date (Note 1) * @param ttb double TT as a 2-part Julian Date (Note 1) * @param uta double UT1 as a 2-part Julian Date (Note 1) * @param utb double UT1 as a 2-part Julian Date (Note 1) * @param x double Celestial Intermediate Pole (Note 2) * @param y double Celestial Intermediate Pole (Note 2) * @param xp double coordinates of the pole (radians, Note 3) * @param yp double coordinates of the pole (radians, Note 3) * * * @return rc2t double[3][3] returned celestial-to-terrestrial matrix (Note 4) * *

Notes: *

    * *
  1. The TT and UT1 dates tta+ttb and uta+utb are Julian Dates, * apportioned in any convenient way between the arguments uta and * utb. For example, JD(UT1)=2450123.7 could be expressed in any o * these ways, among others: *
        *             uta            utb
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date &time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution is * acceptable. The J2000 and MJD methods are good compromises * between resolution and convenience. In the case of uta,utb, the * date &time method is best matched to the Earth rotation angle * algorithm used: maximum precision is delivered when the uta * argument is for 0hrs UT1 on the day in question and the utb * argument lies in the range 0 to 1, or vice versa. * *
  2. The Celestial Intermediate Pole coordinates are the x,y * components of the unit vector in the Geocentric Celestial * Reference System. * *
  3. The arguments xp and yp are the coordinates (in radians) of the * Celestial Intermediate Pole with respect to the International * Terrestrial Reference System (see IERS Conventions 2003), * measured along the meridians 0 and 90 deg west respectively. * *
  4. The matrix rc2t transforms from celestial to terrestrial * coordinates: * * [TRS] = RPOM * R_3(ERA) * RC2I * [CRS] * * = rc2t * [CRS] * * where [CRS] is a vector in the Geocentric Celestial Reference * System and [TRS] is a vector in the International Terrestrial * Reference System (see IERS Conventions 2003), ERA is the Earth * Rotation Angle and RPOM is the polar motion matrix. * *
  5. Although its name does not include "00", This function is in fact * specific to the IAU 2000 models. *
*

Called:

* Reference: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2009 April 1 * * @since Release 20101201 * * */ public static double[][] jauC2txy(double tta, double ttb, double uta, double utb, double x, double y, double xp, double yp) { double rc2i[][] = new double[3][3], era, sp, rpom[][] = new double[3][3]; /* Form the celestial-to-intermediate matrix for this TT. */ rc2i = jauC2ixy(tta, ttb, x, y); /* Predict the Earth rotation angle for this UT1. */ era = jauEra00(uta, utb); /* Estimate s'. */ sp = jauSp00(tta, ttb); /* Form the polar motion matrix. */ rpom = jauPom00(xp, yp, sp); /* Combine to form the celestial-to-terrestrial matrix. */ double[][] rc2t = jauC2tcio(rc2i, era, rpom ); return rc2t; } /** * Gregorian Calendar to Julian Date. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param iy int year in Gregorian calendar (Note 1) * @param im int month in Gregorian calendar (Note 1) * @param id int day in Gregorian calendar (Note 1) * * * @return d MJD zero-point: always 2400000.5 * returned Modified Julian Date for 0 hrs * * * @throws JSOFAIllegalParameter status: * 0 = OK * -1 = bad year (Note 3: JD not computed) * -2 = bad month (JD not computed) * -3 = bad day (JD computed) * *

Notes: *

    * *
  1. The algorithm used is valid from -4800 March 1, but this * implementation rejects dates before -4799 January 1. * *
  2. The Julian Date is returned in two pieces, in the usual JSOFA * manner, which is designed to preserve time resolution. The * Julian Date is available as a single number by adding djm0 and * djm. * *
  3. In early eras the conversion is from the "Proleptic Gregorian * Calendar"; no account is taken of the date(s) of adoption of * the Gregorian Calendar, nor is the AD/BC numbering convention * observed. *
*

Reference: * *

Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992), * Section 12.92 (p604). * *@version 2009 October 19 * * @since Release 20101201 * * */ public static JulianDate jauCal2jd(int iy, int im, int id) throws JSOFAIllegalParameter { int ly, my; long iypmy; double djm0, djm; /* Earliest year allowed (4800BC) */ final int IYMIN = -4799; /* Month lengths in days */ final int mtab[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /* Validate year and month. */ if (iy < IYMIN) throw new JSOFAIllegalParameter("bad year", -1); if (im < 1 || im > 12) throw new JSOFAIllegalParameter("bad month", -2); /* If February in a leap year, 1, otherwise 0. */ ly = ((im == 2) &&(iy%4 == 0) && (iy%100 != 0 || (iy%400 == 0)))?1:0; /* Validate day, taking into account leap years. */ if ( (id < 1) || (id > (mtab[im-1] + ly))) { } /* Return result. */ my = (im - 14) / 12; iypmy = (long) (iy + my); djm0 = DJM0; djm = (double)((1461L * (iypmy + 4800L)) / 4L + (367L * (long) (im - 2 - 12 * my)) / 12L - (3L * ((iypmy + 4900L) / 100L)) / 4L + (long) id - 2432076L); /* Return status. */ return new JulianDate(djm0, djm); } /** * Copy a p-vector. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param p double[3] p-vector to be copied * * * @param c double[3] given and returned copy * @return double[3] given and returned copy * *@version 2008 May 11 * * @since Release 20101201 * * */ public static double[] jauCp(double p[], double c[]) { c[0] = p[0]; c[1] = p[1]; c[2] = p[2]; return c; } /** * Copy a position/velocity vector. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param pv double[2][3] position/velocity vector to be copied * @param c double[2][3] returned copy * * * @return double[2][3] returned c copy * *

Called:

*@version 2008 May 11 * * @since Release 20101201 * * */ public static double[][] jauCpv(double pv[][], double c[][]) { c[0]=jauCp(pv[0], c[0]); c[1]=jauCp(pv[1], c[1]); return c; } /** * Copy an r-matrix. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param r double[3][3] r-matrix to be copied. * * * @param c double[3][3] given and returned the elements of r are copied into this. * *

Called:

*@version 2008 May 11 * * @since Release 20101201 * * */ public static void jauCr(double r[][], double c[][] ) { jauCp(r[0], c[0]); jauCp(r[1], c[1]); jauCp(r[2], c[2]); return; } /** * Decompose days to hours, minutes, seconds, fraction. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param ndp int resolution (Note 1) * @param days double interval in days * * * @param ihmsf int[4] returned hours, minutes, seconds, fraction * @return sign char returned '+' or '-' * *

Notes: *

    * *
  1. The argument ndp is interpreted as follows: * * ndp resolution * : ...0000 00 00 * -7 1000 00 00 * -6 100 00 00 * -5 10 00 00 * -4 1 00 00 * -3 0 10 00 * -2 0 01 00 * -1 0 00 10 * 0 0 00 01 * 1 0 00 00.1 * 2 0 00 00.01 * 3 0 00 00.001 * : 0 00 00.000... * *
  2. The largest positive useful value for ndp is determined by the * size of days, the format of double on the target platform, and * the risk of overflowing ihmsf[3]. On a typical platform, for * days up to 1.0, the available floating-point precision might * correspond to ndp=12. However, the practical limit is typically * ndp=9, set by the capacity of a 32-bit int, or ndp=4 if int is * only 16 bits. * *
  3. The absolute value of days may exceed 1.0. In cases where it * does not, it is up to the caller to test for and handle the * case where days is very nearly 1.0 and rounds up to 24 hours, * by testing for ihms[0]=24 and setting ihmsf[0-3] to zero. *
*@version 2008 May 11 * * @since Release 20101201 * * */ public static char jauD2tf(final int ndp, final double days, int ihmsf[]) { int nrs, n; double rs, rm, rh, a, w, ah, am, as, af; /* Handle sign. */ char sign = (char) ( ( days >= 0.0 ) ? '+' : '-' ); /* Interval in seconds. */ a = DAYSEC * abs(days); /* Pre-round if resolution coarser than 1s (then pretend ndp=1). */ if (ndp < 0) { nrs = 1; for (n = 1; n <= -ndp; n++) { nrs *= (n == 2 || n == 4) ? 6 : 10; } rs = (double) nrs; w = a / rs; a = rs * dnint(w); } /* Express the unit of each field in resolution units. */ nrs = 1; for (n = 1; n <= ndp; n++) { nrs *= 10; } rs = (double) nrs; rm = rs * 60.0; rh = rm * 60.0; /* Round the interval and express in resolution units. */ a = dnint(rs * a); /* Break into fields. */ ah = a / rh; ah = dint(ah); a -= ah * rh; am = a / rm; am = dint(am); a -= am * rm; as = a / rs; as = dint(as); af = a - as * rs; /* Return results. */ ihmsf[0] = (int) ah; ihmsf[1] = (int) am; ihmsf[2] = (int) as; ihmsf[3] = (int) af; return sign; } /** * Representation of Gregorian Calendar with fractional day. * @author Paul Harrison (paul.harrison@manchester.ac.uk) 4 Feb 2010 * * @since AIDA Stage 1 */ public static class Calendar { public final int iy; public final int im; public final int id; public final double fd; public Calendar (int iy, int im, int id, double fd) { this.iy = iy; this.im = im; this.id = id; this.fd = fd; } } /** * Representation of Gregorian Calendar with integer hours minutes and seconds. * @author Paul Harrison (paul.harrison@manchester.ac.uk) 4 Feb 2010 * * @since AIDA Stage 1 */ public static class CalendarHMS { public final int iy; public final int im; public final int id; public final int ihmsf[]; public CalendarHMS (int iy, int im, int id, int hmsf[]){ this.iy = iy; this.im = im; this.id = id; this.ihmsf = hmsf; } } /** * * Format for output a 2-part Julian Date (or in the case of UTC a * quasi-JD form that includes special provision for leap seconds). * *

This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param scale char[] time scale ID (Note 1) * @param ndp int resolution (Note 2) * @param d1 double time as a 2-part Julian Date (Notes 3,4) * @param d2 double time as a 2-part Julian Date (Notes 3,4) * * * @return the date as a Gregorian calendar * iy,im,id int year, month, day in Gregorian calendar (Note 5) * ihmsf int[4] hours, minutes, seconds, fraction (Note 1) * * Returned (function value): * int status: +1 = dubious year (Note 5) * 0 = OK * -1 = unacceptable date (Note 6) * *

Notes: *

    *
  1. scale identifies the time scale. Only the value "UTC" (in upper * case) is significant, and enables handling of leap seconds (see * Note 4). * *
  2. ndp is the number of decimal places in the seconds field, and can * have negative as well as positive values, such as: * * ndp resolution * -4 1 00 00 * -3 0 10 00 * -2 0 01 00 * -1 0 00 10 * 0 0 00 01 * 1 0 00 00.1 * 2 0 00 00.01 * 3 0 00 00.001 * * The limits are platform dependent, but a safe range is -5 to +9. * *
  3. d1+d2 is Julian Date, apportioned in any convenient way between * the two arguments, for example where d1 is the Julian Day Number * and d2 is the fraction of a day. In the case of UTC, where the * use of JD is problematical, special conventions apply: see the * next note. * *
  4. JD cannot unambiguously represent UTC during a leap second unless * special measures are taken. The SOFA internal convention is that * the quasi-JD day represents UTC days whether the length is 86399, * 86400 or 86401 SI seconds. In the 1960-1972 era there were * smaller jumps (in either direction) each time the linear UTC(TAI) * expression was changed, and these "mini-leaps" are also included * in the SOFA convention. * *
  5. The warning status "dubious year" flags UTCs that predate the * introduction of the time scale or that are too far in the future * to be trusted. See iauDat for further details. * *
  6. For calendar conventions and limitations, see iauCal2jd. *
* Called: * iauJd2cal JD to Gregorian calendar * iauD2tf decompose days to hms * iauDat delta(AT) = TAI-UTC * *@version 2014 February 15 * *@since JSOFA release 20131202 * * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter unacceptable date (notes 5,6) */ public static CalendarHMS jauD2dtf(final String scale, int ndp, double d1, double d2 ) throws JSOFAIllegalParameter, JSOFAInternalError { boolean leap; int iy1, im1, id1, iy2, im2, id2, ihmsf1[] = new int[4]; double a1, b1, fd, dat0, dat12, dat24, dleap; /* The two-part JD. */ a1 = d1; b1 = d2; /* Provisional calendar date. */ Calendar cal = jauJd2cal(a1, b1); iy1 = cal.iy; im1 = cal.im; id1 = cal.id; fd = cal.fd; /* Is this a leap second day? */ leap = false; if ( scale.equalsIgnoreCase("UTC") ) { /* TAI-UTC at 0h today. */ dat0 = jauDat(iy1, im1, id1, 0.0 ); /* TAI-UTC at 12h today (to detect drift). */ dat12 = jauDat(iy1, im1, id1, 0.5); /* TAI-UTC at 0h tomorrow (to detect jumps). */ cal = jauJd2cal(a1+1.5, b1-fd); iy2 = cal.iy; im2 = cal.im; id2 = cal.id; dat24 = jauDat(iy2, im2, id2, 0.0); /* Any sudden change in TAI-UTC (seconds). */ dleap = dat24 - (2.0*dat12 - dat0); /* If leap second day, scale the fraction of a day into SI. */ leap = (abs(dleap) > 0.5); if (leap) fd += fd * dleap/DAYSEC; } jauD2tf ( ndp, fd, ihmsf1 ); /* Has the (rounded) time gone past 24h? */ if ( ihmsf1[0] > 23 ) { /* Yes. We probably need tomorrow's calendar date. */ cal = jauJd2cal(a1+1.5, b1-fd); iy2 = cal.iy; im2 = cal.im; id2 = cal.id; /* Is today a leap second day? */ if ( ! leap ) { /* No. Use 0h tomorrow. */ iy1 = iy2; im1 = im2; id1 = id2; ihmsf1[0] = 0; ihmsf1[1] = 0; ihmsf1[2] = 0; } else { /* Yes. Are we past the leap second itself? */ if ( ihmsf1[2] > 0 ) { /* Yes. Use tomorrow but allow for the leap second. */ iy1 = iy2; im1 = im2; id1 = id2; ihmsf1[0] = 0; ihmsf1[1] = 0; ihmsf1[2] = 0; } else { /* No. Use 23 59 60... today. */ ihmsf1[0] = 23; ihmsf1[1] = 59; ihmsf1[2] = 60; } /* If rounding to 10s or coarser always go up to new day. */ if ( ndp < 0 && ihmsf1[2] == 60 ) { iy1 = iy2; im1 = im2; id1 = id2; ihmsf1[0] = 0; ihmsf1[1] = 0; ihmsf1[2] = 0; } } } /* Results. */ return new CalendarHMS(iy1, im1, id1, ihmsf1); } /** * Encode date and time fields into 2-part Julian Date (or in the case * of UTC a quasi-JD form that includes special provision for leap * seconds). * *

This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param scale char time scale ID (Note 1) * @param iy int year in Gregorian calendar (Note 2) * @param im int month in Gregorian calendar (Note 2) * @param id int day in Gregorian calendar (Note 2) * @param ihr int hour * @param imn int minute * @param sec double seconds * * * @return 2-part Julian Date (Notes 3,4) * * @throws JSOFAIllegalParameter bad year * * @throws JSOFAInternalError {@code status: +3 = both of next two * +2 = time is after end of day (Note 5) * +1 = dubious year (Note 6) * 0 = OK * -1 = bad year * -2 = bad month * -3 = bad day * -4 = bad hour * -5 = bad minute * -6 = bad second (<0)} * *

Notes: *

    *
  1. scale identifies the time scale. Only the value "UTC" (in upper * case) is significant, and enables handling of leap seconds (see * Note 4). * *
  2. For calendar conventions and limitations, see iauCal2jd. * *
  3. The sum of the results, d1+d2, is Julian Date, where normally d1 * is the Julian Day Number and d2 is the fraction of a day. In the * case of UTC, where the use of JD is problematical, special * conventions apply: see the next note. * *
  4. JD cannot unambiguously represent UTC during a leap second unless * special measures are taken. The SOFA internal convention is that * the quasi-JD day represents UTC days whether the length is 86399, * 86400 or 86401 SI seconds. In the 1960-1972 era there were * smaller jumps (in either direction) each time the linear UTC(TAI) * expression was changed, and these "mini-leaps" are also included * in the SOFA convention. * *
  5. The warning status "time is after end of day" usually means that * the sec argument is greater than 60.0. However, in a day ending * in a leap second the limit changes to 61.0 (or 59.0 in the case * of a negative leap second). * *
  6. The warning status "dubious year" flags UTCs that predate the * introduction of the time scale or that are too far in the future * to be trusted. See iauDat for further details. * *
  7. Only in the case of continuous and regular time scales (TAI, TT, * TCG, TCB and TDB) is the result d1+d2 a Julian Date, strictly * speaking. In the other cases (UT1 and UTC) the result must be * used with circumspection; in particular the difference between * two such results cannot be interpreted as a precise time * interval. *
* Called: * iauCal2jd Gregorian calendar to JD * iauDat delta(AT) = TAI-UTC * iauJd2cal JD to Gregorian calendar * *@version 2013 July 26 * *@since JSOFA release 20131202 * * */ public static JulianDate jauDtf2d(final String scale, int iy, int im, int id, int ihr, int imn, double sec) throws JSOFAIllegalParameter, JSOFAInternalError { int js = 0, iy2, im2, id2; double dj, w, day, seclim, dat0, dat12, dat24, dleap, time; /* Today's Julian Day Number. */ JulianDate jd = jauCal2jd(iy, im, id); dj = jd.djm0; w = jd.djm1; dj += w; /* Day length and final minute length in seconds (provisional). */ day = DAYSEC; seclim = 60.0; /* Deal with the UTC leap second case. */ if ( scale.equals("UTC") ) { /* TAI-UTC at 0h today. */ dat0 = jauDat(iy, im, id, 0.0); /* TAI-UTC at 12h today (to detect drift). */ dat12 = jauDat(iy, im, id, 0.5); /* TAI-UTC at 0h tomorrow (to detect jumps). */ Calendar cal = jauJd2cal ( dj, 1.5); iy2 = cal.iy; im2 = cal.im; id2 = cal.id; w = cal.fd; dat24 = jauDat(iy2, im2, id2, 0.0); /* Any sudden change in TAI-UTC between today and tomorrow. */ dleap = dat24 - (2.0*dat12 - dat0); /* If leap second day, correct the day and final minute lengths. */ day += dleap; if ( ihr == 23 && imn == 59 ) seclim += dleap; /* End of UTC-specific actions. */ } /* Validate the time. */ if ( ihr >= 0 && ihr <= 23 ) { if ( imn >= 0 && imn <= 59 ) { if ( sec >= 0 ) { if ( sec >= seclim ) { js += 2; } } else { js = -6; } } else { js = -5; } } else { js = -4; } if ( js < 0 ) throw new JSOFAInternalError("problem with time", js); /* The time in days. */ time = ( 60.0 * ( (double) ( 60 * ihr + imn ) ) + sec ) / day; /* Return the date and time. */ return new JulianDate(dj, time) ; } /** * the date of the last leap second. Note that this is not a SOFA standard fumction. * @return the {@link JulianDate} of the last leap second. */ public static JulianDate lastLeapSecondDate() { final LeapInfo lastentry = leapSeconds[leapSeconds.length -1]; JulianDate retval = new JulianDate(0, 0); try { retval = jauCal2jd(lastentry.iyear,lastentry.month,1); } catch (JSOFAIllegalParameter e) { //should not happen e.printStackTrace(); } return retval; } /** * For a given UTC date, calculate delta(AT) = TAI-UTC. *
    *     :------------------------------------------:
    *     :                                          :
    *     :                 IMPORTANT                :
    *     :                                          :
    *     :  A new version of this function must be  :
    *     :  produced whenever a new leap second is  :
    *     :  announced.  There are four items to     :
    *     :  change on each such occasion:           :
    *     :                                          :
    *     :  1) A new line must be added to the set  :
    *     :     of statements that initialize the    :
    *     :     array "changes".                     :
    *     :                                          :
    *     :  2) The parameter IYV must be set to     :
    *     :     the current year.                    :
    *     :                                          :
    *     :  3) The "Latest leap second" comment     :
    *     :     below must be set to the new leap    :
    *     :     second date.                         :
    *     :                                          :
    *     :  4) The "This revision" comment, later,  :
    *     :     must be set to the current date.     :
    *     :                                          :
    *     :  Change (2) must also be carried out     :
    *     :  whenever the function is re-issued,     :
    *     :  even if no leap seconds have been       :
    *     :  added.                                  :
    *     :                                          :
    *     :  Latest leap second:  2017 Jan 01        :
    *     :                                          :
    *     :__________________________________________:
    *
*

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param iy int UTC: year (Notes 1 and 2) * @param im int month (Note 2) * @param id int day (Notes 2 and 3) * @param fd double fraction of day (Note 4) * * * @return deltat double returned TAI minus UTC, seconds * * @throws JSOFAIllegalParameter status (Note 5): * 1 = dubious year (Note 1) * 0 = OK * -1 = bad year * -2 = bad month * -3 = bad day (Note 3) * -4 = bad fraction (Note 4) * * @throws JSOFAInternalError * *

Notes: *

    * *
  1. UTC began at 1960 January 1.0 (JD 2436934.5) and it is improper * to call the function with an earlier date. If this is attempted, * zero is returned together with a warning status. * * Because leap seconds cannot, in principle, be predicted in * advance, a reliable check for dates beyond the valid range is * impossible. To guard against gross errors, a year five or more * after the release year of the present function (see parameter * IYV) is considered dubious. In this case a warning status is * returned but the result is computed in the normal way. * * For both too-early and too-late years, the warning status is * j=+1. This is distinct from the error status j=-1, which * signifies a year so early that JD could not be computed. * *
  2. If the specified date is for a day which ends with a leap second, * the TAI-UTC value returned is for the period leading up to the * leap second. If the date is for a day which begins as a leap * second ends, the TAI-UTC returned is for the period following the * leap second. * *
  3. The day number must be in the normal calendar range, for example * 1 through 30 for April. The "almanac" convention of allowing * such dates as January 0 and December 32 is not supported in this * function, in order to avoid confusion near leap seconds. * *
  4. The fraction of day is used only for dates before the * introduction of leap seconds, the first of which occurred at the * end of 1971. It is tested for validity (zero to less than 1 is * the valid range) even if not used; if invalid, zero is used and * status j=-4 is returned. For many applications, setting fd to * zero is acceptable; the resulting error is always less than 3 ms * (and occurs only pre-1972). * *
  5. The status value returned in the case where there are multiple * errors refers to the first error detected. For example, if the * month and day are 13 and 32 respectively, j=-2 (bad month) * will be returned. * *
  6. In cases where a valid result is not available, zero is returned. * *

    References: * *

  7. For dates from 1961 January 1 onwards, the expressions from the * file ftp://maia.usno.navy.mil/ser7/tai-utc.dat are used. * *
  8. The 5ms timestep at 1961 January 1 is taken from 2.58.1 (p87) of * the 1992 Explanatory Supplement. *
*

Called:

*

@version 20160729 * * @since Release 20101201 * * */ public static double jauDat(int iy, int im, int id, double fd ) throws JSOFAIllegalParameter, JSOFAInternalError { /* Reference dates (MJD) and drift rates (s/day), pre leap seconds */ final double drift[][] = { { 37300.0, 0.0012960 }, { 37300.0, 0.0012960 }, { 37300.0, 0.0012960 }, { 37665.0, 0.0011232 }, { 37665.0, 0.0011232 }, { 38761.0, 0.0012960 }, { 38761.0, 0.0012960 }, { 38761.0, 0.0012960 }, { 38761.0, 0.0012960 }, { 38761.0, 0.0012960 }, { 38761.0, 0.0012960 }, { 38761.0, 0.0012960 }, { 39126.0, 0.0025920 }, { 39126.0, 0.0025920 } }; /* Number of Delta(AT) expressions before leap seconds were introduced */ final int NERA1 = drift.length; /* Number of Delta(AT) changes */ final int NDAT = leapSeconds.length; /* Miscellaneous local variables */ int i, m; double da, djm; /* Initialize the result to zero. */ double deltat = da = 0.0; /* If invalid fraction of a day, set error status and give up. */ if (fd < 0.0 || fd > 1.0) throw new JSOFAIllegalParameter("bad day fraction", -4); /* Convert the date into an MJD. */ JulianDate jd = jauCal2jd(iy, im, id); djm = jd.djm1; /* If pre-UTC year, set warning status and give up. */ if (iy < leapSeconds[0].iyear) throw new JSOFAInternalError("year before UTC start", 1); /* If suspiciously late year, set warning status but proceed. */ if (iy > IYV + 5) { } /* Combine year and month to form a date-ordered integer... */ m = 12*iy + im; /* ...and use it to find the preceding table entry. */ for (i = NDAT-1; i >=0; i--) { if (m >= (12 * leapSeconds[i].iyear + leapSeconds[i].month)) break; } /* Get the Delta(AT). */ da = leapSeconds[i].delat; /* If pre-1972, adjust for drift. */ if (i < NERA1) da += (djm + fd - drift[i][0]) * drift[i][1]; /* Return the Delta(AT) value. */ deltat = da; /* Return the value. */ return deltat; } /** * An approximation to TDB-TT, the difference between barycentric * dynamical time and terrestrial time, for an observer on the Earth. * * The different time scales - proper, coordinate and realized - are * related to each other: * {@code * TAI <- physically realized * : * offset <- observed (nominally +32.184s) * : * TT <- terrestrial time * : * rate adjustment (L_G) <- definition of TT * : * TCG <- time scale for GCRS * : * "periodic" terms <- jauDtdb is an implementation * : * rate adjustment (L_C) <- function of solar-system ephemeris * : * TCB <- time scale for BCRS * : * rate adjustment (-L_B) <- definition of TDB * : * TDB <- TCB scaled to track TT * : * "periodic" terms <- -jau_DTDB is an approximation * : * TT <- terrestrial time *} * Adopted values for the various constants can be found in the IERS * Conventions (McCarthy & Petit 2003). * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param date1 double date, TDB (Notes 1-3) * @param date2 double date, TDB (Notes 1-3) * @param ut double universal time (UT1, fraction of one day) * @param elong double longitude (east positive, radians) * @param u double distance from Earth spin axis (km) * @param v double distance north of equatorial plane (km) * * * @return double TDB-TT (seconds) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * * Although the date is, formally, barycentric dynamical time (TDB), * the terrestrial dynamical time (TT) can be used with no practical * effect on the accuracy of the prediction. * *
  2. TT can be regarded as a coordinate time that is realized as an * offset of 32.184s from International Atomic Time, TAI. TT is a * specific linear transformation of geocentric coordinate time TCG, * which is the time scale for the Geocentric Celestial Reference * System, GCRS. * *
  3. TDB is a coordinate time, and is a specific linear transformation * of barycentric coordinate time TCB, which is the time scale for * the Barycentric Celestial Reference System, BCRS. * *
  4. The difference TCG-TCB depends on the masses and positions of the * bodies of the solar system and the velocity of the Earth. It is * dominated by a rate difference, the residual being of a periodic * character. The latter, which is modeled by the present function, * comprises a main (annual) sinusoidal term of amplitude * approximately 0.00166 seconds, plus planetary terms up to about * 20 microseconds, and lunar and diurnal terms up to 2 microseconds. * These effects come from the changing transverse Doppler effect * and gravitational red-shift as the observer (on the Earth's * surface) experiences variations in speed (with respect to the * BCRS) and gravitational potential. * *
  5. TDB can be regarded as the same as TCB but with a rate adjustment * to keep it close to TT, which is convenient for many applications. * The history of successive attempts to define TDB is set out in * Resolution 3 adopted by the IAU General Assembly in 2006, which * defines a fixed TDB(TCB) transformation that is consistent with * contemporary solar-system ephemerides. Future ephemerides will * imply slightly changed transformations between TCG and TCB, which * could introduce a linear drift between TDB and TT; however, any * such drift is unlikely to exceed 1 nanosecond per century. * *
  6. The geocentric TDB-TT model used in the present function is that of * Fairhead & Bretagnon (1990), in its full form. It was originally * supplied by Fairhead (private communications with P.T.Wallace, * 1990) as a Fortran subroutine. The present C function contains an * adaptation of the Fairhead code. The numerical results are * essentially unaffected by the changes, the differences with * respect to the Fairhead & Bretagnon original being at the 1e-20 s * level. * * The topocentric part of the model is from Moyer (1981) and * Murray (1983), with fundamental arguments adapted from * Simon et al. 1994. It is an approximation to the expression * ( v / c ) . ( r / c ), where v is the barycentric velocity of * the Earth, r is the geocentric position of the observer and * c is the speed of light. * * By supplying zeroes for u and v, the topocentric part of the * model can be nullified, and the function will return the Fairhead * & Bretagnon result alone. * *
  7. During the interval 1950-2050, the absolute accuracy is better * than +/- 3 nanoseconds relative to time ephemerides obtained by * direct numerical integrations based on the JPL DE405 solar system * ephemeris. * *
  8. It must be stressed that the present function is merely a model, * and that numerical integration of solar-system ephemerides is the * definitive method for predicting the relationship between TCG and * TCB and hence between TT and TDB. *
*

References: * *

Fairhead, L., & Bretagnon, P., Astron.Astrophys., 229, 240-247 * (1990). * *

IAU 2006 Resolution 3. * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *

Moyer, T.D., Cel.Mech., 23, 33 (1981). * *

Murray, C.A., Vectorial Astrometry, Adam Hilger (1983). * *

Seidelmann, P.K. et al., Explanatory Supplement to the * Astronomical Almanac, Chapter 2, University Science Books (1992). * *

Simon, J.L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G. & Laskar, J., Astron.Astrophys., 282, 663-683 (1994). * *@version 2009 December 17 * * @since Release 20101201 * * */ public static double jauDtdb(double date1, double date2, double ut, double elong, double u, double v) { double t, tsol, w, elsun, emsun, d, elj, els, wt, w0, w1, w2, w3, w4, wf, wj; int j; /* * ===================== * Fairhead et al. model * ===================== * * 787 sets of three coefficients. * * Each set is * amplitude (microseconds) * frequency (radians per Julian millennium since J2000.0) * phase (radians) * * Sets 1-474 are the T**0 terms * " 475-679 " " T**1 * " 680-764 " " T**2 * " 765-784 " " T**3 * " 785-787 " " T**4 */ final double fairhd[][] = { /* 1, 10 */ { 1656.674564e-6, 6283.075849991, 6.240054195 }, { 22.417471e-6, 5753.384884897, 4.296977442 }, { 13.839792e-6, 12566.151699983, 6.196904410 }, { 4.770086e-6, 529.690965095, 0.444401603 }, { 4.676740e-6, 6069.776754553, 4.021195093 }, { 2.256707e-6, 213.299095438, 5.543113262 }, { 1.694205e-6, -3.523118349, 5.025132748 }, { 1.554905e-6, 77713.771467920, 5.198467090 }, { 1.276839e-6, 7860.419392439, 5.988822341 }, { 1.193379e-6, 5223.693919802, 3.649823730 }, /* 11, 20 */ { 1.115322e-6, 3930.209696220, 1.422745069 }, { 0.794185e-6, 11506.769769794, 2.322313077 }, { 0.447061e-6, 26.298319800, 3.615796498 }, { 0.435206e-6, -398.149003408, 4.349338347 }, { 0.600309e-6, 1577.343542448, 2.678271909 }, { 0.496817e-6, 6208.294251424, 5.696701824 }, { 0.486306e-6, 5884.926846583, 0.520007179 }, { 0.432392e-6, 74.781598567, 2.435898309 }, { 0.468597e-6, 6244.942814354, 5.866398759 }, { 0.375510e-6, 5507.553238667, 4.103476804 }, /* 21, 30 */ { 0.243085e-6, -775.522611324, 3.651837925 }, { 0.173435e-6, 18849.227549974, 6.153743485 }, { 0.230685e-6, 5856.477659115, 4.773852582 }, { 0.203747e-6, 12036.460734888, 4.333987818 }, { 0.143935e-6, -796.298006816, 5.957517795 }, { 0.159080e-6, 10977.078804699, 1.890075226 }, { 0.119979e-6, 38.133035638, 4.551585768 }, { 0.118971e-6, 5486.777843175, 1.914547226 }, { 0.116120e-6, 1059.381930189, 0.873504123 }, { 0.137927e-6, 11790.629088659, 1.135934669 }, /* 31, 40 */ { 0.098358e-6, 2544.314419883, 0.092793886 }, { 0.101868e-6, -5573.142801634, 5.984503847 }, { 0.080164e-6, 206.185548437, 2.095377709 }, { 0.079645e-6, 4694.002954708, 2.949233637 }, { 0.062617e-6, 20.775395492, 2.654394814 }, { 0.075019e-6, 2942.463423292, 4.980931759 }, { 0.064397e-6, 5746.271337896, 1.280308748 }, { 0.063814e-6, 5760.498431898, 4.167901731 }, { 0.048042e-6, 2146.165416475, 1.495846011 }, { 0.048373e-6, 155.420399434, 2.251573730 }, /* 41, 50 */ { 0.058844e-6, 426.598190876, 4.839650148 }, { 0.046551e-6, -0.980321068, 0.921573539 }, { 0.054139e-6, 17260.154654690, 3.411091093 }, { 0.042411e-6, 6275.962302991, 2.869567043 }, { 0.040184e-6, -7.113547001, 3.565975565 }, { 0.036564e-6, 5088.628839767, 3.324679049 }, { 0.040759e-6, 12352.852604545, 3.981496998 }, { 0.036507e-6, 801.820931124, 6.248866009 }, { 0.036955e-6, 3154.687084896, 5.071801441 }, { 0.042732e-6, 632.783739313, 5.720622217 }, /* 51, 60 */ { 0.042560e-6, 161000.685737473, 1.270837679 }, { 0.040480e-6, 15720.838784878, 2.546610123 }, { 0.028244e-6, -6286.598968340, 5.069663519 }, { 0.033477e-6, 6062.663207553, 4.144987272 }, { 0.034867e-6, 522.577418094, 5.210064075 }, { 0.032438e-6, 6076.890301554, 0.749317412 }, { 0.030215e-6, 7084.896781115, 3.389610345 }, { 0.029247e-6, -71430.695617928, 4.183178762 }, { 0.033529e-6, 9437.762934887, 2.404714239 }, { 0.032423e-6, 8827.390269875, 5.541473556 }, /* 61, 70 */ { 0.027567e-6, 6279.552731642, 5.040846034 }, { 0.029862e-6, 12139.553509107, 1.770181024 }, { 0.022509e-6, 10447.387839604, 1.460726241 }, { 0.020937e-6, 8429.241266467, 0.652303414 }, { 0.020322e-6, 419.484643875, 3.735430632 }, { 0.024816e-6, -1194.447010225, 1.087136918 }, { 0.025196e-6, 1748.016413067, 2.901883301 }, { 0.021691e-6, 14143.495242431, 5.952658009 }, { 0.017673e-6, 6812.766815086, 3.186129845 }, { 0.022567e-6, 6133.512652857, 3.307984806 }, /* 71, 80 */ { 0.016155e-6, 10213.285546211, 1.331103168 }, { 0.014751e-6, 1349.867409659, 4.308933301 }, { 0.015949e-6, -220.412642439, 4.005298270 }, { 0.015974e-6, -2352.866153772, 6.145309371 }, { 0.014223e-6, 17789.845619785, 2.104551349 }, { 0.017806e-6, 73.297125859, 3.475975097 }, { 0.013671e-6, -536.804512095, 5.971672571 }, { 0.011942e-6, 8031.092263058, 2.053414715 }, { 0.014318e-6, 16730.463689596, 3.016058075 }, { 0.012462e-6, 103.092774219, 1.737438797 }, /* 81, 90 */ { 0.010962e-6, 3.590428652, 2.196567739 }, { 0.015078e-6, 19651.048481098, 3.969480770 }, { 0.010396e-6, 951.718406251, 5.717799605 }, { 0.011707e-6, -4705.732307544, 2.654125618 }, { 0.010453e-6, 5863.591206116, 1.913704550 }, { 0.012420e-6, 4690.479836359, 4.734090399 }, { 0.011847e-6, 5643.178563677, 5.489005403 }, { 0.008610e-6, 3340.612426700, 3.661698944 }, { 0.011622e-6, 5120.601145584, 4.863931876 }, { 0.010825e-6, 553.569402842, 0.842715011 }, /* 91, 100 */ { 0.008666e-6, -135.065080035, 3.293406547 }, { 0.009963e-6, 149.563197135, 4.870690598 }, { 0.009858e-6, 6309.374169791, 1.061816410 }, { 0.007959e-6, 316.391869657, 2.465042647 }, { 0.010099e-6, 283.859318865, 1.942176992 }, { 0.007147e-6, -242.728603974, 3.661486981 }, { 0.007505e-6, 5230.807466803, 4.920937029 }, { 0.008323e-6, 11769.853693166, 1.229392026 }, { 0.007490e-6, -6256.777530192, 3.658444681 }, { 0.009370e-6, 149854.400134205, 0.673880395 }, /* 101, 110 */ { 0.007117e-6, 38.027672636, 5.294249518 }, { 0.007857e-6, 12168.002696575, 0.525733528 }, { 0.007019e-6, 6206.809778716, 0.837688810 }, { 0.006056e-6, 955.599741609, 4.194535082 }, { 0.008107e-6, 13367.972631107, 3.793235253 }, { 0.006731e-6, 5650.292110678, 5.639906583 }, { 0.007332e-6, 36.648562930, 0.114858677 }, { 0.006366e-6, 4164.311989613, 2.262081818 }, { 0.006858e-6, 5216.580372801, 0.642063318 }, { 0.006919e-6, 6681.224853400, 6.018501522 }, /* 111, 120 */ { 0.006826e-6, 7632.943259650, 3.458654112 }, { 0.005308e-6, -1592.596013633, 2.500382359 }, { 0.005096e-6, 11371.704689758, 2.547107806 }, { 0.004841e-6, 5333.900241022, 0.437078094 }, { 0.005582e-6, 5966.683980335, 2.246174308 }, { 0.006304e-6, 11926.254413669, 2.512929171 }, { 0.006603e-6, 23581.258177318, 5.393136889 }, { 0.005123e-6, -1.484472708, 2.999641028 }, { 0.004648e-6, 1589.072895284, 1.275847090 }, { 0.005119e-6, 6438.496249426, 1.486539246 }, /* 121, 130 */ { 0.004521e-6, 4292.330832950, 6.140635794 }, { 0.005680e-6, 23013.539539587, 4.557814849 }, { 0.005488e-6, -3.455808046, 0.090675389 }, { 0.004193e-6, 7234.794256242, 4.869091389 }, { 0.003742e-6, 7238.675591600, 4.691976180 }, { 0.004148e-6, -110.206321219, 3.016173439 }, { 0.004553e-6, 11499.656222793, 5.554998314 }, { 0.004892e-6, 5436.993015240, 1.475415597 }, { 0.004044e-6, 4732.030627343, 1.398784824 }, { 0.004164e-6, 12491.370101415, 5.650931916 }, /* 131, 140 */ { 0.004349e-6, 11513.883316794, 2.181745369 }, { 0.003919e-6, 12528.018664345, 5.823319737 }, { 0.003129e-6, 6836.645252834, 0.003844094 }, { 0.004080e-6, -7058.598461315, 3.690360123 }, { 0.003270e-6, 76.266071276, 1.517189902 }, { 0.002954e-6, 6283.143160294, 4.447203799 }, { 0.002872e-6, 28.449187468, 1.158692983 }, { 0.002881e-6, 735.876513532, 0.349250250 }, { 0.003279e-6, 5849.364112115, 4.893384368 }, { 0.003625e-6, 6209.778724132, 1.473760578 }, /* 141, 150 */ { 0.003074e-6, 949.175608970, 5.185878737 }, { 0.002775e-6, 9917.696874510, 1.030026325 }, { 0.002646e-6, 10973.555686350, 3.918259169 }, { 0.002575e-6, 25132.303399966, 6.109659023 }, { 0.003500e-6, 263.083923373, 1.892100742 }, { 0.002740e-6, 18319.536584880, 4.320519510 }, { 0.002464e-6, 202.253395174, 4.698203059 }, { 0.002409e-6, 2.542797281, 5.325009315 }, { 0.003354e-6, -90955.551694697, 1.942656623 }, { 0.002296e-6, 6496.374945429, 5.061810696 }, /* 151, 160 */ { 0.003002e-6, 6172.869528772, 2.797822767 }, { 0.003202e-6, 27511.467873537, 0.531673101 }, { 0.002954e-6, -6283.008539689, 4.533471191 }, { 0.002353e-6, 639.897286314, 3.734548088 }, { 0.002401e-6, 16200.772724501, 2.605547070 }, { 0.003053e-6, 233141.314403759, 3.029030662 }, { 0.003024e-6, 83286.914269554, 2.355556099 }, { 0.002863e-6, 17298.182327326, 5.240963796 }, { 0.002103e-6, -7079.373856808, 5.756641637 }, { 0.002303e-6, 83996.847317911, 2.013686814 }, /* 161, 170 */ { 0.002303e-6, 18073.704938650, 1.089100410 }, { 0.002381e-6, 63.735898303, 0.759188178 }, { 0.002493e-6, 6386.168624210, 0.645026535 }, { 0.002366e-6, 3.932153263, 6.215885448 }, { 0.002169e-6, 11015.106477335, 4.845297676 }, { 0.002397e-6, 6243.458341645, 3.809290043 }, { 0.002183e-6, 1162.474704408, 6.179611691 }, { 0.002353e-6, 6246.427287062, 4.781719760 }, { 0.002199e-6, -245.831646229, 5.956152284 }, { 0.001729e-6, 3894.181829542, 1.264976635 }, /* 171, 180 */ { 0.001896e-6, -3128.388765096, 4.914231596 }, { 0.002085e-6, 35.164090221, 1.405158503 }, { 0.002024e-6, 14712.317116458, 2.752035928 }, { 0.001737e-6, 6290.189396992, 5.280820144 }, { 0.002229e-6, 491.557929457, 1.571007057 }, { 0.001602e-6, 14314.168113050, 4.203664806 }, { 0.002186e-6, 454.909366527, 1.402101526 }, { 0.001897e-6, 22483.848574493, 4.167932508 }, { 0.001825e-6, -3738.761430108, 0.545828785 }, { 0.001894e-6, 1052.268383188, 5.817167450 }, /* 181, 190 */ { 0.001421e-6, 20.355319399, 2.419886601 }, { 0.001408e-6, 10984.192351700, 2.732084787 }, { 0.001847e-6, 10873.986030480, 2.903477885 }, { 0.001391e-6, -8635.942003763, 0.593891500 }, { 0.001388e-6, -7.046236698, 1.166145902 }, { 0.001810e-6, -88860.057071188, 0.487355242 }, { 0.001288e-6, -1990.745017041, 3.913022880 }, { 0.001297e-6, 23543.230504682, 3.063805171 }, { 0.001335e-6, -266.607041722, 3.995764039 }, { 0.001376e-6, 10969.965257698, 5.152914309 }, /* 191, 200 */ { 0.001745e-6, 244287.600007027, 3.626395673 }, { 0.001649e-6, 31441.677569757, 1.952049260 }, { 0.001416e-6, 9225.539273283, 4.996408389 }, { 0.001238e-6, 4804.209275927, 5.503379738 }, { 0.001472e-6, 4590.910180489, 4.164913291 }, { 0.001169e-6, 6040.347246017, 5.841719038 }, { 0.001039e-6, 5540.085789459, 2.769753519 }, { 0.001004e-6, -170.672870619, 0.755008103 }, { 0.001284e-6, 10575.406682942, 5.306538209 }, { 0.001278e-6, 71.812653151, 4.713486491 }, /* 201, 210 */ { 0.001321e-6, 18209.330263660, 2.624866359 }, { 0.001297e-6, 21228.392023546, 0.382603541 }, { 0.000954e-6, 6282.095528923, 0.882213514 }, { 0.001145e-6, 6058.731054289, 1.169483931 }, { 0.000979e-6, 5547.199336460, 5.448375984 }, { 0.000987e-6, -6262.300454499, 2.656486959 }, { 0.001070e-6, -154717.609887482, 1.827624012 }, { 0.000991e-6, 4701.116501708, 4.387001801 }, { 0.001155e-6, -14.227094002, 3.042700750 }, { 0.001176e-6, 277.034993741, 3.335519004 }, /* 211, 220 */ { 0.000890e-6, 13916.019109642, 5.601498297 }, { 0.000884e-6, -1551.045222648, 1.088831705 }, { 0.000876e-6, 5017.508371365, 3.969902609 }, { 0.000806e-6, 15110.466119866, 5.142876744 }, { 0.000773e-6, -4136.910433516, 0.022067765 }, { 0.001077e-6, 175.166059800, 1.844913056 }, { 0.000954e-6, -6284.056171060, 0.968480906 }, { 0.000737e-6, 5326.786694021, 4.923831588 }, { 0.000845e-6, -433.711737877, 4.749245231 }, { 0.000819e-6, 8662.240323563, 5.991247817 }, /* 221, 230 */ { 0.000852e-6, 199.072001436, 2.189604979 }, { 0.000723e-6, 17256.631536341, 6.068719637 }, { 0.000940e-6, 6037.244203762, 6.197428148 }, { 0.000885e-6, 11712.955318231, 3.280414875 }, { 0.000706e-6, 12559.038152982, 2.824848947 }, { 0.000732e-6, 2379.164473572, 2.501813417 }, { 0.000764e-6, -6127.655450557, 2.236346329 }, { 0.000908e-6, 131.541961686, 2.521257490 }, { 0.000907e-6, 35371.887265976, 3.370195967 }, { 0.000673e-6, 1066.495477190, 3.876512374 }, /* 231, 240 */ { 0.000814e-6, 17654.780539750, 4.627122566 }, { 0.000630e-6, 36.027866677, 0.156368499 }, { 0.000798e-6, 515.463871093, 5.151962502 }, { 0.000798e-6, 148.078724426, 5.909225055 }, { 0.000806e-6, 309.278322656, 6.054064447 }, { 0.000607e-6, -39.617508346, 2.839021623 }, { 0.000601e-6, 412.371096874, 3.984225404 }, { 0.000646e-6, 11403.676995575, 3.852959484 }, { 0.000704e-6, 13521.751441591, 2.300991267 }, { 0.000603e-6, -65147.619767937, 4.140083146 }, /* 241, 250 */ { 0.000609e-6, 10177.257679534, 0.437122327 }, { 0.000631e-6, 5767.611978898, 4.026532329 }, { 0.000576e-6, 11087.285125918, 4.760293101 }, { 0.000674e-6, 14945.316173554, 6.270510511 }, { 0.000726e-6, 5429.879468239, 6.039606892 }, { 0.000710e-6, 28766.924424484, 5.672617711 }, { 0.000647e-6, 11856.218651625, 3.397132627 }, { 0.000678e-6, -5481.254918868, 6.249666675 }, { 0.000618e-6, 22003.914634870, 2.466427018 }, { 0.000738e-6, 6134.997125565, 2.242668890 }, /* 251, 260 */ { 0.000660e-6, 625.670192312, 5.864091907 }, { 0.000694e-6, 3496.032826134, 2.668309141 }, { 0.000531e-6, 6489.261398429, 1.681888780 }, { 0.000611e-6, -143571.324284214, 2.424978312 }, { 0.000575e-6, 12043.574281889, 4.216492400 }, { 0.000553e-6, 12416.588502848, 4.772158039 }, { 0.000689e-6, 4686.889407707, 6.224271088 }, { 0.000495e-6, 7342.457780181, 3.817285811 }, { 0.000567e-6, 3634.621024518, 1.649264690 }, { 0.000515e-6, 18635.928454536, 3.945345892 }, /* 261, 270 */ { 0.000486e-6, -323.505416657, 4.061673868 }, { 0.000662e-6, 25158.601719765, 1.794058369 }, { 0.000509e-6, 846.082834751, 3.053874588 }, { 0.000472e-6, -12569.674818332, 5.112133338 }, { 0.000461e-6, 6179.983075773, 0.513669325 }, { 0.000641e-6, 83467.156352816, 3.210727723 }, { 0.000520e-6, 10344.295065386, 2.445597761 }, { 0.000493e-6, 18422.629359098, 1.676939306 }, { 0.000478e-6, 1265.567478626, 5.487314569 }, { 0.000472e-6, -18.159247265, 1.999707589 }, /* 271, 280 */ { 0.000559e-6, 11190.377900137, 5.783236356 }, { 0.000494e-6, 9623.688276691, 3.022645053 }, { 0.000463e-6, 5739.157790895, 1.411223013 }, { 0.000432e-6, 16858.482532933, 1.179256434 }, { 0.000574e-6, 72140.628666286, 1.758191830 }, { 0.000484e-6, 17267.268201691, 3.290589143 }, { 0.000550e-6, 4907.302050146, 0.864024298 }, { 0.000399e-6, 14.977853527, 2.094441910 }, { 0.000491e-6, 224.344795702, 0.878372791 }, { 0.000432e-6, 20426.571092422, 6.003829241 }, /* 281, 290 */ { 0.000481e-6, 5749.452731634, 4.309591964 }, { 0.000480e-6, 5757.317038160, 1.142348571 }, { 0.000485e-6, 6702.560493867, 0.210580917 }, { 0.000426e-6, 6055.549660552, 4.274476529 }, { 0.000480e-6, 5959.570433334, 5.031351030 }, { 0.000466e-6, 12562.628581634, 4.959581597 }, { 0.000520e-6, 39302.096962196, 4.788002889 }, { 0.000458e-6, 12132.439962106, 1.880103788 }, { 0.000470e-6, 12029.347187887, 1.405611197 }, { 0.000416e-6, -7477.522860216, 1.082356330 }, /* 291, 300 */ { 0.000449e-6, 11609.862544012, 4.179989585 }, { 0.000465e-6, 17253.041107690, 0.353496295 }, { 0.000362e-6, -4535.059436924, 1.583849576 }, { 0.000383e-6, 21954.157609398, 3.747376371 }, { 0.000389e-6, 17.252277143, 1.395753179 }, { 0.000331e-6, 18052.929543158, 0.566790582 }, { 0.000430e-6, 13517.870106233, 0.685827538 }, { 0.000368e-6, -5756.908003246, 0.731374317 }, { 0.000330e-6, 10557.594160824, 3.710043680 }, { 0.000332e-6, 20199.094959633, 1.652901407 }, /* 301, 310 */ { 0.000384e-6, 11933.367960670, 5.827781531 }, { 0.000387e-6, 10454.501386605, 2.541182564 }, { 0.000325e-6, 15671.081759407, 2.178850542 }, { 0.000318e-6, 138.517496871, 2.253253037 }, { 0.000305e-6, 9388.005909415, 0.578340206 }, { 0.000352e-6, 5749.861766548, 3.000297967 }, { 0.000311e-6, 6915.859589305, 1.693574249 }, { 0.000297e-6, 24072.921469776, 1.997249392 }, { 0.000363e-6, -640.877607382, 5.071820966 }, { 0.000323e-6, 12592.450019783, 1.072262823 }, /* 311, 320 */ { 0.000341e-6, 12146.667056108, 4.700657997 }, { 0.000290e-6, 9779.108676125, 1.812320441 }, { 0.000342e-6, 6132.028180148, 4.322238614 }, { 0.000329e-6, 6268.848755990, 3.033827743 }, { 0.000374e-6, 17996.031168222, 3.388716544 }, { 0.000285e-6, -533.214083444, 4.687313233 }, { 0.000338e-6, 6065.844601290, 0.877776108 }, { 0.000276e-6, 24.298513841, 0.770299429 }, { 0.000336e-6, -2388.894020449, 5.353796034 }, { 0.000290e-6, 3097.883822726, 4.075291557 }, /* 321, 330 */ { 0.000318e-6, 709.933048357, 5.941207518 }, { 0.000271e-6, 13095.842665077, 3.208912203 }, { 0.000331e-6, 6073.708907816, 4.007881169 }, { 0.000292e-6, 742.990060533, 2.714333592 }, { 0.000362e-6, 29088.811415985, 3.215977013 }, { 0.000280e-6, 12359.966151546, 0.710872502 }, { 0.000267e-6, 10440.274292604, 4.730108488 }, { 0.000262e-6, 838.969287750, 1.327720272 }, { 0.000250e-6, 16496.361396202, 0.898769761 }, { 0.000325e-6, 20597.243963041, 0.180044365 }, /* 331, 340 */ { 0.000268e-6, 6148.010769956, 5.152666276 }, { 0.000284e-6, 5636.065016677, 5.655385808 }, { 0.000301e-6, 6080.822454817, 2.135396205 }, { 0.000294e-6, -377.373607916, 3.708784168 }, { 0.000236e-6, 2118.763860378, 1.733578756 }, { 0.000234e-6, 5867.523359379, 5.575209112 }, { 0.000268e-6, -226858.238553767, 0.069432392 }, { 0.000265e-6, 167283.761587465, 4.369302826 }, { 0.000280e-6, 28237.233459389, 5.304829118 }, { 0.000292e-6, 12345.739057544, 4.096094132 }, /* 341, 350 */ { 0.000223e-6, 19800.945956225, 3.069327406 }, { 0.000301e-6, 43232.306658416, 6.205311188 }, { 0.000264e-6, 18875.525869774, 1.417263408 }, { 0.000304e-6, -1823.175188677, 3.409035232 }, { 0.000301e-6, 109.945688789, 0.510922054 }, { 0.000260e-6, 813.550283960, 2.389438934 }, { 0.000299e-6, 316428.228673312, 5.384595078 }, { 0.000211e-6, 5756.566278634, 3.789392838 }, { 0.000209e-6, 5750.203491159, 1.661943545 }, { 0.000240e-6, 12489.885628707, 5.684549045 }, /* 351, 360 */ { 0.000216e-6, 6303.851245484, 3.862942261 }, { 0.000203e-6, 1581.959348283, 5.549853589 }, { 0.000200e-6, 5642.198242609, 1.016115785 }, { 0.000197e-6, -70.849445304, 4.690702525 }, { 0.000227e-6, 6287.008003254, 2.911891613 }, { 0.000197e-6, 533.623118358, 1.048982898 }, { 0.000205e-6, -6279.485421340, 1.829362730 }, { 0.000209e-6, -10988.808157535, 2.636140084 }, { 0.000208e-6, -227.526189440, 4.127883842 }, { 0.000191e-6, 415.552490612, 4.401165650 }, /* 361, 370 */ { 0.000190e-6, 29296.615389579, 4.175658539 }, { 0.000264e-6, 66567.485864652, 4.601102551 }, { 0.000256e-6, -3646.350377354, 0.506364778 }, { 0.000188e-6, 13119.721102825, 2.032195842 }, { 0.000185e-6, -209.366942175, 4.694756586 }, { 0.000198e-6, 25934.124331089, 3.832703118 }, { 0.000195e-6, 4061.219215394, 3.308463427 }, { 0.000234e-6, 5113.487598583, 1.716090661 }, { 0.000188e-6, 1478.866574064, 5.686865780 }, { 0.000222e-6, 11823.161639450, 1.942386641 }, /* 371, 380 */ { 0.000181e-6, 10770.893256262, 1.999482059 }, { 0.000171e-6, 6546.159773364, 1.182807992 }, { 0.000206e-6, 70.328180442, 5.934076062 }, { 0.000169e-6, 20995.392966449, 2.169080622 }, { 0.000191e-6, 10660.686935042, 5.405515999 }, { 0.000228e-6, 33019.021112205, 4.656985514 }, { 0.000184e-6, -4933.208440333, 3.327476868 }, { 0.000220e-6, -135.625325010, 1.765430262 }, { 0.000166e-6, 23141.558382925, 3.454132746 }, { 0.000191e-6, 6144.558353121, 5.020393445 }, /* 381, 390 */ { 0.000180e-6, 6084.003848555, 0.602182191 }, { 0.000163e-6, 17782.732072784, 4.960593133 }, { 0.000225e-6, 16460.333529525, 2.596451817 }, { 0.000222e-6, 5905.702242076, 3.731990323 }, { 0.000204e-6, 227.476132789, 5.636192701 }, { 0.000159e-6, 16737.577236597, 3.600691544 }, { 0.000200e-6, 6805.653268085, 0.868220961 }, { 0.000187e-6, 11919.140866668, 2.629456641 }, { 0.000161e-6, 127.471796607, 2.862574720 }, { 0.000205e-6, 6286.666278643, 1.742882331 }, /* 391, 400 */ { 0.000189e-6, 153.778810485, 4.812372643 }, { 0.000168e-6, 16723.350142595, 0.027860588 }, { 0.000149e-6, 11720.068865232, 0.659721876 }, { 0.000189e-6, 5237.921013804, 5.245313000 }, { 0.000143e-6, 6709.674040867, 4.317625647 }, { 0.000146e-6, 4487.817406270, 4.815297007 }, { 0.000144e-6, -664.756045130, 5.381366880 }, { 0.000175e-6, 5127.714692584, 4.728443327 }, { 0.000162e-6, 6254.626662524, 1.435132069 }, { 0.000187e-6, 47162.516354635, 1.354371923 }, /* 401, 410 */ { 0.000146e-6, 11080.171578918, 3.369695406 }, { 0.000180e-6, -348.924420448, 2.490902145 }, { 0.000148e-6, 151.047669843, 3.799109588 }, { 0.000157e-6, 6197.248551160, 1.284375887 }, { 0.000167e-6, 146.594251718, 0.759969109 }, { 0.000133e-6, -5331.357443741, 5.409701889 }, { 0.000154e-6, 95.979227218, 3.366890614 }, { 0.000148e-6, -6418.140930027, 3.384104996 }, { 0.000128e-6, -6525.804453965, 3.803419985 }, { 0.000130e-6, 11293.470674356, 0.939039445 }, /* 411, 420 */ { 0.000152e-6, -5729.506447149, 0.734117523 }, { 0.000138e-6, 210.117701700, 2.564216078 }, { 0.000123e-6, 6066.595360816, 4.517099537 }, { 0.000140e-6, 18451.078546566, 0.642049130 }, { 0.000126e-6, 11300.584221356, 3.485280663 }, { 0.000119e-6, 10027.903195729, 3.217431161 }, { 0.000151e-6, 4274.518310832, 4.404359108 }, { 0.000117e-6, 6072.958148291, 0.366324650 }, { 0.000165e-6, -7668.637425143, 4.298212528 }, { 0.000117e-6, -6245.048177356, 5.379518958 }, /* 421, 430 */ { 0.000130e-6, -5888.449964932, 4.527681115 }, { 0.000121e-6, -543.918059096, 6.109429504 }, { 0.000162e-6, 9683.594581116, 5.720092446 }, { 0.000141e-6, 6219.339951688, 0.679068671 }, { 0.000118e-6, 22743.409379516, 4.881123092 }, { 0.000129e-6, 1692.165669502, 0.351407289 }, { 0.000126e-6, 5657.405657679, 5.146592349 }, { 0.000114e-6, 728.762966531, 0.520791814 }, { 0.000120e-6, 52.596639600, 0.948516300 }, { 0.000115e-6, 65.220371012, 3.504914846 }, /* 431, 440 */ { 0.000126e-6, 5881.403728234, 5.577502482 }, { 0.000158e-6, 163096.180360983, 2.957128968 }, { 0.000134e-6, 12341.806904281, 2.598576764 }, { 0.000151e-6, 16627.370915377, 3.985702050 }, { 0.000109e-6, 1368.660252845, 0.014730471 }, { 0.000131e-6, 6211.263196841, 0.085077024 }, { 0.000146e-6, 5792.741760812, 0.708426604 }, { 0.000146e-6, -77.750543984, 3.121576600 }, { 0.000107e-6, 5341.013788022, 0.288231904 }, { 0.000138e-6, 6281.591377283, 2.797450317 }, /* 441, 450 */ { 0.000113e-6, -6277.552925684, 2.788904128 }, { 0.000115e-6, -525.758811831, 5.895222200 }, { 0.000138e-6, 6016.468808270, 6.096188999 }, { 0.000139e-6, 23539.707386333, 2.028195445 }, { 0.000146e-6, -4176.041342449, 4.660008502 }, { 0.000107e-6, 16062.184526117, 4.066520001 }, { 0.000142e-6, 83783.548222473, 2.936315115 }, { 0.000128e-6, 9380.959672717, 3.223844306 }, { 0.000135e-6, 6205.325306007, 1.638054048 }, { 0.000101e-6, 2699.734819318, 5.481603249 }, /* 451, 460 */ { 0.000104e-6, -568.821874027, 2.205734493 }, { 0.000103e-6, 6321.103522627, 2.440421099 }, { 0.000119e-6, 6321.208885629, 2.547496264 }, { 0.000138e-6, 1975.492545856, 2.314608466 }, { 0.000121e-6, 137.033024162, 4.539108237 }, { 0.000123e-6, 19402.796952817, 4.538074405 }, { 0.000119e-6, 22805.735565994, 2.869040566 }, { 0.000133e-6, 64471.991241142, 6.056405489 }, { 0.000129e-6, -85.827298831, 2.540635083 }, { 0.000131e-6, 13613.804277336, 4.005732868 }, /* 461, 470 */ { 0.000104e-6, 9814.604100291, 1.959967212 }, { 0.000112e-6, 16097.679950283, 3.589026260 }, { 0.000123e-6, 2107.034507542, 1.728627253 }, { 0.000121e-6, 36949.230808424, 6.072332087 }, { 0.000108e-6, -12539.853380183, 3.716133846 }, { 0.000113e-6, -7875.671863624, 2.725771122 }, { 0.000109e-6, 4171.425536614, 4.033338079 }, { 0.000101e-6, 6247.911759770, 3.441347021 }, { 0.000113e-6, 7330.728427345, 0.656372122 }, { 0.000113e-6, 51092.726050855, 2.791483066 }, /* 471, 480 */ { 0.000106e-6, 5621.842923210, 1.815323326 }, { 0.000101e-6, 111.430161497, 5.711033677 }, { 0.000103e-6, 909.818733055, 2.812745443 }, { 0.000101e-6, 1790.642637886, 1.965746028 }, /* T */ { 102.156724e-6, 6283.075849991, 4.249032005 }, { 1.706807e-6, 12566.151699983, 4.205904248 }, { 0.269668e-6, 213.299095438, 3.400290479 }, { 0.265919e-6, 529.690965095, 5.836047367 }, { 0.210568e-6, -3.523118349, 6.262738348 }, { 0.077996e-6, 5223.693919802, 4.670344204 }, /* 481, 490 */ { 0.054764e-6, 1577.343542448, 4.534800170 }, { 0.059146e-6, 26.298319800, 1.083044735 }, { 0.034420e-6, -398.149003408, 5.980077351 }, { 0.032088e-6, 18849.227549974, 4.162913471 }, { 0.033595e-6, 5507.553238667, 5.980162321 }, { 0.029198e-6, 5856.477659115, 0.623811863 }, { 0.027764e-6, 155.420399434, 3.745318113 }, { 0.025190e-6, 5746.271337896, 2.980330535 }, { 0.022997e-6, -796.298006816, 1.174411803 }, { 0.024976e-6, 5760.498431898, 2.467913690 }, /* 491, 500 */ { 0.021774e-6, 206.185548437, 3.854787540 }, { 0.017925e-6, -775.522611324, 1.092065955 }, { 0.013794e-6, 426.598190876, 2.699831988 }, { 0.013276e-6, 6062.663207553, 5.845801920 }, { 0.011774e-6, 12036.460734888, 2.292832062 }, { 0.012869e-6, 6076.890301554, 5.333425680 }, { 0.012152e-6, 1059.381930189, 6.222874454 }, { 0.011081e-6, -7.113547001, 5.154724984 }, { 0.010143e-6, 4694.002954708, 4.044013795 }, { 0.009357e-6, 5486.777843175, 3.416081409 }, /* 501, 510 */ { 0.010084e-6, 522.577418094, 0.749320262 }, { 0.008587e-6, 10977.078804699, 2.777152598 }, { 0.008628e-6, 6275.962302991, 4.562060226 }, { 0.008158e-6, -220.412642439, 5.806891533 }, { 0.007746e-6, 2544.314419883, 1.603197066 }, { 0.007670e-6, 2146.165416475, 3.000200440 }, { 0.007098e-6, 74.781598567, 0.443725817 }, { 0.006180e-6, -536.804512095, 1.302642751 }, { 0.005818e-6, 5088.628839767, 4.827723531 }, { 0.004945e-6, -6286.598968340, 0.268305170 }, /* 511, 520 */ { 0.004774e-6, 1349.867409659, 5.808636673 }, { 0.004687e-6, -242.728603974, 5.154890570 }, { 0.006089e-6, 1748.016413067, 4.403765209 }, { 0.005975e-6, -1194.447010225, 2.583472591 }, { 0.004229e-6, 951.718406251, 0.931172179 }, { 0.005264e-6, 553.569402842, 2.336107252 }, { 0.003049e-6, 5643.178563677, 1.362634430 }, { 0.002974e-6, 6812.766815086, 1.583012668 }, { 0.003403e-6, -2352.866153772, 2.552189886 }, { 0.003030e-6, 419.484643875, 5.286473844 }, /* 521, 530 */ { 0.003210e-6, -7.046236698, 1.863796539 }, { 0.003058e-6, 9437.762934887, 4.226420633 }, { 0.002589e-6, 12352.852604545, 1.991935820 }, { 0.002927e-6, 5216.580372801, 2.319951253 }, { 0.002425e-6, 5230.807466803, 3.084752833 }, { 0.002656e-6, 3154.687084896, 2.487447866 }, { 0.002445e-6, 10447.387839604, 2.347139160 }, { 0.002990e-6, 4690.479836359, 6.235872050 }, { 0.002890e-6, 5863.591206116, 0.095197563 }, { 0.002498e-6, 6438.496249426, 2.994779800 }, /* 531, 540 */ { 0.001889e-6, 8031.092263058, 3.569003717 }, { 0.002567e-6, 801.820931124, 3.425611498 }, { 0.001803e-6, -71430.695617928, 2.192295512 }, { 0.001782e-6, 3.932153263, 5.180433689 }, { 0.001694e-6, -4705.732307544, 4.641779174 }, { 0.001704e-6, -1592.596013633, 3.997097652 }, { 0.001735e-6, 5849.364112115, 0.417558428 }, { 0.001643e-6, 8429.241266467, 2.180619584 }, { 0.001680e-6, 38.133035638, 4.164529426 }, { 0.002045e-6, 7084.896781115, 0.526323854 }, /* 541, 550 */ { 0.001458e-6, 4292.330832950, 1.356098141 }, { 0.001437e-6, 20.355319399, 3.895439360 }, { 0.001738e-6, 6279.552731642, 0.087484036 }, { 0.001367e-6, 14143.495242431, 3.987576591 }, { 0.001344e-6, 7234.794256242, 0.090454338 }, { 0.001438e-6, 11499.656222793, 0.974387904 }, { 0.001257e-6, 6836.645252834, 1.509069366 }, { 0.001358e-6, 11513.883316794, 0.495572260 }, { 0.001628e-6, 7632.943259650, 4.968445721 }, { 0.001169e-6, 103.092774219, 2.838496795 }, /* 551, 560 */ { 0.001162e-6, 4164.311989613, 3.408387778 }, { 0.001092e-6, 6069.776754553, 3.617942651 }, { 0.001008e-6, 17789.845619785, 0.286350174 }, { 0.001008e-6, 639.897286314, 1.610762073 }, { 0.000918e-6, 10213.285546211, 5.532798067 }, { 0.001011e-6, -6256.777530192, 0.661826484 }, { 0.000753e-6, 16730.463689596, 3.905030235 }, { 0.000737e-6, 11926.254413669, 4.641956361 }, { 0.000694e-6, 3340.612426700, 2.111120332 }, { 0.000701e-6, 3894.181829542, 2.760823491 }, /* 561, 570 */ { 0.000689e-6, -135.065080035, 4.768800780 }, { 0.000700e-6, 13367.972631107, 5.760439898 }, { 0.000664e-6, 6040.347246017, 1.051215840 }, { 0.000654e-6, 5650.292110678, 4.911332503 }, { 0.000788e-6, 6681.224853400, 4.699648011 }, { 0.000628e-6, 5333.900241022, 5.024608847 }, { 0.000755e-6, -110.206321219, 4.370971253 }, { 0.000628e-6, 6290.189396992, 3.660478857 }, { 0.000635e-6, 25132.303399966, 4.121051532 }, { 0.000534e-6, 5966.683980335, 1.173284524 }, /* 571, 580 */ { 0.000543e-6, -433.711737877, 0.345585464 }, { 0.000517e-6, -1990.745017041, 5.414571768 }, { 0.000504e-6, 5767.611978898, 2.328281115 }, { 0.000485e-6, 5753.384884897, 1.685874771 }, { 0.000463e-6, 7860.419392439, 5.297703006 }, { 0.000604e-6, 515.463871093, 0.591998446 }, { 0.000443e-6, 12168.002696575, 4.830881244 }, { 0.000570e-6, 199.072001436, 3.899190272 }, { 0.000465e-6, 10969.965257698, 0.476681802 }, { 0.000424e-6, -7079.373856808, 1.112242763 }, /* 581, 590 */ { 0.000427e-6, 735.876513532, 1.994214480 }, { 0.000478e-6, -6127.655450557, 3.778025483 }, { 0.000414e-6, 10973.555686350, 5.441088327 }, { 0.000512e-6, 1589.072895284, 0.107123853 }, { 0.000378e-6, 10984.192351700, 0.915087231 }, { 0.000402e-6, 11371.704689758, 4.107281715 }, { 0.000453e-6, 9917.696874510, 1.917490952 }, { 0.000395e-6, 149.563197135, 2.763124165 }, { 0.000371e-6, 5739.157790895, 3.112111866 }, { 0.000350e-6, 11790.629088659, 0.440639857 }, /* 591, 600 */ { 0.000356e-6, 6133.512652857, 5.444568842 }, { 0.000344e-6, 412.371096874, 5.676832684 }, { 0.000383e-6, 955.599741609, 5.559734846 }, { 0.000333e-6, 6496.374945429, 0.261537984 }, { 0.000340e-6, 6055.549660552, 5.975534987 }, { 0.000334e-6, 1066.495477190, 2.335063907 }, { 0.000399e-6, 11506.769769794, 5.321230910 }, { 0.000314e-6, 18319.536584880, 2.313312404 }, { 0.000424e-6, 1052.268383188, 1.211961766 }, { 0.000307e-6, 63.735898303, 3.169551388 }, /* 601, 610 */ { 0.000329e-6, 29.821438149, 6.106912080 }, { 0.000357e-6, 6309.374169791, 4.223760346 }, { 0.000312e-6, -3738.761430108, 2.180556645 }, { 0.000301e-6, 309.278322656, 1.499984572 }, { 0.000268e-6, 12043.574281889, 2.447520648 }, { 0.000257e-6, 12491.370101415, 3.662331761 }, { 0.000290e-6, 625.670192312, 1.272834584 }, { 0.000256e-6, 5429.879468239, 1.913426912 }, { 0.000339e-6, 3496.032826134, 4.165930011 }, { 0.000283e-6, 3930.209696220, 4.325565754 }, /* 611, 620 */ { 0.000241e-6, 12528.018664345, 3.832324536 }, { 0.000304e-6, 4686.889407707, 1.612348468 }, { 0.000259e-6, 16200.772724501, 3.470173146 }, { 0.000238e-6, 12139.553509107, 1.147977842 }, { 0.000236e-6, 6172.869528772, 3.776271728 }, { 0.000296e-6, -7058.598461315, 0.460368852 }, { 0.000306e-6, 10575.406682942, 0.554749016 }, { 0.000251e-6, 17298.182327326, 0.834332510 }, { 0.000290e-6, 4732.030627343, 4.759564091 }, { 0.000261e-6, 5884.926846583, 0.298259862 }, /* 621, 630 */ { 0.000249e-6, 5547.199336460, 3.749366406 }, { 0.000213e-6, 11712.955318231, 5.415666119 }, { 0.000223e-6, 4701.116501708, 2.703203558 }, { 0.000268e-6, -640.877607382, 0.283670793 }, { 0.000209e-6, 5636.065016677, 1.238477199 }, { 0.000193e-6, 10177.257679534, 1.943251340 }, { 0.000182e-6, 6283.143160294, 2.456157599 }, { 0.000184e-6, -227.526189440, 5.888038582 }, { 0.000182e-6, -6283.008539689, 0.241332086 }, { 0.000228e-6, -6284.056171060, 2.657323816 }, /* 631, 640 */ { 0.000166e-6, 7238.675591600, 5.930629110 }, { 0.000167e-6, 3097.883822726, 5.570955333 }, { 0.000159e-6, -323.505416657, 5.786670700 }, { 0.000154e-6, -4136.910433516, 1.517805532 }, { 0.000176e-6, 12029.347187887, 3.139266834 }, { 0.000167e-6, 12132.439962106, 3.556352289 }, { 0.000153e-6, 202.253395174, 1.463313961 }, { 0.000157e-6, 17267.268201691, 1.586837396 }, { 0.000142e-6, 83996.847317911, 0.022670115 }, { 0.000152e-6, 17260.154654690, 0.708528947 }, /* 641, 650 */ { 0.000144e-6, 6084.003848555, 5.187075177 }, { 0.000135e-6, 5756.566278634, 1.993229262 }, { 0.000134e-6, 5750.203491159, 3.457197134 }, { 0.000144e-6, 5326.786694021, 6.066193291 }, { 0.000160e-6, 11015.106477335, 1.710431974 }, { 0.000133e-6, 3634.621024518, 2.836451652 }, { 0.000134e-6, 18073.704938650, 5.453106665 }, { 0.000134e-6, 1162.474704408, 5.326898811 }, { 0.000128e-6, 5642.198242609, 2.511652591 }, { 0.000160e-6, 632.783739313, 5.628785365 }, /* 651, 660 */ { 0.000132e-6, 13916.019109642, 0.819294053 }, { 0.000122e-6, 14314.168113050, 5.677408071 }, { 0.000125e-6, 12359.966151546, 5.251984735 }, { 0.000121e-6, 5749.452731634, 2.210924603 }, { 0.000136e-6, -245.831646229, 1.646502367 }, { 0.000120e-6, 5757.317038160, 3.240883049 }, { 0.000134e-6, 12146.667056108, 3.059480037 }, { 0.000137e-6, 6206.809778716, 1.867105418 }, { 0.000141e-6, 17253.041107690, 2.069217456 }, { 0.000129e-6, -7477.522860216, 2.781469314 }, /* 661, 670 */ { 0.000116e-6, 5540.085789459, 4.281176991 }, { 0.000116e-6, 9779.108676125, 3.320925381 }, { 0.000129e-6, 5237.921013804, 3.497704076 }, { 0.000113e-6, 5959.570433334, 0.983210840 }, { 0.000122e-6, 6282.095528923, 2.674938860 }, { 0.000140e-6, -11.045700264, 4.957936982 }, { 0.000108e-6, 23543.230504682, 1.390113589 }, { 0.000106e-6, -12569.674818332, 0.429631317 }, { 0.000110e-6, -266.607041722, 5.501340197 }, { 0.000115e-6, 12559.038152982, 4.691456618 }, /* 671, 680 */ { 0.000134e-6, -2388.894020449, 0.577313584 }, { 0.000109e-6, 10440.274292604, 6.218148717 }, { 0.000102e-6, -543.918059096, 1.477842615 }, { 0.000108e-6, 21228.392023546, 2.237753948 }, { 0.000101e-6, -4535.059436924, 3.100492232 }, { 0.000103e-6, 76.266071276, 5.594294322 }, { 0.000104e-6, 949.175608970, 5.674287810 }, { 0.000101e-6, 13517.870106233, 2.196632348 }, { 0.000100e-6, 11933.367960670, 4.056084160 }, /* T^2 */ { 4.322990e-6, 6283.075849991, 2.642893748 }, /* 681, 690 */ { 0.406495e-6, 0.000000000, 4.712388980 }, { 0.122605e-6, 12566.151699983, 2.438140634 }, { 0.019476e-6, 213.299095438, 1.642186981 }, { 0.016916e-6, 529.690965095, 4.510959344 }, { 0.013374e-6, -3.523118349, 1.502210314 }, { 0.008042e-6, 26.298319800, 0.478549024 }, { 0.007824e-6, 155.420399434, 5.254710405 }, { 0.004894e-6, 5746.271337896, 4.683210850 }, { 0.004875e-6, 5760.498431898, 0.759507698 }, { 0.004416e-6, 5223.693919802, 6.028853166 }, /* 691, 700 */ { 0.004088e-6, -7.113547001, 0.060926389 }, { 0.004433e-6, 77713.771467920, 3.627734103 }, { 0.003277e-6, 18849.227549974, 2.327912542 }, { 0.002703e-6, 6062.663207553, 1.271941729 }, { 0.003435e-6, -775.522611324, 0.747446224 }, { 0.002618e-6, 6076.890301554, 3.633715689 }, { 0.003146e-6, 206.185548437, 5.647874613 }, { 0.002544e-6, 1577.343542448, 6.232904270 }, { 0.002218e-6, -220.412642439, 1.309509946 }, { 0.002197e-6, 5856.477659115, 2.407212349 }, /* 701, 710 */ { 0.002897e-6, 5753.384884897, 5.863842246 }, { 0.001766e-6, 426.598190876, 0.754113147 }, { 0.001738e-6, -796.298006816, 2.714942671 }, { 0.001695e-6, 522.577418094, 2.629369842 }, { 0.001584e-6, 5507.553238667, 1.341138229 }, { 0.001503e-6, -242.728603974, 0.377699736 }, { 0.001552e-6, -536.804512095, 2.904684667 }, { 0.001370e-6, -398.149003408, 1.265599125 }, { 0.001889e-6, -5573.142801634, 4.413514859 }, { 0.001722e-6, 6069.776754553, 2.445966339 }, /* 711, 720 */ { 0.001124e-6, 1059.381930189, 5.041799657 }, { 0.001258e-6, 553.569402842, 3.849557278 }, { 0.000831e-6, 951.718406251, 2.471094709 }, { 0.000767e-6, 4694.002954708, 5.363125422 }, { 0.000756e-6, 1349.867409659, 1.046195744 }, { 0.000775e-6, -11.045700264, 0.245548001 }, { 0.000597e-6, 2146.165416475, 4.543268798 }, { 0.000568e-6, 5216.580372801, 4.178853144 }, { 0.000711e-6, 1748.016413067, 5.934271972 }, { 0.000499e-6, 12036.460734888, 0.624434410 }, /* 721, 730 */ { 0.000671e-6, -1194.447010225, 4.136047594 }, { 0.000488e-6, 5849.364112115, 2.209679987 }, { 0.000621e-6, 6438.496249426, 4.518860804 }, { 0.000495e-6, -6286.598968340, 1.868201275 }, { 0.000456e-6, 5230.807466803, 1.271231591 }, { 0.000451e-6, 5088.628839767, 0.084060889 }, { 0.000435e-6, 5643.178563677, 3.324456609 }, { 0.000387e-6, 10977.078804699, 4.052488477 }, { 0.000547e-6, 161000.685737473, 2.841633844 }, { 0.000522e-6, 3154.687084896, 2.171979966 }, /* 731, 740 */ { 0.000375e-6, 5486.777843175, 4.983027306 }, { 0.000421e-6, 5863.591206116, 4.546432249 }, { 0.000439e-6, 7084.896781115, 0.522967921 }, { 0.000309e-6, 2544.314419883, 3.172606705 }, { 0.000347e-6, 4690.479836359, 1.479586566 }, { 0.000317e-6, 801.820931124, 3.553088096 }, { 0.000262e-6, 419.484643875, 0.606635550 }, { 0.000248e-6, 6836.645252834, 3.014082064 }, { 0.000245e-6, -1592.596013633, 5.519526220 }, { 0.000225e-6, 4292.330832950, 2.877956536 }, /* 741, 750 */ { 0.000214e-6, 7234.794256242, 1.605227587 }, { 0.000205e-6, 5767.611978898, 0.625804796 }, { 0.000180e-6, 10447.387839604, 3.499954526 }, { 0.000229e-6, 199.072001436, 5.632304604 }, { 0.000214e-6, 639.897286314, 5.960227667 }, { 0.000175e-6, -433.711737877, 2.162417992 }, { 0.000209e-6, 515.463871093, 2.322150893 }, { 0.000173e-6, 6040.347246017, 2.556183691 }, { 0.000184e-6, 6309.374169791, 4.732296790 }, { 0.000227e-6, 149854.400134205, 5.385812217 }, /* 751, 760 */ { 0.000154e-6, 8031.092263058, 5.120720920 }, { 0.000151e-6, 5739.157790895, 4.815000443 }, { 0.000197e-6, 7632.943259650, 0.222827271 }, { 0.000197e-6, 74.781598567, 3.910456770 }, { 0.000138e-6, 6055.549660552, 1.397484253 }, { 0.000149e-6, -6127.655450557, 5.333727496 }, { 0.000137e-6, 3894.181829542, 4.281749907 }, { 0.000135e-6, 9437.762934887, 5.979971885 }, { 0.000139e-6, -2352.866153772, 4.715630782 }, { 0.000142e-6, 6812.766815086, 0.513330157 }, /* 761, 770 */ { 0.000120e-6, -4705.732307544, 0.194160689 }, { 0.000131e-6, -71430.695617928, 0.000379226 }, { 0.000124e-6, 6279.552731642, 2.122264908 }, { 0.000108e-6, -6256.777530192, 0.883445696 }, /* T^3 */ { 0.143388e-6, 6283.075849991, 1.131453581 }, { 0.006671e-6, 12566.151699983, 0.775148887 }, { 0.001480e-6, 155.420399434, 0.480016880 }, { 0.000934e-6, 213.299095438, 6.144453084 }, { 0.000795e-6, 529.690965095, 2.941595619 }, { 0.000673e-6, 5746.271337896, 0.120415406 }, /* 771, 780 */ { 0.000672e-6, 5760.498431898, 5.317009738 }, { 0.000389e-6, -220.412642439, 3.090323467 }, { 0.000373e-6, 6062.663207553, 3.003551964 }, { 0.000360e-6, 6076.890301554, 1.918913041 }, { 0.000316e-6, -21.340641002, 5.545798121 }, { 0.000315e-6, -242.728603974, 1.884932563 }, { 0.000278e-6, 206.185548437, 1.266254859 }, { 0.000238e-6, -536.804512095, 4.532664830 }, { 0.000185e-6, 522.577418094, 4.578313856 }, { 0.000245e-6, 18849.227549974, 0.587467082 }, /* 781, 787 */ { 0.000180e-6, 426.598190876, 5.151178553 }, { 0.000200e-6, 553.569402842, 5.355983739 }, { 0.000141e-6, 5223.693919802, 1.336556009 }, { 0.000104e-6, 5856.477659115, 4.239842759 }, /* T^4 */ { 0.003826e-6, 6283.075849991, 5.705257275 }, { 0.000303e-6, 12566.151699983, 5.407132842 }, { 0.000209e-6, 155.420399434, 1.989815753 } }; /* Time since J2000.0 in Julian millennia. */ t = ((date1 - DJ00) + date2) / DJM; /* ================= */ /* Topocentric terms */ /* ================= */ /* Convert UT to local solar time in radians. */ tsol = fmod(ut, 1.0) * D2PI + elong; /* FUNDAMENTAL ARGUMENTS: Simon et al. 1994. */ /* Combine time argument (millennia) with deg/arcsec factor. */ w = t / 3600.0; /* Sun Mean Longitude. */ elsun = fmod(280.46645683 + 1296027711.03429 * w, 360.0) * DD2R; /* Sun Mean Anomaly. */ emsun = fmod(357.52910918 + 1295965810.481 * w, 360.0) * DD2R; /* Mean Elongation of Moon from Sun. */ d = fmod(297.85019547 + 16029616012.090 * w, 360.0) * DD2R; /* Mean Longitude of Jupiter. */ elj = fmod(34.35151874 + 109306899.89453 * w, 360.0) * DD2R; /* Mean Longitude of Saturn. */ els = fmod(50.07744430 + 44046398.47038 * w, 360.0) * DD2R; /* TOPOCENTRIC TERMS: Moyer 1981 and Murray 1983. */ wt = + 0.00029e-10 * u * sin(tsol + elsun - els) + 0.00100e-10 * u * sin(tsol - 2.0 * emsun) + 0.00133e-10 * u * sin(tsol - d) + 0.00133e-10 * u * sin(tsol + elsun - elj) - 0.00229e-10 * u * sin(tsol + 2.0 * elsun + emsun) - 0.02200e-10 * v * cos(elsun + emsun) + 0.05312e-10 * u * sin(tsol - emsun) - 0.13677e-10 * u * sin(tsol + 2.0 * elsun) - 1.31840e-10 * v * cos(elsun) + 3.17679e-10 * u * sin(tsol); /* ===================== */ /* Fairhead et al. model */ /* ===================== */ /* T**0 */ w0 = 0; for (j = 473; j >= 0; j--) { w0 += fairhd[j][0] * sin(fairhd[j][1] * t + fairhd[j][2]); } /* T**1 */ w1 = 0; for (j = 678; j >= 474; j--) { w1 += fairhd[j][0] * sin(fairhd[j][1] * t + fairhd[j][2]); } /* T**2 */ w2 = 0; for (j = 763; j >= 679; j--) { w2 += fairhd[j][0] * sin(fairhd[j][1] * t + fairhd[j][2]); } /* T**3 */ w3 = 0; for (j = 783; j >= 764; j--) { w3 += fairhd[j][0] * sin(fairhd[j][1] * t + fairhd[j][2]); } /* T**4 */ w4 = 0; for (j = 786; j >= 784; j--) { w4 += fairhd[j][0] * sin(fairhd[j][1] * t + fairhd[j][2]); } /* Multiply by powers of T and combine. */ wf = t * (t * (t * (t * w4 + w3) + w2) + w1) + w0; /* Adjustments to use JPL planetary masses instead of IAU. */ wj = 0.00065e-6 * sin(6069.776754 * t + 4.021194) + 0.00033e-6 * sin( 213.299095 * t + 5.543132) + (-0.00196e-6 * sin(6208.294251 * t + 5.696701)) + (-0.00173e-6 * sin( 74.781599 * t + 2.435900)) + 0.03638e-6 * t * t; /* ============ */ /* Final result */ /* ============ */ /* TDB-TT in seconds. */ w = wt + wf + wj; return w; } /** * The equation of the equinoxes, compatible with IAU 2000 resolutions, * given the nutation in longitude and the mean obliquity. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * @param epsa double mean obliquity (Note 2) * @param dpsi double nutation in longitude (Note 3) * * * @return double equation of the equinoxes (Note 4) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The obliquity, in radians, is mean of date. * *
  3. The result, which is in radians, operates in the following sense: * * Greenwich apparent ST = GMST + equation of the equinoxes * *
  4. The result is compatible with the IAU 2000 resolutions. For * further details, see IERS Conventions 2003 and Capitaine et al. * (2002). *
*

Called:

* * *

Capitaine, N., Wallace, P.T. and McCarthy, D.D., "Expressions to * implement the IAU 2000 definition of UT1", Astronomy & * Astrophysics, 406, 1135-1149 (2003) * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2008 May 16 * * @since Release 20101201 * * */ public static double jauEe00(double date1, double date2, double epsa, double dpsi) { double ee; /* Equation of the equinoxes. */ ee = dpsi * cos(epsa) + jauEect00(date1, date2); return ee; } /** * Equation of the equinoxes, compatible with IAU 2000 resolutions. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return double equation of the equinoxes (Note 2) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The result, which is in radians, operates in the following sense: * * Greenwich apparent ST = GMST + equation of the equinoxes * *
  3. The result is compatible with the IAU 2000 resolutions. For * further details, see IERS Conventions 2003 and Capitaine et al. * (2002). *
*

Called:

*

References: * *

Capitaine, N., Wallace, P.T. and McCarthy, D.D., "Expressions to * implement the IAU 2000 definition of UT1", Astronomy & * Astrophysics, 406, 1135-1149 (2003). * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004). * *@version 2008 May 16 * * @since Release 20101201 * * */ public static double jauEe00a(double date1, double date2) { double epsa, ee; /* IAU 2000 precession-rate adjustments. */ PrecessionDeltaTerms nutd = jauPr00(date1, date2); /* Mean obliquity, consistent with IAU 2000 precession-nutation. */ epsa = jauObl80(date1, date2) + nutd.depspr; /* Nutation in longitude. */ NutationTerms nut = jauNut00a(date1, date2); /* Equation of the equinoxes. */ ee = jauEe00(date1, date2, epsa, nut.dpsi); return ee; } /** * Equation of the equinoxes, compatible with IAU 2000 resolutions but * using the truncated nutation model IAU 2000B. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return double equation of the equinoxes (Note 2) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The result, which is in radians, operates in the following sense: * * Greenwich apparent ST = GMST + equation of the equinoxes * *
  3. The result is compatible with the IAU 2000 resolutions except * that accuracy has been compromised (1 mas) for the sake of speed. For * further details, see McCarthy & Luzum (2001), IERS Conventions * 2003 and Capitaine et al. (2003). *
*

Called:

* * *

Capitaine, N., Wallace, P.T. and McCarthy, D.D., "Expressions to * implement the IAU 2000 definition of UT1", Astronomy & * Astrophysics, 406, 1135-1149 (2003) * *

McCarthy, D.D. & Luzum, B.J., "An abridged model of the * precession-nutation of the celestial pole", Celestial Mechanics & * Dynamical Astronomy, 85, 37-49 (2003) * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2008 May 18 * * @since Release 20101201 * * */ public static double jauEe00b(double date1, double date2) { double ee; /* IAU 2000 precession-rate adjustments. */ PrecessionDeltaTerms nutd = jauPr00(date1, date2); /* Mean obliquity, consistent with IAU 2000 precession-nutation. */ double epsa = jauObl80(date1, date2) + nutd.depspr; /* Nutation in longitude. dpsi, deps*/ NutationTerms nut = jauNut00b(date1, date2 ); /* Equation of the equinoxes. */ ee = jauEe00(date1, date2, epsa, nut.dpsi); return ee; } /** * Equation of the equinoxes, compatible with IAU 2000 resolutions and * IAU 2006/2000A precession-nutation. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return double equation of the equinoxes (Note 2) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The result, which is in radians, operates in the following sense: * * Greenwich apparent ST = GMST + equation of the equinoxes *
*

Called:

*

Reference: * *

McCarthy, D. D., Petit, G. (eds.), 2004, IERS Conventions (2003), * IERS Technical Note No. 32, BKG * *@version 2008 May 18 * * @since Release 20101201 * * */ public static double jauEe06a(double date1, double date2) { double gst06a, gmst06, ee; /* Apparent and mean sidereal times. */ gst06a = jauGst06a(0.0, 0.0, date1, date2); gmst06 = jauGmst06(0.0, 0.0, date1, date2); /* Equation of the equinoxes. */ ee = jauAnpm(gst06a - gmst06); return ee; } private static class TERM { final int nfa[]; /* coefficients of l,l',F,D,Om,LVe,LE,pA */ final double s, c; /* sine and cosine coefficients */ public TERM(int nfa[], double s, double c) { this.nfa = nfa; this.s = s; this.c = c; } } /** * Equation of the equinoxes complementary terms, consistent with * IAU 2000 resolutions. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return double complementary terms (Note 2) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The "complementary terms" are part of the equation of the * equinoxes (EE), classically the difference between apparent and * mean Sidereal Time: * * GAST = GMST + EE * * with: * * EE = dpsi * cos(eps) * * where dpsi is the nutation in longitude and eps is the obliquity * of date. However, if the rotation of the Earth were constant in * an inertial frame the classical formulation would lead to * apparent irregularities in the UT1 timescale traceable to side- * effects of precession-nutation. In order to eliminate these * effects from UT1, "complementary terms" were introduced in 1994 * (IAU, 1994) and took effect from 1997 (Capitaine and Gontier, *
  3. : * * GAST = GMST + CT + EE * * By convention, the complementary terms are included as part of * the equation of the equinoxes rather than as part of the mean * Sidereal Time. This slightly compromises the "geometrical" * interpretation of mean sidereal time but is otherwise * inconsequential. * * The present function computes CT in the above expression, * compatible with IAU 2000 resolutions (Capitaine et al., 2002, and * IERS Conventions 2003). *
*

Called:

*

References: * *

Capitaine, N. & Gontier, A.-M., Astron. Astrophys., 275, * 645-650 (1993) * *

Capitaine, N., Wallace, P.T. and McCarthy, D.D., "Expressions to * implement the IAU 2000 definition of UT1", Astronomy & * Astrophysics, 406, 1135-1149 (2003) * *

IAU Resolution C7, Recommendation 3 (1994) * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2009 December 17 * * @since Release 20101201 * * */ public static double jauEect00(double date1, double date2) { /* Time since J2000.0, in Julian centuries */ double t; /* Miscellaneous */ int i, j; double a, s0, s1; /* Fundamental arguments */ double fa[] = new double[14]; /* Returned value. */ double eect; /* ----------------------------------------- */ /* The series for the EE complementary terms */ /* ----------------------------------------- */ /* Terms of order t^0 */ final TERM e0[] = { /* 1-10 */ new TERM(new int[]{ 0, 0, 0, 0, 1, 0, 0, 0}, 2640.96e-6, -0.39e-6 ), new TERM(new int[]{ 0, 0, 0, 0, 2, 0, 0, 0}, 63.52e-6, -0.02e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 3, 0, 0, 0}, 11.75e-6, 0.01e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 1, 0, 0, 0}, 11.21e-6, 0.01e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 2, 0, 0, 0}, -4.55e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 3, 0, 0, 0}, 2.02e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 1, 0, 0, 0}, 1.98e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 0, 0, 3, 0, 0, 0}, -1.72e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, 0, 0, 1, 0, 0, 0}, -1.41e-6, -0.01e-6 ), new TERM(new int[]{ 0, 1, 0, 0, -1, 0, 0, 0}, -1.26e-6, -0.01e-6 ), /* 11-20 */ new TERM(new int[]{ 1, 0, 0, 0, -1, 0, 0, 0}, -0.63e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 0, 0, 1, 0, 0, 0}, -0.63e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, 2, -2, 3, 0, 0, 0}, 0.46e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, 2, -2, 1, 0, 0, 0}, 0.45e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 4, -4, 4, 0, 0, 0}, 0.36e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 1, -1, 1, -8, 12, 0}, -0.24e-6, -0.12e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 0, 0, 0, 0}, 0.32e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 2, 0, 0, 0}, 0.28e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 2, 0, 3, 0, 0, 0}, 0.27e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 2, 0, 1, 0, 0, 0}, 0.26e-6, 0.00e-6 ), /* 21-30 */ new TERM(new int[]{ 0, 0, 2, -2, 0, 0, 0, 0}, -0.21e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, -2, 2, -3, 0, 0, 0}, 0.19e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, -2, 2, -1, 0, 0, 0}, 0.18e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 0, 0, 0, 8,-13, -1}, -0.10e-6, 0.05e-6 ), new TERM(new int[]{ 0, 0, 0, 2, 0, 0, 0, 0}, 0.15e-6, 0.00e-6 ), new TERM(new int[]{ 2, 0, -2, 0, -1, 0, 0, 0}, -0.14e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 0, -2, 1, 0, 0, 0}, 0.14e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, 2, -2, 2, 0, 0, 0}, -0.14e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 0, -2, -1, 0, 0, 0}, 0.14e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 4, -2, 4, 0, 0, 0}, 0.13e-6, 0.00e-6 ), /* 31-33 */ new TERM(new int[]{ 0, 0, 2, -2, 4, 0, 0, 0}, -0.11e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, -2, 0, -3, 0, 0, 0}, 0.11e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, -2, 0, -1, 0, 0, 0}, 0.11e-6, 0.00e-6 ) }; /* Terms of order t^1 */ final TERM e1[] = { new TERM(new int[]{ 0, 0, 0, 0, 1, 0, 0, 0}, -0.87e-6, 0.00e-6 ) }; /* Number of terms in the series */ final int NE0 = e0.length; final int NE1 = e1.length; /*--------------------------------------------------------------------*/ /* Interval between fundamental epoch J2000.0 and current date (JC). */ t = ((date1 - DJ00) + date2) / DJC; /* Fundamental Arguments (from IERS Conventions 2003) */ /* Mean anomaly of the Moon. */ fa[0] = jauFal03(t); /* Mean anomaly of the Sun. */ fa[1] = jauFalp03(t); /* Mean longitude of the Moon minus that of the ascending node. */ fa[2] = jauFaf03(t); /* Mean elongation of the Moon from the Sun. */ fa[3] = jauFad03(t); /* Mean longitude of the ascending node of the Moon. */ fa[4] = jauFaom03(t); /* Mean longitude of Venus. */ fa[5] = jauFave03(t); /* Mean longitude of Earth. */ fa[6] = jauFae03(t); /* General precession in longitude. */ fa[7] = jauFapa03(t); /* Evaluate the EE complementary terms. */ s0 = 0.0; s1 = 0.0; for (i = NE0-1; i >= 0; i--) { a = 0.0; for (j = 0; j < 8; j++) { a += (double)(e0[i].nfa[j]) * fa[j]; } s0 += e0[i].s * sin(a) + e0[i].c * cos(a); } for (i = NE1-1; i >= 0; i--) { a = 0.0; for (j = 0; j < 8; j++) { a += (double)(e1[i].nfa[j]) * fa[j]; } s1 += e1[i].s * sin(a) + e1[i].c * cos(a); } eect = (s0 + s1 * t ) * DAS2R; return eect; } /** * Reference Ellipsoid of Earth. * * The ellipsoid parameters are returned in the form of equatorial * radius in meters (a) and flattening (f). The latter is a number * around 0.00335, i.e. around 1/298. * * @author Paul Harrison (paul.harrison@manchester.ac.uk) 1 Feb 2010 * * @since AIDA Stage 1 */ public static class ReferenceEllipsoid{ /** equatorial radius (meters, Note 2) */ public double a; /** flattening (Note 2) */ public double f ; public ReferenceEllipsoid(double a, double f ) { this.a = a; this.f = f; } } /** * Earth reference ellipsoids. * *

This function is derived from the International Astronomical Union's * JSOFA (Standards of Fundamental Astronomy) software collection. * *

Status: canonical. * * * @param n int ellipsoid identifier (Note 1) * * * @return a double returned equatorial radius (meters, Note 2) * f double returned flattening (Note 2) * * * @throws JSOFAIllegalParameter int status: * 0 = OK * -1 = illegal identifier (Note 3) * *

Notes: *

    * *
  1. The identifier n is a number that specifies the choice of * reference ellipsoid. The following are supported: * * n ellipsoid * * 1 WGS84 * 2 GRS80 * 3 WGS72 * * The number n has no significance outside the JSOFA software. * *
  2. The ellipsoid parameters are returned in the form of equatorial * radius in meters (a) and flattening (f). The latter is a number * around 0.00335, i.e. around 1/298. * *
  3. For the case where an unsupported n value is supplied, zero a and * f are returned, as well as error status. *
*

References: * *

Department of Defense World Geodetic System 1984, National * Imagery and Mapping Agency Technical Report 8350.2, Third * Edition, p3-2. * *

Moritz, H., Bull. Geodesique 66-2, 187 (1992). * *

The Department of Defense World Geodetic System 1972, World * Geodetic System Committee, May 1974. * *

Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992), * p220. * *@version 2010 January 18 * * @since Release 20101201 * * */ public static ReferenceEllipsoid jauEform ( int n ) throws JSOFAIllegalParameter { double a,f; /* Look up a and f for the specified reference ellipsoid. */ switch ( n ) { case 1: /* WGS84. */ a = 6378137.0; f = 1.0 / 298.257223563; break; case 2: /* GRS80. */ a = 6378137.0; f = 1.0 / 298.257222101; break; case 3: /* WGS72. */ a = 6378135.0; f = 1.0 / 298.26; break; default: /* Invalid identifier. */ a = 0.0; f = 0.0; throw new JSOFAIllegalParameter("illegal ellipsoid identifier", -1); } /* OK status. */ return new ReferenceEllipsoid(a, f); } /** * Equation of the origins, IAU 2006 precession and IAU 2000A nutation. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return double the equation of the origins in radians * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The equation of the origins is the distance between the true * equinox and the celestial intermediate origin and, equivalently, * the difference between Earth rotation angle and Greenwich * apparent sidereal time (ERA-GST). It comprises the precession * (since J2000.0) in right ascension plus the equation of the * equinoxes (including the small correction terms). *
*

Called:

*

References: * *

Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 * *

Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 * *@version 2008 May 16 * * @since Release 20101201 * * */ public static double jauEo06a(double date1, double date2) { double r[][], s, eo; /* Classical nutation x precession x bias matrix. */ r = jauPnm06a(date1, date2); /* Extract CIP coordinates. */ CelestialIntermediatePole cip = jauBpn2xy(r); /* The CIO locator, s. */ s = jauS06(date1, date2, cip.x, cip.y); /* Solve for the EO. */ eo = jauEors(r, s); return eo; } /** * Equation of the origins, given the classical NPB matrix and the * quantity s. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param rnpb double[3][3] classical nutation x precession x bias matrix * @param s double the quantity s (the CIO locator) in radians * * * @return double the equation of the origins in radians. * *

Notes: *

    * *
  1. The equation of the origins is the distance between the true * equinox and the celestial intermediate origin and, equivalently, * the difference between Earth rotation angle and Greenwich * apparent sidereal time (ERA-GST). It comprises the precession * (since J2000.0) in right ascension plus the equation of the * equinoxes (including the small correction terms). * *
  2. The algorithm is from Wallace & Capitaine (2006). *
* References: * *

Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 * *

Wallace, P. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 * *@version 2008 May 26 * * @since Release 20101201 * * */ public static double jauEors(double rnpb[][], double s) { double x, ax, xs, ys, zs, p, q, eo; /* Evaluate Wallace & Capitaine (2006) expression (16). */ x = rnpb[2][0]; ax = x / (1.0 + rnpb[2][2]); xs = 1.0 - ax * x; ys = -ax * rnpb[2][1]; zs = -x; p = rnpb[0][0] * xs + rnpb[0][1] * ys + rnpb[0][2] * zs; q = rnpb[1][0] * xs + rnpb[1][1] * ys + rnpb[1][2] * zs; eo = ((p != 0) || (q != 0)) ? s - atan2(q, p) : s; return eo; } /** * Julian Date to Besselian Epoch. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param dj1 double Julian Date (see note) * @param dj2 double Julian Date (see note) * * * @return double Besselian Epoch. * * Note: * * The Julian Date is supplied in two pieces, in the usual JSOFA * manner, which is designed to preserve time resolution. The * Julian Date is available as a single number by adding dj1 and * dj2. The maximum resolution is achieved if dj1 is 2451545D0 * (J2000.0). * *

Reference: * * Lieske,J.H., 1979. Astron.Astrophys.,73,282. * *@version 2009 December 16 * * @since Release 20101201 * * */ public static double jauEpb(double dj1, double dj2) { /* J2000.0 minus B1900.0 (2415019.81352) in Julian days */ final double D1900 = 36524.68648; return 1900.0 + ((dj1 - DJ00) + (dj2 + D1900)) / DTY; } /** * Besselian Epoch to Julian Date. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param epb double Besselian Epoch (e.g. 1957.3D0) * * * @return MJD zero-point: always 2400000.5 Modified Julian Date * * Note: * * The Julian Date is returned in two pieces, in the usual JSOFA * manner, which is designed to preserve time resolution. The * Julian Date is available as a single number by adding djm0 and * djm. * *

Reference: * *

Lieske, J.H., 1979, Astron.Astrophys. 73, 282. * *@version 2008 May 24 * * @since Release 20101201 * * */ public static JulianDate jauEpb2jd(double epb) { double djm0, djm; djm0 = 2400000.5; djm = 15019.81352 + (epb - 1900.0) * DTY; return new JulianDate(djm0, djm); } /** * Julian Date to Julian Epoch. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param dj1 double Julian Date (see note) * @param dj2 double Julian Date (see note) * * * @return double Julian Epoch * * Note: * * The Julian Date is supplied in two pieces, in the usual JSOFA * manner, which is designed to preserve time resolution. The * Julian Date is available as a single number by adding dj1 and * dj2. The maximum resolution is achieved if dj1 is 2451545D0 * (J2000.0). * *

Reference: * *

Lieske, J.H., 1979, Astron.Astrophys. 73, 282. * *@version 2009 December 16 * * @since Release 20101201 * * */ public static double jauEpj(double dj1, double dj2) { return 2000.0 + ((dj1 - DJ00) + dj2) / DJY; } /** * Julian Epoch to Julian Date. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param epj double Julian Epoch (e.g. 1996.8D0) * * * @return MJD zero-point: always 2400000.5 Modified Julian Date * * Note: * * The Julian Date is returned in two pieces, in the usual JSOFA * manner, which is designed to preserve time resolution. The * Julian Date is available as a single number by adding djm0 and * djm. * *

Reference: * *

Lieske, J.H., 1979, Astron.Astrophys. 73, 282. * *@version 2008 May 11 * * @since Release 20101201 * * */ public static JulianDate jauEpj2jd(double epj) { double djm0, djm; djm0 = 2400000.5; djm = 51544.5 + (epj - 2000.0) * 365.25; return new JulianDate(djm0, djm); } /* * A utility class to get round 65536 byte limit on functions in java - The static initializer is too large on its own. - So split into two classes for no real semantic reason */ static private final class Ephemeris extends SSB { /** * ---------------------- * Ephemeris Coefficients * ---------------------- * * The ephemeris consists of harmonic terms for predicting (i) the Sun * to Earth vector and (ii) the Solar-System-barycenter to Sun vector * respectively. The coefficients are stored in arrays which, although * 1-demensional, contain groups of three. Each triplet of * coefficients is the amplitude, phase and frequency for one term in * the model, and each array contains the number of terms called for by * the model. * * There are eighteen such arrays, named as follows: *

    *     array         model      power of T      component
    *
    *      e0x      Sun-to-Earth        0              x
    *      e0y      Sun-to-Earth        0              y
    *      e0z      Sun-to-Earth        0              z
    *
    *      e1x      Sun-to-Earth        1              x
    *      e1y      Sun-to-Earth        1              y
    *      e1z      Sun-to-Earth        1              z
    *
    *      e2x      Sun-to-Earth        2              x
    *      e2y      Sun-to-Earth        2              y
    *      e2z      Sun-to-Earth        2              z
    *
    *      s0x      SSB-to-Sun          0              x
    *      s0y      SSB-to-Sun          0              y
    *      s0z      SSB-to-Sun          0              z
    *
    *      s1x      SSB-to-Sun          1              x
    *      s1y      SSB-to-Sun          1              y
    *      s1z      SSB-to-Sun          1              z
    *
    *      s2x      SSB-to-Sun          2              x
    *      s2y      SSB-to-Sun          2              y
    *      s2z      SSB-to-Sun          2              z
    *
    */

    /* Sun-to-Earth, T^0, X */
      static final double e0x[] = {
          0.9998292878132e+00, 0.1753485171504e+01, 0.6283075850446e+01,
          0.8352579567414e-02, 0.1710344404582e+01, 0.1256615170089e+02,
          0.5611445335148e-02, 0.0000000000000e+00, 0.0000000000000e+00,
          0.1046664295572e-03, 0.1667225416770e+01, 0.1884922755134e+02,
          0.3110842534677e-04, 0.6687513390251e+00, 0.8399684731857e+02,
          0.2552413503550e-04, 0.5830637358413e+00, 0.5296909721118e+00,
          0.2137207845781e-04, 0.1092330954011e+01, 0.1577343543434e+01,
          0.1680240182951e-04, 0.4955366134987e+00, 0.6279552690824e+01,
          0.1679012370795e-04, 0.6153014091901e+01, 0.6286599010068e+01,
          0.1445526946777e-04, 0.3472744100492e+01, 0.2352866153506e+01,

          0.1091038246184e-04, 0.3689845786119e+01, 0.5223693906222e+01,
          0.9344399733932e-05, 0.6073934645672e+01, 0.1203646072878e+02,
          0.8993182910652e-05, 0.3175705249069e+01, 0.1021328554739e+02,
          0.5665546034116e-05, 0.2152484672246e+01, 0.1059381944224e+01,
          0.6844146703035e-05, 0.1306964099750e+01, 0.5753384878334e+01,
          0.7346610905565e-05, 0.4354980070466e+01, 0.3981490189893e+00,
          0.6815396474414e-05, 0.2218229211267e+01, 0.4705732307012e+01,
          0.6112787253053e-05, 0.5384788425458e+01, 0.6812766822558e+01,
          0.4518120711239e-05, 0.6087604012291e+01, 0.5884926831456e+01,
          0.4521963430706e-05, 0.1279424524906e+01, 0.6256777527156e+01,

          0.4497426764085e-05, 0.5369129144266e+01, 0.6309374173736e+01,
          0.4062190566959e-05, 0.5436473303367e+00, 0.6681224869435e+01,
          0.5412193480192e-05, 0.7867838528395e+00, 0.7755226100720e+00,
          0.5469839049386e-05, 0.1461440311134e+01, 0.1414349524433e+02,
          0.5205264083477e-05, 0.4432944696116e+01, 0.7860419393880e+01,
          0.2149759935455e-05, 0.4502237496846e+01, 0.1150676975667e+02,
          0.2279109618501e-05, 0.1239441308815e+01, 0.7058598460518e+01,
          0.2259282939683e-05, 0.3272430985331e+01, 0.4694002934110e+01,
          0.2558950271319e-05, 0.2265471086404e+01, 0.1216800268190e+02,
          0.2561581447555e-05, 0.1454740653245e+01, 0.7099330490126e+00,

          0.1781441115440e-05, 0.2962068630206e+01, 0.7962980379786e+00,
          0.1612005874644e-05, 0.1473255041006e+01, 0.5486777812467e+01,
          0.1818630667105e-05, 0.3743903293447e+00, 0.6283008715021e+01,
          0.1818601377529e-05, 0.6274174354554e+01, 0.6283142985870e+01,
          0.1554475925257e-05, 0.1624110906816e+01, 0.2513230340178e+02,
          0.2090948029241e-05, 0.5852052276256e+01, 0.1179062909082e+02,
          0.2000176345460e-05, 0.4072093298513e+01, 0.1778984560711e+02,
          0.1289535917759e-05, 0.5217019331069e+01, 0.7079373888424e+01,
          0.1281135307881e-05, 0.4802054538934e+01, 0.3738761453707e+01,
          0.1518229005692e-05, 0.8691914742502e+00, 0.2132990797783e+00,

          0.9450128579027e-06, 0.4601859529950e+01, 0.1097707878456e+02,
          0.7781119494996e-06, 0.1844352816694e+01, 0.8827390247185e+01,
          0.7733407759912e-06, 0.3582790154750e+01, 0.5507553240374e+01,
          0.7350644318120e-06, 0.2695277788230e+01, 0.1589072916335e+01,
          0.6535928827023e-06, 0.3651327986142e+01, 0.1176985366291e+02,
          0.6324624183656e-06, 0.2241302375862e+01, 0.6262300422539e+01,
          0.6298565300557e-06, 0.4407122406081e+01, 0.6303851278352e+01,
          0.8587037089179e-06, 0.3024307223119e+01, 0.1672837615881e+03,
          0.8299954491035e-06, 0.6192539428237e+01, 0.3340612434717e+01,
          0.6311263503401e-06, 0.2014758795416e+01, 0.7113454667900e-02,

          0.6005646745452e-06, 0.3399500503397e+01, 0.4136910472696e+01,
          0.7917715109929e-06, 0.2493386877837e+01, 0.6069776770667e+01,
          0.7556958099685e-06, 0.4159491740143e+01, 0.6496374930224e+01,
          0.6773228244949e-06, 0.4034162934230e+01, 0.9437762937313e+01,
          0.5370708577847e-06, 0.1562219163734e+01, 0.1194447056968e+01,
          0.5710804266203e-06, 0.2662730803386e+01, 0.6282095334605e+01,
          0.5709824583726e-06, 0.3985828430833e+01, 0.6284056366286e+01,
          0.5143950896447e-06, 0.1308144688689e+01, 0.6290189305114e+01,
          0.5088010604546e-06, 0.5352817214804e+01, 0.6275962395778e+01,
          0.4960369085172e-06, 0.2644267922349e+01, 0.6127655567643e+01,

          0.4803137891183e-06, 0.4008844192080e+01, 0.6438496133249e+01,
          0.5731747768225e-06, 0.3794550174597e+01, 0.3154687086868e+01,
          0.4735947960579e-06, 0.6107118308982e+01, 0.3128388763578e+01,
          0.4808348796625e-06, 0.4771458618163e+01, 0.8018209333619e+00,
          0.4115073743137e-06, 0.3327111335159e+01, 0.8429241228195e+01,
          0.5230575889287e-06, 0.5305708551694e+01, 0.1336797263425e+02,
          0.5133977889215e-06, 0.5784230738814e+01, 0.1235285262111e+02,
          0.5065815825327e-06, 0.2052064793679e+01, 0.1185621865188e+02,
          0.4339831593868e-06, 0.3644994195830e+01, 0.1726015463500e+02,
          0.3952928638953e-06, 0.4930376436758e+01, 0.5481254917084e+01,

          0.4898498111942e-06, 0.4542084219731e+00, 0.9225539266174e+01,
          0.4757490209328e-06, 0.3161126388878e+01, 0.5856477690889e+01,
          0.4727701669749e-06, 0.6214993845446e+00, 0.2544314396739e+01,
          0.3800966681863e-06, 0.3040132339297e+01, 0.4265981595566e+00,
          0.3257301077939e-06, 0.8064977360087e+00, 0.3930209696940e+01,
          0.3255810528674e-06, 0.1974147981034e+01, 0.2146165377750e+01,
          0.3252029748187e-06, 0.2845924913135e+01, 0.4164311961999e+01,
          0.3255505635308e-06, 0.3017900824120e+01, 0.5088628793478e+01,
          0.2801345211990e-06, 0.6109717793179e+01, 0.1256967486051e+02,
          0.3688987740970e-06, 0.2911550235289e+01, 0.1807370494127e+02,

          0.2475153429458e-06, 0.2179146025856e+01, 0.2629832328990e-01,
          0.3033457749150e-06, 0.1994161050744e+01, 0.4535059491685e+01,
          0.2186743763110e-06, 0.5125687237936e+01, 0.1137170464392e+02,
          0.2764777032774e-06, 0.4822646860252e+00, 0.1256262854127e+02,
          0.2199028768592e-06, 0.4637633293831e+01, 0.1255903824622e+02,
          0.2046482824760e-06, 0.1467038733093e+01, 0.7084896783808e+01,
          0.2611209147507e-06, 0.3044718783485e+00, 0.7143069561767e+02,
          0.2286079656818e-06, 0.4764220356805e+01, 0.8031092209206e+01,
          0.1855071202587e-06, 0.3383637774428e+01, 0.1748016358760e+01,
          0.2324669506784e-06, 0.6189088449251e+01, 0.1831953657923e+02,

          0.1709528015688e-06, 0.5874966729774e+00, 0.4933208510675e+01,
          0.2168156875828e-06, 0.4302994009132e+01, 0.1044738781244e+02,
          0.2106675556535e-06, 0.3800475419891e+01, 0.7477522907414e+01,
          0.1430213830465e-06, 0.1294660846502e+01, 0.2942463415728e+01,
          0.1388396901944e-06, 0.4594797202114e+01, 0.8635942003952e+01,
          0.1922258844190e-06, 0.4943044543591e+00, 0.1729818233119e+02,
          0.1888460058292e-06, 0.2426943912028e+01, 0.1561374759853e+03,
          0.1789449386107e-06, 0.1582973303499e+00, 0.1592596075957e+01,
          0.1360803685374e-06, 0.5197240440504e+01, 0.1309584267300e+02,
          0.1504038014709e-06, 0.3120360916217e+01, 0.1649636139783e+02,

          0.1382769533389e-06, 0.6164702888205e+01, 0.7632943190217e+01,
          0.1438059769079e-06, 0.1437423770979e+01, 0.2042657109477e+02,
          0.1326303260037e-06, 0.3609688799679e+01, 0.1213955354133e+02,
          0.1159244950540e-06, 0.5463018167225e+01, 0.5331357529664e+01,
          0.1433118149136e-06, 0.6028909912097e+01, 0.7342457794669e+01,
          0.1234623148594e-06, 0.3109645574997e+01, 0.6279485555400e+01,
          0.1233949875344e-06, 0.3539359332866e+01, 0.6286666145492e+01,
          0.9927196061299e-07, 0.1259321569772e+01, 0.7234794171227e+01,
          0.1242302191316e-06, 0.1065949392609e+01, 0.1511046609763e+02,
          0.1098402195201e-06, 0.2192508743837e+01, 0.1098880815746e+02,

          0.1158191395315e-06, 0.4054411278650e+01, 0.5729506548653e+01,
          0.9048475596241e-07, 0.5429764748518e+01, 0.9623688285163e+01,
          0.8889853269023e-07, 0.5046586206575e+01, 0.6148010737701e+01,
          0.1048694242164e-06, 0.2628858030806e+01, 0.6836645152238e+01,
          0.1112308378646e-06, 0.4177292719907e+01, 0.1572083878776e+02,
          0.8631729709901e-07, 0.1601345232557e+01, 0.6418140963190e+01,
          0.8527816951664e-07, 0.2463888997513e+01, 0.1471231707864e+02,
          0.7892139456991e-07, 0.3154022088718e+01, 0.2118763888447e+01,
          0.1051782905236e-06, 0.4795035816088e+01, 0.1349867339771e+01,
          0.1048219943164e-06, 0.2952983395230e+01, 0.5999216516294e+01,

          0.7435760775143e-07, 0.5420547991464e+01, 0.6040347114260e+01,
          0.9869574106949e-07, 0.3695646753667e+01, 0.6566935184597e+01,
          0.9156886364226e-07, 0.3922675306609e+01, 0.5643178611111e+01,
          0.7006834356188e-07, 0.1233968624861e+01, 0.6525804586632e+01,
          0.9806170182601e-07, 0.1919542280684e+01, 0.2122839202813e+02,
          0.9052289673607e-07, 0.4615902724369e+01, 0.4690479774488e+01,
          0.7554200867893e-07, 0.1236863719072e+01, 0.1253985337760e+02,
          0.8215741286498e-07, 0.3286800101559e+00, 0.1097355562493e+02,
          0.7185178575397e-07, 0.5880942158367e+01, 0.6245048154254e+01,
          0.7130726476180e-07, 0.7674871987661e+00, 0.6321103546637e+01,

          0.6650894461162e-07, 0.6987129150116e+00, 0.5327476111629e+01,
          0.7396888823688e-07, 0.3576824794443e+01, 0.5368044267797e+00,
          0.7420588884775e-07, 0.5033615245369e+01, 0.2354323048545e+02,
          0.6141181642908e-07, 0.9449927045673e+00, 0.1296430071988e+02,
          0.6373557924058e-07, 0.6206342280341e+01, 0.9517183207817e+00,
          0.6359474329261e-07, 0.5036079095757e+01, 0.1990745094947e+01,
          0.5740173582646e-07, 0.6105106371350e+01, 0.9555997388169e+00,
          0.7019864084602e-07, 0.7237747359018e+00, 0.5225775174439e+00,
          0.6398054487042e-07, 0.3976367969666e+01, 0.2407292145756e+02,
          0.7797092650498e-07, 0.4305423910623e+01, 0.2200391463820e+02,

          0.6466760000900e-07, 0.3500136825200e+01, 0.5230807360890e+01,
          0.7529417043890e-07, 0.3514779246100e+01, 0.1842262939178e+02,
          0.6924571140892e-07, 0.2743457928679e+01, 0.1554202828031e+00,
          0.6220798650222e-07, 0.2242598118209e+01, 0.1845107853235e+02,
          0.5870209391853e-07, 0.2332832707527e+01, 0.6398972393349e+00,
          0.6263953473888e-07, 0.2191105358956e+01, 0.6277552955062e+01,
          0.6257781390012e-07, 0.4457559396698e+01, 0.6288598745829e+01,
          0.5697304945123e-07, 0.3499234761404e+01, 0.1551045220144e+01,
          0.6335438746791e-07, 0.6441691079251e+00, 0.5216580451554e+01,
          0.6377258441152e-07, 0.2252599151092e+01, 0.5650292065779e+01,

          0.6484841818165e-07, 0.1992812417646e+01, 0.1030928125552e+00,
          0.4735551485250e-07, 0.3744672082942e+01, 0.1431416805965e+02,
          0.4628595996170e-07, 0.1334226211745e+01, 0.5535693017924e+00,
          0.6258152336933e-07, 0.4395836159154e+01, 0.2608790314060e+02,
          0.6196171366594e-07, 0.2587043007997e+01, 0.8467247584405e+02,
          0.6159556952126e-07, 0.4782499769128e+01, 0.2394243902548e+03,
          0.4987741172394e-07, 0.7312257619924e+00, 0.7771377146812e+02,
          0.5459280703142e-07, 0.3001376372532e+01, 0.6179983037890e+01,
          0.4863461189999e-07, 0.3767222128541e+01, 0.9027992316901e+02,
          0.5349912093158e-07, 0.3663594450273e+01, 0.6386168663001e+01,

          0.5673725607806e-07, 0.4331187919049e+01, 0.6915859635113e+01,
          0.4745485060512e-07, 0.5816195745518e+01, 0.6282970628506e+01,
          0.4745379005326e-07, 0.8323672435672e+00, 0.6283181072386e+01,
          0.4049002796321e-07, 0.3785023976293e+01, 0.6254626709878e+01,
          0.4247084014515e-07, 0.2378220728783e+01, 0.7875671926403e+01,
          0.4026912363055e-07, 0.2864103423269e+01, 0.6311524991013e+01,
          0.4062935011774e-07, 0.2415408595975e+01, 0.3634620989887e+01,
          0.5347771048509e-07, 0.3343479309801e+01, 0.2515860172507e+02,
          0.4829494136505e-07, 0.2821742398262e+01, 0.5760498333002e+01,
          0.4342554404599e-07, 0.5624662458712e+01, 0.7238675589263e+01,

          0.4021599184361e-07, 0.5557250275009e+00, 0.1101510648075e+02,
          0.4104900474558e-07, 0.3296691780005e+01, 0.6709674010002e+01,
          0.4376532905131e-07, 0.3814443999443e+01, 0.6805653367890e+01,
          0.3314590480650e-07, 0.3560229189250e+01, 0.1259245002418e+02,
          0.3232421839643e-07, 0.5185389180568e+01, 0.1066495398892e+01,
          0.3541176318876e-07, 0.3921381909679e+01, 0.9917696840332e+01,
          0.3689831242681e-07, 0.4190658955386e+01, 0.1192625446156e+02,
          0.3890605376774e-07, 0.5546023371097e+01, 0.7478166569050e-01,
          0.3038559339780e-07, 0.6231032794494e+01, 0.1256621883632e+02,
          0.3137083969782e-07, 0.6207063419190e+01, 0.4292330755499e+01,

          0.4024004081854e-07, 0.1195257375713e+01, 0.1334167431096e+02,
          0.3300234879283e-07, 0.1804694240998e+01, 0.1057540660594e+02,
          0.3635399155575e-07, 0.5597811343500e+01, 0.6208294184755e+01,
          0.3032668691356e-07, 0.3191059366530e+01, 0.1805292951336e+02,
          0.2809652069058e-07, 0.4094348032570e+01, 0.3523159621801e-02,
          0.3696955383823e-07, 0.5219282738794e+01, 0.5966683958112e+01,
          0.3562894142503e-07, 0.1037247544554e+01, 0.6357857516136e+01,
          0.3510598524148e-07, 0.1430020816116e+01, 0.6599467742779e+01,
          0.3617736142953e-07, 0.3002911403677e+01, 0.6019991944201e+01,
          0.2624524910730e-07, 0.2437046757292e+01, 0.6702560555334e+01,

          0.2535824204490e-07, 0.1581594689647e+01, 0.3141537925223e+02,
          0.3519787226257e-07, 0.5379863121521e+01, 0.2505706758577e+03,
          0.2578406709982e-07, 0.4904222639329e+01, 0.1673046366289e+02,
          0.3423887981473e-07, 0.3646448997315e+01, 0.6546159756691e+01,
          0.2776083886467e-07, 0.3307829300144e+01, 0.1272157198369e+02,
          0.3379592818379e-07, 0.1747541251125e+01, 0.1494531617769e+02,
          0.3050255426284e-07, 0.1784689432607e-01, 0.4732030630302e+01,
          0.2652378350236e-07, 0.4420055276260e+01, 0.5863591145557e+01,
          0.2374498173768e-07, 0.3629773929208e+01, 0.2388894113936e+01,
          0.2716451255140e-07, 0.3079623706780e+01, 0.1202934727411e+02,

          0.3038583699229e-07, 0.3312487903507e+00, 0.1256608456547e+02,
          0.2220681228760e-07, 0.5265520401774e+01, 0.1336244973887e+02,
          0.3044156540912e-07, 0.4766664081250e+01, 0.2908881142201e+02,
          0.2731859923561e-07, 0.5069146530691e+01, 0.1391601904066e+02,
          0.2285603018171e-07, 0.5954935112271e+01, 0.6076890225335e+01,
          0.2025006454555e-07, 0.4061789589267e+01, 0.4701116388778e+01,
          0.2012597519804e-07, 0.2485047705241e+01, 0.6262720680387e+01,
          0.2003406962258e-07, 0.4163779209320e+01, 0.6303431020504e+01,
          0.2207863441371e-07, 0.6923839133828e+00, 0.6489261475556e+01,
          0.2481374305624e-07, 0.5944173595676e+01, 0.1204357418345e+02,

          0.2130923288870e-07, 0.4641013671967e+01, 0.5746271423666e+01,
          0.2446370543391e-07, 0.6125796518757e+01, 0.1495633313810e+00,
          0.1932492759052e-07, 0.2234572324504e+00, 0.1352175143971e+02,
          0.2600122568049e-07, 0.4281012405440e+01, 0.4590910121555e+01,
          0.2431754047488e-07, 0.1429943874870e+00, 0.1162474756779e+01,
          0.1875902869209e-07, 0.9781803816948e+00, 0.6279194432410e+01,
          0.1874381139426e-07, 0.5670368130173e+01, 0.6286957268481e+01,
          0.2156696047173e-07, 0.2008985006833e+01, 0.1813929450232e+02,
          0.1965076182484e-07, 0.2566186202453e+00, 0.4686889479442e+01,
          0.2334816372359e-07, 0.4408121891493e+01, 0.1002183730415e+02,

          0.1869937408802e-07, 0.5272745038656e+01, 0.2427287361862e+00,
          0.2436236460883e-07, 0.4407720479029e+01, 0.9514313292143e+02,
          0.1761365216611e-07, 0.1943892315074e+00, 0.1351787002167e+02,
          0.2156289480503e-07, 0.1418570924545e+01, 0.6037244212485e+01,
          0.2164748979255e-07, 0.4724603439430e+01, 0.2301353951334e+02,
          0.2222286670853e-07, 0.2400266874598e+01, 0.1266924451345e+02,
          0.2070901414929e-07, 0.5230348028732e+01, 0.6528907488406e+01,
          0.1792745177020e-07, 0.2099190328945e+01, 0.6819880277225e+01,
          0.1841802068445e-07, 0.3467527844848e+00, 0.6514761976723e+02,
          0.1578401631718e-07, 0.7098642356340e+00, 0.2077542790660e-01,

          0.1561690152531e-07, 0.5943349620372e+01, 0.6272439236156e+01,
          0.1558591045463e-07, 0.7040653478980e+00, 0.6293712464735e+01,
          0.1737356469576e-07, 0.4487064760345e+01, 0.1765478049437e+02,
          0.1434755619991e-07, 0.2993391570995e+01, 0.1102062672231e+00,
          0.1482187806654e-07, 0.2278049198251e+01, 0.1052268489556e+01,
          0.1424812827089e-07, 0.1682114725827e+01, 0.1311972100268e+02,
          0.1380282448623e-07, 0.3262668602579e+01, 0.1017725758696e+02,
          0.1811481244566e-07, 0.3187771221777e+01, 0.1887552587463e+02,
          0.1504446185696e-07, 0.5650162308647e+01, 0.7626583626240e-01,
          0.1740776154137e-07, 0.5487068607507e+01, 0.1965104848470e+02,

          0.1374339536251e-07, 0.5745688172201e+01, 0.6016468784579e+01,
          0.1761377477704e-07, 0.5748060203659e+01, 0.2593412433514e+02,
          0.1535138225795e-07, 0.6226848505790e+01, 0.9411464614024e+01,
          0.1788140543676e-07, 0.6189318878563e+01, 0.3301902111895e+02,
          0.1375002807996e-07, 0.5371812884394e+01, 0.6327837846670e+00,
          0.1242115758632e-07, 0.1471687569712e+01, 0.3894181736510e+01,
          0.1450977333938e-07, 0.4143836662127e+01, 0.1277945078067e+02,
          0.1297579575023e-07, 0.9003477661957e+00, 0.6549682916313e+01,
          0.1462667934821e-07, 0.5760505536428e+01, 0.1863592847156e+02,
          0.1381774374799e-07, 0.1085471729463e+01, 0.2379164476796e+01,

          0.1682333169307e-07, 0.5409870870133e+01, 0.1620077269078e+02,
          0.1190812918837e-07, 0.1397205174601e+01, 0.1149965630200e+02,
          0.1221434762106e-07, 0.9001804809095e+00, 0.1257326515556e+02,
          0.1549934644860e-07, 0.4262528275544e+01, 0.1820933031200e+02,
          0.1252138953050e-07, 0.1411642012027e+01, 0.6993008899458e+01,
          0.1237078905387e-07, 0.2844472403615e+01, 0.2435678079171e+02,
          0.1446953389615e-07, 0.5295835522223e+01, 0.3813291813120e-01,
          0.1388446457170e-07, 0.4969428135497e+01, 0.2458316379602e+00,
          0.1019339179228e-07, 0.2491369561806e+01, 0.6112403035119e+01,
          0.1258880815343e-07, 0.4679426248976e+01, 0.5429879531333e+01,

          0.1297768238261e-07, 0.1074509953328e+01, 0.1249137003520e+02,
          0.9913505718094e-08, 0.4735097918224e+01, 0.6247047890016e+01,
          0.9830453155969e-08, 0.4158649187338e+01, 0.6453748665772e+01,
          0.1192615865309e-07, 0.3438208613699e+01, 0.6290122169689e+01,
          0.9835874798277e-08, 0.1913300781229e+01, 0.6319103810876e+01,
          0.9639087569277e-08, 0.9487683644125e+00, 0.8273820945392e+01,
          0.1175716107001e-07, 0.3228141664287e+01, 0.6276029531202e+01,
          0.1018926508678e-07, 0.2216607854300e+01, 0.1254537627298e+02,
          0.9500087869225e-08, 0.2625116459733e+01, 0.1256517118505e+02,
          0.9664192916575e-08, 0.5860562449214e+01, 0.6259197520765e+01,

          0.9612858712203e-08, 0.7885682917381e+00, 0.6306954180126e+01,
          0.1117645675413e-07, 0.3932148831189e+01, 0.1779695906178e+02,
          0.1158864052160e-07, 0.9995605521691e+00, 0.1778273215245e+02,
          0.9021043467028e-08, 0.5263769742673e+01, 0.6172869583223e+01,
          0.8836134773563e-08, 0.1496843220365e+01, 0.1692165728891e+01,
          0.1045872200691e-07, 0.7009039517214e+00, 0.2204125344462e+00,
          0.1211463487798e-07, 0.4041544938511e+01, 0.8257698122054e+02,
          0.8541990804094e-08, 0.1447586692316e+01, 0.6393282117669e+01,
          0.1038720703636e-07, 0.4594249718112e+00, 0.1550861511662e+02,
          0.1126722351445e-07, 0.3925550579036e+01, 0.2061856251104e+00,

          0.8697373859631e-08, 0.4411341856037e+01, 0.9491756770005e+00,
          0.8869380028441e-08, 0.2402659724813e+01, 0.3903911373650e+01,
          0.9247014693258e-08, 0.1401579743423e+01, 0.6267823317922e+01,
          0.9205062930950e-08, 0.5245978000814e+01, 0.6298328382969e+01,
          0.8000745038049e-08, 0.3590803356945e+01, 0.2648454860559e+01,
          0.9168973650819e-08, 0.2470150501679e+01, 0.1498544001348e+03,
          0.1075444949238e-07, 0.1328606161230e+01, 0.3694923081589e+02,
          0.7817298525817e-08, 0.6162256225998e+01, 0.4804209201333e+01,
          0.9541469226356e-08, 0.3942568967039e+01, 0.1256713221673e+02,
          0.9821910122027e-08, 0.2360246287233e+00, 0.1140367694411e+02,

          0.9897822023777e-08, 0.4619805634280e+01, 0.2280573557157e+02,
          0.7737289283765e-08, 0.3784727847451e+01, 0.7834121070590e+01,
          0.9260204034710e-08, 0.2223352487601e+01, 0.2787043132925e+01,
          0.7320252888486e-08, 0.1288694636874e+01, 0.6282655592598e+01,
          0.7319785780946e-08, 0.5359869567774e+01, 0.6283496108294e+01,
          0.7147219933778e-08, 0.5516616675856e+01, 0.1725663147538e+02,
          0.7946502829878e-08, 0.2630459984567e+01, 0.1241073141809e+02,
          0.9001711808932e-08, 0.2849815827227e+01, 0.6281591679874e+01,
          0.8994041507257e-08, 0.3795244450750e+01, 0.6284560021018e+01,
          0.8298582787358e-08, 0.5236413127363e+00, 0.1241658836951e+02,

          0.8526596520710e-08, 0.4794605424426e+01, 0.1098419223922e+02,
          0.8209822103197e-08, 0.1578752370328e+01, 0.1096996532989e+02,
          0.6357049861094e-08, 0.5708926113761e+01, 0.1596186371003e+01,
          0.7370473179049e-08, 0.3842402530241e+01, 0.4061219149443e+01,
          0.7232154664726e-08, 0.3067548981535e+01, 0.1610006857377e+03,
          0.6328765494903e-08, 0.1313930030069e+01, 0.1193336791622e+02,
          0.8030064908595e-08, 0.3488500408886e+01, 0.8460828644453e+00,
          0.6275464259232e-08, 0.1532061626198e+01, 0.8531963191132e+00,
          0.7051897446325e-08, 0.3285859929993e+01, 0.5849364236221e+01,
          0.6161593705428e-08, 0.1477341999464e+01, 0.5573142801433e+01,

          0.7754683957278e-08, 0.1586118663096e+01, 0.8662240327241e+01,
          0.5889928990701e-08, 0.1304887868803e+01, 0.1232342296471e+02,
          0.5705756047075e-08, 0.4555333589350e+01, 0.1258692712880e+02,
          0.5964178808332e-08, 0.3001762842062e+01, 0.5333900173445e+01,
          0.6712446027467e-08, 0.4886780007595e+01, 0.1171295538178e+02,
          0.5941809275464e-08, 0.4701509603824e+01, 0.9779108567966e+01,
          0.5466993627395e-08, 0.4588357817278e+01, 0.1884211409667e+02,
          0.6340512090980e-08, 0.1164543038893e+01, 0.5217580628120e+02,
          0.6325505710045e-08, 0.3919171259645e+01, 0.1041998632314e+02,
          0.6164789509685e-08, 0.2143828253542e+01, 0.6151533897323e+01,

          0.5263330812430e-08, 0.6066564434241e+01, 0.1885275071096e+02,
          0.5597087780221e-08, 0.2926316429472e+01, 0.4337116142245e+00,
          0.5396556236817e-08, 0.3244303591505e+01, 0.6286362197481e+01,
          0.5396615148223e-08, 0.3404304703662e+01, 0.6279789503410e+01,
          0.7091832443341e-08, 0.8532377803192e+00, 0.4907302013889e+01,
          0.6572352589782e-08, 0.4901966774419e+01, 0.1176433076753e+02,
          0.5960236060795e-08, 0.1874672315797e+01, 0.1422690933580e-01,
          0.5125480043511e-08, 0.3735726064334e+01, 0.1245594543367e+02,
          0.5928241866410e-08, 0.4502033899935e+01, 0.6414617803568e+01,
          0.5249600357424e-08, 0.4372334799878e+01, 0.1151388321134e+02,

          0.6059171276087e-08, 0.2581617302908e+01, 0.6062663316000e+01,
          0.5295235081662e-08, 0.2974811513158e+01, 0.3496032717521e+01,
          0.5820561875933e-08, 0.1796073748244e+00, 0.2838593341516e+00,
          0.4754696606440e-08, 0.1981998136973e+01, 0.3104930017775e+01,
          0.6385053548955e-08, 0.2559174171605e+00, 0.6133512519065e+01,
          0.6589828273941e-08, 0.2750967106776e+01, 0.4087944051283e+02,
          0.5383376567189e-08, 0.6325947523578e+00, 0.2248384854122e+02,
          0.5928941683538e-08, 0.1672304519067e+01, 0.1581959461667e+01,
          0.4816060709794e-08, 0.3512566172575e+01, 0.9388005868221e+01,
          0.6003381586512e-08, 0.5610932219189e+01, 0.5326786718777e+01,

          0.5504225393105e-08, 0.4037501131256e+01, 0.6503488384892e+01,
          0.5353772620129e-08, 0.6122774968240e+01, 0.1735668374386e+03,
          0.5786253768544e-08, 0.5527984999515e+01, 0.1350651127443e+00,
          0.5065706702002e-08, 0.9980765573624e+00, 0.1248988586463e+02,
          0.5972838885276e-08, 0.6044489493203e+01, 0.2673594526851e+02,
          0.5323585877961e-08, 0.3924265998147e+01, 0.4171425416666e+01,
          0.5210772682858e-08, 0.6220111376901e+01, 0.2460261242967e+02,
          0.4726549040535e-08, 0.3716043206862e+01, 0.7232251527446e+01,
          0.6029425105059e-08, 0.8548704071116e+00, 0.3227113045244e+03,
          0.4481542826513e-08, 0.1426925072829e+01, 0.5547199253223e+01,

          0.5836024505068e-08, 0.7135651752625e-01, 0.7285056171570e+02,
          0.4137046613272e-08, 0.5330767643283e+01, 0.1087398597200e+02,
          0.5171977473924e-08, 0.4494262335353e+00, 0.1884570439172e+02,
          0.5694429833732e-08, 0.2952369582215e+01, 0.9723862754494e+02,
          0.4009158925298e-08, 0.3500003416535e+01, 0.6244942932314e+01,
          0.4784939596873e-08, 0.6196709413181e+01, 0.2929661536378e+02,
          0.3983725022610e-08, 0.5103690031897e+01, 0.4274518229222e+01,
          0.3870535232462e-08, 0.3187569587401e+01, 0.6321208768577e+01,
          0.5140501213951e-08, 0.1668924357457e+01, 0.1232032006293e+02,
          0.3849034819355e-08, 0.4445722510309e+01, 0.1726726808967e+02,

          0.4002383075060e-08, 0.5226224152423e+01, 0.7018952447668e+01,
          0.3890719543549e-08, 0.4371166550274e+01, 0.1491901785440e+02,
          0.4887084607881e-08, 0.5973556689693e+01, 0.1478866649112e+01,
          0.3739939287592e-08, 0.2089084714600e+01, 0.6922973089781e+01,
          0.5031925918209e-08, 0.4658371936827e+01, 0.1715706182245e+02,
          0.4387748764954e-08, 0.4825580552819e+01, 0.2331413144044e+03,
          0.4147398098865e-08, 0.3739003524998e+01, 0.1376059875786e+02,
          0.3719089993586e-08, 0.1148941386536e+01, 0.6297302759782e+01,
          0.3934238461056e-08, 0.1559893008343e+01, 0.7872148766781e+01,
          0.3672471375622e-08, 0.5516145383612e+01, 0.6268848941110e+01,

          0.3768911277583e-08, 0.6116053700563e+01, 0.4157198507331e+01,
          0.4033388417295e-08, 0.5076821746017e+01, 0.1567108171867e+02,
          0.3764194617832e-08, 0.8164676232075e+00, 0.3185192151914e+01,
          0.4840628226284e-08, 0.1360479453671e+01, 0.1252801878276e+02,
          0.4949443923785e-08, 0.2725622229926e+01, 0.1617106187867e+03,
          0.4117393089971e-08, 0.6054459628492e+00, 0.5642198095270e+01,
          0.3925754020428e-08, 0.8570462135210e+00, 0.2139354194808e+02,
          0.3630551757923e-08, 0.3552067338279e+01, 0.6294805223347e+01,
          0.3627274802357e-08, 0.3096565085313e+01, 0.6271346477544e+01,
          0.3806143885093e-08, 0.6367751709777e+00, 0.1725304118033e+02,

          0.4433254641565e-08, 0.4848461503937e+01, 0.7445550607224e+01,
          0.3712319846576e-08, 0.1331950643655e+01, 0.4194847048887e+00,
          0.3849847534783e-08, 0.4958368297746e+00, 0.9562891316684e+00,
          0.3483955430165e-08, 0.2237215515707e+01, 0.1161697602389e+02,
          0.3961912730982e-08, 0.3332402188575e+01, 0.2277943724828e+02,
          0.3419978244481e-08, 0.5785600576016e+01, 0.1362553364512e+02,
          0.3329417758177e-08, 0.9812676559709e-01, 0.1685848245639e+02,
          0.4207206893193e-08, 0.9494780468236e+00, 0.2986433403208e+02,
          0.3268548976410e-08, 0.1739332095686e+00, 0.5749861718712e+01,
          0.3321880082685e-08, 0.1423354800666e+01, 0.6279143387820e+01,

          0.4503173010852e-08, 0.2314972675293e+00, 0.1385561574497e+01,
          0.4316599090954e-08, 0.1012646782616e+00, 0.4176041334900e+01,
          0.3283493323850e-08, 0.5233306881265e+01, 0.6287008313071e+01,
          0.3164033542343e-08, 0.4005597257511e+01, 0.2099539292909e+02,
          0.4159720956725e-08, 0.5365676242020e+01, 0.5905702259363e+01,
          0.3565176892217e-08, 0.4284440620612e+01, 0.3932462625300e-02,
          0.3514440950221e-08, 0.4270562636575e+01, 0.7335344340001e+01,
          0.3540596871909e-08, 0.5953553201060e+01, 0.1234573916645e+02,
          0.2960769905118e-08, 0.1115180417718e+01, 0.2670964694522e+02,
          0.2962213739684e-08, 0.3863811918186e+01, 0.6408777551755e+00,

          0.3883556700251e-08, 0.1268617928302e+01, 0.6660449441528e+01,
          0.2919225516346e-08, 0.4908605223265e+01, 0.1375773836557e+01,
          0.3115158863370e-08, 0.3744519976885e+01, 0.3802769619140e-01,
          0.4099438144212e-08, 0.4173244670532e+01, 0.4480965020977e+02,
          0.2899531858964e-08, 0.5910601428850e+01, 0.2059724391010e+02,
          0.3289733429855e-08, 0.2488050078239e+01, 0.1081813534213e+02,
          0.3933075612875e-08, 0.1122363652883e+01, 0.3773735910827e+00,
          0.3021403764467e-08, 0.4951973724904e+01, 0.2982630633589e+02,
          0.2798598949757e-08, 0.5117057845513e+01, 0.1937891852345e+02,
          0.3397421302707e-08, 0.6104159180476e+01, 0.6923953605621e+01,

          0.3720398002179e-08, 0.1184933429829e+01, 0.3066615496545e+02,
          0.3598484186267e-08, 0.3505282086105e+01, 0.6147450479709e+01,
          0.3694594027310e-08, 0.2286651088141e+01, 0.2636725487657e+01,
          0.2680444152969e-08, 0.1871816775482e+00, 0.6816289982179e+01,
          0.3497574865641e-08, 0.3143251755431e+01, 0.6418701221183e+01,
          0.3130274129494e-08, 0.2462167316018e+01, 0.1235996607578e+02,
          0.3241119069551e-08, 0.4256374004686e+01, 0.1652265972112e+02,
          0.2601960842061e-08, 0.4970362941425e+01, 0.1045450126711e+02,
          0.2690601527504e-08, 0.2372657824898e+01, 0.3163918923335e+00,
          0.2908688152664e-08, 0.4232652627721e+01, 0.2828699048865e+02,

          0.3120456131875e-08, 0.3925747001137e+00, 0.2195415756911e+02,
          0.3148855423384e-08, 0.3093478330445e+01, 0.1172006883645e+02,
          0.3051044261017e-08, 0.5560948248212e+01, 0.6055599646783e+01,
          0.2826006876660e-08, 0.5072790310072e+01, 0.5120601093667e+01,
          0.3100034191711e-08, 0.4998530231096e+01, 0.1799603123222e+02,
          0.2398771640101e-08, 0.2561739802176e+01, 0.6255674361143e+01,
          0.2384002842728e-08, 0.4087420284111e+01, 0.6310477339748e+01,
          0.2842146517568e-08, 0.2515048217955e+01, 0.5469525544182e+01,
          0.2847674371340e-08, 0.5235326497443e+01, 0.1034429499989e+02,
          0.2903722140764e-08, 0.1088200795797e+01, 0.6510552054109e+01,

          0.3187610710605e-08, 0.4710624424816e+01, 0.1693792562116e+03,
          0.3048869992813e-08, 0.2857975896445e+00, 0.8390110365991e+01,
          0.2860216950984e-08, 0.2241619020815e+01, 0.2243449970715e+00,
          0.2701117683113e-08, 0.6651573305272e-01, 0.6129297044991e+01,
          0.2509891590152e-08, 0.1285135324585e+01, 0.1044027435778e+02,
          0.2623200252223e-08, 0.2981229834530e+00, 0.6436854655901e+01,
          0.2622541669202e-08, 0.6122470726189e+01, 0.9380959548977e+01,
          0.2818435667099e-08, 0.4251087148947e+01, 0.5934151399930e+01,
          0.2365196797465e-08, 0.3465070460790e+01, 0.2470570524223e+02,
          0.2358704646143e-08, 0.5791603815350e+01, 0.8671969964381e+01,

          0.2388299481390e-08, 0.4142483772941e+01, 0.7096626156709e+01,
          0.1996041217224e-08, 0.2101901889496e+01, 0.1727188400790e+02,
          0.2687593060336e-08, 0.1526689456959e+01, 0.7075506709219e+02,
          0.2618913670810e-08, 0.2397684236095e+01, 0.6632000300961e+01,
          0.2571523050364e-08, 0.5751929456787e+00, 0.6206810014183e+01,
          0.2582135006946e-08, 0.5595464352926e+01, 0.4873985990671e+02,
          0.2372530190361e-08, 0.5092689490655e+01, 0.1590676413561e+02,
          0.2357178484712e-08, 0.4444363527851e+01, 0.3097883698531e+01,
          0.2451590394723e-08, 0.3108251687661e+01, 0.6612329252343e+00,
          0.2370045949608e-08, 0.2608133861079e+01, 0.3459636466239e+02,

          0.2268997267358e-08, 0.3639717753384e+01, 0.2844914056730e-01,
          0.1731432137906e-08, 0.1741898445707e+00, 0.2019909489111e+02,
          0.1629869741622e-08, 0.3902225646724e+01, 0.3035599730800e+02,
          0.2206215801974e-08, 0.4971131250731e+01, 0.6281667977667e+01,
          0.2205469554680e-08, 0.1677462357110e+01, 0.6284483723224e+01,
          0.2148792362509e-08, 0.4236259604006e+01, 0.1980482729015e+02,
          0.1873733657847e-08, 0.5926814998687e+01, 0.2876692439167e+02,
          0.2026573758959e-08, 0.4349643351962e+01, 0.2449240616245e+02,
          0.1807770325110e-08, 0.5700940482701e+01, 0.2045286941806e+02,
          0.1881174408581e-08, 0.6601286363430e+00, 0.2358125818164e+02,

          0.1368023671690e-08, 0.2211098592752e+01, 0.2473415438279e+02,
          0.1720017916280e-08, 0.4942488551129e+01, 0.1679593901136e+03,
          0.1702427665131e-08, 0.1452233856386e+01, 0.3338575901272e+03,
          0.1414032510054e-08, 0.5525357721439e+01, 0.1624205518357e+03,
          0.1652626045364e-08, 0.4108794283624e+01, 0.8956999012000e+02,
          0.1642957769686e-08, 0.7344335209984e+00, 0.5267006960365e+02,
          0.1614952403624e-08, 0.3541213951363e+01, 0.3332657872986e+02,
          0.1535988291188e-08, 0.4031094072151e+01, 0.3852657435933e+02,
          0.1593193738177e-08, 0.4185136203609e+01, 0.2282781046519e+03,
          0.1074569126382e-08, 0.1720485636868e+01, 0.8397383534231e+02,

          0.1074408214509e-08, 0.2758613420318e+01, 0.8401985929482e+02,
          0.9700199670465e-09, 0.4216686842097e+01, 0.7826370942180e+02,
          0.1258433517061e-08, 0.2575068876639e+00, 0.3115650189215e+03,
          0.1240303229539e-08, 0.4800844956756e+00, 0.1784300471910e+03,
          0.9018345948127e-09, 0.3896756361552e+00, 0.5886454391678e+02,
          0.1135301432805e-08, 0.3700805023550e+00, 0.7842370451713e+02,
          0.9215887951370e-09, 0.4364579276638e+01, 0.1014262087719e+03,
          0.1055401054147e-08, 0.2156564222111e+01, 0.5660027930059e+02,
          0.1008725979831e-08, 0.5454015785234e+01, 0.4245678405627e+02,
          0.7217398104321e-09, 0.1597772562175e+01, 0.2457074661053e+03,

          0.6912033134447e-09, 0.5824090621461e+01, 0.1679936946371e+03,
          0.6833881523549e-09, 0.3578778482835e+01, 0.6053048899753e+02,
          0.4887304205142e-09, 0.3724362812423e+01, 0.9656299901946e+02,
          0.5173709754788e-09, 0.5422427507933e+01, 0.2442876000072e+03,
          0.4671353097145e-09, 0.2396106924439e+01, 0.1435713242844e+03,
          0.5652608439480e-09, 0.2804028838685e+01, 0.8365903305582e+02,
          0.5604061331253e-09, 0.1638816006247e+01, 0.8433466158131e+02,
          0.4712723365400e-09, 0.8979003224474e+00, 0.3164282286739e+03,
          0.4909967465112e-09, 0.3210426725516e+01, 0.4059982187939e+03,
          0.4771358267658e-09, 0.5308027211629e+01, 0.1805255418145e+03,

          0.3943451445989e-09, 0.2195145341074e+01, 0.2568537517081e+03,
          0.3952109120244e-09, 0.5081189491586e+01, 0.2449975330562e+03,
          0.3788134594789e-09, 0.4345171264441e+01, 0.1568131045107e+03,
          0.3738330190479e-09, 0.2613062847997e+01, 0.3948519331910e+03,
          0.3099866678136e-09, 0.2846760817689e+01, 0.1547176098872e+03,
          0.2002962716768e-09, 0.4921360989412e+01, 0.2268582385539e+03,
          0.2198291338754e-09, 0.1130360117454e+00, 0.1658638954901e+03,
          0.1491958330784e-09, 0.4228195232278e+01, 0.2219950288015e+03,
          0.1475384076173e-09, 0.3005721811604e+00, 0.3052819430710e+03,
          0.1661626624624e-09, 0.7830125621203e+00, 0.2526661704812e+03,

          0.9015823460025e-10, 0.3807792942715e+01, 0.4171445043968e+03 };

    /* Sun-to-Earth, T^0, Y */
      static final double e0y[] = {
          0.9998921098898e+00, 0.1826583913846e+00, 0.6283075850446e+01,
         -0.2442700893735e-01, 0.0000000000000e+00, 0.0000000000000e+00,
          0.8352929742915e-02, 0.1395277998680e+00, 0.1256615170089e+02,
          0.1046697300177e-03, 0.9641423109763e-01, 0.1884922755134e+02,
          0.3110841876663e-04, 0.5381140401712e+01, 0.8399684731857e+02,
          0.2570269094593e-04, 0.5301016407128e+01, 0.5296909721118e+00,
          0.2147389623610e-04, 0.2662510869850e+01, 0.1577343543434e+01,
          0.1680344384050e-04, 0.5207904119704e+01, 0.6279552690824e+01,
          0.1679117312193e-04, 0.4582187486968e+01, 0.6286599010068e+01,
          0.1440512068440e-04, 0.1900688517726e+01, 0.2352866153506e+01,

          0.1135139664999e-04, 0.5273108538556e+01, 0.5223693906222e+01,
          0.9345482571018e-05, 0.4503047687738e+01, 0.1203646072878e+02,
          0.9007418719568e-05, 0.1605621059637e+01, 0.1021328554739e+02,
          0.5671536712314e-05, 0.5812849070861e+00, 0.1059381944224e+01,
          0.7451401861666e-05, 0.2807346794836e+01, 0.3981490189893e+00,
          0.6393470057114e-05, 0.6029224133855e+01, 0.5753384878334e+01,
          0.6814275881697e-05, 0.6472990145974e+00, 0.4705732307012e+01,
          0.6113705628887e-05, 0.3813843419700e+01, 0.6812766822558e+01,
          0.4503851367273e-05, 0.4527804370996e+01, 0.5884926831456e+01,
          0.4522249141926e-05, 0.5991783029224e+01, 0.6256777527156e+01,

          0.4501794307018e-05, 0.3798703844397e+01, 0.6309374173736e+01,
          0.5514927480180e-05, 0.3961257833388e+01, 0.5507553240374e+01,
          0.4062862799995e-05, 0.5256247296369e+01, 0.6681224869435e+01,
          0.5414900429712e-05, 0.5499032014097e+01, 0.7755226100720e+00,
          0.5463153987424e-05, 0.6173092454097e+01, 0.1414349524433e+02,
          0.5071611859329e-05, 0.2870244247651e+01, 0.7860419393880e+01,
          0.2195112094455e-05, 0.2952338617201e+01, 0.1150676975667e+02,
          0.2279139233919e-05, 0.5951775132933e+01, 0.7058598460518e+01,
          0.2278386100876e-05, 0.4845456398785e+01, 0.4694002934110e+01,
          0.2559088003308e-05, 0.6945321117311e+00, 0.1216800268190e+02,

          0.2561079286856e-05, 0.6167224608301e+01, 0.7099330490126e+00,
          0.1792755796387e-05, 0.1400122509632e+01, 0.7962980379786e+00,
          0.1818715656502e-05, 0.4703347611830e+01, 0.6283142985870e+01,
          0.1818744924791e-05, 0.5086748900237e+01, 0.6283008715021e+01,
          0.1554518791390e-05, 0.5331008042713e-01, 0.2513230340178e+02,
          0.2063265737239e-05, 0.4283680484178e+01, 0.1179062909082e+02,
          0.1497613520041e-05, 0.6074207826073e+01, 0.5486777812467e+01,
          0.2000617940427e-05, 0.2501426281450e+01, 0.1778984560711e+02,
          0.1289731195580e-05, 0.3646340599536e+01, 0.7079373888424e+01,
          0.1282657998934e-05, 0.3232864804902e+01, 0.3738761453707e+01,

          0.1528915968658e-05, 0.5581433416669e+01, 0.2132990797783e+00,
          0.1187304098432e-05, 0.5453576453694e+01, 0.9437762937313e+01,
          0.7842782928118e-06, 0.2823953922273e+00, 0.8827390247185e+01,
          0.7352892280868e-06, 0.1124369580175e+01, 0.1589072916335e+01,
          0.6570189360797e-06, 0.2089154042840e+01, 0.1176985366291e+02,
          0.6324967590410e-06, 0.6704855581230e+00, 0.6262300422539e+01,
          0.6298289872283e-06, 0.2836414855840e+01, 0.6303851278352e+01,
          0.6476686465855e-06, 0.4852433866467e+00, 0.7113454667900e-02,
          0.8587034651234e-06, 0.1453511005668e+01, 0.1672837615881e+03,
          0.8068948788113e-06, 0.9224087798609e+00, 0.6069776770667e+01,

          0.8353786011661e-06, 0.4631707184895e+01, 0.3340612434717e+01,
          0.6009324532132e-06, 0.1829498827726e+01, 0.4136910472696e+01,
          0.7558158559566e-06, 0.2588596800317e+01, 0.6496374930224e+01,
          0.5809279504503e-06, 0.5516818853476e+00, 0.1097707878456e+02,
          0.5374131950254e-06, 0.6275674734960e+01, 0.1194447056968e+01,
          0.5711160507326e-06, 0.1091905956872e+01, 0.6282095334605e+01,
          0.5710183170746e-06, 0.2415001635090e+01, 0.6284056366286e+01,
          0.5144373590610e-06, 0.6020336443438e+01, 0.6290189305114e+01,
          0.5103108927267e-06, 0.3775634564605e+01, 0.6275962395778e+01,
          0.4960654697891e-06, 0.1073450946756e+01, 0.6127655567643e+01,

          0.4786385689280e-06, 0.2431178012310e+01, 0.6438496133249e+01,
          0.6109911263665e-06, 0.5343356157914e+01, 0.3154687086868e+01,
          0.4839898944024e-06, 0.5830833594047e-01, 0.8018209333619e+00,
          0.4734822623919e-06, 0.4536080134821e+01, 0.3128388763578e+01,
          0.4834741473290e-06, 0.2585090489754e+00, 0.7084896783808e+01,
          0.5134858581156e-06, 0.4213317172603e+01, 0.1235285262111e+02,
          0.5064004264978e-06, 0.4814418806478e+00, 0.1185621865188e+02,
          0.3753476772761e-06, 0.1599953399788e+01, 0.8429241228195e+01,
          0.4935264014283e-06, 0.2157417556873e+01, 0.2544314396739e+01,
          0.3950929600897e-06, 0.3359394184254e+01, 0.5481254917084e+01,

          0.4895849789777e-06, 0.5165704376558e+01, 0.9225539266174e+01,
          0.4215241688886e-06, 0.2065368800993e+01, 0.1726015463500e+02,
          0.3796773731132e-06, 0.1468606346612e+01, 0.4265981595566e+00,
          0.3114178142515e-06, 0.3615638079474e+01, 0.2146165377750e+01,
          0.3260664220838e-06, 0.4417134922435e+01, 0.4164311961999e+01,
          0.3976996123008e-06, 0.4700866883004e+01, 0.5856477690889e+01,
          0.2801459672924e-06, 0.4538902060922e+01, 0.1256967486051e+02,
          0.3638931868861e-06, 0.1334197991475e+01, 0.1807370494127e+02,
          0.2487013269476e-06, 0.3749275558275e+01, 0.2629832328990e-01,
          0.3034165481994e-06, 0.4236622030873e+00, 0.4535059491685e+01,

          0.2676278825586e-06, 0.5970848007811e+01, 0.3930209696940e+01,
          0.2764903818918e-06, 0.5194636754501e+01, 0.1256262854127e+02,
          0.2485149930507e-06, 0.1002434207846e+01, 0.5088628793478e+01,
          0.2199305540941e-06, 0.3066773098403e+01, 0.1255903824622e+02,
          0.2571106500435e-06, 0.7588312459063e+00, 0.1336797263425e+02,
          0.2049751817158e-06, 0.3444977434856e+01, 0.1137170464392e+02,
          0.2599707296297e-06, 0.1873128542205e+01, 0.7143069561767e+02,
          0.1785018072217e-06, 0.5015891306615e+01, 0.1748016358760e+01,
          0.2324833891115e-06, 0.4618271239730e+01, 0.1831953657923e+02,
          0.1709711119545e-06, 0.5300003455669e+01, 0.4933208510675e+01,

          0.2107159351716e-06, 0.2229819815115e+01, 0.7477522907414e+01,
          0.1750333080295e-06, 0.6161485880008e+01, 0.1044738781244e+02,
          0.2000598210339e-06, 0.2967357299999e+01, 0.8031092209206e+01,
          0.1380920248681e-06, 0.3027007923917e+01, 0.8635942003952e+01,
          0.1412460470299e-06, 0.6037597163798e+01, 0.2942463415728e+01,
          0.1888459803001e-06, 0.8561476243374e+00, 0.1561374759853e+03,
          0.1788370542585e-06, 0.4869736290209e+01, 0.1592596075957e+01,
          0.1360893296167e-06, 0.3626411886436e+01, 0.1309584267300e+02,
          0.1506846530160e-06, 0.1550975377427e+01, 0.1649636139783e+02,
          0.1800913376176e-06, 0.2075826033190e+01, 0.1729818233119e+02,

          0.1436261390649e-06, 0.6148876420255e+01, 0.2042657109477e+02,
          0.1220227114151e-06, 0.4382583879906e+01, 0.7632943190217e+01,
          0.1337883603592e-06, 0.2036644327361e+01, 0.1213955354133e+02,
          0.1159326650738e-06, 0.3892276994687e+01, 0.5331357529664e+01,
          0.1352853128569e-06, 0.1447950649744e+01, 0.1673046366289e+02,
          0.1433408296083e-06, 0.4457854692961e+01, 0.7342457794669e+01,
          0.1234701666518e-06, 0.1538818147151e+01, 0.6279485555400e+01,
          0.1234027192007e-06, 0.1968523220760e+01, 0.6286666145492e+01,
          0.1244024091797e-06, 0.5779803499985e+01, 0.1511046609763e+02,
          0.1097934945516e-06, 0.6210975221388e+00, 0.1098880815746e+02,

          0.1254611329856e-06, 0.2591963807998e+01, 0.1572083878776e+02,
          0.1158247286784e-06, 0.2483612812670e+01, 0.5729506548653e+01,
          0.9039078252960e-07, 0.3857554579796e+01, 0.9623688285163e+01,
          0.9108024978836e-07, 0.5826368512984e+01, 0.7234794171227e+01,
          0.8887068108436e-07, 0.3475694573987e+01, 0.6148010737701e+01,
          0.8632374035438e-07, 0.3059070488983e-01, 0.6418140963190e+01,
          0.7893186992967e-07, 0.1583194837728e+01, 0.2118763888447e+01,
          0.8297650201172e-07, 0.8519770534637e+00, 0.1471231707864e+02,
          0.1019759578988e-06, 0.1319598738732e+00, 0.1349867339771e+01,
          0.1010037696236e-06, 0.9937860115618e+00, 0.6836645152238e+01,

          0.1047727548266e-06, 0.1382138405399e+01, 0.5999216516294e+01,
          0.7351993881086e-07, 0.3833397851735e+01, 0.6040347114260e+01,
          0.9868771092341e-07, 0.2124913814390e+01, 0.6566935184597e+01,
          0.7007321959390e-07, 0.5946305343763e+01, 0.6525804586632e+01,
          0.6861411679709e-07, 0.4574654977089e+01, 0.7238675589263e+01,
          0.7554519809614e-07, 0.5949232686844e+01, 0.1253985337760e+02,
          0.9541880448335e-07, 0.3495242990564e+01, 0.2122839202813e+02,
          0.7185606722155e-07, 0.4310113471661e+01, 0.6245048154254e+01,
          0.7131360871710e-07, 0.5480309323650e+01, 0.6321103546637e+01,
          0.6651142021039e-07, 0.5411097713654e+01, 0.5327476111629e+01,

          0.8538618213667e-07, 0.1827849973951e+01, 0.1101510648075e+02,
          0.8634954288044e-07, 0.5443584943349e+01, 0.5643178611111e+01,
          0.7449415051484e-07, 0.2011535459060e+01, 0.5368044267797e+00,
          0.7421047599169e-07, 0.3464562529249e+01, 0.2354323048545e+02,
          0.6140694354424e-07, 0.5657556228815e+01, 0.1296430071988e+02,
          0.6353525143033e-07, 0.3463816593821e+01, 0.1990745094947e+01,
          0.6221964013447e-07, 0.1532259498697e+01, 0.9517183207817e+00,
          0.5852480257244e-07, 0.1375396598875e+01, 0.9555997388169e+00,
          0.6398637498911e-07, 0.2405645801972e+01, 0.2407292145756e+02,
          0.7039744069878e-07, 0.5397541799027e+01, 0.5225775174439e+00,

          0.6977997694382e-07, 0.4762347105419e+01, 0.1097355562493e+02,
          0.7460629558396e-07, 0.2711944692164e+01, 0.2200391463820e+02,
          0.5376577536101e-07, 0.2352980430239e+01, 0.1431416805965e+02,
          0.7530607893556e-07, 0.1943940180699e+01, 0.1842262939178e+02,
          0.6822928971605e-07, 0.4337651846959e+01, 0.1554202828031e+00,
          0.6220772380094e-07, 0.6716871369278e+00, 0.1845107853235e+02,
          0.6586950799043e-07, 0.2229714460505e+01, 0.5216580451554e+01,
          0.5873800565771e-07, 0.7627013920580e+00, 0.6398972393349e+00,
          0.6264346929745e-07, 0.6202785478961e+00, 0.6277552955062e+01,
          0.6257929115669e-07, 0.2886775596668e+01, 0.6288598745829e+01,

          0.5343536033409e-07, 0.1977241012051e+01, 0.4690479774488e+01,
          0.5587849781714e-07, 0.1922923484825e+01, 0.1551045220144e+01,
          0.6905100845603e-07, 0.3570757164631e+01, 0.1030928125552e+00,
          0.6178957066649e-07, 0.5197558947765e+01, 0.5230807360890e+01,
          0.6187270224331e-07, 0.8193497368922e+00, 0.5650292065779e+01,
          0.5385664291426e-07, 0.5406336665586e+01, 0.7771377146812e+02,
          0.6329363917926e-07, 0.2837760654536e+01, 0.2608790314060e+02,
          0.4546018761604e-07, 0.2933580297050e+01, 0.5535693017924e+00,
          0.6196091049375e-07, 0.4157871494377e+01, 0.8467247584405e+02,
          0.6159555108218e-07, 0.3211703561703e+01, 0.2394243902548e+03,

          0.4995340539317e-07, 0.1459098102922e+01, 0.4732030630302e+01,
          0.5457031243572e-07, 0.1430457676136e+01, 0.6179983037890e+01,
          0.4863461418397e-07, 0.2196425916730e+01, 0.9027992316901e+02,
          0.5342947626870e-07, 0.2086612890268e+01, 0.6386168663001e+01,
          0.5674296648439e-07, 0.2760204966535e+01, 0.6915859635113e+01,
          0.4745783120161e-07, 0.4245368971862e+01, 0.6282970628506e+01,
          0.4745676961198e-07, 0.5544725787016e+01, 0.6283181072386e+01,
          0.4049796869973e-07, 0.2213984363586e+01, 0.6254626709878e+01,
          0.4248333596940e-07, 0.8075781952896e+00, 0.7875671926403e+01,
          0.4027178070205e-07, 0.1293268540378e+01, 0.6311524991013e+01,

          0.4066543943476e-07, 0.3986141175804e+01, 0.3634620989887e+01,
          0.4858863787880e-07, 0.1276112738231e+01, 0.5760498333002e+01,
          0.5277398263530e-07, 0.4916111741527e+01, 0.2515860172507e+02,
          0.4105635656559e-07, 0.1725805864426e+01, 0.6709674010002e+01,
          0.4376781925772e-07, 0.2243642442106e+01, 0.6805653367890e+01,
          0.3235827894693e-07, 0.3614135118271e+01, 0.1066495398892e+01,
          0.3073244740308e-07, 0.2460873393460e+01, 0.5863591145557e+01,
          0.3088609271373e-07, 0.5678431771790e+01, 0.9917696840332e+01,
          0.3393022279836e-07, 0.3814017477291e+01, 0.1391601904066e+02,
          0.3038686508802e-07, 0.4660216229171e+01, 0.1256621883632e+02,

          0.4019677752497e-07, 0.5906906243735e+01, 0.1334167431096e+02,
          0.3288834998232e-07, 0.9536146445882e+00, 0.1620077269078e+02,
          0.3889973794631e-07, 0.3942205097644e+01, 0.7478166569050e-01,
          0.3050438987141e-07, 0.1624810271286e+01, 0.1805292951336e+02,
          0.3601142564638e-07, 0.4030467142575e+01, 0.6208294184755e+01,
          0.3689015557141e-07, 0.3648878818694e+01, 0.5966683958112e+01,
          0.3563471893565e-07, 0.5749584017096e+01, 0.6357857516136e+01,
          0.2776183170667e-07, 0.2630124187070e+01, 0.3523159621801e-02,
          0.2922350530341e-07, 0.1790346403629e+01, 0.1272157198369e+02,
          0.3511076917302e-07, 0.6142198301611e+01, 0.6599467742779e+01,

          0.3619351007632e-07, 0.1432421386492e+01, 0.6019991944201e+01,
          0.2561254711098e-07, 0.2302822475792e+01, 0.1259245002418e+02,
          0.2626903942920e-07, 0.8660470994571e+00, 0.6702560555334e+01,
          0.2550187397083e-07, 0.6069721995383e+01, 0.1057540660594e+02,
          0.2535873526138e-07, 0.1079020331795e-01, 0.3141537925223e+02,
          0.3519786153847e-07, 0.3809066902283e+01, 0.2505706758577e+03,
          0.3424651492873e-07, 0.2075435114417e+01, 0.6546159756691e+01,
          0.2372676630861e-07, 0.2057803120154e+01, 0.2388894113936e+01,
          0.2710980779541e-07, 0.1510068488010e+01, 0.1202934727411e+02,
          0.3038710889704e-07, 0.5043617528901e+01, 0.1256608456547e+02,

          0.2220364130585e-07, 0.3694793218205e+01, 0.1336244973887e+02,
          0.3025880825460e-07, 0.5450618999049e-01, 0.2908881142201e+02,
          0.2784493486864e-07, 0.3381164084502e+01, 0.1494531617769e+02,
          0.2294414142438e-07, 0.4382309025210e+01, 0.6076890225335e+01,
          0.2012723294724e-07, 0.9142212256518e+00, 0.6262720680387e+01,
          0.2036357831958e-07, 0.5676172293154e+01, 0.4701116388778e+01,
          0.2003474823288e-07, 0.2592767977625e+01, 0.6303431020504e+01,
          0.2207144900109e-07, 0.5404976271180e+01, 0.6489261475556e+01,
          0.2481664905135e-07, 0.4373284587027e+01, 0.1204357418345e+02,
          0.2674949182295e-07, 0.5859182188482e+01, 0.4590910121555e+01,

          0.2450554720322e-07, 0.4555381557451e+01, 0.1495633313810e+00,
          0.2601975986457e-07, 0.3933165584959e+01, 0.1965104848470e+02,
          0.2199860022848e-07, 0.5227977189087e+01, 0.1351787002167e+02,
          0.2448121172316e-07, 0.4858060353949e+01, 0.1162474756779e+01,
          0.1876014864049e-07, 0.5690546553605e+01, 0.6279194432410e+01,
          0.1874513219396e-07, 0.4099539297446e+01, 0.6286957268481e+01,
          0.2156380842559e-07, 0.4382594769913e+00, 0.1813929450232e+02,
          0.1981691240061e-07, 0.1829784152444e+01, 0.4686889479442e+01,
          0.2329992648539e-07, 0.2836254278973e+01, 0.1002183730415e+02,
          0.1765184135302e-07, 0.2803494925833e+01, 0.4292330755499e+01,

          0.2436368366085e-07, 0.2836897959677e+01, 0.9514313292143e+02,
          0.2164089203889e-07, 0.6127522446024e+01, 0.6037244212485e+01,
          0.1847755034221e-07, 0.3683163635008e+01, 0.2427287361862e+00,
          0.1674798769966e-07, 0.3316993867246e+00, 0.1311972100268e+02,
          0.2222542124356e-07, 0.8294097805480e+00, 0.1266924451345e+02,
          0.2071074505925e-07, 0.3659492220261e+01, 0.6528907488406e+01,
          0.1608224471835e-07, 0.4774492067182e+01, 0.1352175143971e+02,
          0.1857583439071e-07, 0.2873120597682e+01, 0.8662240327241e+01,
          0.1793018836159e-07, 0.5282441177929e+00, 0.6819880277225e+01,
          0.1575391221692e-07, 0.1320789654258e+01, 0.1102062672231e+00,

          0.1840132009557e-07, 0.1917110916256e+01, 0.6514761976723e+02,
          0.1760917288281e-07, 0.2972635937132e+01, 0.5746271423666e+01,
          0.1561779518516e-07, 0.4372569261981e+01, 0.6272439236156e+01,
          0.1558687885205e-07, 0.5416424926425e+01, 0.6293712464735e+01,
          0.1951359382579e-07, 0.3094448898752e+01, 0.2301353951334e+02,
          0.1569144275614e-07, 0.2802103689808e+01, 0.1765478049437e+02,
          0.1479130389462e-07, 0.2136435020467e+01, 0.2077542790660e-01,
          0.1467828510764e-07, 0.7072627435674e+00, 0.1052268489556e+01,
          0.1627627337440e-07, 0.3947607143237e+01, 0.6327837846670e+00,
          0.1503498479758e-07, 0.4079248909190e+01, 0.7626583626240e-01,

          0.1297967708237e-07, 0.6269637122840e+01, 0.1149965630200e+02,
          0.1374416896634e-07, 0.4175657970702e+01, 0.6016468784579e+01,
          0.1783812325219e-07, 0.1476540547560e+01, 0.3301902111895e+02,
          0.1525884228756e-07, 0.4653477715241e+01, 0.9411464614024e+01,
          0.1451067396763e-07, 0.2573001128225e+01, 0.1277945078067e+02,
          0.1297713111950e-07, 0.5612799618771e+01, 0.6549682916313e+01,
          0.1462784012820e-07, 0.4189661623870e+01, 0.1863592847156e+02,
          0.1384185980007e-07, 0.2656915472196e+01, 0.2379164476796e+01,
          0.1221497599801e-07, 0.5612515760138e+01, 0.1257326515556e+02,
          0.1560574525896e-07, 0.4783414317919e+01, 0.1887552587463e+02,

          0.1544598372036e-07, 0.2694431138063e+01, 0.1820933031200e+02,
          0.1531678928696e-07, 0.4105103489666e+01, 0.2593412433514e+02,
          0.1349321503795e-07, 0.3082437194015e+00, 0.5120601093667e+01,
          0.1252030290917e-07, 0.6124072334087e+01, 0.6993008899458e+01,
          0.1459243816687e-07, 0.3733103981697e+01, 0.3813291813120e-01,
          0.1226103625262e-07, 0.1267127706817e+01, 0.2435678079171e+02,
          0.1019449641504e-07, 0.4367790112269e+01, 0.1725663147538e+02,
          0.1380789433607e-07, 0.3387201768700e+01, 0.2458316379602e+00,
          0.1019453421658e-07, 0.9204143073737e+00, 0.6112403035119e+01,
          0.1297929434405e-07, 0.5786874896426e+01, 0.1249137003520e+02,

          0.9912677786097e-08, 0.3164232870746e+01, 0.6247047890016e+01,
          0.9829386098599e-08, 0.2586762413351e+01, 0.6453748665772e+01,
          0.1226807746104e-07, 0.6239068436607e+01, 0.5429879531333e+01,
          0.1192691755997e-07, 0.1867380051424e+01, 0.6290122169689e+01,
          0.9836499227081e-08, 0.3424716293727e+00, 0.6319103810876e+01,
          0.9642862564285e-08, 0.5661372990657e+01, 0.8273820945392e+01,
          0.1165184404862e-07, 0.5768367239093e+01, 0.1778273215245e+02,
          0.1175794418818e-07, 0.1657351222943e+01, 0.6276029531202e+01,
          0.1018948635601e-07, 0.6458292350865e+00, 0.1254537627298e+02,
          0.9500383606676e-08, 0.1054306140741e+01, 0.1256517118505e+02,

          0.1227512202906e-07, 0.2505278379114e+01, 0.2248384854122e+02,
          0.9664792009993e-08, 0.4289737277000e+01, 0.6259197520765e+01,
          0.9613285666331e-08, 0.5500597673141e+01, 0.6306954180126e+01,
          0.1117906736211e-07, 0.2361405953468e+01, 0.1779695906178e+02,
          0.9611378640782e-08, 0.2851310576269e+01, 0.2061856251104e+00,
          0.8845354852370e-08, 0.6208777705343e+01, 0.1692165728891e+01,
          0.1054046966600e-07, 0.5413091423934e+01, 0.2204125344462e+00,
          0.1215539124483e-07, 0.5613969479755e+01, 0.8257698122054e+02,
          0.9932460955209e-08, 0.1106124877015e+01, 0.1017725758696e+02,
          0.8785804715043e-08, 0.2869224476477e+01, 0.9491756770005e+00,

          0.8538084097562e-08, 0.6159640899344e+01, 0.6393282117669e+01,
          0.8648994369529e-08, 0.1374901198784e+01, 0.4804209201333e+01,
          0.1039063219067e-07, 0.5171080641327e+01, 0.1550861511662e+02,
          0.8867983926439e-08, 0.8317320304902e+00, 0.3903911373650e+01,
          0.8327495955244e-08, 0.3605591969180e+01, 0.6172869583223e+01,
          0.9243088356133e-08, 0.6114299196843e+01, 0.6267823317922e+01,
          0.9205657357835e-08, 0.3675153683737e+01, 0.6298328382969e+01,
          0.1033269714606e-07, 0.3313328813024e+01, 0.5573142801433e+01,
          0.8001706275552e-08, 0.2019980960053e+01, 0.2648454860559e+01,
          0.9171858254191e-08, 0.8992015524177e+00, 0.1498544001348e+03,

          0.1075327150242e-07, 0.2898669963648e+01, 0.3694923081589e+02,
          0.9884866689828e-08, 0.4946715904478e+01, 0.1140367694411e+02,
          0.9541835576677e-08, 0.2371787888469e+01, 0.1256713221673e+02,
          0.7739903376237e-08, 0.2213775190612e+01, 0.7834121070590e+01,
          0.7311962684106e-08, 0.3429378787739e+01, 0.1192625446156e+02,
          0.9724904869624e-08, 0.6195878564404e+01, 0.2280573557157e+02,
          0.9251628983612e-08, 0.6511509527390e+00, 0.2787043132925e+01,
          0.7320763787842e-08, 0.6001083639421e+01, 0.6282655592598e+01,
          0.7320296650962e-08, 0.3789073265087e+01, 0.6283496108294e+01,
          0.7947032271039e-08, 0.1059659582204e+01, 0.1241073141809e+02,

          0.9005277053115e-08, 0.1280315624361e+01, 0.6281591679874e+01,
          0.8995601652048e-08, 0.2224439106766e+01, 0.6284560021018e+01,
          0.8288040568796e-08, 0.5234914433867e+01, 0.1241658836951e+02,
          0.6359381347255e-08, 0.4137989441490e+01, 0.1596186371003e+01,
          0.8699572228626e-08, 0.1758411009497e+01, 0.6133512519065e+01,
          0.6456797542736e-08, 0.5919285089994e+01, 0.1685848245639e+02,
          0.7424573475452e-08, 0.5414616938827e+01, 0.4061219149443e+01,
          0.7235671196168e-08, 0.1496516557134e+01, 0.1610006857377e+03,
          0.8104015182733e-08, 0.1919918242764e+01, 0.8460828644453e+00,
          0.8098576535937e-08, 0.3819615855458e+01, 0.3894181736510e+01,

          0.6275292346625e-08, 0.6244264115141e+01, 0.8531963191132e+00,
          0.6052432989112e-08, 0.5037731872610e+00, 0.1567108171867e+02,
          0.5705651535817e-08, 0.2984557271995e+01, 0.1258692712880e+02,
          0.5789650115138e-08, 0.6087038140697e+01, 0.1193336791622e+02,
          0.5512132153377e-08, 0.5855668994076e+01, 0.1232342296471e+02,
          0.7388890819102e-08, 0.2443128574740e+01, 0.4907302013889e+01,
          0.5467593991798e-08, 0.3017561234194e+01, 0.1884211409667e+02,
          0.6388519802999e-08, 0.5887386712935e+01, 0.5217580628120e+02,
          0.6106777149944e-08, 0.3483461059895e+00, 0.1422690933580e-01,
          0.7383420275489e-08, 0.5417387056707e+01, 0.2358125818164e+02,

          0.5505208141738e-08, 0.2848193644783e+01, 0.1151388321134e+02,
          0.6310757462877e-08, 0.2349882520828e+01, 0.1041998632314e+02,
          0.6166904929691e-08, 0.5728575944077e+00, 0.6151533897323e+01,
          0.5263442042754e-08, 0.4495796125937e+01, 0.1885275071096e+02,
          0.5591828082629e-08, 0.1355441967677e+01, 0.4337116142245e+00,
          0.5397051680497e-08, 0.1673422864307e+01, 0.6286362197481e+01,
          0.5396992745159e-08, 0.1833502206373e+01, 0.6279789503410e+01,
          0.6572913000726e-08, 0.3331122065824e+01, 0.1176433076753e+02,
          0.5123421866413e-08, 0.2165327142679e+01, 0.1245594543367e+02,
          0.5930495725999e-08, 0.2931146089284e+01, 0.6414617803568e+01,

          0.6431797403933e-08, 0.4134407994088e+01, 0.1350651127443e+00,
          0.5003182207604e-08, 0.3805420303749e+01, 0.1096996532989e+02,
          0.5587731032504e-08, 0.1082469260599e+01, 0.6062663316000e+01,
          0.5935263407816e-08, 0.8384333678401e+00, 0.5326786718777e+01,
          0.4756019827760e-08, 0.3552588749309e+01, 0.3104930017775e+01,
          0.6599951172637e-08, 0.4320826409528e+01, 0.4087944051283e+02,
          0.5902606868464e-08, 0.4811879454445e+01, 0.5849364236221e+01,
          0.5921147809031e-08, 0.9942628922396e-01, 0.1581959461667e+01,
          0.5505382581266e-08, 0.2466557607764e+01, 0.6503488384892e+01,
          0.5353771071862e-08, 0.4551978748683e+01, 0.1735668374386e+03,

          0.5063282210946e-08, 0.5710812312425e+01, 0.1248988586463e+02,
          0.5926120403383e-08, 0.1333998428358e+01, 0.2673594526851e+02,
          0.5211016176149e-08, 0.4649315360760e+01, 0.2460261242967e+02,
          0.5347075084894e-08, 0.5512754081205e+01, 0.4171425416666e+01,
          0.4872609773574e-08, 0.1308025299938e+01, 0.5333900173445e+01,
          0.4727711321420e-08, 0.2144908368062e+01, 0.7232251527446e+01,
          0.6029426018652e-08, 0.5567259412084e+01, 0.3227113045244e+03,
          0.4321485284369e-08, 0.5230667156451e+01, 0.9388005868221e+01,
          0.4476406760553e-08, 0.6134081115303e+01, 0.5547199253223e+01,
          0.5835268277420e-08, 0.4783808492071e+01, 0.7285056171570e+02,

          0.5172183602748e-08, 0.5161817911099e+01, 0.1884570439172e+02,
          0.5693571465184e-08, 0.1381646203111e+01, 0.9723862754494e+02,
          0.4060634965349e-08, 0.3876705259495e+00, 0.4274518229222e+01,
          0.3967398770473e-08, 0.5029491776223e+01, 0.3496032717521e+01,
          0.3943754005255e-08, 0.1923162955490e+01, 0.6244942932314e+01,
          0.4781323427824e-08, 0.4633332586423e+01, 0.2929661536378e+02,
          0.3871483781204e-08, 0.1616650009743e+01, 0.6321208768577e+01,
          0.5141741733997e-08, 0.9817316704659e-01, 0.1232032006293e+02,
          0.4002385978497e-08, 0.3656161212139e+01, 0.7018952447668e+01,
          0.4901092604097e-08, 0.4404098713092e+01, 0.1478866649112e+01,

          0.3740932630345e-08, 0.5181188732639e+00, 0.6922973089781e+01,
          0.4387283718538e-08, 0.3254859566869e+01, 0.2331413144044e+03,
          0.5019197802033e-08, 0.3086773224677e+01, 0.1715706182245e+02,
          0.3834931695175e-08, 0.2797882673542e+01, 0.1491901785440e+02,
          0.3760413942497e-08, 0.2892676280217e+01, 0.1726726808967e+02,
          0.3719717204628e-08, 0.5861046025739e+01, 0.6297302759782e+01,
          0.4145623530149e-08, 0.2168239627033e+01, 0.1376059875786e+02,
          0.3932788425380e-08, 0.6271811124181e+01, 0.7872148766781e+01,
          0.3686377476857e-08, 0.3936853151404e+01, 0.6268848941110e+01,
          0.3779077950339e-08, 0.1404148734043e+01, 0.4157198507331e+01,

          0.4091334550598e-08, 0.2452436180854e+01, 0.9779108567966e+01,
          0.3926694536146e-08, 0.6102292739040e+01, 0.1098419223922e+02,
          0.4841000253289e-08, 0.6072760457276e+01, 0.1252801878276e+02,
          0.4949340130240e-08, 0.1154832815171e+01, 0.1617106187867e+03,
          0.3761557737360e-08, 0.5527545321897e+01, 0.3185192151914e+01,
          0.3647396268188e-08, 0.1525035688629e+01, 0.6271346477544e+01,
          0.3932405074189e-08, 0.5570681040569e+01, 0.2139354194808e+02,
          0.3631322501141e-08, 0.1981240601160e+01, 0.6294805223347e+01,
          0.4130007425139e-08, 0.2050060880201e+01, 0.2195415756911e+02,
          0.4433905965176e-08, 0.3277477970321e+01, 0.7445550607224e+01,

          0.3851814176947e-08, 0.5210690074886e+01, 0.9562891316684e+00,
          0.3485807052785e-08, 0.6653274904611e+00, 0.1161697602389e+02,
          0.3979772816991e-08, 0.1767941436148e+01, 0.2277943724828e+02,
          0.3402607460500e-08, 0.3421746306465e+01, 0.1087398597200e+02,
          0.4049993000926e-08, 0.1127144787547e+01, 0.3163918923335e+00,
          0.3420511182382e-08, 0.4214794779161e+01, 0.1362553364512e+02,
          0.3640772365012e-08, 0.5324905497687e+01, 0.1725304118033e+02,
          0.3323037987501e-08, 0.6135761838271e+01, 0.6279143387820e+01,
          0.4503141663637e-08, 0.1802305450666e+01, 0.1385561574497e+01,
          0.4314560055588e-08, 0.4812299731574e+01, 0.4176041334900e+01,

          0.3294226949110e-08, 0.3657547059723e+01, 0.6287008313071e+01,
          0.3215657197281e-08, 0.4866676894425e+01, 0.5749861718712e+01,
          0.4129362656266e-08, 0.3809342558906e+01, 0.5905702259363e+01,
          0.3137762976388e-08, 0.2494635174443e+01, 0.2099539292909e+02,
          0.3514010952384e-08, 0.2699961831678e+01, 0.7335344340001e+01,
          0.3327607571530e-08, 0.3318457714816e+01, 0.5436992986000e+01,
          0.3541066946675e-08, 0.4382703582466e+01, 0.1234573916645e+02,
          0.3216179847052e-08, 0.5271066317054e+01, 0.3802769619140e-01,
          0.2959045059570e-08, 0.5819591585302e+01, 0.2670964694522e+02,
          0.3884040326665e-08, 0.5980934960428e+01, 0.6660449441528e+01,

          0.2922027539886e-08, 0.3337290282483e+01, 0.1375773836557e+01,
          0.4110846382042e-08, 0.5742978187327e+01, 0.4480965020977e+02,
          0.2934508411032e-08, 0.2278075804200e+01, 0.6408777551755e+00,
          0.3966896193000e-08, 0.5835747858477e+01, 0.3773735910827e+00,
          0.3286695827610e-08, 0.5838898193902e+01, 0.3932462625300e-02,
          0.3720643094196e-08, 0.1122212337858e+01, 0.1646033343740e+02,
          0.3285508906174e-08, 0.9182250996416e+00, 0.1081813534213e+02,
          0.3753880575973e-08, 0.5174761973266e+01, 0.5642198095270e+01,
          0.3022129385587e-08, 0.3381611020639e+01, 0.2982630633589e+02,
          0.2798569205621e-08, 0.3546193723922e+01, 0.1937891852345e+02,

          0.3397872070505e-08, 0.4533203197934e+01, 0.6923953605621e+01,
          0.3708099772977e-08, 0.2756168198616e+01, 0.3066615496545e+02,
          0.3599283541510e-08, 0.1934395469918e+01, 0.6147450479709e+01,
          0.3688702753059e-08, 0.7149920971109e+00, 0.2636725487657e+01,
          0.2681084724003e-08, 0.4899819493154e+01, 0.6816289982179e+01,
          0.3495993460759e-08, 0.1572418915115e+01, 0.6418701221183e+01,
          0.3130770324995e-08, 0.8912190180489e+00, 0.1235996607578e+02,
          0.2744353821941e-08, 0.3800821940055e+01, 0.2059724391010e+02,
          0.2842732906341e-08, 0.2644717440029e+01, 0.2828699048865e+02,
          0.3046882682154e-08, 0.3987793020179e+01, 0.6055599646783e+01,

          0.2399072455143e-08, 0.9908826440764e+00, 0.6255674361143e+01,
          0.2384306274204e-08, 0.2516149752220e+01, 0.6310477339748e+01,
          0.2977324500559e-08, 0.5849195642118e+01, 0.1652265972112e+02,
          0.3062835258972e-08, 0.1681660100162e+01, 0.1172006883645e+02,
          0.3109682589231e-08, 0.5804143987737e+00, 0.2751146787858e+02,
          0.2903920355299e-08, 0.5800768280123e+01, 0.6510552054109e+01,
          0.2823221989212e-08, 0.9241118370216e+00, 0.5469525544182e+01,
          0.3187949696649e-08, 0.3139776445735e+01, 0.1693792562116e+03,
          0.2922559771655e-08, 0.3549440782984e+01, 0.2630839062450e+00,
          0.2436302066603e-08, 0.4735540696319e+01, 0.3946258593675e+00,

          0.3049473043606e-08, 0.4998289124561e+01, 0.8390110365991e+01,
          0.2863682575784e-08, 0.6709515671102e+00, 0.2243449970715e+00,
          0.2641750517966e-08, 0.5410978257284e+01, 0.2986433403208e+02,
          0.2704093466243e-08, 0.4778317207821e+01, 0.6129297044991e+01,
          0.2445522177011e-08, 0.6009020662222e+01, 0.1171295538178e+02,
          0.2623608810230e-08, 0.5010449777147e+01, 0.6436854655901e+01,
          0.2079259704053e-08, 0.5980943768809e+01, 0.2019909489111e+02,
          0.2820225596771e-08, 0.2679965110468e+01, 0.5934151399930e+01,
          0.2365221950927e-08, 0.1894231148810e+01, 0.2470570524223e+02,
          0.2359682077149e-08, 0.4220752950780e+01, 0.8671969964381e+01,

          0.2387577137206e-08, 0.2571783940617e+01, 0.7096626156709e+01,
          0.1982102089816e-08, 0.5169765997119e+00, 0.1727188400790e+02,
          0.2687502389925e-08, 0.6239078264579e+01, 0.7075506709219e+02,
          0.2207751669135e-08, 0.2031184412677e+01, 0.4377611041777e+01,
          0.2618370214274e-08, 0.8266079985979e+00, 0.6632000300961e+01,
          0.2591951887361e-08, 0.8819350522008e+00, 0.4873985990671e+02,
          0.2375055656248e-08, 0.3520944177789e+01, 0.1590676413561e+02,
          0.2472019978911e-08, 0.1551431908671e+01, 0.6612329252343e+00,
          0.2368157127199e-08, 0.4178610147412e+01, 0.3459636466239e+02,
          0.1764846605693e-08, 0.1506764000157e+01, 0.1980094587212e+02,

          0.2291769608798e-08, 0.2118250611782e+01, 0.2844914056730e-01,
          0.2209997316943e-08, 0.3363255261678e+01, 0.2666070658668e+00,
          0.2292699097923e-08, 0.4200423956460e+00, 0.1484170571900e-02,
          0.1629683015329e-08, 0.2331362582487e+01, 0.3035599730800e+02,
          0.2206492862426e-08, 0.3400274026992e+01, 0.6281667977667e+01,
          0.2205746568257e-08, 0.1066051230724e+00, 0.6284483723224e+01,
          0.2026310767991e-08, 0.2779066487979e+01, 0.2449240616245e+02,
          0.1762977622163e-08, 0.9951450691840e+00, 0.2045286941806e+02,
          0.1368535049606e-08, 0.6402447365817e+00, 0.2473415438279e+02,
          0.1720598775450e-08, 0.2303524214705e+00, 0.1679593901136e+03,

          0.1702429015449e-08, 0.6164622655048e+01, 0.3338575901272e+03,
          0.1414033197685e-08, 0.3954561185580e+01, 0.1624205518357e+03,
          0.1573768958043e-08, 0.2028286308984e+01, 0.3144167757552e+02,
          0.1650705184447e-08, 0.2304040666128e+01, 0.5267006960365e+02,
          0.1651087618855e-08, 0.2538461057280e+01, 0.8956999012000e+02,
          0.1616409518983e-08, 0.5111054348152e+01, 0.3332657872986e+02,
          0.1537175173581e-08, 0.5601130666603e+01, 0.3852657435933e+02,
          0.1593191980553e-08, 0.2614340453411e+01, 0.2282781046519e+03,
          0.1499480170643e-08, 0.3624721577264e+01, 0.2823723341956e+02,
          0.1493807843235e-08, 0.4214569879008e+01, 0.2876692439167e+02,

          0.1074571199328e-08, 0.1496911744704e+00, 0.8397383534231e+02,
          0.1074406983417e-08, 0.1187817671922e+01, 0.8401985929482e+02,
          0.9757576855851e-09, 0.2655703035858e+01, 0.7826370942180e+02,
          0.1258432887565e-08, 0.4969896184844e+01, 0.3115650189215e+03,
          0.1240336343282e-08, 0.5192460776926e+01, 0.1784300471910e+03,
          0.9016107005164e-09, 0.1960356923057e+01, 0.5886454391678e+02,
          0.1135392360918e-08, 0.5082427809068e+01, 0.7842370451713e+02,
          0.9216046089565e-09, 0.2793775037273e+01, 0.1014262087719e+03,
          0.1061276615030e-08, 0.3726144311409e+01, 0.5660027930059e+02,
          0.1010110596263e-08, 0.7404080708937e+00, 0.4245678405627e+02,

          0.7217424756199e-09, 0.2697449980577e-01, 0.2457074661053e+03,
          0.6912003846756e-09, 0.4253296276335e+01, 0.1679936946371e+03,
          0.6871814664847e-09, 0.5148072412354e+01, 0.6053048899753e+02,
          0.4887158016343e-09, 0.2153581148294e+01, 0.9656299901946e+02,
          0.5161802866314e-09, 0.3852750634351e+01, 0.2442876000072e+03,
          0.5652599559057e-09, 0.1233233356270e+01, 0.8365903305582e+02,
          0.4710812608586e-09, 0.5610486976767e+01, 0.3164282286739e+03,
          0.4909977500324e-09, 0.1639629524123e+01, 0.4059982187939e+03,
          0.4772641839378e-09, 0.3737100368583e+01, 0.1805255418145e+03,
          0.4487562567153e-09, 0.1158417054478e+00, 0.8433466158131e+02,

          0.3943441230497e-09, 0.6243502862796e+00, 0.2568537517081e+03,
          0.3952236913598e-09, 0.3510377382385e+01, 0.2449975330562e+03,
          0.3788898363417e-09, 0.5916128302299e+01, 0.1568131045107e+03,
          0.3738329328831e-09, 0.1042266763456e+01, 0.3948519331910e+03,
          0.2451199165151e-09, 0.1166788435700e+01, 0.1435713242844e+03,
          0.2436734402904e-09, 0.3254726114901e+01, 0.2268582385539e+03,
          0.2213605274325e-09, 0.1687210598530e+01, 0.1658638954901e+03,
          0.1491521204829e-09, 0.2657541786794e+01, 0.2219950288015e+03,
          0.1474995329744e-09, 0.5013089805819e+01, 0.3052819430710e+03,
          0.1661939475656e-09, 0.5495315428418e+01, 0.2526661704812e+03,

          0.9015946748003e-10, 0.2236989966505e+01, 0.4171445043968e+03 };

    /* Sun-to-Earth, T^0, Z */
      static final double e0z[] = {
          0.2796207639075e-05, 0.3198701560209e+01, 0.8433466158131e+02,
          0.1016042198142e-05, 0.5422360395913e+01, 0.5507553240374e+01,
          0.8044305033647e-06, 0.3880222866652e+01, 0.5223693906222e+01,
          0.4385347909274e-06, 0.3704369937468e+01, 0.2352866153506e+01,
          0.3186156414906e-06, 0.3999639363235e+01, 0.1577343543434e+01,
          0.2272412285792e-06, 0.3984738315952e+01, 0.1047747311755e+01,
          0.1645620103007e-06, 0.3565412516841e+01, 0.5856477690889e+01,
          0.1815836921166e-06, 0.4984507059020e+01, 0.6283075850446e+01,
          0.1447461676364e-06, 0.3702753570108e+01, 0.9437762937313e+01,
          0.1430760876382e-06, 0.3409658712357e+01, 0.1021328554739e+02,

          0.1120445753226e-06, 0.4829561570246e+01, 0.1414349524433e+02,
          0.1090232840797e-06, 0.2080729178066e+01, 0.6812766822558e+01,
          0.9715727346551e-07, 0.3476295881948e+01, 0.4694002934110e+01,
          0.1036267136217e-06, 0.4056639536648e+01, 0.7109288135493e+02,
          0.8752665271340e-07, 0.4448159519911e+01, 0.5753384878334e+01,
          0.8331864956004e-07, 0.4991704044208e+01, 0.7084896783808e+01,
          0.6901658670245e-07, 0.4325358994219e+01, 0.6275962395778e+01,
          0.9144536848998e-07, 0.1141826375363e+01, 0.6620890113188e+01,
          0.7205085037435e-07, 0.3624344170143e+01, 0.5296909721118e+00,
          0.7697874654176e-07, 0.5554257458998e+01, 0.1676215758509e+03,

          0.5197545738384e-07, 0.6251760961735e+01, 0.1807370494127e+02,
          0.5031345378608e-07, 0.2497341091913e+01, 0.4705732307012e+01,
          0.4527110205840e-07, 0.2335079920992e+01, 0.6309374173736e+01,
          0.4753355798089e-07, 0.7094148987474e+00, 0.5884926831456e+01,
          0.4296951977516e-07, 0.1101916352091e+01, 0.6681224869435e+01,
          0.3855341568387e-07, 0.1825495405486e+01, 0.5486777812467e+01,
          0.5253930970990e-07, 0.4424740687208e+01, 0.7860419393880e+01,
          0.4024630496471e-07, 0.5120498157053e+01, 0.1336797263425e+02,
          0.4061069791453e-07, 0.6029771435451e+01, 0.3930209696940e+01,
          0.3797883804205e-07, 0.4435193600836e+00, 0.3154687086868e+01,

          0.2933033225587e-07, 0.5124157356507e+01, 0.1059381944224e+01,
          0.3503000930426e-07, 0.5421830162065e+01, 0.6069776770667e+01,
          0.3670096214050e-07, 0.4582101667297e+01, 0.1219403291462e+02,
          0.2905609437008e-07, 0.1926566420072e+01, 0.1097707878456e+02,
          0.2466827821713e-07, 0.6090174539834e+00, 0.6496374930224e+01,
          0.2691647295332e-07, 0.1393432595077e+01, 0.2200391463820e+02,
          0.2150554667946e-07, 0.4308671715951e+01, 0.5643178611111e+01,
          0.2237481922680e-07, 0.8133968269414e+00, 0.8635942003952e+01,
          0.1817741038157e-07, 0.3755205127454e+01, 0.3340612434717e+01,
          0.2227820762132e-07, 0.2759558596664e+01, 0.1203646072878e+02,

          0.1944713772307e-07, 0.5699645869121e+01, 0.1179062909082e+02,
          0.1527340520662e-07, 0.1986749091746e+01, 0.3981490189893e+00,
          0.1577282574914e-07, 0.3205017217983e+01, 0.5088628793478e+01,
          0.1424738825424e-07, 0.6256747903666e+01, 0.2544314396739e+01,
          0.1616563121701e-07, 0.2601671259394e+00, 0.1729818233119e+02,
          0.1401210391692e-07, 0.4686939173506e+01, 0.7058598460518e+01,
          0.1488726974214e-07, 0.2815862451372e+01, 0.2593412433514e+02,
          0.1692626442388e-07, 0.4956894109797e+01, 0.1564752902480e+03,
          0.1123571582910e-07, 0.2381192697696e+01, 0.3738761453707e+01,
          0.9903308606317e-08, 0.4294851657684e+01, 0.9225539266174e+01,

          0.9174533187191e-08, 0.3075171510642e+01, 0.4164311961999e+01,
          0.8645985631457e-08, 0.5477534821633e+00, 0.8429241228195e+01,
         -0.1085876492688e-07, 0.0000000000000e+00, 0.0000000000000e+00,
          0.9264309077815e-08, 0.5968571670097e+01, 0.7079373888424e+01,
          0.8243116984954e-08, 0.1489098777643e+01, 0.1044738781244e+02,
          0.8268102113708e-08, 0.3512977691983e+01, 0.1150676975667e+02,
          0.9043613988227e-08, 0.1290704408221e+00, 0.1101510648075e+02,
          0.7432912038789e-08, 0.1991086893337e+01, 0.2608790314060e+02,
          0.8586233727285e-08, 0.4238357924414e+01, 0.2986433403208e+02,
          0.7612230060131e-08, 0.2911090150166e+01, 0.4732030630302e+01,

          0.7097787751408e-08, 0.1908938392390e+01, 0.8031092209206e+01,
          0.7640237040175e-08, 0.6129219000168e+00, 0.7962980379786e+00,
          0.7070445688081e-08, 0.1380417036651e+01, 0.2146165377750e+01,
          0.7690770957702e-08, 0.1680504249084e+01, 0.2122839202813e+02,
          0.8051292542594e-08, 0.5127423484511e+01, 0.2942463415728e+01,
          0.5902709104515e-08, 0.2020274190917e+01, 0.7755226100720e+00,
          0.5134567496462e-08, 0.2606778676418e+01, 0.1256615170089e+02,
          0.5525802046102e-08, 0.1613011769663e+01, 0.8018209333619e+00,
          0.5880724784221e-08, 0.4604483417236e+01, 0.4690479774488e+01,
          0.5211699081370e-08, 0.5718964114193e+01, 0.8827390247185e+01,

          0.4891849573562e-08, 0.3689658932196e+01, 0.2132990797783e+00,
          0.5150246069997e-08, 0.4099769855122e+01, 0.6480980550449e+02,
          0.5102434319633e-08, 0.5660834602509e+01, 0.3379454372902e+02,
          0.5083405254252e-08, 0.9842221218974e+00, 0.4136910472696e+01,
          0.4206562585682e-08, 0.1341363634163e+00, 0.3128388763578e+01,
          0.4663249683579e-08, 0.8130132735866e+00, 0.5216580451554e+01,
          0.4099474416530e-08, 0.5791497770644e+01, 0.4265981595566e+00,
          0.4628251220767e-08, 0.1249802769331e+01, 0.1572083878776e+02,
          0.5024068728142e-08, 0.4795684802743e+01, 0.6290189305114e+01,
          0.5120234327758e-08, 0.3810420387208e+01, 0.5230807360890e+01,

          0.5524029815280e-08, 0.1029264714351e+01, 0.2397622045175e+03,
          0.4757415718860e-08, 0.3528044781779e+01, 0.1649636139783e+02,
          0.3915786131127e-08, 0.5593889282646e+01, 0.1589072916335e+01,
          0.4869053149991e-08, 0.3299636454433e+01, 0.7632943190217e+01,
          0.3649365703729e-08, 0.1286049002584e+01, 0.6206810014183e+01,
          0.3992493949002e-08, 0.3100307589464e+01, 0.2515860172507e+02,
          0.3320247477418e-08, 0.6212683940807e+01, 0.1216800268190e+02,
          0.3287123739696e-08, 0.4699118445928e+01, 0.7234794171227e+01,
          0.3472776811103e-08, 0.2630507142004e+01, 0.7342457794669e+01,
          0.3423253294767e-08, 0.2946432844305e+01, 0.9623688285163e+01,

          0.3896173898244e-08, 0.1224834179264e+01, 0.6438496133249e+01,
          0.3388455337924e-08, 0.1543807616351e+01, 0.1494531617769e+02,
          0.3062704716523e-08, 0.1191777572310e+01, 0.8662240327241e+01,
          0.3270075600400e-08, 0.5483498767737e+01, 0.1194447056968e+01,
          0.3101209215259e-08, 0.8000833804348e+00, 0.3772475342596e+02,
          0.2780883347311e-08, 0.4077980721888e+00, 0.5863591145557e+01,
          0.2903605931824e-08, 0.2617490302147e+01, 0.1965104848470e+02,
          0.2682014743119e-08, 0.2634703158290e+01, 0.7238675589263e+01,
          0.2534360108492e-08, 0.6102446114873e+01, 0.6836645152238e+01,
          0.2392564882509e-08, 0.3681820208691e+01, 0.5849364236221e+01,

          0.2656667254856e-08, 0.6216045388886e+01, 0.6133512519065e+01,
          0.2331242096773e-08, 0.5864949777744e+01, 0.4535059491685e+01,
          0.2287898363668e-08, 0.4566628532802e+01, 0.7477522907414e+01,
          0.2336944521306e-08, 0.2442722126930e+01, 0.1137170464392e+02,
          0.3156632236269e-08, 0.1626628050682e+01, 0.2509084901204e+03,
          0.2982612402766e-08, 0.2803604512609e+01, 0.1748016358760e+01,
          0.2774031674807e-08, 0.4654002897158e+01, 0.8223916695780e+02,
          0.2295236548638e-08, 0.4326518333253e+01, 0.3378142627421e+00,
          0.2190714699873e-08, 0.4519614578328e+01, 0.2908881142201e+02,
          0.2191495845045e-08, 0.3012626912549e+01, 0.1673046366289e+02,

          0.2492901628386e-08, 0.1290101424052e+00, 0.1543797956245e+03,
          0.1993778064319e-08, 0.3864046799414e+01, 0.1778984560711e+02,
          0.1898146479022e-08, 0.5053777235891e+01, 0.2042657109477e+02,
          0.1918280127634e-08, 0.2222470192548e+01, 0.4165496312290e+02,
          0.1916351061607e-08, 0.8719067257774e+00, 0.7737595720538e+02,
          0.1834720181466e-08, 0.4031491098040e+01, 0.2358125818164e+02,
          0.1249201523806e-08, 0.5938379466835e+01, 0.3301902111895e+02,
          0.1477304050539e-08, 0.6544722606797e+00, 0.9548094718417e+02,
          0.1264316431249e-08, 0.2059072853236e+01, 0.8399684731857e+02,
          0.1203526495039e-08, 0.3644813532605e+01, 0.4558517281984e+02,

          0.9221681059831e-09, 0.3241815055602e+01, 0.7805158573086e+02,
          0.7849278367646e-09, 0.5043812342457e+01, 0.5217580628120e+02,
          0.7983392077387e-09, 0.5000024502753e+01, 0.1501922143975e+03,
          0.7925395431654e-09, 0.1398734871821e-01, 0.9061773743175e+02,
          0.7640473285886e-09, 0.5067111723130e+01, 0.4951538251678e+02,
          0.5398937754482e-09, 0.5597382200075e+01, 0.1613385000004e+03,
          0.5626247550193e-09, 0.2601338209422e+01, 0.7318837597844e+02,
          0.5525197197855e-09, 0.5814832109256e+01, 0.1432335100216e+03,
          0.5407629837898e-09, 0.3384820609076e+01, 0.3230491187871e+03,
          0.3856739119801e-09, 0.1072391840473e+01, 0.2334791286671e+03,

          0.3856425239987e-09, 0.2369540393327e+01, 0.1739046517013e+03,
          0.4350867755983e-09, 0.5255575751082e+01, 0.1620484330494e+03,
          0.3844113924996e-09, 0.5482356246182e+01, 0.9757644180768e+02,
          0.2854869155431e-09, 0.9573634763143e+00, 0.1697170704744e+03,
          0.1719227671416e-09, 0.1887203025202e+01, 0.2265204242912e+03,
          0.1527846879755e-09, 0.3982183931157e+01, 0.3341954043900e+03,
          0.1128229264847e-09, 0.2787457156298e+01, 0.3119028331842e+03 };

    /* Sun-to-Earth, T^1, X */
      static final double e1x[] = {
          0.1234046326004e-05, 0.0000000000000e+00, 0.0000000000000e+00,
          0.5150068824701e-06, 0.6002664557501e+01, 0.1256615170089e+02,
          0.1290743923245e-07, 0.5959437664199e+01, 0.1884922755134e+02,
          0.1068615564952e-07, 0.2015529654209e+01, 0.6283075850446e+01,
          0.2079619142538e-08, 0.1732960531432e+01, 0.6279552690824e+01,
          0.2078009243969e-08, 0.4915604476996e+01, 0.6286599010068e+01,
          0.6206330058856e-09, 0.3616457953824e+00, 0.4705732307012e+01,
          0.5989335313746e-09, 0.3802607304474e+01, 0.6256777527156e+01,
          0.5958495663840e-09, 0.2845866560031e+01, 0.6309374173736e+01,
          0.4866923261539e-09, 0.5213203771824e+01, 0.7755226100720e+00,

          0.4267785823142e-09, 0.4368189727818e+00, 0.1059381944224e+01,
          0.4610675141648e-09, 0.1837249181372e-01, 0.7860419393880e+01,
          0.3626989993973e-09, 0.2161590545326e+01, 0.5753384878334e+01,
          0.3563071194389e-09, 0.1452631954746e+01, 0.5884926831456e+01,
          0.3557015642807e-09, 0.4470593393054e+01, 0.6812766822558e+01,
          0.3210412089122e-09, 0.5195926078314e+01, 0.6681224869435e+01,
          0.2875473577986e-09, 0.5916256610193e+01, 0.2513230340178e+02,
          0.2842913681629e-09, 0.1149902426047e+01, 0.6127655567643e+01,
          0.2751248215916e-09, 0.5502088574662e+01, 0.6438496133249e+01,
          0.2481432881127e-09, 0.2921989846637e+01, 0.5486777812467e+01,

          0.2059885976560e-09, 0.3718070376585e+01, 0.7079373888424e+01,
          0.2015522342591e-09, 0.5979395259740e+01, 0.6290189305114e+01,
          0.1995364084253e-09, 0.6772087985494e+00, 0.6275962395778e+01,
          0.1957436436943e-09, 0.2899210654665e+01, 0.5507553240374e+01,
          0.1651609818948e-09, 0.6228206482192e+01, 0.1150676975667e+02,
          0.1822980550699e-09, 0.1469348746179e+01, 0.1179062909082e+02,
          0.1675223159760e-09, 0.3813910555688e+01, 0.7058598460518e+01,
          0.1706491764745e-09, 0.3004380506684e+00, 0.7113454667900e-02,
          0.1392952362615e-09, 0.1440393973406e+01, 0.7962980379786e+00,
          0.1209868266342e-09, 0.4150425791727e+01, 0.4694002934110e+01,

          0.1009827202611e-09, 0.3290040429843e+01, 0.3738761453707e+01,
          0.1047261388602e-09, 0.4229590090227e+01, 0.6282095334605e+01,
          0.1047006652004e-09, 0.2418967680575e+01, 0.6284056366286e+01,
          0.9609993143095e-10, 0.4627943659201e+01, 0.6069776770667e+01,
          0.9590900593873e-10, 0.1894393939924e+01, 0.4136910472696e+01,
          0.9146249188071e-10, 0.2010647519562e+01, 0.6496374930224e+01,
          0.8545274480290e-10, 0.5529846956226e-01, 0.1194447056968e+01,
          0.8224377881194e-10, 0.1254304102174e+01, 0.1589072916335e+01,
          0.6183529510410e-10, 0.3360862168815e+01, 0.8827390247185e+01,
          0.6259255147141e-10, 0.4755628243179e+01, 0.8429241228195e+01,

          0.5539291694151e-10, 0.5371746955142e+01, 0.4933208510675e+01,
          0.7328259466314e-10, 0.4927699613906e+00, 0.4535059491685e+01,
          0.6017835843560e-10, 0.5776682001734e-01, 0.1255903824622e+02,
          0.7079827775243e-10, 0.4395059432251e+01, 0.5088628793478e+01,
          0.5170358878213e-10, 0.5154062619954e+01, 0.1176985366291e+02,
          0.4872301838682e-10, 0.6289611648973e+00, 0.6040347114260e+01,
          0.5249869411058e-10, 0.5617272046949e+01, 0.3154687086868e+01,
          0.4716172354411e-10, 0.3965901800877e+01, 0.5331357529664e+01,
          0.4871214940964e-10, 0.4627507050093e+01, 0.1256967486051e+02,
          0.4598076850751e-10, 0.6023631226459e+01, 0.6525804586632e+01,

          0.4562196089485e-10, 0.4138562084068e+01, 0.3930209696940e+01,
          0.4325493872224e-10, 0.1330845906564e+01, 0.7632943190217e+01,
          0.5673781176748e-10, 0.2558752615657e+01, 0.5729506548653e+01,
          0.3961436642503e-10, 0.2728071734630e+01, 0.7234794171227e+01,
          0.5101868209058e-10, 0.4113444965144e+01, 0.6836645152238e+01,
          0.5257043167676e-10, 0.6195089830590e+01, 0.8031092209206e+01,
          0.5076613989393e-10, 0.2305124132918e+01, 0.7477522907414e+01,
          0.3342169352778e-10, 0.5415998155071e+01, 0.1097707878456e+02,
          0.3545881983591e-10, 0.3727160564574e+01, 0.4164311961999e+01,
          0.3364063738599e-10, 0.2901121049204e+00, 0.1137170464392e+02,

          0.3357039670776e-10, 0.1652229354331e+01, 0.5223693906222e+01,
          0.4307412268687e-10, 0.4938909587445e+01, 0.1592596075957e+01,
          0.3405769115435e-10, 0.2408890766511e+01, 0.3128388763578e+01,
          0.3001926198480e-10, 0.4862239006386e+01, 0.1748016358760e+01,
          0.2778264787325e-10, 0.5241168661353e+01, 0.7342457794669e+01,
          0.2676159480666e-10, 0.3423593942199e+01, 0.2146165377750e+01,
          0.2954273399939e-10, 0.1881721265406e+01, 0.5368044267797e+00,
          0.3309362888795e-10, 0.1931525677349e+01, 0.8018209333619e+00,
          0.2810283608438e-10, 0.2414659495050e+01, 0.5225775174439e+00,
          0.3378045637764e-10, 0.4238019163430e+01, 0.1554202828031e+00,

          0.2558134979840e-10, 0.1828225235805e+01, 0.5230807360890e+01,
          0.2273755578447e-10, 0.5858184283998e+01, 0.7084896783808e+01,
          0.2294176037690e-10, 0.4514589779057e+01, 0.1726015463500e+02,
          0.2533506099435e-10, 0.2355717851551e+01, 0.5216580451554e+01,
          0.2716685375812e-10, 0.2221003625100e+01, 0.8635942003952e+01,
          0.2419043435198e-10, 0.5955704951635e+01, 0.4690479774488e+01,
          0.2521232544812e-10, 0.1395676848521e+01, 0.5481254917084e+01,
          0.2630195021491e-10, 0.5727468918743e+01, 0.2629832328990e-01,
          0.2548395840944e-10, 0.2628351859400e-03, 0.1349867339771e+01 };

    /* Sun-to-Earth, T^1, Y */
      static final double e1y[] = {
          0.9304690546528e-06, 0.0000000000000e+00, 0.0000000000000e+00,
          0.5150715570663e-06, 0.4431807116294e+01, 0.1256615170089e+02,
          0.1290825411056e-07, 0.4388610039678e+01, 0.1884922755134e+02,
          0.4645466665386e-08, 0.5827263376034e+01, 0.6283075850446e+01,
          0.2079625310718e-08, 0.1621698662282e+00, 0.6279552690824e+01,
          0.2078189850907e-08, 0.3344713435140e+01, 0.6286599010068e+01,
          0.6207190138027e-09, 0.5074049319576e+01, 0.4705732307012e+01,
          0.5989826532569e-09, 0.2231842216620e+01, 0.6256777527156e+01,
          0.5961360812618e-09, 0.1274975769045e+01, 0.6309374173736e+01,
          0.4874165471016e-09, 0.3642277426779e+01, 0.7755226100720e+00,

          0.4283834034360e-09, 0.5148765510106e+01, 0.1059381944224e+01,
          0.4652389287529e-09, 0.4715794792175e+01, 0.7860419393880e+01,
          0.3751707476401e-09, 0.6617207370325e+00, 0.5753384878334e+01,
          0.3559998806198e-09, 0.6155548875404e+01, 0.5884926831456e+01,
          0.3558447558857e-09, 0.2898827297664e+01, 0.6812766822558e+01,
          0.3211116927106e-09, 0.3625813502509e+01, 0.6681224869435e+01,
          0.2875609914672e-09, 0.4345435813134e+01, 0.2513230340178e+02,
          0.2843109704069e-09, 0.5862263940038e+01, 0.6127655567643e+01,
          0.2744676468427e-09, 0.3926419475089e+01, 0.6438496133249e+01,
          0.2481285237789e-09, 0.1351976572828e+01, 0.5486777812467e+01,

          0.2060338481033e-09, 0.2147556998591e+01, 0.7079373888424e+01,
          0.2015822358331e-09, 0.4408358972216e+01, 0.6290189305114e+01,
          0.2001195944195e-09, 0.5385829822531e+01, 0.6275962395778e+01,
          0.1953667642377e-09, 0.1304933746120e+01, 0.5507553240374e+01,
          0.1839744078713e-09, 0.6173567228835e+01, 0.1179062909082e+02,
          0.1643334294845e-09, 0.4635942997523e+01, 0.1150676975667e+02,
          0.1768051018652e-09, 0.5086283558874e+01, 0.7113454667900e-02,
          0.1674874205489e-09, 0.2243332137241e+01, 0.7058598460518e+01,
          0.1421445397609e-09, 0.6186899771515e+01, 0.7962980379786e+00,
          0.1255163958267e-09, 0.5730238465658e+01, 0.4694002934110e+01,

          0.1013945281961e-09, 0.1726055228402e+01, 0.3738761453707e+01,
          0.1047294335852e-09, 0.2658801228129e+01, 0.6282095334605e+01,
          0.1047103879392e-09, 0.8481047835035e+00, 0.6284056366286e+01,
          0.9530343962826e-10, 0.3079267149859e+01, 0.6069776770667e+01,
          0.9604637611690e-10, 0.3258679792918e+00, 0.4136910472696e+01,
          0.9153518537177e-10, 0.4398599886584e+00, 0.6496374930224e+01,
          0.8562458214922e-10, 0.4772686794145e+01, 0.1194447056968e+01,
          0.8232525360654e-10, 0.5966220721679e+01, 0.1589072916335e+01,
          0.6150223411438e-10, 0.1780985591923e+01, 0.8827390247185e+01,
          0.6272087858000e-10, 0.3184305429012e+01, 0.8429241228195e+01,

          0.5540476311040e-10, 0.3801260595433e+01, 0.4933208510675e+01,
          0.7331901699361e-10, 0.5205948591865e+01, 0.4535059491685e+01,
          0.6018528702791e-10, 0.4770139083623e+01, 0.1255903824622e+02,
          0.5150530724804e-10, 0.3574796899585e+01, 0.1176985366291e+02,
          0.6471933741811e-10, 0.2679787266521e+01, 0.5088628793478e+01,
          0.5317460644174e-10, 0.9528763345494e+00, 0.3154687086868e+01,
          0.4832187748783e-10, 0.5329322498232e+01, 0.6040347114260e+01,
          0.4716763555110e-10, 0.2395235316466e+01, 0.5331357529664e+01,
          0.4871509139861e-10, 0.3056663648823e+01, 0.1256967486051e+02,
          0.4598417696768e-10, 0.4452762609019e+01, 0.6525804586632e+01,

          0.5674189533175e-10, 0.9879680872193e+00, 0.5729506548653e+01,
          0.4073560328195e-10, 0.5939127696986e+01, 0.7632943190217e+01,
          0.5040994945359e-10, 0.4549875824510e+01, 0.8031092209206e+01,
          0.5078185134679e-10, 0.7346659893982e+00, 0.7477522907414e+01,
          0.3769343537061e-10, 0.1071317188367e+01, 0.7234794171227e+01,
          0.4980331365299e-10, 0.2500345341784e+01, 0.6836645152238e+01,
          0.3458236594757e-10, 0.3825159450711e+01, 0.1097707878456e+02,
          0.3578859493602e-10, 0.5299664791549e+01, 0.4164311961999e+01,
          0.3370504646419e-10, 0.5002316301593e+01, 0.1137170464392e+02,
          0.3299873338428e-10, 0.2526123275282e+01, 0.3930209696940e+01,

          0.4304917318409e-10, 0.3368078557132e+01, 0.1592596075957e+01,
          0.3402418753455e-10, 0.8385495425800e+00, 0.3128388763578e+01,
          0.2778460572146e-10, 0.3669905203240e+01, 0.7342457794669e+01,
          0.2782710128902e-10, 0.2691664812170e+00, 0.1748016358760e+01,
          0.2711725179646e-10, 0.4707487217718e+01, 0.5296909721118e+00,
          0.2981760946340e-10, 0.3190260867816e+00, 0.5368044267797e+00,
          0.2811672977772e-10, 0.3196532315372e+01, 0.7084896783808e+01,
          0.2863454474467e-10, 0.2263240324780e+00, 0.5223693906222e+01,
          0.3333464634051e-10, 0.3498451685065e+01, 0.8018209333619e+00,
          0.3312991747609e-10, 0.5839154477412e+01, 0.1554202828031e+00,

          0.2813255564006e-10, 0.8268044346621e+00, 0.5225775174439e+00,
          0.2665098083966e-10, 0.3934021725360e+01, 0.5216580451554e+01,
          0.2349795705216e-10, 0.5197620913779e+01, 0.2146165377750e+01,
          0.2330352293961e-10, 0.2984999231807e+01, 0.1726015463500e+02,
          0.2728001683419e-10, 0.6521679638544e+00, 0.8635942003952e+01,
          0.2484061007669e-10, 0.3468955561097e+01, 0.5230807360890e+01,
          0.2646328768427e-10, 0.1013724533516e+01, 0.2629832328990e-01,
          0.2518630264831e-10, 0.6108081057122e+01, 0.5481254917084e+01,
          0.2421901455384e-10, 0.1651097776260e+01, 0.1349867339771e+01,
          0.6348533267831e-11, 0.3220226560321e+01, 0.8433466158131e+02 };

    /* Sun-to-Earth, T^1, Z */
      static final double e1z[] = {
          0.2278290449966e-05, 0.3413716033863e+01, 0.6283075850446e+01,
          0.5429458209830e-07, 0.0000000000000e+00, 0.0000000000000e+00,
          0.1903240492525e-07, 0.3370592358297e+01, 0.1256615170089e+02,
          0.2385409276743e-09, 0.3327914718416e+01, 0.1884922755134e+02,
          0.8676928342573e-10, 0.1824006811264e+01, 0.5223693906222e+01,
          0.7765442593544e-10, 0.3888564279247e+01, 0.5507553240374e+01,
          0.7066158332715e-10, 0.5194267231944e+01, 0.2352866153506e+01,
          0.7092175288657e-10, 0.2333246960021e+01, 0.8399684731857e+02,
          0.5357582213535e-10, 0.2224031176619e+01, 0.5296909721118e+00,
          0.3828035865021e-10, 0.2156710933584e+01, 0.6279552690824e+01,

          0.3824857220427e-10, 0.1529755219915e+01, 0.6286599010068e+01,
          0.3286995181628e-10, 0.4879512900483e+01, 0.1021328554739e+02 };

    /* Sun-to-Earth, T^2, X */
      static final double e2x[] = {
         -0.4143818297913e-10, 0.0000000000000e+00, 0.0000000000000e+00,
          0.2171497694435e-10, 0.4398225628264e+01, 0.1256615170089e+02,
          0.9845398442516e-11, 0.2079720838384e+00, 0.6283075850446e+01,
          0.9256833552682e-12, 0.4191264694361e+01, 0.1884922755134e+02,
          0.1022049384115e-12, 0.5381133195658e+01, 0.8399684731857e+02 };

    /* Sun-to-Earth, T^2, Y */
      static final double e2y[] = {
          0.5063375872532e-10, 0.0000000000000e+00, 0.0000000000000e+00,
          0.2173815785980e-10, 0.2827805833053e+01, 0.1256615170089e+02,
          0.1010231999920e-10, 0.4634612377133e+01, 0.6283075850446e+01,
          0.9259745317636e-12, 0.2620612076189e+01, 0.1884922755134e+02,
          0.1022202095812e-12, 0.3809562326066e+01, 0.8399684731857e+02 };

    /* Sun-to-Earth, T^2, Z */
      static final double e2z[] = {
          0.9722666114891e-10, 0.5152219582658e+01, 0.6283075850446e+01,
         -0.3494819171909e-11, 0.0000000000000e+00, 0.0000000000000e+00,
          0.6713034376076e-12, 0.6440188750495e+00, 0.1256615170089e+02 };

    }
      //subclassed the 
      private static class SSB {
    /* SSB-to-Sun, T^0, X */
      static final double s0x[] = {
          0.4956757536410e-02, 0.3741073751789e+01, 0.5296909721118e+00,
          0.2718490072522e-02, 0.4016011511425e+01, 0.2132990797783e+00,
          0.1546493974344e-02, 0.2170528330642e+01, 0.3813291813120e-01,
          0.8366855276341e-03, 0.2339614075294e+01, 0.7478166569050e-01,
          0.2936777942117e-03, 0.0000000000000e+00, 0.0000000000000e+00,
          0.1201317439469e-03, 0.4090736353305e+01, 0.1059381944224e+01,
          0.7578550887230e-04, 0.3241518088140e+01, 0.4265981595566e+00,
          0.1941787367773e-04, 0.1012202064330e+01, 0.2061856251104e+00,
          0.1889227765991e-04, 0.3892520416440e+01, 0.2204125344462e+00,
          0.1937896968613e-04, 0.4797779441161e+01, 0.1495633313810e+00,

          0.1434506110873e-04, 0.3868960697933e+01, 0.5225775174439e+00,
          0.1406659911580e-04, 0.4759766557397e+00, 0.5368044267797e+00,
          0.1179022300202e-04, 0.7774961520598e+00, 0.7626583626240e-01,
          0.8085864460959e-05, 0.3254654471465e+01, 0.3664874755930e-01,
          0.7622752967615e-05, 0.4227633103489e+01, 0.3961708870310e-01,
          0.6209171139066e-05, 0.2791828325711e+00, 0.7329749511860e-01,
          0.4366435633970e-05, 0.4440454875925e+01, 0.1589072916335e+01,
          0.3792124889348e-05, 0.5156393842356e+01, 0.7113454667900e-02,
          0.3154548963402e-05, 0.6157005730093e+01, 0.4194847048887e+00,
          0.3088359882942e-05, 0.2494567553163e+01, 0.6398972393349e+00,

          0.2788440902136e-05, 0.4934318747989e+01, 0.1102062672231e+00,
          0.3039928456376e-05, 0.4895077702640e+01, 0.6283075850446e+01,
          0.2272258457679e-05, 0.5278394064764e+01, 0.1030928125552e+00,
          0.2162007057957e-05, 0.5802978019099e+01, 0.3163918923335e+00,
          0.1767632855737e-05, 0.3415346595193e-01, 0.1021328554739e+02,
          0.1349413459362e-05, 0.2001643230755e+01, 0.1484170571900e-02,
          0.1170141900476e-05, 0.2424750491620e+01, 0.6327837846670e+00,
          0.1054355266820e-05, 0.3123311487576e+01, 0.4337116142245e+00,
          0.9800822461610e-06, 0.3026258088130e+01, 0.1052268489556e+01,
          0.1091203749931e-05, 0.3157811670347e+01, 0.1162474756779e+01,

          0.6960236715913e-06, 0.8219570542313e+00, 0.1066495398892e+01,
          0.5689257296909e-06, 0.1323052375236e+01, 0.9491756770005e+00,
          0.6613172135802e-06, 0.2765348881598e+00, 0.8460828644453e+00,
          0.6277702517571e-06, 0.5794064466382e+01, 0.1480791608091e+00,
          0.6304884066699e-06, 0.7323555380787e+00, 0.2243449970715e+00,
          0.4897850467382e-06, 0.3062464235399e+01, 0.3340612434717e+01,
          0.3759148598786e-06, 0.4588290469664e+01, 0.3516457698740e-01,
          0.3110520548195e-06, 0.1374299536572e+01, 0.6373574839730e-01,
          0.3064708359780e-06, 0.4222267485047e+01, 0.1104591729320e-01,
          0.2856347168241e-06, 0.3714202944973e+01, 0.1510475019529e+00,

          0.2840945514288e-06, 0.2847972875882e+01, 0.4110125927500e-01,
          0.2378951599405e-06, 0.3762072563388e+01, 0.2275259891141e+00,
          0.2714229481417e-06, 0.1036049980031e+01, 0.2535050500000e-01,
          0.2323551717307e-06, 0.4682388599076e+00, 0.8582758298370e-01,
          0.1881790512219e-06, 0.4790565425418e+01, 0.2118763888447e+01,
          0.2261353968371e-06, 0.1669144912212e+01, 0.7181332454670e-01,
          0.2214546389848e-06, 0.3937717281614e+01, 0.2968341143800e-02,
          0.2184915594933e-06, 0.1129169845099e+00, 0.7775000683430e-01,
          0.2000164937936e-06, 0.4030009638488e+01, 0.2093666171530e+00,
          0.1966105136719e-06, 0.8745955786834e+00, 0.2172315424036e+00,

          0.1904742332624e-06, 0.5919743598964e+01, 0.2022531624851e+00,
          0.1657399705031e-06, 0.2549141484884e+01, 0.7358765972222e+00,
          0.1574070533987e-06, 0.5277533020230e+01, 0.7429900518901e+00,
          0.1832261651039e-06, 0.3064688127777e+01, 0.3235053470014e+00,
          0.1733615346569e-06, 0.3011432799094e+01, 0.1385174140878e+00,
          0.1549124014496e-06, 0.4005569132359e+01, 0.5154640627760e+00,
          0.1637044713838e-06, 0.1831375966632e+01, 0.8531963191132e+00,
          0.1123420082383e-06, 0.1180270407578e+01, 0.1990721704425e+00,
          0.1083754165740e-06, 0.3414101320863e+00, 0.5439178814476e+00,
          0.1156638012655e-06, 0.6130479452594e+00, 0.5257585094865e+00,

          0.1142548785134e-06, 0.3724761948846e+01, 0.5336234347371e+00,
          0.7921463895965e-07, 0.2435425589361e+01, 0.1478866649112e+01,
          0.7428600285231e-07, 0.3542144398753e+01, 0.2164800718209e+00,
          0.8323211246747e-07, 0.3525058072354e+01, 0.1692165728891e+01,
          0.7257595116312e-07, 0.1364299431982e+01, 0.2101180877357e+00,
          0.7111185833236e-07, 0.2460478875808e+01, 0.4155522422634e+00,
          0.6868090383716e-07, 0.4397327670704e+01, 0.1173197218910e+00,
          0.7226419974175e-07, 0.4042647308905e+01, 0.1265567569334e+01,
          0.6955642383177e-07, 0.2865047906085e+01, 0.9562891316684e+00,
          0.7492139296331e-07, 0.5014278994215e+01, 0.1422690933580e-01,

          0.6598363128857e-07, 0.2376730020492e+01, 0.6470106940028e+00,
          0.7381147293385e-07, 0.3272990384244e+01, 0.1581959461667e+01,
          0.6402909624032e-07, 0.5302290955138e+01, 0.9597935788730e-01,
          0.6237454263857e-07, 0.5444144425332e+01, 0.7084920306520e-01,
          0.5241198544016e-07, 0.4215359579205e+01, 0.5265099800692e+00,
          0.5144463853918e-07, 0.1218916689916e+00, 0.5328719641544e+00,
          0.5868164772299e-07, 0.2369402002213e+01, 0.7871412831580e-01,
          0.6233195669151e-07, 0.1254922242403e+01, 0.2608790314060e+02,
          0.6068463791422e-07, 0.5679713760431e+01, 0.1114304132498e+00,
          0.4359361135065e-07, 0.6097219641646e+00, 0.1375773836557e+01,

          0.4686510366826e-07, 0.4786231041431e+01, 0.1143987543936e+00,
          0.3758977287225e-07, 0.1167368068139e+01, 0.1596186371003e+01,
          0.4282051974778e-07, 0.1519471064319e+01, 0.2770348281756e+00,
          0.5153765386113e-07, 0.1860532322984e+01, 0.2228608264996e+00,
          0.4575129387188e-07, 0.7632857887158e+00, 0.1465949902372e+00,
          0.3326844933286e-07, 0.1298219485285e+01, 0.5070101000000e-01,
          0.3748617450984e-07, 0.1046510321062e+01, 0.4903339079539e+00,
          0.2816756661499e-07, 0.3434522346190e+01, 0.2991266627620e+00,
          0.3412750405039e-07, 0.2523766270318e+01, 0.3518164938661e+00,
          0.2655796761776e-07, 0.2904422260194e+01, 0.6256703299991e+00,

          0.2963597929458e-07, 0.5923900431149e+00, 0.1099462426779e+00,
          0.2539523734781e-07, 0.4851947722567e+01, 0.1256615170089e+02,
          0.2283087914139e-07, 0.3400498595496e+01, 0.6681224869435e+01,
          0.2321309799331e-07, 0.5789099148673e+01, 0.3368040641550e-01,
          0.2549657649750e-07, 0.3991856479792e-01, 0.1169588211447e+01,
          0.2290462303977e-07, 0.2788567577052e+01, 0.1045155034888e+01,
          0.1945398522914e-07, 0.3290896998176e+01, 0.1155361302111e+01,
          0.1849171512638e-07, 0.2698060129367e+01, 0.4452511715700e-02,
          0.1647199834254e-07, 0.3016735644085e+01, 0.4408250688924e+00,
          0.1529530765273e-07, 0.5573043116178e+01, 0.6521991896920e-01,

          0.1433199339978e-07, 0.1481192356147e+01, 0.9420622223326e+00,
          0.1729134193602e-07, 0.1422817538933e+01, 0.2108507877249e+00,
          0.1716463931346e-07, 0.3469468901855e+01, 0.2157473718317e+00,
          0.1391206061378e-07, 0.6122436220547e+01, 0.4123712502208e+00,
          0.1404746661924e-07, 0.1647765641936e+01, 0.4258542984690e-01,
          0.1410452399455e-07, 0.5989729161964e+01, 0.2258291676434e+00,
          0.1089828772168e-07, 0.2833705509371e+01, 0.4226656969313e+00,
          0.1047374564948e-07, 0.5090690007331e+00, 0.3092784376656e+00,
          0.1358279126532e-07, 0.5128990262836e+01, 0.7923417740620e-01,
          0.1020456476148e-07, 0.9632772880808e+00, 0.1456308687557e+00,

          0.1033428735328e-07, 0.3223779318418e+01, 0.1795258541446e+01,
          0.1412435841540e-07, 0.2410271572721e+01, 0.1525316725248e+00,
          0.9722759371574e-08, 0.2333531395690e+01, 0.8434341241180e-01,
          0.9657334084704e-08, 0.6199270974168e+01, 0.1272681024002e+01,
          0.1083641148690e-07, 0.2864222292929e+01, 0.7032915397480e-01,
          0.1067318403838e-07, 0.5833458866568e+00, 0.2123349582968e+00,
          0.1062366201976e-07, 0.4307753989494e+01, 0.2142632012598e+00,
          0.1236364149266e-07, 0.2873917870593e+01, 0.1847279083684e+00,
          0.1092759489593e-07, 0.2959887266733e+01, 0.1370332435159e+00,
          0.8912069362899e-08, 0.5141213702562e+01, 0.2648454860559e+01,

          0.9656467707970e-08, 0.4532182462323e+01, 0.4376440768498e+00,
          0.8098386150135e-08, 0.2268906338379e+01, 0.2880807454688e+00,
          0.7857714675000e-08, 0.4055544260745e+01, 0.2037373330570e+00,
          0.7288455940646e-08, 0.5357901655142e+01, 0.1129145838217e+00,
          0.9450595950552e-08, 0.4264926963939e+01, 0.5272426800584e+00,
          0.9381718247537e-08, 0.7489366976576e-01, 0.5321392641652e+00,
          0.7079052646038e-08, 0.1923311052874e+01, 0.6288513220417e+00,
          0.9259004415344e-08, 0.2970256853438e+01, 0.1606092486742e+00,
          0.8259801499742e-08, 0.3327056314697e+01, 0.8389694097774e+00,
          0.6476334355779e-08, 0.2954925505727e+01, 0.2008557621224e+01,

          0.5984021492007e-08, 0.9138753105829e+00, 0.2042657109477e+02,
          0.5989546863181e-08, 0.3244464082031e+01, 0.2111650433779e+01,
          0.6233108606023e-08, 0.4995232638403e+00, 0.4305306221819e+00,
          0.6877299149965e-08, 0.2834987233449e+01, 0.9561746721300e-02,
          0.8311234227190e-08, 0.2202951835758e+01, 0.3801276407308e+00,
          0.6599472832414e-08, 0.4478581462618e+01, 0.1063314406849e+01,
          0.6160491096549e-08, 0.5145858696411e+01, 0.1368660381889e+01,
          0.6164772043891e-08, 0.3762976697911e+00, 0.4234171675140e+00,
          0.6363248684450e-08, 0.3162246718685e+01, 0.1253008786510e-01,
          0.6448587520999e-08, 0.3442693302119e+01, 0.5287268506303e+00,

          0.6431662283977e-08, 0.8977549136606e+00, 0.5306550935933e+00,
          0.6351223158474e-08, 0.4306447410369e+01, 0.5217580628120e+02,
          0.5476721393451e-08, 0.3888529177855e+01, 0.2221856701002e+01,
          0.5341772572619e-08, 0.2655560662512e+01, 0.7466759693650e-01,
          0.5337055758302e-08, 0.5164990735946e+01, 0.7489573444450e-01,
          0.5373120816787e-08, 0.6041214553456e+01, 0.1274714967946e+00,
          0.5392351705426e-08, 0.9177763485932e+00, 0.1055449481598e+01,
          0.6688495850205e-08, 0.3089608126937e+01, 0.2213766559277e+00,
          0.5072003660362e-08, 0.4311316541553e+01, 0.2132517061319e+00,
          0.5070726650455e-08, 0.5790675464444e+00, 0.2133464534247e+00,

          0.5658012950032e-08, 0.2703945510675e+01, 0.7287631425543e+00,
          0.4835509924854e-08, 0.2975422976065e+01, 0.7160067364790e-01,
          0.6479821978012e-08, 0.1324168733114e+01, 0.2209183458640e-01,
          0.6230636494980e-08, 0.2860103632836e+01, 0.3306188016693e+00,
          0.4649239516213e-08, 0.4832259763403e+01, 0.7796265773310e-01,
          0.6487325792700e-08, 0.2726165825042e+01, 0.3884652414254e+00,
          0.4682823682770e-08, 0.6966602455408e+00, 0.1073608853559e+01,
          0.5704230804976e-08, 0.5669634104606e+01, 0.8731175355560e-01,
          0.6125413585489e-08, 0.1513386538915e+01, 0.7605151500000e-01,
          0.6035825038187e-08, 0.1983509168227e+01, 0.9846002785331e+00,

          0.4331123462303e-08, 0.2782892992807e+01, 0.4297791515992e+00,
          0.4681107685143e-08, 0.5337232886836e+01, 0.2127790306879e+00,
          0.4669105829655e-08, 0.5837133792160e+01, 0.2138191288687e+00,
          0.5138823602365e-08, 0.3080560200507e+01, 0.7233337363710e-01,
          0.4615856664534e-08, 0.1661747897471e+01, 0.8603097737811e+00,
          0.4496916702197e-08, 0.2112508027068e+01, 0.7381754420900e-01,
          0.4278479042945e-08, 0.5716528462627e+01, 0.7574578717200e-01,
          0.3840525503932e-08, 0.6424172726492e+00, 0.3407705765729e+00,
          0.4866636509685e-08, 0.4919244697715e+01, 0.7722995774390e-01,
          0.3526100639296e-08, 0.2550821052734e+01, 0.6225157782540e-01,

          0.3939558488075e-08, 0.3939331491710e+01, 0.5268983110410e-01,
          0.4041268772576e-08, 0.2275337571218e+01, 0.3503323232942e+00,
          0.3948761842853e-08, 0.1999324200790e+01, 0.1451108196653e+00,
          0.3258394550029e-08, 0.9121001378200e+00, 0.5296435984654e+00,
          0.3257897048761e-08, 0.3428428660869e+01, 0.5297383457582e+00,
          0.3842559031298e-08, 0.6132927720035e+01, 0.9098186128426e+00,
          0.3109920095448e-08, 0.7693650193003e+00, 0.3932462625300e-02,
          0.3132237775119e-08, 0.3621293854908e+01, 0.2346394437820e+00,
          0.3942189421510e-08, 0.4841863659733e+01, 0.3180992042600e-02,
          0.3796972285340e-08, 0.1814174994268e+01, 0.1862120789403e+00,

          0.3995640233688e-08, 0.1386990406091e+01, 0.4549093064213e+00,
          0.2875013727414e-08, 0.9178318587177e+00, 0.1905464808669e+01,
          0.3073719932844e-08, 0.2688923811835e+01, 0.3628624111593e+00,
          0.2731016580075e-08, 0.1188259127584e+01, 0.2131850110243e+00,
          0.2729549896546e-08, 0.3702160634273e+01, 0.2134131485323e+00,
          0.3339372892449e-08, 0.7199163960331e+00, 0.2007689919132e+00,
          0.2898833764204e-08, 0.1916709364999e+01, 0.5291709230214e+00,
          0.2894536549362e-08, 0.2424043195547e+01, 0.5302110212022e+00,
          0.3096872473843e-08, 0.4445894977497e+01, 0.2976424921901e+00,
          0.2635672326810e-08, 0.3814366984117e+01, 0.1485980103780e+01,

          0.3649302697001e-08, 0.2924200596084e+01, 0.6044726378023e+00,
          0.3127954585895e-08, 0.1842251648327e+01, 0.1084620721060e+00,
          0.2616040173947e-08, 0.4155841921984e+01, 0.1258454114666e+01,
          0.2597395859860e-08, 0.1158045978874e+00, 0.2103781122809e+00,
          0.2593286172210e-08, 0.4771850408691e+01, 0.2162200472757e+00,
          0.2481823585747e-08, 0.4608842558889e+00, 0.1062562936266e+01,
          0.2742219550725e-08, 0.1538781127028e+01, 0.5651155736444e+00,
          0.3199558469610e-08, 0.3226647822878e+00, 0.7036329877322e+00,
          0.2666088542957e-08, 0.1967991731219e+00, 0.1400015846597e+00,
          0.2397067430580e-08, 0.3707036669873e+01, 0.2125476091956e+00,

          0.2376570772738e-08, 0.1182086628042e+01, 0.2140505503610e+00,
          0.2547228007887e-08, 0.4906256820629e+01, 0.1534957940063e+00,
          0.2265575594114e-08, 0.3414949866857e+01, 0.2235935264888e+00,
          0.2464381430585e-08, 0.4599122275378e+01, 0.2091065926078e+00,
          0.2433408527044e-08, 0.2830751145445e+00, 0.2174915669488e+00,
          0.2443605509076e-08, 0.4212046432538e+01, 0.1739420156204e+00,
          0.2319779262465e-08, 0.9881978408630e+00, 0.7530171478090e-01,
          0.2284622835465e-08, 0.5565347331588e+00, 0.7426161660010e-01,
          0.2467268750783e-08, 0.5655708150766e+00, 0.2526561439362e+00,
          0.2808513492782e-08, 0.1418405053408e+01, 0.5636314030725e+00,

          0.2329528932532e-08, 0.4069557545675e+01, 0.1056200952181e+01,
          0.9698639532817e-09, 0.1074134313634e+01, 0.7826370942180e+02 };

    /* SSB-to-Sun, T^0, Y */
      static final double s0y[] = {
          0.4955392320126e-02, 0.2170467313679e+01, 0.5296909721118e+00,
          0.2722325167392e-02, 0.2444433682196e+01, 0.2132990797783e+00,
          0.1546579925346e-02, 0.5992779281546e+00, 0.3813291813120e-01,
          0.8363140252966e-03, 0.7687356310801e+00, 0.7478166569050e-01,
          0.3385792683603e-03, 0.0000000000000e+00, 0.0000000000000e+00,
          0.1201192221613e-03, 0.2520035601514e+01, 0.1059381944224e+01,
          0.7587125720554e-04, 0.1669954006449e+01, 0.4265981595566e+00,
          0.1964155361250e-04, 0.5707743963343e+01, 0.2061856251104e+00,
          0.1891900364909e-04, 0.2320960679937e+01, 0.2204125344462e+00,
          0.1937373433356e-04, 0.3226940689555e+01, 0.1495633313810e+00,

          0.1437139941351e-04, 0.2301626908096e+01, 0.5225775174439e+00,
          0.1406267683099e-04, 0.5188579265542e+01, 0.5368044267797e+00,
          0.1178703080346e-04, 0.5489483248476e+01, 0.7626583626240e-01,
          0.8079835186041e-05, 0.1683751835264e+01, 0.3664874755930e-01,
          0.7623253594652e-05, 0.2656400462961e+01, 0.3961708870310e-01,
          0.6248667483971e-05, 0.4992775362055e+01, 0.7329749511860e-01,
          0.4366353695038e-05, 0.2869706279678e+01, 0.1589072916335e+01,
          0.3829101568895e-05, 0.3572131359950e+01, 0.7113454667900e-02,
          0.3175733773908e-05, 0.4535372530045e+01, 0.4194847048887e+00,
          0.3092437902159e-05, 0.9230153317909e+00, 0.6398972393349e+00,

          0.2874168812154e-05, 0.3363143761101e+01, 0.1102062672231e+00,
          0.3040119321826e-05, 0.3324250895675e+01, 0.6283075850446e+01,
          0.2699723308006e-05, 0.2917882441928e+00, 0.1030928125552e+00,
          0.2134832683534e-05, 0.4220997202487e+01, 0.3163918923335e+00,
          0.1770412139433e-05, 0.4747318496462e+01, 0.1021328554739e+02,
          0.1377264209373e-05, 0.4305058462401e+00, 0.1484170571900e-02,
          0.1127814538960e-05, 0.8538177240740e+00, 0.6327837846670e+00,
          0.1055608090130e-05, 0.1551800742580e+01, 0.4337116142245e+00,
          0.9802673861420e-06, 0.1459646735377e+01, 0.1052268489556e+01,
          0.1090329461951e-05, 0.1587351228711e+01, 0.1162474756779e+01,

          0.6959590025090e-06, 0.5534442628766e+01, 0.1066495398892e+01,
          0.5664914529542e-06, 0.6030673003297e+01, 0.9491756770005e+00,
          0.6607787763599e-06, 0.4989507233927e+01, 0.8460828644453e+00,
          0.6269725742838e-06, 0.4222951804572e+01, 0.1480791608091e+00,
          0.6301889697863e-06, 0.5444316669126e+01, 0.2243449970715e+00,
          0.4891042662861e-06, 0.1490552839784e+01, 0.3340612434717e+01,
          0.3457083123290e-06, 0.3030475486049e+01, 0.3516457698740e-01,
          0.3032559967314e-06, 0.2652038793632e+01, 0.1104591729320e-01,
          0.2841133988903e-06, 0.1276744786829e+01, 0.4110125927500e-01,
          0.2855564444432e-06, 0.2143368674733e+01, 0.1510475019529e+00,

          0.2765157135038e-06, 0.5444186109077e+01, 0.6373574839730e-01,
          0.2382312465034e-06, 0.2190521137593e+01, 0.2275259891141e+00,
          0.2808060365077e-06, 0.5735195064841e+01, 0.2535050500000e-01,
          0.2332175234405e-06, 0.9481985524859e-01, 0.7181332454670e-01,
          0.2322488199659e-06, 0.5180499361533e+01, 0.8582758298370e-01,
          0.1881850258423e-06, 0.3219788273885e+01, 0.2118763888447e+01,
          0.2196111392808e-06, 0.2366941159761e+01, 0.2968341143800e-02,
          0.2183810335519e-06, 0.4825445110915e+01, 0.7775000683430e-01,
          0.2002733093326e-06, 0.2457148995307e+01, 0.2093666171530e+00,
          0.1967111767229e-06, 0.5586291545459e+01, 0.2172315424036e+00,

          0.1568473250543e-06, 0.3708003123320e+01, 0.7429900518901e+00,
          0.1852528314300e-06, 0.4310638151560e+01, 0.2022531624851e+00,
          0.1832111226447e-06, 0.1494665322656e+01, 0.3235053470014e+00,
          0.1746805502310e-06, 0.1451378500784e+01, 0.1385174140878e+00,
          0.1555730966650e-06, 0.1068040418198e+01, 0.7358765972222e+00,
          0.1554883462559e-06, 0.2442579035461e+01, 0.5154640627760e+00,
          0.1638380568746e-06, 0.2597913420625e+00, 0.8531963191132e+00,
          0.1159938593640e-06, 0.5834512021280e+01, 0.1990721704425e+00,
          0.1083427965695e-06, 0.5054033177950e+01, 0.5439178814476e+00,
          0.1156480369431e-06, 0.5325677432457e+01, 0.5257585094865e+00,

          0.1141308860095e-06, 0.2153403923857e+01, 0.5336234347371e+00,
          0.7913146470946e-07, 0.8642846847027e+00, 0.1478866649112e+01,
          0.7439752463733e-07, 0.1970628496213e+01, 0.2164800718209e+00,
          0.7280277104079e-07, 0.6073307250609e+01, 0.2101180877357e+00,
          0.8319567719136e-07, 0.1954371928334e+01, 0.1692165728891e+01,
          0.7137705549290e-07, 0.8904989440909e+00, 0.4155522422634e+00,
          0.6900825396225e-07, 0.2825717714977e+01, 0.1173197218910e+00,
          0.7245757216635e-07, 0.2481677513331e+01, 0.1265567569334e+01,
          0.6961165696255e-07, 0.1292955312978e+01, 0.9562891316684e+00,
          0.7571804456890e-07, 0.3427517575069e+01, 0.1422690933580e-01,

          0.6605425721904e-07, 0.8052192701492e+00, 0.6470106940028e+00,
          0.7375477357248e-07, 0.1705076390088e+01, 0.1581959461667e+01,
          0.7041664951470e-07, 0.4848356967891e+00, 0.9597935788730e-01,
          0.6322199535763e-07, 0.3878069473909e+01, 0.7084920306520e-01,
          0.5244380279191e-07, 0.2645560544125e+01, 0.5265099800692e+00,
          0.5143125704988e-07, 0.4834486101370e+01, 0.5328719641544e+00,
          0.5871866319373e-07, 0.7981472548900e+00, 0.7871412831580e-01,
          0.6300822573871e-07, 0.5979398788281e+01, 0.2608790314060e+02,
          0.6062154271548e-07, 0.4108655402756e+01, 0.1114304132498e+00,
          0.4361912339976e-07, 0.5322624319280e+01, 0.1375773836557e+01,

          0.4417005920067e-07, 0.6240817359284e+01, 0.2770348281756e+00,
          0.4686806749936e-07, 0.3214977301156e+01, 0.1143987543936e+00,
          0.3758892132305e-07, 0.5879809634765e+01, 0.1596186371003e+01,
          0.5151351332319e-07, 0.2893377688007e+00, 0.2228608264996e+00,
          0.4554683578572e-07, 0.5475427144122e+01, 0.1465949902372e+00,
          0.3442381385338e-07, 0.5992034796640e+01, 0.5070101000000e-01,
          0.2831093954933e-07, 0.5367350273914e+01, 0.3092784376656e+00,
          0.3756267090084e-07, 0.5758171285420e+01, 0.4903339079539e+00,
          0.2816374679892e-07, 0.1863718700923e+01, 0.2991266627620e+00,
          0.3419307025569e-07, 0.9524347534130e+00, 0.3518164938661e+00,

          0.2904250494239e-07, 0.5304471615602e+01, 0.1099462426779e+00,
          0.2471734511206e-07, 0.1297069793530e+01, 0.6256703299991e+00,
          0.2539620831872e-07, 0.3281126083375e+01, 0.1256615170089e+02,
          0.2281017868007e-07, 0.1829122133165e+01, 0.6681224869435e+01,
          0.2275319473335e-07, 0.5797198160181e+01, 0.3932462625300e-02,
          0.2547755368442e-07, 0.4752697708330e+01, 0.1169588211447e+01,
          0.2285979669317e-07, 0.1223205292886e+01, 0.1045155034888e+01,
          0.1913386560994e-07, 0.1757532993389e+01, 0.1155361302111e+01,
          0.1809020525147e-07, 0.4246116108791e+01, 0.3368040641550e-01,
          0.1649213300201e-07, 0.1445162890627e+01, 0.4408250688924e+00,

          0.1834972793932e-07, 0.1126917567225e+01, 0.4452511715700e-02,
          0.1439550648138e-07, 0.6160756834764e+01, 0.9420622223326e+00,
          0.1487645457041e-07, 0.4358761931792e+01, 0.4123712502208e+00,
          0.1731729516660e-07, 0.6134456753344e+01, 0.2108507877249e+00,
          0.1717747163567e-07, 0.1898186084455e+01, 0.2157473718317e+00,
          0.1418190430374e-07, 0.4180286741266e+01, 0.6521991896920e-01,
          0.1404844134873e-07, 0.7654053565412e-01, 0.4258542984690e-01,
          0.1409842846538e-07, 0.4418612420312e+01, 0.2258291676434e+00,
          0.1090948346291e-07, 0.1260615686131e+01, 0.4226656969313e+00,
          0.1357577323612e-07, 0.3558248818690e+01, 0.7923417740620e-01,

          0.1018154061960e-07, 0.5676087241256e+01, 0.1456308687557e+00,
          0.1412073972109e-07, 0.8394392632422e+00, 0.1525316725248e+00,
          0.1030938326496e-07, 0.1653593274064e+01, 0.1795258541446e+01,
          0.1180081567104e-07, 0.1285802592036e+01, 0.7032915397480e-01,
          0.9708510575650e-08, 0.7631889488106e+00, 0.8434341241180e-01,
          0.9637689663447e-08, 0.4630642649176e+01, 0.1272681024002e+01,
          0.1068910429389e-07, 0.5294934032165e+01, 0.2123349582968e+00,
          0.1063716179336e-07, 0.2736266800832e+01, 0.2142632012598e+00,
          0.1234858713814e-07, 0.1302891146570e+01, 0.1847279083684e+00,
          0.8912631189738e-08, 0.3570415993621e+01, 0.2648454860559e+01,

          0.1036378285534e-07, 0.4236693440949e+01, 0.1370332435159e+00,
          0.9667798501561e-08, 0.2960768892398e+01, 0.4376440768498e+00,
          0.8108314201902e-08, 0.6987781646841e+00, 0.2880807454688e+00,
          0.7648364324628e-08, 0.2499017863863e+01, 0.2037373330570e+00,
          0.7286136828406e-08, 0.3787426951665e+01, 0.1129145838217e+00,
          0.9448237743913e-08, 0.2694354332983e+01, 0.5272426800584e+00,
          0.9374276106428e-08, 0.4787121277064e+01, 0.5321392641652e+00,
          0.7100226287462e-08, 0.3530238792101e+00, 0.6288513220417e+00,
          0.9253056659571e-08, 0.1399478925664e+01, 0.1606092486742e+00,
          0.6636432145504e-08, 0.3479575438447e+01, 0.1368660381889e+01,

          0.6469975312932e-08, 0.1383669964800e+01, 0.2008557621224e+01,
          0.7335849729765e-08, 0.1243698166898e+01, 0.9561746721300e-02,
          0.8743421205855e-08, 0.3776164289301e+01, 0.3801276407308e+00,
          0.5993635744494e-08, 0.5627122113596e+01, 0.2042657109477e+02,
          0.5981008479693e-08, 0.1674336636752e+01, 0.2111650433779e+01,
          0.6188535145838e-08, 0.5214925208672e+01, 0.4305306221819e+00,
          0.6596074017566e-08, 0.2907653268124e+01, 0.1063314406849e+01,
          0.6630815126226e-08, 0.2127643669658e+01, 0.8389694097774e+00,
          0.6156772830040e-08, 0.5082160803295e+01, 0.4234171675140e+00,
          0.6446960563014e-08, 0.1872100916905e+01, 0.5287268506303e+00,

          0.6429324424668e-08, 0.5610276103577e+01, 0.5306550935933e+00,
          0.6302232396465e-08, 0.1592152049607e+01, 0.1253008786510e-01,
          0.6399244436159e-08, 0.2746214421532e+01, 0.5217580628120e+02,
          0.5474965172558e-08, 0.2317666374383e+01, 0.2221856701002e+01,
          0.5339293190692e-08, 0.1084724961156e+01, 0.7466759693650e-01,
          0.5334733683389e-08, 0.3594106067745e+01, 0.7489573444450e-01,
          0.5392665782110e-08, 0.5630254365606e+01, 0.1055449481598e+01,
          0.6682075673789e-08, 0.1518480041732e+01, 0.2213766559277e+00,
          0.5079130495960e-08, 0.2739765115711e+01, 0.2132517061319e+00,
          0.5077759793261e-08, 0.5290711290094e+01, 0.2133464534247e+00,

          0.4832037368310e-08, 0.1404473217200e+01, 0.7160067364790e-01,
          0.6463279674802e-08, 0.6038381695210e+01, 0.2209183458640e-01,
          0.6240592771560e-08, 0.1290170653666e+01, 0.3306188016693e+00,
          0.4672013521493e-08, 0.3261895939677e+01, 0.7796265773310e-01,
          0.6500650750348e-08, 0.1154522312095e+01, 0.3884652414254e+00,
          0.6344161389053e-08, 0.6206111545062e+01, 0.7605151500000e-01,
          0.4682518370646e-08, 0.5409118796685e+01, 0.1073608853559e+01,
          0.5329460015591e-08, 0.1202985784864e+01, 0.7287631425543e+00,
          0.5701588675898e-08, 0.4098715257064e+01, 0.8731175355560e-01,
          0.6030690867211e-08, 0.4132033218460e+00, 0.9846002785331e+00,

          0.4336256312655e-08, 0.1211415991827e+01, 0.4297791515992e+00,
          0.4688498808975e-08, 0.3765479072409e+01, 0.2127790306879e+00,
          0.4675578609335e-08, 0.4265540037226e+01, 0.2138191288687e+00,
          0.4225578112158e-08, 0.5237566010676e+01, 0.3407705765729e+00,
          0.5139422230028e-08, 0.1507173079513e+01, 0.7233337363710e-01,
          0.4619995093571e-08, 0.9023957449848e-01, 0.8603097737811e+00,
          0.4494776255461e-08, 0.5414930552139e+00, 0.7381754420900e-01,
          0.4274026276788e-08, 0.4145735303659e+01, 0.7574578717200e-01,
          0.5018141789353e-08, 0.3344408829055e+01, 0.3180992042600e-02,
          0.4866163952181e-08, 0.3348534657607e+01, 0.7722995774390e-01,

          0.4111986020501e-08, 0.4198823597220e+00, 0.1451108196653e+00,
          0.3356142784950e-08, 0.5609144747180e+01, 0.1274714967946e+00,
          0.4070575554551e-08, 0.7028411059224e+00, 0.3503323232942e+00,
          0.3257451857278e-08, 0.5624697983086e+01, 0.5296435984654e+00,
          0.3256973703026e-08, 0.1857842076707e+01, 0.5297383457582e+00,
          0.3830771508640e-08, 0.4562887279931e+01, 0.9098186128426e+00,
          0.3725024005962e-08, 0.2358058692652e+00, 0.1084620721060e+00,
          0.3136763921756e-08, 0.2049731526845e+01, 0.2346394437820e+00,
          0.3795147256194e-08, 0.2432356296933e+00, 0.1862120789403e+00,
          0.2877342229911e-08, 0.5631101279387e+01, 0.1905464808669e+01,

          0.3076931798805e-08, 0.1117615737392e+01, 0.3628624111593e+00,
          0.2734765945273e-08, 0.5899826516955e+01, 0.2131850110243e+00,
          0.2733405296885e-08, 0.2130562964070e+01, 0.2134131485323e+00,
          0.2898552353410e-08, 0.3462387048225e+00, 0.5291709230214e+00,
          0.2893736103681e-08, 0.8534352781543e+00, 0.5302110212022e+00,
          0.3095717734137e-08, 0.2875061429041e+01, 0.2976424921901e+00,
          0.2636190425832e-08, 0.2242512846659e+01, 0.1485980103780e+01,
          0.3645512095537e-08, 0.1354016903958e+01, 0.6044726378023e+00,
          0.2808173547723e-08, 0.6705114365631e-01, 0.6225157782540e-01,
          0.2625012866888e-08, 0.4775705748482e+01, 0.5268983110410e-01,

          0.2572233995651e-08, 0.2638924216139e+01, 0.1258454114666e+01,
          0.2604238824792e-08, 0.4826358927373e+01, 0.2103781122809e+00,
          0.2596886385239e-08, 0.3200388483118e+01, 0.2162200472757e+00,
          0.3228057304264e-08, 0.5384848409563e+01, 0.2007689919132e+00,
          0.2481601798252e-08, 0.5173373487744e+01, 0.1062562936266e+01,
          0.2745977498864e-08, 0.6250966149853e+01, 0.5651155736444e+00,
          0.2669878833811e-08, 0.4906001352499e+01, 0.1400015846597e+00,
          0.3203986611711e-08, 0.5034333010005e+01, 0.7036329877322e+00,
          0.3354961227212e-08, 0.6108262423137e+01, 0.4549093064213e+00,
          0.2400407324558e-08, 0.2135399294955e+01, 0.2125476091956e+00,

          0.2379905859802e-08, 0.5893721933961e+01, 0.2140505503610e+00,
          0.2550844302187e-08, 0.3331940762063e+01, 0.1534957940063e+00,
          0.2268824211001e-08, 0.1843418461035e+01, 0.2235935264888e+00,
          0.2464700891204e-08, 0.3029548547230e+01, 0.2091065926078e+00,
          0.2436814726024e-08, 0.4994717970364e+01, 0.2174915669488e+00,
          0.2443623894745e-08, 0.2645102591375e+01, 0.1739420156204e+00,
          0.2318701783838e-08, 0.5700547397897e+01, 0.7530171478090e-01,
          0.2284448700256e-08, 0.5268898905872e+01, 0.7426161660010e-01,
          0.2468848123510e-08, 0.5276280575078e+01, 0.2526561439362e+00,
          0.2814052350303e-08, 0.6130168623475e+01, 0.5636314030725e+00,

          0.2243662755220e-08, 0.6631692457995e+00, 0.8886590321940e-01,
          0.2330795855941e-08, 0.2499435487702e+01, 0.1056200952181e+01,
          0.9757679038404e-09, 0.5796846023126e+01, 0.7826370942180e+02 };

    /* SSB-to-Sun, T^0, Z */
      static  final double s0z[] = {
          0.1181255122986e-03, 0.4607918989164e+00, 0.2132990797783e+00,
          0.1127777651095e-03, 0.4169146331296e+00, 0.5296909721118e+00,
          0.4777754401806e-04, 0.4582657007130e+01, 0.3813291813120e-01,
          0.1129354285772e-04, 0.5758735142480e+01, 0.7478166569050e-01,
         -0.1149543637123e-04, 0.0000000000000e+00, 0.0000000000000e+00,
          0.3298730512306e-05, 0.5978801994625e+01, 0.4265981595566e+00,
          0.2733376706079e-05, 0.7665413691040e+00, 0.1059381944224e+01,
          0.9426389657270e-06, 0.3710201265838e+01, 0.2061856251104e+00,
          0.8187517749552e-06, 0.3390675605802e+00, 0.2204125344462e+00,
          0.4080447871819e-06, 0.4552296640088e+00, 0.5225775174439e+00,

          0.3169973017028e-06, 0.3445455899321e+01, 0.5368044267797e+00,
          0.2438098615549e-06, 0.5664675150648e+01, 0.3664874755930e-01,
          0.2601897517235e-06, 0.1931894095697e+01, 0.1495633313810e+00,
          0.2314558080079e-06, 0.3666319115574e+00, 0.3961708870310e-01,
          0.1962549548002e-06, 0.3167411699020e+01, 0.7626583626240e-01,
          0.2180518287925e-06, 0.1544420746580e+01, 0.7113454667900e-02,
          0.1451382442868e-06, 0.1583756740070e+01, 0.1102062672231e+00,
          0.1358439007389e-06, 0.5239941758280e+01, 0.6398972393349e+00,
          0.1050585898028e-06, 0.2266958352859e+01, 0.3163918923335e+00,
          0.1050029870186e-06, 0.2711495250354e+01, 0.4194847048887e+00,

          0.9934920679800e-07, 0.1116208151396e+01, 0.1589072916335e+01,
          0.1048395331560e-06, 0.3408619600206e+01, 0.1021328554739e+02,
          0.8370147196668e-07, 0.3810459401087e+01, 0.2535050500000e-01,
          0.7989856510998e-07, 0.3769910473647e+01, 0.7329749511860e-01,
          0.5441221655233e-07, 0.2416994903374e+01, 0.1030928125552e+00,
          0.4610812906784e-07, 0.5858503336994e+01, 0.4337116142245e+00,
          0.3923022803444e-07, 0.3354170010125e+00, 0.1484170571900e-02,
          0.2610725582128e-07, 0.5410600646324e+01, 0.6327837846670e+00,
          0.2455279767721e-07, 0.6120216681403e+01, 0.1162474756779e+01,
          0.2375530706525e-07, 0.6055443426143e+01, 0.1052268489556e+01,

          0.1782967577553e-07, 0.3146108708004e+01, 0.8460828644453e+00,
          0.1581687095238e-07, 0.6255496089819e+00, 0.3340612434717e+01,
          0.1594657672461e-07, 0.3782604300261e+01, 0.1066495398892e+01,
          0.1563448615040e-07, 0.1997775733196e+01, 0.2022531624851e+00,
          0.1463624258525e-07, 0.1736316792088e+00, 0.3516457698740e-01,
          0.1331585056673e-07, 0.4331941830747e+01, 0.9491756770005e+00,
          0.1130634557637e-07, 0.6152017751825e+01, 0.2968341143800e-02,
          0.1028949607145e-07, 0.2101792614637e+00, 0.2275259891141e+00,
          0.1024074971618e-07, 0.4071833211074e+01, 0.5070101000000e-01,
          0.8826956060303e-08, 0.4861633688145e+00, 0.2093666171530e+00,

          0.8572230171541e-08, 0.5268190724302e+01, 0.4110125927500e-01,
          0.7649332643544e-08, 0.5134543417106e+01, 0.2608790314060e+02,
          0.8581673291033e-08, 0.2920218146681e+01, 0.1480791608091e+00,
          0.8430589300938e-08, 0.3604576619108e+01, 0.2172315424036e+00,
          0.7776165501012e-08, 0.3772942249792e+01, 0.6373574839730e-01,
          0.8311070234408e-08, 0.6200412329888e+01, 0.3235053470014e+00,
          0.6927365212582e-08, 0.4543353113437e+01, 0.8531963191132e+00,
          0.6791574208598e-08, 0.2882188406238e+01, 0.7181332454670e-01,
          0.5593100811839e-08, 0.1776646892780e+01, 0.7429900518901e+00,
          0.4553381853021e-08, 0.3949617611240e+01, 0.7775000683430e-01,

          0.5758000450068e-08, 0.3859251775075e+01, 0.1990721704425e+00,
          0.4281283457133e-08, 0.1466294631206e+01, 0.2118763888447e+01,
          0.4206935661097e-08, 0.5421776011706e+01, 0.1104591729320e-01,
          0.4213751641837e-08, 0.3412048993322e+01, 0.2243449970715e+00,
          0.5310506239878e-08, 0.5421641370995e+00, 0.5154640627760e+00,
          0.3827450341320e-08, 0.8887314524995e+00, 0.1510475019529e+00,
          0.4292435241187e-08, 0.1405043757194e+01, 0.1422690933580e-01,
          0.3189780702289e-08, 0.1060049293445e+01, 0.1173197218910e+00,
          0.3226611928069e-08, 0.6270858897442e+01, 0.2164800718209e+00,
          0.2893897608830e-08, 0.5117563223301e+01, 0.6470106940028e+00,

          0.3239852024578e-08, 0.4079092237983e+01, 0.2101180877357e+00,
          0.2956892222200e-08, 0.1594917021704e+01, 0.3092784376656e+00,
          0.2980177912437e-08, 0.5258787667564e+01, 0.4155522422634e+00,
          0.3163725690776e-08, 0.3854589225479e+01, 0.8582758298370e-01,
          0.2662262399118e-08, 0.3561326430187e+01, 0.5257585094865e+00,
          0.2766689135729e-08, 0.3180732086830e+00, 0.1385174140878e+00,
          0.2411600278464e-08, 0.3324798335058e+01, 0.5439178814476e+00,
          0.2483527695131e-08, 0.4169069291947e+00, 0.5336234347371e+00,
          0.7788777276590e-09, 0.1900569908215e+01, 0.5217580628120e+02 };

    /* SSB-to-Sun, T^1, X */
      static  final double s1x[] = {
         -0.1296310361520e-07, 0.0000000000000e+00, 0.0000000000000e+00,
          0.8975769009438e-08, 0.1128891609250e+01, 0.4265981595566e+00,
          0.7771113441307e-08, 0.2706039877077e+01, 0.2061856251104e+00,
          0.7538303866642e-08, 0.2191281289498e+01, 0.2204125344462e+00,
          0.6061384579336e-08, 0.3248167319958e+01, 0.1059381944224e+01,
          0.5726994235594e-08, 0.5569981398610e+01, 0.5225775174439e+00,
          0.5616492836424e-08, 0.5057386614909e+01, 0.5368044267797e+00,
          0.1010881584769e-08, 0.3473577116095e+01, 0.7113454667900e-02,
          0.7259606157626e-09, 0.3651858593665e+00, 0.6398972393349e+00,
          0.8755095026935e-09, 0.1662835408338e+01, 0.4194847048887e+00,

          0.5370491182812e-09, 0.1327673878077e+01, 0.4337116142245e+00,
          0.5743773887665e-09, 0.4250200846687e+01, 0.2132990797783e+00,
          0.4408103140300e-09, 0.3598752574277e+01, 0.1589072916335e+01,
          0.3101892374445e-09, 0.4887822983319e+01, 0.1052268489556e+01,
          0.3209453713578e-09, 0.9702272295114e+00, 0.5296909721118e+00,
          0.3017228286064e-09, 0.5484462275949e+01, 0.1066495398892e+01,
          0.3200700038601e-09, 0.2846613338643e+01, 0.1495633313810e+00,
          0.2137637279911e-09, 0.5692163292729e+00, 0.3163918923335e+00,
          0.1899686386727e-09, 0.2061077157189e+01, 0.2275259891141e+00,
          0.1401994545308e-09, 0.4177771136967e+01, 0.1102062672231e+00,

          0.1578057810499e-09, 0.5782460597335e+01, 0.7626583626240e-01,
          0.1237713253351e-09, 0.5705900866881e+01, 0.5154640627760e+00,
          0.1313076837395e-09, 0.5163438179576e+01, 0.3664874755930e-01,
          0.1184963304860e-09, 0.3054804427242e+01, 0.6327837846670e+00,
          0.1238130878565e-09, 0.2317292575962e+01, 0.3961708870310e-01,
          0.1015959527736e-09, 0.2194643645526e+01, 0.7329749511860e-01,
          0.9017954423714e-10, 0.2868603545435e+01, 0.1990721704425e+00,
          0.8668024955603e-10, 0.4923849675082e+01, 0.5439178814476e+00,
          0.7756083930103e-10, 0.3014334135200e+01, 0.9491756770005e+00,
          0.7536503401741e-10, 0.2704886279769e+01, 0.1030928125552e+00,

          0.5483308679332e-10, 0.6010983673799e+01, 0.8531963191132e+00,
          0.5184339620428e-10, 0.1952704573291e+01, 0.2093666171530e+00,
          0.5108658712030e-10, 0.2958575786649e+01, 0.2172315424036e+00,
          0.5019424524650e-10, 0.1736317621318e+01, 0.2164800718209e+00,
          0.4909312625978e-10, 0.3167216416257e+01, 0.2101180877357e+00,
          0.4456638901107e-10, 0.7697579923471e+00, 0.3235053470014e+00,
          0.4227030350925e-10, 0.3490910137928e+01, 0.6373574839730e-01,
          0.4095456040093e-10, 0.5178888984491e+00, 0.6470106940028e+00,
          0.4990537041422e-10, 0.3323887668974e+01, 0.1422690933580e-01,
          0.4321170010845e-10, 0.4288484987118e+01, 0.7358765972222e+00,

          0.3544072091802e-10, 0.6021051579251e+01, 0.5265099800692e+00,
          0.3480198638687e-10, 0.4600027054714e+01, 0.5328719641544e+00,
          0.3440287244435e-10, 0.4349525970742e+01, 0.8582758298370e-01,
          0.3330628322713e-10, 0.2347391505082e+01, 0.1104591729320e-01,
          0.2973060707184e-10, 0.4789409286400e+01, 0.5257585094865e+00,
          0.2932606766089e-10, 0.5831693799927e+01, 0.5336234347371e+00,
          0.2876972310953e-10, 0.2692638514771e+01, 0.1173197218910e+00,
          0.2827488278556e-10, 0.2056052487960e+01, 0.2022531624851e+00,
          0.2515028239756e-10, 0.7411863262449e+00, 0.9597935788730e-01,
          0.2853033744415e-10, 0.3948481024894e+01, 0.2118763888447e+01 };

    /* SSB-to-Sun, T^1, Y */
      static  final double s1y[] = {
          0.8989047573576e-08, 0.5840593672122e+01, 0.4265981595566e+00,
          0.7815938401048e-08, 0.1129664707133e+01, 0.2061856251104e+00,
          0.7550926713280e-08, 0.6196589104845e+00, 0.2204125344462e+00,
          0.6056556925895e-08, 0.1677494667846e+01, 0.1059381944224e+01,
          0.5734142698204e-08, 0.4000920852962e+01, 0.5225775174439e+00,
          0.5614341822459e-08, 0.3486722577328e+01, 0.5368044267797e+00,
          0.1028678147656e-08, 0.1877141024787e+01, 0.7113454667900e-02,
          0.7270792075266e-09, 0.5077167301739e+01, 0.6398972393349e+00,
          0.8734141726040e-09, 0.9069550282609e-01, 0.4194847048887e+00,
          0.5377371402113e-09, 0.6039381844671e+01, 0.4337116142245e+00,

          0.4729719431571e-09, 0.2153086311760e+01, 0.2132990797783e+00,
          0.4458052820973e-09, 0.5059830025565e+01, 0.5296909721118e+00,
          0.4406855467908e-09, 0.2027971692630e+01, 0.1589072916335e+01,
          0.3101659310977e-09, 0.3317677981860e+01, 0.1052268489556e+01,
          0.3016749232545e-09, 0.3913703482532e+01, 0.1066495398892e+01,
          0.3198541352656e-09, 0.1275513098525e+01, 0.1495633313810e+00,
          0.2142065389871e-09, 0.5301351614597e+01, 0.3163918923335e+00,
          0.1902615247592e-09, 0.4894943352736e+00, 0.2275259891141e+00,
          0.1613410990871e-09, 0.2449891130437e+01, 0.1102062672231e+00,
          0.1576992165097e-09, 0.4211421447633e+01, 0.7626583626240e-01,

          0.1241637259894e-09, 0.4140803368133e+01, 0.5154640627760e+00,
          0.1313974830355e-09, 0.3591920305503e+01, 0.3664874755930e-01,
          0.1181697118258e-09, 0.1506314382788e+01, 0.6327837846670e+00,
          0.1238239742779e-09, 0.7461405378404e+00, 0.3961708870310e-01,
          0.1010107068241e-09, 0.6271010795475e+00, 0.7329749511860e-01,
          0.9226316616509e-10, 0.1259158839583e+01, 0.1990721704425e+00,
          0.8664946419555e-10, 0.3353244696934e+01, 0.5439178814476e+00,
          0.7757230468978e-10, 0.1447677295196e+01, 0.9491756770005e+00,
          0.7693168628139e-10, 0.1120509896721e+01, 0.1030928125552e+00,
          0.5487897454612e-10, 0.4439380426795e+01, 0.8531963191132e+00,

          0.5196118677218e-10, 0.3788856619137e+00, 0.2093666171530e+00,
          0.5110853339935e-10, 0.1386879372016e+01, 0.2172315424036e+00,
          0.5027804534813e-10, 0.1647881805466e+00, 0.2164800718209e+00,
          0.4922485922674e-10, 0.1594315079862e+01, 0.2101180877357e+00,
          0.6155599524400e-10, 0.0000000000000e+00, 0.0000000000000e+00,
          0.4447147832161e-10, 0.5480720918976e+01, 0.3235053470014e+00,
          0.4144691276422e-10, 0.1931371033660e+01, 0.6373574839730e-01,
          0.4099950625452e-10, 0.5229611294335e+01, 0.6470106940028e+00,
          0.5060541682953e-10, 0.1731112486298e+01, 0.1422690933580e-01,
          0.4293615946300e-10, 0.2714571038925e+01, 0.7358765972222e+00,

          0.3545659845763e-10, 0.4451041444634e+01, 0.5265099800692e+00,
          0.3479112041196e-10, 0.3029385448081e+01, 0.5328719641544e+00,
          0.3438516493570e-10, 0.2778507143731e+01, 0.8582758298370e-01,
          0.3297341285033e-10, 0.7898709807584e+00, 0.1104591729320e-01,
          0.2972585818015e-10, 0.3218785316973e+01, 0.5257585094865e+00,
          0.2931707295017e-10, 0.4260731012098e+01, 0.5336234347371e+00,
          0.2897198149403e-10, 0.1120753978101e+01, 0.1173197218910e+00,
          0.2832293240878e-10, 0.4597682717827e+00, 0.2022531624851e+00,
          0.2864348326612e-10, 0.2169939928448e+01, 0.9597935788730e-01,
          0.2852714675471e-10, 0.2377659870578e+01, 0.2118763888447e+01 };

    /* SSB-to-Sun, T^1, Z */
      static final double s1z[] = {
          0.5444220475678e-08, 0.1803825509310e+01, 0.2132990797783e+00,
          0.3883412695596e-08, 0.4668616389392e+01, 0.5296909721118e+00,
          0.1334341434551e-08, 0.0000000000000e+00, 0.0000000000000e+00,
          0.3730001266883e-09, 0.5401405918943e+01, 0.2061856251104e+00,
          0.2894929197956e-09, 0.4932415609852e+01, 0.2204125344462e+00,
          0.2857950357701e-09, 0.3154625362131e+01, 0.7478166569050e-01,
          0.2499226432292e-09, 0.3657486128988e+01, 0.4265981595566e+00,
          0.1937705443593e-09, 0.5740434679002e+01, 0.1059381944224e+01,
          0.1374894396320e-09, 0.1712857366891e+01, 0.5368044267797e+00,
          0.1217248678408e-09, 0.2312090870932e+01, 0.5225775174439e+00,

          0.7961052740870e-10, 0.5283368554163e+01, 0.3813291813120e-01,
          0.4979225949689e-10, 0.4298290471860e+01, 0.4194847048887e+00,
          0.4388552286597e-10, 0.6145515047406e+01, 0.7113454667900e-02,
          0.2586835212560e-10, 0.3019448001809e+01, 0.6398972393349e+00 };

    /* SSB-to-Sun, T^2, X */
      static  final double s2x[] = {
          0.1603551636587e-11, 0.4404109410481e+01, 0.2061856251104e+00,
          0.1556935889384e-11, 0.4818040873603e+00, 0.2204125344462e+00,
          0.1182594414915e-11, 0.9935762734472e+00, 0.5225775174439e+00,
          0.1158794583180e-11, 0.3353180966450e+01, 0.5368044267797e+00,
          0.9597358943932e-12, 0.5567045358298e+01, 0.2132990797783e+00,
          0.6511516579605e-12, 0.5630872420788e+01, 0.4265981595566e+00,
          0.7419792747688e-12, 0.2156188581957e+01, 0.5296909721118e+00,
          0.3951972655848e-12, 0.1981022541805e+01, 0.1059381944224e+01,
          0.4478223877045e-12, 0.0000000000000e+00, 0.0000000000000e+00 };

    /* SSB-to-Sun, T^2, Y */
      static final double s2y[] = {
          0.1609114495091e-11, 0.2831096993481e+01, 0.2061856251104e+00,
          0.1560330784946e-11, 0.5193058213906e+01, 0.2204125344462e+00,
          0.1183535479202e-11, 0.5707003443890e+01, 0.5225775174439e+00,
          0.1158183066182e-11, 0.1782400404928e+01, 0.5368044267797e+00,
          0.1032868027407e-11, 0.4036925452011e+01, 0.2132990797783e+00,
          0.6540142847741e-12, 0.4058241056717e+01, 0.4265981595566e+00,
          0.7305236491596e-12, 0.6175401942957e+00, 0.5296909721118e+00,
         -0.5580725052968e-12, 0.0000000000000e+00, 0.0000000000000e+00,
          0.3946122651015e-12, 0.4108265279171e+00, 0.1059381944224e+01 };

    /* SSB-to-Sun, T^2, Z */
      static final double s2z[] = {
          0.3749920358054e-12, 0.3230285558668e+01, 0.2132990797783e+00,
          0.2735037220939e-12, 0.6154322683046e+01, 0.5296909721118e+00 };
        }
      
        /**
         *  Earth position and velocity, heliocentric and barycentric, with
         *  respect to the Barycentric Celestial Reference System.
         *
         *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TDB date (Note 1) * @param date2 double TDB date (Note 1) * * * @param pvh double[2][3] returned heliocentric Earth position/velocity (au, au/d) * @param pvb double[2][3] returned barycentric Earth position/velocity (au, au/d) * * * @return int status: 0 = OK * +1 = warning: date outside * the range 1900-2100 AD * *

Notes: *

    * *
  1. The TDB date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TDB)=2450123.7 could be expressed in any of these ways, among * others: *
             *            date1          date2
             *
             *         2450123.7           0.0       (JD method)
             *         2451545.0       -1421.3       (J2000 method)
             *         2400000.5       50123.2       (MJD method)
             *         2450123.5           0.2       (date & time method)
             *
    * The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 method is best matched to the way the * argument is handled internally and will deliver the optimum * resolution. The MJD method and the date & time methods are both * good compromises between resolution and convenience. However, * the accuracy of the result is more likely to be limited by the * algorithm itself than the way the date has been expressed. * * n.b. TT can be used instead of TDB in most applications. * *
  2. On return, the arrays pvh and pvb contain the following: * * pvh[0][0] x } * pvh[0][1] y } heliocentric position, au * pvh[0][2] z } * * pvh[1][0] xdot } * pvh[1][1] ydot } heliocentric velocity, au/d * pvh[1][2] zdot } * * pvb[0][0] x } * pvb[0][1] y } barycentric position, au * pvb[0][2] z } * * pvb[1][0] xdot } * pvb[1][1] ydot } barycentric velocity, au/d * pvb[1][2] zdot } * * The vectors are with respect to the Barycentric Celestial * Reference System. The time unit is one day in TDB. * *
  3. The function is a SIMPLIFIED SOLUTION from the planetary theory * VSOP2000 (X. Moisson, P. Bretagnon, 2001, Celes. Mechanics & * Dyn. Astron., 80, 3/4, 205-213) and is an adaptation of original * Fortran code supplied by P. Bretagnon (private comm., 2000). * *
  4. Comparisons over the time span 1900-2100 with this simplified * solution and the JPL DE405 ephemeris give the following results: * * RMS max * Heliocentric: * position error 3.7 11.2 km * velocity error 1.4 5.0 mm/s * * Barycentric: * position error 4.6 13.4 km * velocity error 1.4 4.9 mm/s * * Comparisons with the JPL DE406 ephemeris show that by 1800 and * 2200 the position errors are approximately double their 1900-2100 * size. By 1500 and 2500 the deterioration is a factor of 10 and * by 1000 and 3000 a factor of 60. The velocity accuracy falls off * at about half that rate. * *
  5. It is permissible to use the same array for pvh and pvb, which * will receive the barycentric values. *
*@version 2008 November 18 * * @since Release 20101201 * * */ public static int jauEpv00(final double date1, final double date2, double pvh[][], double pvb[][]) { /* * Matrix elements for orienting the analytical model to DE405. * * The corresponding Euler angles are: * * d ' " * 1st rotation - 23 26 21.4091 about the x-axis (obliquity) * 2nd rotation + 0.0475 about the z-axis (RA offset) * * These were obtained empirically, by comparisons with DE405 over * 1900-2100. */ final double am12 = 0.000000211284, am13 = -0.000000091603, am21 = -0.000000230286, am22 = 0.917482137087, am23 = -0.397776982902, am32 = 0.397776982902, am33 = 0.917482137087; /* Pointers to coefficient arrays, in x,y,z sets */ final double ce0[][] = { Ephemeris.e0x, Ephemeris.e0y, Ephemeris.e0z }, ce1[][] = { Ephemeris.e1x, Ephemeris.e1y, Ephemeris.e1z }, ce2[][] = { Ephemeris.e2x, Ephemeris.e2y, Ephemeris.e2z }, cs0[][] = { Ephemeris.s0x, Ephemeris.s0y, Ephemeris.s0z }, cs1[][] = { Ephemeris.s1x, Ephemeris.s1y, Ephemeris.s1z }, cs2[][] = { Ephemeris.s2x, Ephemeris.s2y, Ephemeris.s2z }; /* Numbers of terms for each component of the model, in x,y,z sets */ final int ne0[] = {Ephemeris.e0x.length/3, Ephemeris.e0y.length/3, Ephemeris.e0z.length/3 }, ne1[] = {Ephemeris.e1x.length/3, Ephemeris.e1y.length/3, Ephemeris.e1z.length/3 }, ne2[] = {Ephemeris.e2x.length/3, Ephemeris.e2y.length/3, Ephemeris.e2z.length/3 }, ns0[] = {Ephemeris.s0x.length/3, Ephemeris.s0y.length/3, Ephemeris.s0z.length/3 }, ns1[] = {Ephemeris.s1x.length/3, Ephemeris.s1y.length/3, Ephemeris.s1z.length/3 }, ns2[] = {Ephemeris.s2x.length/3, Ephemeris.s2y.length/3, Ephemeris.s2z.length/3 }; int nterms; /* Miscellaneous */ int jstat, i, j; double t, t2, xyz, xyzd, a, b, c, ct, p, cp, ph[] = new double[3], vh[] = new double[3], pb[] = new double[3], vb[] = new double[3], x, y, z; /*--------------------------------------------------------------------*/ /* Time since reference epoch, Julian years. */ t = ((date1 - DJ00) + date2) / DJY; t2 = t*t; /* Set status. */ jstat = abs(t) <= 100.0 ? 0 : 1; /* X then Y then Z. */ for (i = 0; i < 3; i++) { /* Initialize position and velocity component. */ xyz = 0.0; xyzd = 0.0; /* ------------------------------------------------ */ /* Obtain component of Sun to Earth ecliptic vector */ /* ------------------------------------------------ */ /* Sun to Earth, T^0 terms. */ nterms = ne0[i]; int idx; for (j = 0, idx=0; j < nterms; j++) { a = ce0[i][idx++]; b = ce0[i][idx++]; c = ce0[i][idx++]; p = b + c*t; xyz += a*cos(p); xyzd -= a*c*sin(p); } /* Sun to Earth, T^1 terms. */ nterms = ne1[i]; for (j = 0, idx= 0; j < nterms; j++) { a = ce1[i][idx++]; b = ce1[i][idx++]; c = ce1[i][idx++]; ct = c*t; p = b + ct; cp = cos(p); xyz += a*t*cp; xyzd += a*( cp - ct*sin(p) ); } /* Sun to Earth, T^2 terms. */ nterms = ne2[i]; for (j = 0, idx = 0; j < nterms; j++) { a = ce2[i][idx++]; b = ce2[i][idx++]; c = ce2[i][idx++]; ct = c*t; p = b + ct; cp = cos(p); xyz += a*t2*cp; xyzd += a*t*( 2.0*cp - ct*sin(p) ); } /* Heliocentric Earth position and velocity component. */ ph[i] = xyz; vh[i] = xyzd / DJY; /* ------------------------------------------------ */ /* Obtain component of SSB to Earth ecliptic vector */ /* ------------------------------------------------ */ /* SSB to Sun, T^0 terms. */ nterms = ns0[i]; for (j = 0, idx = 0; j < nterms; j++) { a = cs0[i][idx++]; b = cs0[i][idx++]; c = cs0[i][idx++]; p = b + c*t; xyz += a*cos(p); xyzd -= a*c*sin(p); } /* SSB to Sun, T^1 terms. */ nterms = ns1[i]; for (j = 0, idx = 0; j < nterms; j++) { a = cs1[i][idx++]; b = cs1[i][idx++]; c = cs1[i][idx++]; ct = c*t; p = b + ct; cp = cos(p); xyz += a*t*cp; xyzd += a*(cp - ct*sin(p)); } /* SSB to Sun, T^2 terms. */ nterms = ns2[i]; for (j = 0, idx = 0; j < nterms; j++) { a = cs2[i][idx++]; b = cs2[i][idx++]; c = cs2[i][idx++]; ct = c*t; p = b + ct; cp = cos(p); xyz += a*t2*cp; xyzd += a*t*(2.0*cp - ct*sin(p)); } /* Barycentric Earth position and velocity component. */ pb[i] = xyz; vb[i] = xyzd / DJY; /* Next Cartesian component. */ } /* Rotate from ecliptic to BCRS coordinates. */ x = ph[0]; y = ph[1]; z = ph[2]; pvh[0][0] = x + am12*y + am13*z; pvh[0][1] = am21*x + am22*y + am23*z; pvh[0][2] = am32*y + am33*z; x = vh[0]; y = vh[1]; z = vh[2]; pvh[1][0] = x + am12*y + am13*z; pvh[1][1] = am21*x + am22*y + am23*z; pvh[1][2] = am32*y + am33*z; x = pb[0]; y = pb[1]; z = pb[2]; pvb[0][0] = x + am12*y + am13*z; pvb[0][1] = am21*x + am22*y + am23*z; pvb[0][2] = am32*y + am33*z; x = vb[0]; y = vb[1]; z = vb[2]; pvb[1][0] = x + am12*y + am13*z; pvb[1][1] = am21*x + am22*y + am23*z; pvb[1][2] = am32*y + am33*z; /* Return the status. */ return jstat; } /** * Equation of the equinoxes, IAU 1994 model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param date1 double TDB date (Note 1) * @param date2 double TDB date (Note 1) * * * @return double equation of the equinoxes (Note 2) * *

Notes: *

    * *
  1. The date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The result, which is in radians, operates in the following sense: * * Greenwich apparent ST = GMST + equation of the equinoxes *
*

Called:

    *
  • {@link #jauNut80} nutation, IAU 1980 *
  • {@link #jauObl80} mean obliquity, IAU 1980 *
*

References: * *

IAU Resolution C7, Recommendation 3 (1994). * *

Capitaine, N. & Gontier, A.-M., 1993, Astron. Astrophys., 275, * 645-650. * *@version 2008 May 24 * * @since Release 20101201 * * */ public static double jauEqeq94(double date1, double date2) { double t, om, eps0, ee; /* Interval between fundamental epoch J2000.0 and given date (JC). */ t = ((date1 - DJ00) + date2) / DJC; /* Longitude of the mean ascending node of the lunar orbit on the */ /* ecliptic, measured from the mean equinox of date. */ om = jauAnpm((450160.280 + (-482890.539 + (7.455 + 0.008 * t) * t) * t) * DAS2R + fmod(-5.0 * t, 1.0) * D2PI); /* Nutation components and mean obliquity. */ NutationTerms nt = jauNut80(date1, date2); eps0 = jauObl80(date1, date2); /* Equation of the equinoxes. */ ee = nt.dpsi*cos(eps0) + DAS2R*(0.00264*sin(om) + 0.000063*sin(om+om)); return ee; } /** * Earth rotation angle (IAU 2000 model). * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param dj1 double UT1 as a 2-part Julian Date (see note) * @param dj2 double UT1 as a 2-part Julian Date (see note) * * * @return double Earth rotation angle (radians), range 0-2pi * *

Notes: *

    * *
  1. The UT1 date dj1+dj2 is a Julian Date, apportioned in any * convenient way between the arguments dj1 and dj2. For example, * JD(UT1)=2450123.7 could be expressed in any of these ways, * among others: *
        *             dj1            dj2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 and MJD methods are good compromises * between resolution and convenience. The date & time method is * best matched to the algorithm used: maximum precision is * delivered when the dj1 argument is for 0hrs UT1 on the day in * question and the dj2 argument lies in the range 0 to 1, or vice * versa. * *
  2. The algorithm is adapted from Expression 22 of Capitaine et al. * 2000. The time argument has been expressed in days directly, * and, to retain precision, integer contributions have been * eliminated. The same formulation is given in IERS Conventions * (2003), Chap. 5, Eq. 14. *
*

Called:

    *
  • {@link #jauAnp} normalize angle into range 0 to 2pi *
*

References: * *

Capitaine N., Guinot B. and McCarthy D.D, 2000, Astron. * Astrophys., 355, 398-405. * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2008 May 24 * * @since Release 20101201 * * */ public static double jauEra00(double dj1, double dj2) { double d1, d2, t, f, theta; /* Days since fundamental epoch. */ if (dj1 < dj2) { d1 = dj1; d2 = dj2; } else { d1 = dj2; d2 = dj1; } t = d1 + (d2- DJ00); /* Fractional part of T (days). */ f = fmod(d1, 1.0) + fmod(d2, 1.0); /* Earth rotation angle at this UT1. */ theta = jauAnp(D2PI * (f + 0.7790572732640 + 0.00273781191135448 * t)); return theta; } /** * Fundamental argument, IERS Conventions (2003): * mean elongation of the Moon from the Sun. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param t double TDB, Julian centuries since J2000.0 (Note 1) * * * @return double D, radians (Note 2) * *

Notes: *

    * *
  1. Though t is strictly TDB, it is usually more convenient to use * TT, which makes no significant difference. * *
  2. The expression used is as adopted in IERS Conventions (2003) and * is from Simon et al. (1994). *
*

References: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *

Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 * *@version 2009 December 16 * * @since Release 20101201 * * */ public static double jauFad03(double t) { double a; /* Mean elongation of the Moon from the Sun (IERS Conventions 2003). */ a = fmod( 1072260.703692 + t * ( 1602961601.2090 + t * ( - 6.3706 + t * ( 0.006593 + t * ( - 0.00003169 ) ) ) ), TURNAS ) * DAS2R; return a; } /** * Fundamental argument, IERS Conventions (2003): * mean longitude of Earth. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param t double TDB, Julian centuries since J2000.0 (Note 1) * * * @return double mean longitude of Earth, radians (Note 2) * *

Notes: *

    * *
  1. Though t is strictly TDB, it is usually more convenient to use * TT, which makes no significant difference. * *
  2. The expression used is as adopted in IERS Conventions (2003) and * comes from Souchay et al. (1999) after Simon et al. (1994). *
*

References: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *

Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 * *

Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M. 1999, * Astron.Astrophys.Supp.Ser. 135, 111 * *@version 2009 December 16 * * @since Release 20101201 * * */ public static double jauFae03(double t) { double a; /* Mean longitude of Earth (IERS Conventions 2003). */ a = fmod(1.753470314 + 628.3075849991 * t, D2PI); return a; } /** * Fundamental argument, IERS Conventions (2003): * mean longitude of the Moon minus mean longitude of the ascending * node. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param t double TDB, Julian centuries since J2000.0 (Note 1) * * * @return double F, radians (Note 2) * *

Notes: *

    * *
  1. Though t is strictly TDB, it is usually more convenient to use * TT, which makes no significant difference. * *
  2. The expression used is as adopted in IERS Conventions (2003) and * is from Simon et al. (1994). *
*

References: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 * *@version 2009 December 16 * * @since Release 20101201 * * */ public static double jauFaf03(double t) { double a; /* Mean longitude of the Moon minus that of the ascending node */ /* (IERS Conventions 2003). */ a = fmod( 335779.526232 + t * ( 1739527262.8478 + t * ( - 12.7512 + t * ( - 0.001037 + t * ( 0.00000417 ) ) ) ), TURNAS ) * DAS2R; return a; } /** * Fundamental argument, IERS Conventions (2003): * mean longitude of Jupiter. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param t double TDB, Julian centuries since J2000.0 (Note 1) * * * @return double mean longitude of Jupiter, radians (Note 2) * *

Notes: *

    * *
  1. Though t is strictly TDB, it is usually more convenient to use * TT, which makes no significant difference. * *
  2. The expression used is as adopted in IERS Conventions (2003) and * comes from Souchay et al. (1999) after Simon et al. (1994). *
*

References: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *

Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 * *

Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M. 1999, * Astron.Astrophys.Supp.Ser. 135, 111 * *@version 2009 December 16 * * @since Release 20101201 * * */ public static double jauFaju03(double t) { double a; /* Mean longitude of Jupiter (IERS Conventions 2003). */ a = fmod(0.599546497 + 52.9690962641 * t, D2PI); return a; } /** * Fundamental argument, IERS Conventions (2003): * mean anomaly of the Moon. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param t double TDB, Julian centuries since J2000.0 (Note 1) * * * @return double l, radians (Note 2) * *

Notes: *

    * *
  1. Though t is strictly TDB, it is usually more convenient to use * TT, which makes no significant difference. * *
  2. The expression used is as adopted in IERS Conventions (2003) and * is from Simon et al. (1994). *
*

References: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 * *@version 2009 December 16 * * @since Release 20101201 * * */ public static double jauFal03(double t) { double a; /* Mean anomaly of the Moon (IERS Conventions 2003). */ a = fmod( 485868.249036 + t * ( 1717915923.2178 + t * ( 31.8792 + t * ( 0.051635 + t * ( - 0.00024470 ) ) ) ), TURNAS ) * DAS2R; return a; } /** * Fundamental argument, IERS Conventions (2003): * mean anomaly of the Sun. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param t double TDB, Julian centuries since J2000.0 (Note 1) * * * @return double l', radians (Note 2) * *

Notes: *

    * *
  1. Though t is strictly TDB, it is usually more convenient to use * TT, which makes no significant difference. * *
  2. The expression used is as adopted in IERS Conventions (2003) and * is from Simon et al. (1994). *
*

References: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 * *@version 2009 December 16 * * @since Release 20101201 * * */ public static double jauFalp03(double t) { double a; /* Mean anomaly of the Sun (IERS Conventions 2003). */ a = fmod( 1287104.793048 + t * ( 129596581.0481 + t * ( - 0.5532 + t * ( 0.000136 + t * ( - 0.00001149 ) ) ) ), TURNAS ) * DAS2R; return a; } /** * Fundamental argument, IERS Conventions (2003): * mean longitude of Mars. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param t double TDB, Julian centuries since J2000.0 (Note 1) * * * @return double mean longitude of Mars, radians (Note 2) * *

Notes: *

    * *
  1. Though t is strictly TDB, it is usually more convenient to use * TT, which makes no significant difference. * *
  2. The expression used is as adopted in IERS Conventions (2003) and * comes from Souchay et al. (1999) after Simon et al. (1994). *
*

References: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 * * Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M. 1999, * Astron.Astrophys.Supp.Ser. 135, 111 * *@version 2009 December 16 * * @since Release 20101201 * * */ public static double jauFama03(double t) { double a; /* Mean longitude of Mars (IERS Conventions 2003). */ a = fmod(6.203480913 + 334.0612426700 * t, D2PI); return a; } /** * Fundamental argument, IERS Conventions (2003): * mean longitude of Mercury. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param t double TDB, Julian centuries since J2000.0 (Note 1) * * * @return double mean longitude of Mercury, radians (Note 2) * *

Notes: *

    * *
  1. Though t is strictly TDB, it is usually more convenient to use * TT, which makes no significant difference. * *
  2. The expression used is as adopted in IERS Conventions (2003) and * comes from Souchay et al. (1999) after Simon et al. (1994). *
*

References: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 * * Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M. 1999, * Astron.Astrophys.Supp.Ser. 135, 111 * *@version 2009 December 16 * * @since Release 20101201 * * */ public static double jauFame03(double t) { double a; /* Mean longitude of Mercury (IERS Conventions 2003). */ a = fmod(4.402608842 + 2608.7903141574 * t, D2PI); return a; } /** * Fundamental argument, IERS Conventions (2003): * mean longitude of Neptune. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param t double TDB, Julian centuries since J2000.0 (Note 1) * * * @return double mean longitude of Neptune, radians (Note 2) * *

Notes: *

    * *
  1. Though t is strictly TDB, it is usually more convenient to use * TT, which makes no significant difference. * *
  2. The expression used is as adopted in IERS Conventions (2003) and * is adapted from Simon et al. (1994). *
*

References: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 * *@version 2009 December 16 * * @since Release 20101201 * * */ public static double jauFane03(double t) { double a; /* Mean longitude of Neptune (IERS Conventions 2003). */ a = fmod(5.311886287 + 3.8133035638 * t, D2PI); return a; } /** * Fundamental argument, IERS Conventions (2003): * mean longitude of the Moon's ascending node. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param t double TDB, Julian centuries since J2000.0 (Note 1) * * * @return double Omega, radians (Note 2) * *

Notes: *

    * *
  1. Though t is strictly TDB, it is usually more convenient to use * TT, which makes no significant difference. * *
  2. The expression used is as adopted in IERS Conventions (2003) and * is from Simon et al. (1994). *
*

References: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 * *@version 2009 December 16 * * @since Release 20101201 * * */ public static double jauFaom03(double t) { double a; /* Mean longitude of the Moon's ascending node */ /* (IERS Conventions 2003). */ a = fmod( 450160.398036 + t * ( - 6962890.5431 + t * ( 7.4722 + t * ( 0.007702 + t * ( - 0.00005939 ) ) ) ), TURNAS ) * DAS2R; return a; } /** * Fundamental argument, IERS Conventions (2003): * general accumulated precession in longitude. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param t double TDB, Julian centuries since J2000.0 (Note 1) * * * @return double general precession in longitude, radians (Note 2) * *

Notes: *

    * *
  1. Though t is strictly TDB, it is usually more convenient to use * TT, which makes no significant difference. * *
  2. The expression used is as adopted in IERS Conventions (2003). It * is taken from Kinoshita & Souchay (1990) and comes originally * from Lieske et al. (1977). *
*

References: * * Kinoshita, H. and Souchay J. 1990, Celest.Mech. and Dyn.Astron. * 48, 187 * *

Lieske, J.H., Lederle, T., Fricke, W. & Morando, B. 1977, * Astron.Astrophys. 58, 1-16 * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2009 December 16 * * @since Release 20101201 * * */ public static double jauFapa03(double t) { double a; /* General accumulated precession in longitude. */ a = (0.024381750 + 0.00000538691 * t) * t; return a; } /** * Fundamental argument, IERS Conventions (2003): * mean longitude of Saturn. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param t double TDB, Julian centuries since J2000.0 (Note 1) * * * @return double mean longitude of Saturn, radians (Note 2) * *

Notes: *

    * *
  1. Though t is strictly TDB, it is usually more convenient to use * TT, which makes no significant difference. * *
  2. The expression used is as adopted in IERS Conventions (2003) and * comes from Souchay et al. (1999) after Simon et al. (1994). *
*

References: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 * * Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M. 1999, * Astron.Astrophys.Supp.Ser. 135, 111 * *@version 2009 December 16 * * @since Release 20101201 * * */ public static double jauFasa03(double t) { double a; /* Mean longitude of Saturn (IERS Conventions 2003). */ a = fmod(0.874016757 + 21.3299104960 * t, D2PI); return a; } /** * Fundamental argument, IERS Conventions (2003): * mean longitude of Uranus. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param t double TDB, Julian centuries since J2000.0 (Note 1) * * * @return double mean longitude of Uranus, radians (Note 2) * *

Notes: *

    * *
  1. Though t is strictly TDB, it is usually more convenient to use * TT, which makes no significant difference. * *
  2. The expression used is as adopted in IERS Conventions (2003) and * is adapted from Simon et al. (1994). *
*

References: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 * *@version 2009 December 16 * * @since Release 20101201 * * */ public static double jauFaur03(double t) { double a; /* Mean longitude of Uranus (IERS Conventions 2003). */ a = fmod(5.481293872 + 7.4781598567 * t, D2PI); return a; } /** * Fundamental argument, IERS Conventions (2003): * mean longitude of Venus. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param t double TDB, Julian centuries since J2000.0 (Note 1) * * * @return double mean longitude of Venus, radians (Note 2) * *

Notes: *

    * *
  1. Though t is strictly TDB, it is usually more convenient to use * TT, which makes no significant difference. * *
  2. The expression used is as adopted in IERS Conventions (2003) and * comes from Souchay et al. (1999) after Simon et al. (1994). *
*

References: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 * * Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M. 1999, * Astron.Astrophys.Supp.Ser. 135, 111 * *@version 2009 December 16 * * @since Release 20101201 * * */ public static double jauFave03(double t) { double a; /* Mean longitude of Venus (IERS Conventions 2003). */ a = fmod(3.176146697 + 1021.3285546211 * t, D2PI); return a; } /** * Transform FK5 (J2000.0) star data into the Hipparcos system. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * Given (all FK5, equinox J2000.0, epoch J2000.0): * @param r5 double RA (radians) * @param d5 double Dec (radians) * @param dr5 double proper motion in RA (dRA/dt, rad/Jyear) * @param dd5 double proper motion in Dec (dDec/dt, rad/Jyear) * @param px5 double parallax (arcsec) * @param rv5 double radial velocity (km/s, positive = receding) * * Returned (all Hipparcos, epoch J2000.0): * @return catalogue coordinates * *

Notes: *

    * *
  1. This function transforms FK5 star positions and proper motions * into the system of the Hipparcos catalog. * *
  2. The proper motions in RA are dRA/dt rather than * cos(Dec)*dRA/dt, and are per year rather than per century. * *
  3. The FK5 to Hipparcos transformation is modeled as a pure * rotation and spin; zonal errors in the FK5 catalog are not * taken into account. * *
  4. See also {@link #jauH2fk5}, {@link #jauFk5hz}, {@link #jauHfk5z}. *
*

Called:

    *
  • {@link #jauStarpv} star catalog data to space motion pv-vector *
  • {@link #jauFk5hip} FK5 to Hipparcos rotation and spin *
  • {@link #jauRxp} product of r-matrix and p-vector *
  • {@link #jauPxp} vector product of two p-vectors *
  • {@link #jauPpp} p-vector plus p-vector *
  • {@link #jauPvstar} space motion pv-vector to star catalog data *
*

Reference: * *

F.Mignard & M.Froeschle, Astron. Astrophys. 354, 732-739 (2000). * *@version 2009 December 17 * * @since Release 20101201 * * */ public static CatalogCoords jauFk52h(double r5, double d5, double dr5, double dd5, double px5, double rv5) { int i; double pv5[][] = new double[2][3], r5h[][] = new double[3][3], s5h[] = new double[3], wxp[] = new double[3], vv[] = new double[3], pvh[][] = new double[2][3]; /* FK5 barycentric position/velocity pv-vector (normalized). */ jauStarpv(r5, d5, dr5, dd5, px5, rv5, pv5); /* FK5 to Hipparcos orientation matrix and spin vector. */ jauFk5hip(r5h, s5h); /* Make spin units per day instead of per year. */ for ( i = 0; i < 3; s5h[i++] /= 365.25 ); /* Orient the FK5 position into the Hipparcos system. */ pvh[0] = jauRxp(r5h, pv5[0]); /* Apply spin to the position giving an extra space motion component. */ wxp = jauPxp(pv5[0],s5h); /* Add this component to the FK5 space motion. */ vv = jauPpp(wxp, pv5[1]); /* Orient the FK5 space motion into the Hipparcos system. */ pvh[1] = jauRxp(r5h, vv); /* Hipparcos pv-vector to spherical. */ CatalogCoords cat = null; try { cat = jauPvstar(pvh); } catch (JSOFAInternalError e) { //original code ignored possibility of error too... e.printStackTrace(); } return cat; } /** * FK5 to Hipparcos rotation and spin. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param r5h double[3][3] returned r-matrix: FK5 rotation wrt Hipparcos (Note 2) * @param s5h double[3] returned r-vector: FK5 spin wrt Hipparcos (Note 3) * *

Notes: *

    * *
  1. This function models the FK5 to Hipparcos transformation as a * pure rotation and spin; zonal errors in the FK5 catalogue are * not taken into account. * *
  2. The r-matrix r5h operates in the sense: * * P_Hipparcos = r5h x P_FK5 * * where P_FK5 is a p-vector in the FK5 frame, and P_Hipparcos is * the equivalent Hipparcos p-vector. * *
  3. The r-vector s5h represents the time derivative of the FK5 to * Hipparcos rotation. The units are radians per year (Julian, * TDB). *
*

Called:

    *
  • {@link #jauRv2m} r-vector to r-matrix *
*

Reference: * *

F.Mignard & M.Froeschle, Astron. Astrophys. 354, 732-739 (2000). * *@version 2009 March 14 * * @since Release 20101201 * * */ public static void jauFk5hip(double r5h[][], double s5h[] ) { double v[] = new double[3]; /* FK5 wrt Hipparcos orientation and spin (radians, radians/year) */ double epx, epy, epz; double omx, omy, omz; epx = -19.9e-3 * DAS2R; epy = -9.1e-3 * DAS2R; epz = 22.9e-3 * DAS2R; omx = -0.30e-3 * DAS2R; omy = 0.60e-3 * DAS2R; omz = 0.70e-3 * DAS2R; /* FK5 to Hipparcos orientation expressed as an r-vector. */ v[0] = epx; v[1] = epy; v[2] = epz; /* Re-express as an r-matrix. */ double[][] r5ht = jauRv2m(v); jauCr(r5ht, r5h); /* Hipparcos wrt FK5 spin expressed as an r-vector. */ s5h[0] = omx; s5h[1] = omy; s5h[2] = omz; return; } /** * Position consisting of (α, δ) pairs in radians. Where α is right ascension (or longitude angle) and δ is declination (or latitude angle). * @author Paul Harrison (paul.harrison@manchester.ac.uk) 1 Feb 2010 * * @since AIDA Stage 1 */ public static class SphericalCoordinate { public double alpha; public double delta; public SphericalCoordinate(double alpha, double delta){ this.alpha = alpha; this.delta = delta; } } /** * Spherical coordinate with equation of origins . * @author Paul Harrison (paul.harrison@manchester.ac.uk) 28 Mar 2014 * @version $Revision$ $date$ */ public static class SphericalCoordinateEO { public SphericalCoordinate pos; public double eo; /** * @param pos the spherical position. * @param eo the equation of thr origins. */ public SphericalCoordinateEO(SphericalCoordinate pos, double eo) { this.pos = pos; this.eo = eo; } } /** * Transform an FK5 (J2000.0) star position into the system of the * Hipparcos catalogue, assuming zero Hipparcos proper motion. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param r5 double FK5 RA (radians), equinox J2000.0, at date * @param d5 double FK5 Dec (radians), equinox J2000.0, at date * @param date1 double TDB date (Notes 1,2) * @param date2 double TDB date (Notes 1,2) * * * @return rh double returned Hipparcos RA (radians) * dh double returned Hipparcos Dec (radians) * *

Notes: *

    * *
  1. This function converts a star position from the FK5 system to * the Hipparcos system, in such a way that the Hipparcos proper * motion is zero. Because such a star has, in general, a non-zero * proper motion in the FK5 system, the function requires the date * at which the position in the FK5 system was determined. * *
  2. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  3. The FK5 to Hipparcos transformation is modeled as a pure * rotation and spin; zonal errors in the FK5 catalogue are not * taken into account. * *
  4. The position returned by this function is in the Hipparcos * reference system but at date date1+date2. * *
  5. See also jauFk52h, jauH2fk5, jauHfk5z. *
*

Called:

    *
  • {@link #jauS2c} spherical coordinates to unit vector *
  • {@link #jauFk5hip} FK5 to Hipparcos rotation and spin *
  • {@link #jauSxp} multiply p-vector by scalar *
  • {@link #jauRv2m} r-vector to r-matrix *
  • {@link #jauTrxp} product of transpose of r-matrix and p-vector *
  • {@link #jauPxp} vector product of two p-vectors *
  • {@link #jauC2s} p-vector to spherical *
  • {@link #jauAnp} normalize angle into range 0 to 2pi *
*

Reference: * *

F.Mignard & M.Froeschle, 2000, Astron.Astrophys. 354, 732-739. * *@version 2009 December 17 * * @since Release 20101201 * * */ public static SphericalCoordinate jauFk5hz(double r5, double d5, double date1, double date2 ) { double t, p5e[] = new double[3], r5h[][] = new double[3][3], s5h[] = new double[3], vst[] = new double[3], rst[][] = new double[3][3], p5[] = new double[3], ph[] = new double[3]; /* Interval from given date to fundamental epoch J2000.0 (JY). */ t = - ((date1 - DJ00) + date2) / DJY; /* FK5 barycentric position vector. */ p5e = jauS2c(r5,d5); /* FK5 to Hipparcos orientation matrix and spin vector. */ jauFk5hip(r5h, s5h); /* Accumulated Hipparcos wrt FK5 spin over that interval. */ vst = jauSxp(t,s5h); /* Express the accumulated spin as a rotation matrix. */ rst = jauRv2m(vst); /* Derotate the vector's FK5 axes back to date. */ p5 = jauTrxp(rst, p5e); /* Rotate the vector into the Hipparcos system. */ ph = jauRxp(r5h, p5); /* Hipparcos vector to spherical. */ SphericalCoordinate sc = jauC2s(ph); double rh = jauAnp(sc.alpha); sc.alpha = rh; return sc; } /** * Form rotation matrix given the Fukushima-Williams angles. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param gamb double F-W angle gamma_bar (radians) * @param phib double F-W angle phi_bar (radians) * @param psi double F-W angle psi (radians) * @param eps double F-W angle epsilon (radians) * * * @return r double[3][3] returned rotation matrix * *

Notes: *

    * *
  1. Naming the following points: * * e = J2000.0 ecliptic pole, * p = GCRS pole, * E = ecliptic pole of date, * and P = CIP, * * the four Fukushima-Williams angles are as follows: * * gamb = gamma = epE * phib = phi = pE * psi = psi = pEP * eps = epsilon = EP * *
  2. The matrix representing the combined effects of frame bias, * precession and nutation is: * * NxPxB = R_1(-eps).R_3(-psi).R_1(phib).R_3(gamb) * *
  3. Three different matrices can be constructed, depending on which angles are supplied as the arguments gamb, * phib, psi and eps: * * o To obtain the nutation x precession x frame bias matrix, * first generate the four precession angles known conventionally * as gamma_bar, phi_bar, psi_bar and epsilon_A, then generate * the nutation components Dpsi and Depsilon and add them to * psi_bar and epsilon_A, and finally call the present function * using those four angles as arguments. * * o To obtain the precession x frame bias matrix, generate the * four precession angles and call the present function. * * o To obtain the frame bias matrix, generate the four precession * angles for date J2000.0 and call the present function. * * The nutation-only and precession-only matrices can if necessary * be obtained by combining these three appropriately. *
*

Called:

    *
  • {@link #jauIr} initialize r-matrix to identity *
  • {@link #jauRz} rotate around Z-axis *
  • {@link #jauRx} rotate around X-axis *
*

References: * * Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 * Hilton, J. et al., 2006, Celest.Mech.Dyn.Astron. 94, 351 * *@version 2020 November 13 * * @since Release 20101201 * * */ public static double[][] jauFw2m(double gamb, double phib, double psi, double eps) { /* Construct the matrix. */ double r[][] = new double[3][3]; jauIr(r); jauRz(gamb, r); jauRx(phib, r); jauRz(-psi, r); jauRx(-eps, r); return r; } /** * CIP X,Y given Fukushima-Williams bias-precession-nutation angles. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param gamb double F-W angle gamma_bar (radians) * @param phib double F-W angle phi_bar (radians) * @param psi double F-W angle psi (radians) * @param eps double F-W angle epsilon (radians) * * * @return CIP unit vector X,Y * *

Notes: *

    * *
  1. Naming the following points: * * e = J2000.0 ecliptic pole, * p = GCRS pole * E = ecliptic pole of date, * and P = CIP, * * the four Fukushima-Williams angles are as follows: * * gamb = gamma = epE * phib = phi = pE * psi = psi = pEP * eps = epsilon = EP * *
  2. The matrix representing the combined effects of frame bias, * precession and nutation is: * * NxPxB = R_1(-epsA).R_3(-psi).R_1(phib).R_3(gamb) * * The returned values x,y are elements [2][0] and [2][1] of the * matrix. Near J2000.0, they are essentially angles in radians * * X,Y are elements (3,1) and (3,2) of the matrix. *
*

Called:

    *
  • {@link #jauFw2m} F-W angles to r-matrix *
  • {@link #jauBpn2xy} extract CIP X,Y coordinates from NPB matrix *
*

Reference: * * Hilton, J. et al., 2006, Celest.Mech.Dyn.Astron. 94, 351 * *@version 2009 December 17 * * @since Release 20101201 * * */ public static CelestialIntermediatePole jauFw2xy(double gamb, double phib, double psi, double eps) { double r[][] = new double[3][3]; /* Form NxPxB matrix. */ r = jauFw2m(gamb, phib, psi, eps); /* Extract CIP X,Y. */ return jauBpn2xy(r); } /** * Geodetic coordinates. * @author Paul Harrison (paul.harrison@manchester.ac.uk) 4 Feb 2010 * * @since AIDA Stage 1 */ public static class GeodeticCoord { /** longitude (radians, east +ve) */ public double elong; /** latitude (geodetic, radians) */ public double phi; /** height above ellipsoid (geodetic) */ public double height; public GeodeticCoord(double elong, double phi, double height) { this.elong = elong; this.phi = phi; this.height = height; } } /** * Transform geocentric coordinates to geodetic using the specified * reference ellipsoid. * *

This function is derived from the International Astronomical Union's * JSOFA (Standards of Fundamental Astronomy) software collection. * *

Status: canonical transformation. * * * @param n int ellipsoid identifier (Note 1) * @param xyz double[3] geocentric vector (Note 2) * * * @return elong double returned longitude (radians, east +ve) * phi double returned latitude (geodetic, radians, Note 3) * height double returned height above ellipsoid (geodetic, Notes 2,3) * * * @throws JSOFAIllegalParameter 0 = OK * -1 = illegal identifier (Note 3) * -2 = internal error (Note 3) * *

Notes: *

    * *
  1. The identifier n is a number that specifies the choice of * reference ellipsoid. The following are supported: * * n ellipsoid * * 1 WGS84 * 2 GRS80 * * The number n has no significance outside the JSOFA software. * *
  2. The geocentric vector (xyz, given) and height (height, returned) * are in meters. * *
  3. An error status -1 means that the identifier n is illegal. An * error status -2 is theoretically impossible. In all error cases, * phi and height are both set to -1e9. * *
  4. The inverse transformation is performed in the function jauGd2gc. *
*

Called:

    *
  • {@link #jauEform} Earth reference ellipsoids *
  • {@link #jauGc2gde} geocentric to geodetic transformation, general *
*@version 2010 January 18 * * @since Release 20101201 * * */ public static GeodeticCoord jauGc2gd ( int n, double xyz[] ) throws JSOFAIllegalParameter { GeodeticCoord gc; /* Obtain reference ellipsoid parameters. */ ReferenceEllipsoid el = jauEform ( n ); /* If OK, transform x,y,z to longitude, geodetic latitude, height. */ gc = jauGc2gde ( el.a, el.f, xyz); /* Return the status. */ return gc; } /** * Transform geocentric coordinates to geodetic for a reference * ellipsoid of specified form. * *

This function is derived from the International Astronomical Union's * JSOFA (Standards of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param a double equatorial radius (Notes 2,4) * @param f double flattening (Note 3) * @param xyz double[3] geocentric vector (Note 4) * * * @return GeodeticCoord logitude (radians, east +ve) latitude (geodetic, radians) height above ellipsoid (geodetic, Note 4) * * @throws JSOFAIllegalParameter int status: * * -1 = illegal a * -2 = illegal f * *

Notes: *

    * *
  1. This function is based on the GCONV2H Fortran subroutine by * Toshio Fukushima (see reference). * *
  2. The equatorial radius, a, can be in any units, but meters is * the conventional choice. * *
  3. The flattening, f, is (for the Earth) a value around 0.00335, * i.e. around 1/298. * *
  4. The equatorial radius, a, and the geocentric vector, xyz, * must be given in the same units, and determine the units of * the returned height, height. * *
  5. If an error occurs (status < 0), elong, phi and height are * unchanged. * *
  6. The inverse transformation is performed in the function * jauGd2gce. * *
  7. The transformation for a standard ellipsoid (such as WGS84) can * more conveniently be performed by calling jauGc2gd, which uses a * numerical code (1 for WGS84) to identify the required A and F * values. *
*

Reference: * * Fukushima, T., "Transformation from Cartesian to geodetic * coordinates accelerated by Halley's method", J.Geodesy (2006) * 79: 689-693 * *@version 2009 November 2 * * @since Release 20101201 * * * */ public static GeodeticCoord jauGc2gde ( double a, double f, double xyz[] ) throws JSOFAIllegalParameter { double aeps2, e2, e4t, ec2, ec, b, x, y, z, p2, absz, p, s0, pn, zc, c0, c02, c03, s02, s03, a02, a0, a03, d0, f0, b0, s1, cc, s12, cc2; double phi, height; /* ------------- */ /* Preliminaries */ /* ------------- */ /* Validate ellipsoid parameters. */ if ( f < 0.0 || f >= 1.0 ) throw new JSOFAIllegalParameter("bad f", -1); if ( a <= 0.0 ) throw new JSOFAIllegalParameter("bad a", -2); /* Functions of ellipsoid parameters (with further validation of f). */ aeps2 = a*a * 1e-32; e2 = (2.0 - f) * f; e4t = e2*e2 * 1.5; ec2 = 1.0 - e2; if ( ec2 <= 0.0 ) throw new JSOFAIllegalParameter("bad f", -1); ec = sqrt(ec2); b = a * ec; /* Cartesian components. */ x = xyz[0]; y = xyz[1]; z = xyz[2]; /* Distance from polar axis squared. */ p2 = x*x + y*y; /* Longitude. */ double elong = p2 > 0.0 ? atan2(y, x) : 0.0; /* Unsigned z-coordinate. */ absz = abs(z); /* Proceed unless polar case. */ if ( p2 > aeps2 ) { /* Distance from polar axis. */ p = sqrt(p2); /* Normalization. */ s0 = absz / a; pn = p / a; zc = ec * s0; /* Prepare Newton correction factors. */ c0 = ec * pn; c02 = c0 * c0; c03 = c02 * c0; s02 = s0 * s0; s03 = s02 * s0; a02 = c02 + s02; a0 = sqrt(a02); a03 = a02 * a0; d0 = zc*a03 + e2*s03; f0 = pn*a03 - e2*c03; /* Prepare Halley correction factor. */ b0 = e4t * s02 * c02 * pn * (a0 - ec); s1 = d0*f0 - b0*s0; cc = ec * (f0*f0 - b0*c0); /* Evaluate latitude and height. */ phi = atan(s1/cc); s12 = s1 * s1; cc2 = cc * cc; height = (p*cc + absz*s1 - a * sqrt(ec2*s12 + cc2)) / sqrt(s12 + cc2); } else { /* Exception: pole. */ phi = DPI / 2.0; height = absz - b; } /* Restore sign of latitude. */ if ( z < 0 ) phi = -phi; /* OK status. */ return new GeodeticCoord(elong, phi, height); } /** * Transform geodetic coordinates to geocentric using the specified * reference ellipsoid. * *

This function is derived from the International Astronomical Union's * JSOFA (Standards of Fundamental Astronomy) software collection. * *

Status: canonical transformation. * * * @param n int ellipsoid identifier (Note 1) * @param elong double longitude (radians, east +ve) * @param phi double latitude (geodetic, radians, Note 3) * @param height double height above ellipsoid (geodetic, Notes 2,3) * * * @return xyz double[3] returned geocentric vector (Note 2) * * * @throws JSOFAIllegalParameter -1 = illegal identifier (Note 3) * -2 = illegal case (Note 3) * *

Notes: *

    * *
  1. The identifier n is a number that specifies the choice of * reference ellipsoid. The following are supported: * * n ellipsoid * * 1 WGS84 * 2 GRS80 * * The number n has no significance outside the JSOFA software. * *
  2. The height (height, given) and the geocentric vector (xyz, * returned) are in meters. * *
  3. No validation is performed on the arguments elong, phi and * height. An error status -1 means that the identifier n is * illegal. An error status -2 protects against cases that would * lead to arithmetic exceptions. In all error cases, xyz is set * to zeros. * *
  4. The inverse transformation is performed in the function jauGc2gd. *
*

Called:

    *
  • {@link #jauEform} Earth reference ellipsoids *
  • {@link #jauGd2gce} geodetic to geocentric transformation, general *
  • {@link #jauZp} zero p-vector *
*@version 2010 January 18 * * @since Release 20101201 * * */ public static double[] jauGd2gc ( int n, double elong, double phi, double height ) throws JSOFAIllegalParameter, JSOFAInternalError { /* Obtain reference ellipsoid parameters. */ ReferenceEllipsoid em = jauEform ( n ); /* If OK, transform longitude, geodetic latitude, height to x,y,z. */ return jauGd2gce ( em.a, em.f, elong, phi, height ); } /** * Transform geodetic coordinates to geocentric for a reference * ellipsoid of specified form. * *

This function is derived from the International Astronomical Union's * JSOFA (Standards of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param a double equatorial radius (Notes 1,4) * @param f double flattening (Notes 2,4) * @param elong double longitude (radians, east +ve) * @param phi double latitude (geodetic, radians, Note 4) * @param height double height above ellipsoid (geodetic, Notes 3,4) * * * @return xyz double[3] returned geocentric vector (Note 3) * * * * @throws JSOFAInternalError 0 = OK * -1 = illegal case (Note 4) *

Notes: *

    * *
  1. The equatorial radius, a, can be in any units, but meters is * the conventional choice. * *
  2. The flattening, f, is (for the Earth) a value around 0.00335, * i.e. around 1/298. * *
  3. The equatorial radius, a, and the height, height, must be * given in the same units, and determine the units of the * returned geocentric vector, xyz. * *
  4. No validation is performed on individual arguments. The error * status -1 protects against (unrealistic) cases that would lead * to arithmetic exceptions. If an error occurs, xyz is unchanged. * *
  5. The inverse transformation is performed in the function * jauGc2gde. * *
  6. The transformation for a standard ellipsoid (such as WGS84) can * more conveniently be performed by calling jauGd2gc, which uses a * numerical code (1 for WGS84) to identify the required a and f * values. *
*

References: * *

Green, R.M., Spherical Astronomy, Cambridge University Press, * (1985) Section 4.5, p96. * *

Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992), * Section 4.22, p202. * *@version 2009 November 2 * * @since Release 20101201 * * */ public static double[] jauGd2gce ( double a, double f, double elong, double phi, double height ) throws JSOFAInternalError { double sp, cp, w, d, ac, as, r; double xyz[] = new double[3]; /* Functions of geodetic latitude. */ sp = sin(phi); cp = cos(phi); w = 1.0 - f; w = w * w; d = cp*cp + w*sp*sp; if ( d <= 0.0 ) throw new JSOFAInternalError("illegal combination of arguments d< 0", -1); ac = a / sqrt(d); as = w * ac; /* Geocentric vector. */ r = (ac + height) * cp; xyz[0] = r * cos(elong); xyz[1] = r * sin(elong); xyz[2] = (as + height) * sp; /* Success. */ return xyz; } /** * Greenwich mean sidereal time (model consistent with IAU 2000 * resolutions). * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param uta double UT1 as a 2-part Julian Date (Notes 1,2) * @param utb double UT1 as a 2-part Julian Date (Notes 1,2) * @param tta double TT as a 2-part Julian Date (Notes 1,2) * @param ttb double TT as a 2-part Julian Date (Notes 1,2) * * * @return double Greenwich mean sidereal time (radians) * *

Notes: *

    * *
  1. The UT1 and TT dates uta+utb and tta+ttb respectively, are both * Julian Dates, apportioned in any convenient way between the * argument pairs. For example, JD(UT1)=2450123.7 could be expressed in * any of these ways, among others: *
        *            Part A         Part B
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable (in the case of UT; the TT is not at all critical * in this respect). The J2000 and MJD methods are good compromises * between resolution and convenience. For UT, the date & time * method is best matched to the algorithm that is used by the Earth * Rotation Angle function, called internally: maximum precision is * delivered when the uta argument is for 0hrs UT1 on the day in * question and the utb argument lies in the range 0 to 1, or vice * versa. * *
  2. Both UT1 and TT are required, UT1 to predict the Earth rotation * and TT to predict the effects of precession. If UT1 is used for * both purposes, errors of order 100 microarcseconds result. * *
  3. This GMST is compatible with the IAU 2000 resolutions and must be * used only in conjunction with other IAU 2000 compatible * components such as precession-nutation and equation of the * equinoxes. * *
  4. The result is returned in the range 0 to 2pi. * *
  5. The algorithm is from Capitaine et al. (2003) and IERS * Conventions 2003. *
*

Called:

    *
  • {@link #jauEra00} Earth rotation angle, IAU 2000 *
  • {@link #jauAnp} normalize angle into range 0 to 2pi *
*

References: * *

Capitaine, N., Wallace, P.T. and McCarthy, D.D., "Expressions to * implement the IAU 2000 definition of UT1", Astronomy & * Astrophysics, 406, 1135-1149 (2003) * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2009 March 16 * * @since Release 20101201 * * */ public static double jauGmst00(double uta, double utb, double tta, double ttb) { double t, gmst; /* TT Julian centuries since J2000.0. */ t = ((tta - DJ00) + ttb) / DJC; /* Greenwich Mean Sidereal Time, IAU 2000. */ gmst = jauAnp(jauEra00(uta, utb) + ( 0.014506 + ( 4612.15739966 + ( 1.39667721 + ( -0.00009344 + ( 0.00001882 ) * t) * t) * t) * t) * DAS2R); return gmst; } /** * Greenwich mean sidereal time (consistent with IAU 2006 precession). * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param uta double UT1 as a 2-part Julian Date (Notes 1,2) * @param utb double UT1 as a 2-part Julian Date (Notes 1,2) * @param tta double TT as a 2-part Julian Date (Notes 1,2) * @param ttb double TT as a 2-part Julian Date (Notes 1,2) * * * @return double Greenwich mean sidereal time (radians) * *

Notes: *

    * *
  1. The UT1 and TT dates uta+utb and tta+ttb respectively, are both * Julian Dates, apportioned in any convenient way between the * argument pairs. For example, JD(UT1)=450123.7 could be expressed in * any of these ways, among others: *
        *            u1a              utb
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable (in the case of UT; the TT is not at all critical * in this respect). The J2000 and MJD methods are good compromises * between resolution and convenience. For UT, the date & time * method is best matched to the algorithm that is used by the Earth * rotation angle function, called internally: maximum precision is * delivered when the uta argument is for 0hrs UT1 on the day in * question and the utb argument lies in the range 0 to 1, or vice * versa. * *
  2. Both UT1 and TT are required, UT1 to predict the Earth rotation * and TT to predict the effects of precession. If UT1 is used for * both purposes, errors of order 100 microarcseconds result. * *
  3. This GMST is compatible with the IAU 2006 precession and must not * be used with other precession models. * *
  4. The result is returned in the range 0 to 2pi. *
*

Called:

    *
  • {@link #jauEra00} Earth rotation angle, IAU 2000 *
  • {@link #jauAnp} normalize angle into range 0 to 2pi *
*

Reference: * *

Capitaine, N., Wallace, P.T. & Chapront, J., 2005, * Astron.Astrophys. 432, 355 * *@version 2008 May 24 * * @since Release 20101201 * * */ public static double jauGmst06(double uta, double utb, double tta, double ttb) { double t, gmst; /* TT Julian centuries since J2000.0. */ t = ((tta - DJ00) + ttb) / DJC; /* Greenwich mean sidereal time, IAU 2006. */ gmst = jauAnp(jauEra00(uta, utb) + ( 0.014506 + ( 4612.156534 + ( 1.3915817 + ( -0.00000044 + ( -0.000029956 + ( -0.0000000368 ) * t) * t) * t) * t) * t) * DAS2R); return gmst; } /** * Universal Time to Greenwich mean sidereal time (IAU 1982 model). * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param dj1 double UT1 Julian Date (see note) * @param dj2 double UT1 Julian Date (see note) * * * @return double Greenwich mean sidereal time (radians) * *

Notes: *

    * *
  1. The UT1 date dj1+dj2 is a Julian Date, apportioned in any * convenient way between the arguments dj1 and dj2. For example, * JD(UT1)=2450123.7 could be expressed in any of these ways, * among others: *
        *             dj1            dj2
        *
        *         2450123.7D0        0D0        (JD method)
        *          2451545D0      -1421.3D0     (J2000 method)
        *         2400000.5D0     50123.2D0     (MJD method)
        *         2450123.5D0       0.2D0       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 and MJD methods are good compromises * between resolution and convenience. The date & time method is * best matched to the algorithm used: maximum accuracy (or, at * least, minimum noise) is delivered when the dj1 argument is for * 0hrs UT1 on the day in question and the dj2 argument lies in the * range 0 to 1, or vice versa. * *
  2. The algorithm is based on the IAU 1982 expression. This is * always described as giving the GMST at 0 hours UT1. In fact, it * gives the difference between the GMST and the UT, the steady * 4-minutes-per-day drawing-ahead of ST with respect to UT. When * whole days are ignored, the expression happens to equal the GMST * at 0 hours UT1 each day. * *
  3. In this function, the entire UT1 (the sum of the two arguments * dj1 and dj2) is used directly as the argument for the standard * formula, the constant term of which is adjusted by 12 hours to * take account of the noon phasing of Julian Date. The UT1 is then * added, but omitting whole days to conserve accuracy. *
*

Called:

    *
  • {@link #jauAnp} normalize angle into range 0 to 2pi *
*

References: * *

Transactions of the International Astronomical Union, * XVIII B, 67 (1983). * *

Aoki et al., Astron. Astrophys. 105, 359-361 (1982). * *@version 2008 May 24 * * @since Release 20101201 * * */ public static double jauGmst82(double dj1, double dj2) { /* Coefficients of IAU 1982 GMST-UT1 model */ double A = 24110.54841 - DAYSEC / 2.0; double B = 8640184.812866; double C = 0.093104; double D = -6.2e-6; /* The first constant, A, has to be adjusted by 12 hours */ /* because the UT1 is supplied as a Julian date, which begins */ /* at noon. */ double d1, d2, t, f, gmst; /* Julian centuries since fundamental epoch. */ if (dj1 < dj2) { d1 = dj1; d2 = dj2; } else { d1 = dj2; d2 = dj1; } t = (d1 + (d2 - DJ00)) / DJC; /* Fractional part of JD(UT1), in seconds. */ f = DAYSEC * (fmod(d1, 1.0) + fmod(d2, 1.0)); /* GMST at this UT1. */ gmst = jauAnp(DS2R * ((A + (B + (C + D * t) * t) * t) + f)); return gmst; } /** * Greenwich apparent sidereal time (consistent with IAU 2000 * resolutions). * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param uta double UT1 as a 2-part Julian Date (Notes 1,2) * @param utb double UT1 as a 2-part Julian Date (Notes 1,2) * @param tta double TT as a 2-part Julian Date (Notes 1,2) * @param ttb double TT as a 2-part Julian Date (Notes 1,2) * * * @return double Greenwich apparent sidereal time (radians) * *

Notes: *

    * *
  1. The UT1 and TT dates uta+utb and tta+ttb respectively, are both * Julian Dates, apportioned in any convenient way between the * argument pairs. For example, JD=2450123.7 could be expressed in * any of these ways, among others: *
        *            Part A        Part B
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable (in the case of UT; the TT is not at all critical * in this respect). The J2000 and MJD methods are good compromises * between resolution and convenience. For UT, the date & time * method is best matched to the algorithm that is used by the Earth * Rotation Angle function, called internally: maximum precision is * delivered when the uta argument is for 0hrs UT1 on the day in * question and the utb argument lies in the range 0 to 1, or vice * versa. * *
  2. Both UT1 and TT are required, UT1 to predict the Earth rotation * and TT to predict the effects of precession-nutation. If UT1 is * used for both purposes, errors of order 100 microarcseconds * result. * *
  3. This GAST is compatible with the IAU 2000 resolutions and must be * used only in conjunction with other IAU 2000 compatible * components such as precession-nutation. * *
  4. The result is returned in the range 0 to 2pi. * *
  5. The algorithm is from Capitaine et al. (2003) and IERS * Conventions 2003. *
*

Called:

    *
  • {@link #jauGmst00} Greenwich mean sidereal time, IAU 2000 *
  • {@link #jauEe00a} equation of the equinoxes, IAU 2000A *
  • {@link #jauAnp} normalize angle into range 0 to 2pi *
*

References: * *

Capitaine, N., Wallace, P.T. and McCarthy, D.D., "Expressions to * implement the IAU 2000 definition of UT1", Astronomy & * Astrophysics, 406, 1135-1149 (2003) * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2008 May 16 * * @since Release 20101201 * * */ public static double jauGst00a(double uta, double utb, double tta, double ttb) { double gmst00, ee00a, gst; gmst00 = jauGmst00(uta, utb, tta, ttb); ee00a = jauEe00a(tta, ttb); gst = jauAnp(gmst00 + ee00a); return gst; } /** * Greenwich apparent sidereal time (consistent with IAU 2000 * resolutions but using the truncated nutation model IAU 2000B). * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param uta double UT1 as a 2-part Julian Date (Notes 1,2) * @param utb double UT1 as a 2-part Julian Date (Notes 1,2) * * * @return double Greenwich apparent sidereal time (radians) * *

Notes: *

    * *
  1. The UT1 date uta+utb is a Julian Date, apportioned in any * convenient way between the argument pair. For example, * JD=2450123.7 could be expressed in any of these ways, among * others: *
        *             uta            utb
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 and MJD methods are good compromises * between resolution and convenience. For UT, the date & time * method is best matched to the algorithm that is used by the Earth * Rotation Angle function, called internally: maximum precision is * delivered when the uta argument is for 0hrs UT1 on the day in * question and the utb argument lies in the range 0 to 1, or vice * versa. * *
  2. The result is compatible with the IAU 2000 resolutions, except * that accuracy has been compromised for the sake of speed and * convenience in two respects: * * . UT is used instead of TDB (or TT) to compute the precession * component of GMST and the equation of the equinoxes. This * results in errors of order 0.1 mas at present. * * . The IAU 2000B abridged nutation model (McCarthy & Luzum, 2003) * is used, introducing errors of up to 1 mas. * *
  3. This GAST is compatible with the IAU 2000 resolutions and must be * used only in conjunction with other IAU 2000 compatible * components such as precession-nutation. * *
  4. The result is returned in the range 0 to 2pi. * *
  5. The algorithm is from Capitaine et al. (2003) and IERS * Conventions 2003. *
*

Called:

    *
  • {@link #jauGmst00} Greenwich mean sidereal time, IAU 2000 *
  • {@link #jauEe00b} equation of the equinoxes, IAU 2000B *
  • {@link #jauAnp} normalize angle into range 0 to 2pi *
*

References: * *

Capitaine, N., Wallace, P.T. and McCarthy, D.D., "Expressions to * implement the IAU 2000 definition of UT1", Astronomy & * Astrophysics, 406, 1135-1149 (2003) * *

McCarthy, D.D. & Luzum, B.J., "An abridged model of the * precession-nutation of the celestial pole", Celestial Mechanics & * Dynamical Astronomy, 85, 37-49 (2003) * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2008 May 16 * * @since Release 20101201 * * */ public static double jauGst00b(double uta, double utb) { double gmst00, ee00b, gst; gmst00 = jauGmst00(uta, utb, uta, utb); ee00b = jauEe00b(uta, utb); gst = jauAnp(gmst00 + ee00b); return gst; } /** * Greenwich apparent sidereal time, IAU 2006, given the NPB matrix. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param uta double UT1 as a 2-part Julian Date (Notes 1,2) * @param utb double UT1 as a 2-part Julian Date (Notes 1,2) * @param tta double TT as a 2-part Julian Date (Notes 1,2) * @param ttb double TT as a 2-part Julian Date (Notes 1,2) * @param rnpb double[3][3] nutation x precession x bias matrix * * * @return double Greenwich apparent sidereal time (radians) * *

Notes: *

    * *
  1. The UT1 and TT dates uta+utb and tta+ttb respectively, are both * Julian Dates, apportioned in any convenient way between the * argument pairs. For example, JD=2450123.7 could be expressed in * any of these ways, among others: *
        *            uta              utb
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable (in the case of UT; the TT is not at all critical * in this respect). The J2000 and MJD methods are good compromises * between resolution and convenience. For UT, the date & time * method is best matched to the algorithm that is used by the Earth * rotation angle function, called internally: maximum precision is * delivered when the uta argument is for 0hrs UT1 on the day in * question and the utb argument lies in the range 0 to 1, or vice * versa. * *
  2. Both UT1 and TT are required, UT1 to predict the Earth rotation * and TT to predict the effects of precession-nutation. If UT1 is * used for both purposes, errors of order 100 microarcseconds * result. * *
  3. Although the function uses the IAU 2006 series for s+XY/2, it is * otherwise independent of the precession-nutation model and can in * practice be used with any equinox-based NPB matrix. * *
  4. The result is returned in the range 0 to 2pi. *
*

Called:

    *
  • {@link #jauBpn2xy} extract CIP X,Y coordinates from NPB matrix *
  • {@link #jauS06} the CIO locator s, given X,Y, IAU 2006 *
  • {@link #jauAnp} normalize angle into range 0 to 2pi *
  • {@link #jauEra00} Earth rotation angle, IAU 2000 *
  • {@link #jauEors} equation of the origins, given NPB matrix and s *
*

Reference: * *

Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 * *@version 2008 May 24 * * @since Release 20101201 * * */ public static double jauGst06(double uta, double utb, double tta, double ttb, double rnpb[][]) { double s, era, eors, gst; /* Extract CIP coordinates. */ CelestialIntermediatePole cip = jauBpn2xy(rnpb); /* The CIO locator, s. */ s = jauS06(tta, ttb, cip.x, cip.y); /* Greenwich apparent sidereal time. */ era = jauEra00(uta, utb); eors = jauEors(rnpb, s); gst = jauAnp(era - eors); return gst; } /** * Greenwich apparent sidereal time (consistent with IAU 2000 and 2006 * resolutions). * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param uta double UT1 as a 2-part Julian Date (Notes 1,2) * @param utb double UT1 as a 2-part Julian Date (Notes 1,2) * @param tta double TT as a 2-part Julian Date (Notes 1,2) * @param ttb double TT as a 2-part Julian Date (Notes 1,2) * * * @return double Greenwich apparent sidereal time (radians) * *

Notes: *

    * *
  1. The UT1 and TT dates uta+utb and tta+ttb respectively, are both * Julian Dates, apportioned in any convenient way between the * argument pairs. For example, JD=2450123.7 could be expressed in * any of these ways, among others: *
        *            uta             utb
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable (in the case of UT; the TT is not at all critical * in this respect). The J2000 and MJD methods are good compromises * between resolution and convenience. For UT, the date & time * method is best matched to the algorithm that is used by the Earth * rotation angle function, called internally: maximum precision is * delivered when the uta argument is for 0hrs UT1 on the day in * question and the utb argument lies in the range 0 to 1, or vice * versa. * *
  2. Both UT1 and TT are required, UT1 to predict the Earth rotation * and TT to predict the effects of precession-nutation. If UT1 is * used for both purposes, errors of order 100 microarcseconds * result. * *
  3. This GAST is compatible with the IAU 2000/2006 resolutions and * must be used only in conjunction with IAU 2006 precession and * IAU 2000A nutation. * *
  4. The result is returned in the range 0 to 2pi. *
*

Called:

    *
  • {@link #jauPnm06a} classical NPB matrix, IAU 2006/2000A *
  • {@link #jauGst06} Greenwich apparent ST, IAU 2006, given NPB matrix *
*

Reference: * *

Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 * *@version 2008 May 16 * * @since Release 20101201 * * */ public static double jauGst06a(double uta, double utb, double tta, double ttb) { double rnpb[][], gst; /* Classical nutation x precession x bias matrix, IAU 2000A. */ rnpb = jauPnm06a(tta, ttb); /* Greenwich apparent sidereal time. */ gst = jauGst06(uta, utb, tta, ttb, rnpb); return gst; } /** * Greenwich apparent sidereal time (consistent with IAU 1982/94 * resolutions). * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param uta double UT1 as a 2-part Julian Date (Notes 1,2) * @param utb double UT1 as a 2-part Julian Date (Notes 1,2) * * * @return double Greenwich apparent sidereal time (radians) * *

Notes: *

    * *
  1. The UT1 date uta+utb is a Julian Date, apportioned in any * convenient way between the argument pair. For example, * JD=2450123.7 could be expressed in any of these ways, among * others: *
        *             uta            utb
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 and MJD methods are good compromises * between resolution and convenience. For UT, the date & time * method is best matched to the algorithm that is used by the Earth * Rotation Angle function, called internally: maximum precision is * delivered when the uta argument is for 0hrs UT1 on the day in * question and the utb argument lies in the range 0 to 1, or vice * versa. * *
  2. The result is compatible with the IAU 1982 and 1994 resolutions, * except that accuracy has been compromised for the sake of * convenience in that UT is used instead of TDB (or TT) to compute * the equation of the equinoxes. * *
  3. This GAST must be used only in conjunction with contemporaneous * IAU standards such as 1976 precession, 1980 obliquity and 1982 * nutation. It is not compatible with the IAU 2000 resolutions. * *
  4. The result is returned in the range 0 to 2pi. *
*

Called:

    *
  • {@link #jauGmst82} Greenwich mean sidereal time, IAU 1982 *
  • {@link #jauEqeq94} equation of the equinoxes, IAU 1994 *
  • {@link #jauAnp} normalize angle into range 0 to 2pi *
*

References: * *

Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992) * * IAU Resolution C7, Recommendation 3 (1994) * *@version 2008 May 16 * * @since Release 20101201 * * */ public static double jauGst94(double uta, double utb) { double gmst82, eqeq94, gst; gmst82 = jauGmst82(uta, utb); eqeq94 = jauEqeq94(uta, utb); gst = jauAnp(gmst82 + eqeq94); return gst; } /** * Transform Hipparcos star data into the FK5 (J2000.0) system. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * Given (all Hipparcos, epoch J2000.0): * @param rh double RA (radians) * @param dh double Dec (radians) * @param drh double proper motion in RA (dRA/dt, rad/Jyear) * @param ddh double proper motion in Dec (dDec/dt, rad/Jyear) * @param pxh double parallax (arcsec) * @param rvh double radial velocity (km/s, positive = receding) * * @return cc CatalogCoords all FK5, equinox J2000.0, epoch J2000.0: * *

Notes: *

    * *
  1. This function transforms Hipparcos star positions and proper * motions into FK5 J2000.0. * *
  2. The proper motions in RA are dRA/dt rather than * cos(Dec)*dRA/dt, and are per year rather than per century. * *
  3. The FK5 to Hipparcos transformation is modeled as a pure * rotation and spin; zonal errors in the FK5 catalog are not * taken into account. * *
  4. See also jauFk52h, jauFk5hz, jauHfk5z. *
*

Called:

    *
  • {@link #jauStarpv} star catalog data to space motion pv-vector *
  • {@link #jauFk5hip} FK5 to Hipparcos rotation and spin *
  • {@link #jauRv2m} r-vector to r-matrix *
  • {@link #jauRxp} product of r-matrix and p-vector *
  • {@link #jauTrxp} product of transpose of r-matrix and p-vector *
  • {@link #jauPxp} vector product of two p-vectors *
  • {@link #jauPmp} p-vector minus p-vector *
  • {@link #jauPvstar} space motion pv-vector to star catalog data *
*

Reference: * *

F.Mignard & M.Froeschle, Astron. Astrophys. 354, 732-739 (2000). * *@version 2009 December 17 * * @since Release 20101201 * * */ public static CatalogCoords jauH2fk5(double rh, double dh, double drh, double ddh, double pxh, double rvh) { int i; double pvh[][] = new double[2][3], r5h[][] = new double[3][3], s5h[] = new double[3], sh[] = new double[3], wxp[] = new double[3], vv[] = new double[3], pv5[][] = new double[2][3]; /* Hipparcos barycentric position/velocity pv-vector (normalized). */ jauStarpv(rh, dh, drh, ddh, pxh, rvh, pvh); /* FK5 to Hipparcos orientation matrix and spin vector. */ jauFk5hip(r5h, s5h); /* Make spin units per day instead of per year. */ for ( i = 0; i < 3; s5h[i++] /= 365.25 ); /* Orient the spin into the Hipparcos system. */ sh = jauRxp(r5h, s5h); /* De-orient the Hipparcos position into the FK5 system. */ pv5[0] = jauTrxp(r5h, pvh[0]); /* Apply spin to the position giving an extra space motion component. */ wxp = jauPxp(pvh[0],sh); /* Subtract this component from the Hipparcos space motion. */ vv = jauPmp(pvh[1], wxp); /* De-orient the Hipparcos space motion into the FK5 system. */ pv5[1] = jauTrxp(r5h, vv); /* FK5 pv-vector to spherical., r5, d5, dr5, dd5, px5, rv5 */ CatalogCoords cat = null; try { cat = jauPvstar(pv5); } catch (JSOFAInternalError e) { // original code just ignored this possibility e.printStackTrace(); } return cat; } /** * Transform a Hipparcos star position into FK5 J2000.0, assuming * zero Hipparcos proper motion. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param rh double Hipparcos RA (radians) * @param dh double Hipparcos Dec (radians) * @param date1 double TDB date (Note 1) * @param date2 double TDB date (Note 1) * * FIXME original did not return the parallax and radial velocity of the CatalogCoords type. * @return cc CatalogCoords (all FK5, equinox J2000.0, date date1+date2) * RA (radians), Dec (radians), FK5 RA proper motion (rad/year, Note 4), Dec proper motion (rad/year, Note 4) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. * *
  3. The FK5 to Hipparcos transformation is modeled as a pure rotation * and spin; zonal errors in the FK5 catalogue are not taken into * account. * *
  4. It was the intention that Hipparcos should be a close * approximation to an inertial frame, so that distant objects have * zero proper motion; such objects have (in general) non-zero * proper motion in FK5, and this function returns those fictitious * proper motions. * *
  5. The position returned by this function is in the FK5 J2000.0 * reference system but at date date1+date2. * *
  6. See also jauFk52h, jauH2fk5, jauFk5zhz. *
*

Called:

    *
  • {@link #jauS2c} spherical coordinates to unit vector *
  • {@link #jauFk5hip} FK5 to Hipparcos rotation and spin *
  • {@link #jauRxp} product of r-matrix and p-vector *
  • {@link #jauSxp} multiply p-vector by scalar *
  • {@link #jauRxr} product of two r-matrices *
  • {@link #jauTrxp} product of transpose of r-matrix and p-vector *
  • {@link #jauPxp} vector product of two p-vectors *
  • {@link #jauPv2s} pv-vector to spherical *
  • {@link #jauAnp} normalize angle into range 0 to 2pi *
*

Reference: * *

F.Mignard & M.Froeschle, 2000, Astron.Astrophys. 354, 732-739. * *@version 2009 December 17 * * @since Release 20101201 * * * */ public static CatalogCoords jauHfk5z(double rh, double dh, double date1, double date2) { double t, ph[] = new double[3], r5h[][] = new double[3][3], s5h[] = new double[3], sh[] = new double[3], vst[] = new double[3], rst[][] = new double[3][3], r5ht[][] = new double[3][3], pv5e[][] = new double[2][3], vv[] = new double[3]; /* Time interval from fundamental epoch J2000.0 to given date (JY). */ t = ((date1 - DJ00) + date2) / DJY; /* Hipparcos barycentric position vector (normalized). */ ph = jauS2c(rh,dh); /* FK5 to Hipparcos orientation matrix and spin vector. */ jauFk5hip(r5h, s5h); /* Rotate the spin into the Hipparcos system. */ sh = jauRxp(r5h, s5h); /* Accumulated Hipparcos wrt FK5 spin over that interval. */ vst = jauSxp(t,s5h); /* Express the accumulated spin as a rotation matrix. */ rst = jauRv2m(vst); /* Rotation matrix: accumulated spin, then FK5 to Hipparcos. */ r5ht = jauRxr(r5h, rst); /* De-orient & de-spin the Hipparcos position into FK5 J2000.0. */ pv5e[0] = jauTrxp(r5ht, ph); /* Apply spin to the position giving a space motion. */ vv = jauPxp(sh,ph); /* De-orient & de-spin the Hipparcos space motion into FK5 J2000.0. */ pv5e[1] = jauTrxp(r5ht, vv); /* FK5 position/velocity pv-vector to spherical. */ SphericalPositionVelocity pvs = jauPv2s(pv5e); double r5 = jauAnp(pvs.pos.theta); return new CatalogCoords(r5, pvs.pos.phi, pvs.vel.theta, pvs.vel.phi, 0.0, 0.0); } /** * Initialize an r-matrix to the identity matrix. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param r double[3][3] returned r-matrix * *

Called:

    *
  • {@link #jauZr} zero r-matrix *
*@version 2008 May 11 * * @since Release 20101201 * * * TODO - this would be better returning a new array in java.... */ public static void jauIr(double r[][]) { jauZr(r); r[0][0] = 1.0; r[1][1] = 1.0; r[2][2] = 1.0; return; } /** * return a new r-matrix as the identity matrix. * This is a convenience method that is an * overload of the official SOFA API {@link #jauIr(double[][])} that does not require * the vector to be passed in. * @return r double[3][3] */ public static double[][] jauIr() { double [][] r = new double[3][3]; jauZr(r); return r ; } /** * Julian Date to Gregorian year, month, day, and fraction of a day. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param dj1 double Julian Date (Notes 1, 2) * @param dj2 double Julian Date (Notes 1, 2) * * Returned (arguments): * iy int year * im int month * id int day * fd double fraction of day * * * @return Calendar the date represented in Java. * *@throws JSOFAIllegalParameter unacceptable date (Note 3) *

Notes: *

    * *
  1. The earliest valid date is -68569.5 (-4900 March 1). The * largest value accepted is 10^9. * *
  2. The Julian Date is apportioned in any convenient way between * the arguments dj1 and dj2. For example, JD=2450123.7 could * be expressed in any of these ways, among others: *
        *            dj1             dj2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * Separating integer and fraction uses the "compensated summation" * algorithm of Kahan-Neumaier to preserve as much precision as * possible irrespective of the jd1+jd2 apportionment. * *
  3. In early eras the conversion is from the "proleptic Gregorian * calendar"; no account is taken of the date(s) of adoption of * the Gregorian calendar, nor is the AD/BC numbering convention * observed. *
*

Reference: * *

Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992), * Section 12.92 (p604). *

Klein, A., A Generalized Kahan-Babuska-Summation-Algorithm. * Computing 76, 279-293 (2006), Section 3. * * @version 2020 Nov 13 * * @since Release 20101201 * * */ public static Calendar jauJd2cal(double dj1, double dj2) throws JSOFAIllegalParameter { /* Minimum and maximum allowed JD */ final double djmin = -68569.5; final double djmax = 1e9; long jd, i , l, n, k; double dj, f1, f2, d, s, cs, v[]=new double[2], x, t, f; /* Verify date is acceptable. */ dj = dj1 + dj2; if (dj < djmin || dj > djmax) throw new JSOFAIllegalParameter("input julian date out of range", -1); /* Separate day and fraction (where -0.5 <= fraction < 0.5). */ d = dnint(dj1); f1 = dj1 - d; jd = (long) d; d = dnint(dj2); f2 = dj2 - d; jd += (long) d; /* Compute f1+f2+0.5 using compensated summation (Klein 2006). */ s = 0.5; cs = 0.0; v[0] = f1; v[1] = f2; for ( int i1 = 0; i1 < 2; i1++ ) { x = v[i1]; t = s + x; cs += abs(s) >= abs(x) ? (s-t) + x : (x-t) + s; s = t; if ( s >= 1.0 ) { jd++; s -= 1.0; } } f = s + cs; cs = f - s; /* Deal with negative f. */ if ( f < 0.0 ) { /* Compensated summation: assume that |s| <= 1.0. */ f = s + 1.0; cs += (1.0-f) + s; s = f; f = s + cs; cs = f - s; jd--; } /* Deal with f that is 1.0 or more (when rounded to double). */ if ( (f-1.0) >= -DBL_EPSILON/4.0 ) { /* Compensated summation: assume that |s| <= 1.0. */ t = s - 1.0; cs += (s-t) - 1.0; s = t; f = s + cs; if ( -DBL_EPSILON/2.0 < f ) { jd++; f = gmax(f, 0.0); } } /* Express day in Gregorian calendar. */ l = jd + 68569L; n = (4L * l) / 146097L; l -= (146097L * n + 3L) / 4L; i = (4000L * (l + 1L)) / 1461001L; l -= (1461L * i) / 4L - 31L; k = (80L * l) / 2447L; int id = (int) (l - (2447L * k) / 80L); l = k / 11L; int im = (int) (k + 2L - 12L * l); int iy = (int) (100L * (n - 49L) + i + l); return new Calendar(iy, im, id, f); } /** * larger (most +ve) of two numbers (generic). * @param A * @param B * @return */ private static double gmax(double A, double B) { return (((A)>(B))?(A):(B)) ; } /** * Julian Date to Gregorian Calendar, expressed in a form convenient * for formatting messages: rounded to a specified precision. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param ndp int number of decimal places of days in fraction * @param dj1 double dj1+dj2 = Julian Date (Note 1) * @param dj2 double dj1+dj2 = Julian Date (Note 1) * * * @param iymdf int[4] returned year, month, day, fraction in Gregorian calendar * * * * @return int status: * -1 = date out of range * 0 = OK * +1 = NDP not 0-9 (interpreted as 0) * *

Notes: *

    * *
  1. The Julian Date is apportioned in any convenient way between * the arguments dj1 and dj2. For example, JD=2450123.7 could * be expressed in any of these ways, among others: *
        *             dj1            dj2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    *
  2. In early eras the conversion is from the "Proleptic Gregorian * Calendar"; no account is taken of the date(s) of adoption of * the Gregorian Calendar, nor is the AD/BC numbering convention * observed. * *
  3. Refer to the function jauJd2cal. * *
  4. the number of decimal places (npd) should be 4 or less if internal overflows are to be * avoided on machines which use 16-bit integers. *
*

Called:

    *
  • {@link #jauJd2cal} JD to Gregorian calendar *
*

Reference: * *

Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992), * Section 12.92 (p604). * * @version 2020 Nov 13 * * @since Release 20101201 * * */ public static int jauJdcalf(int ndp, double dj1, double dj2, int iymdf[]) { int j; double denom, d1, d2, f1, f2, d, djd, f, rf; /* Denominator of fraction (e.g. 100 for 2 decimal places). */ if ((ndp >= 0) && (ndp <= 9)) { j = 0; denom = pow(10.0, ndp); } else { j = 1; denom = 1.0; } /* Copy the date, big then small. */ if (abs(dj1) >= abs(dj2)) { d1 = dj1; d2 = dj2; } else { d1 = dj2; d2 = dj1; } /* Realign to midnight (without rounding error). */ d1 -= 0.5; /* Separate day and fraction (as precisely as possible). */ d = dnint(d1); f1 = d1 - d; djd = d; d = dnint(d2); f2 = d2 - d; djd += d; d = dnint(f1 + f2); f = (f1 - d) + f2; if (f < 0.0) { f += 1.0; d -= 1.0; } djd += d; /* Round the total fraction to the specified number of places. */ rf = dnint(f*denom) / denom; /* Re-align to noon. */ djd += 0.5; /* Convert to Gregorian Calendar. */ try { Calendar cal = jauJd2cal(djd, rf); iymdf[0] = cal.iy; iymdf[1] = cal.im; iymdf[2] = cal.id; iymdf[3] = (int) dnint(cal.fd * denom); } catch (JSOFAIllegalParameter e) { j = -1; } /* Return the status. */ return j; } /** * Form the matrix of nutation for a given date, IAU 2000A model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return rmatn double[3][3] returned nutation matrix * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The matrix operates in the sense V(true) = rmatn * V(mean), where * the p-vector V(true) is with respect to the true equatorial triad * of date and the p-vector V(mean) is with respect to the mean * equatorial triad of date. * *
  3. A faster, but slightly less accurate, result (about 1 mas), can be * obtained by using instead the jauNum00b function. *
*

Called:

    *
  • {@link #jauPn00a} bias/precession/nutation, IAU 2000A *
*

Reference: * *

Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992), * Section 3.222-3 (p114). * *@version 2008 May 12 * * @since Release 20101201 * * */ public static double[][] jauNum00a(double date1, double date2) { /* Obtain the required matrix (discarding other results). */ PrecessionNutation pn = jauPn00a(date1, date2); return pn.rn ; } /** * Form the matrix of nutation for a given date, IAU 2000B model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return rmatn double[3][3] returned nutation matrix * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The matrix operates in the sense V(true) = rmatn * V(mean), where * the p-vector V(true) is with respect to the true equatorial triad * of date and the p-vector V(mean) is with respect to the mean * equatorial triad of date. * *
  3. The present function is faster, but slightly less accurate (about * 1 mas), than the jauNum00a function. *
*

Called:

    *
  • {@link #jauPn00b} bias/precession/nutation, IAU 2000B *
*

Reference: * *

Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992), * Section 3.222-3 (p114). * *@version 2008 May 12 * * @since Release 20101201 * * */ public static double[][] jauNum00b(double date1, double date2) { /* Obtain the required matrix (discarding other results). */ PrecessionNutation pn = jauPn00b(date1, date2); return pn.rn; } /** * Form the matrix of nutation for a given date, IAU 2006/2000A model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return rmatn double[3][3] returned nutation matrix * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The matrix operates in the sense V(true) = rmatn * V(mean), where * the p-vector V(true) is with respect to the true equatorial triad * of date and the p-vector V(mean) is with respect to the mean * equatorial triad of date. *
*

Called:

    *
  • {@link #jauObl06} mean obliquity, IAU 2006 *
  • {@link #jauNut06a} nutation, IAU 2006/2000A *
  • {@link #jauNumat} form nutation matrix *
*

Reference: * *

Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992), * Section 3.222-3 (p114). * *@version 2008 May 12 * * @since Release 20101201 * * */ public static double[][] jauNum06a(double date1, double date2) { double eps, rmatn[][]; /* Mean obliquity. */ eps = jauObl06(date1, date2); /* Nutation components. */ NutationTerms nut = jauNut06a(date1, date2); /* Nutation matrix. */ rmatn = jauNumat(eps, nut.dpsi, nut.deps); return rmatn; } /** * Form the matrix of nutation. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param epsa double mean obliquity of date (Note 1) * @param dpsi double nutation (Note 2) * @param deps double nutation (Note 2) * * * @return rmatn double[3][3] returned nutation matrix (Note 3) * *

Notes: *

    * * *
  1. The supplied mean obliquity epsa, must be consistent with the * precession-nutation models from which dpsi and deps were obtained. * *
  2. The caller is responsible for providing the nutation components; * they are in longitude and obliquity, in radians and are with * respect to the equinox and ecliptic of date. * *
  3. The matrix operates in the sense V(true) = rmatn * V(mean), * where the p-vector V(true) is with respect to the true * equatorial triad of date and the p-vector V(mean) is with * respect to the mean equatorial triad of date. *
*

Called:

    *
  • {@link #jauIr} initialize r-matrix to identity *
  • {@link #jauRx} rotate around X-axis *
  • {@link #jauRz} rotate around Z-axis *
*

Reference: * *

Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992), * Section 3.222-3 (p114). * *@version 2008 May 11 * * @since Release 20101201 * * */ public static double[][] jauNumat(double epsa, double dpsi, double deps) { double rmatn[][] = new double[3][3]; /* Build the rotation matrix. */ jauIr(rmatn); jauRx(epsa, rmatn); jauRz(-dpsi, rmatn); jauRx(-(epsa + deps), rmatn); return rmatn; } /** * Nutation Terms. * . * @author Paul Harrison (paul.harrison@manchester.ac.uk) 21 Nov 2011 * @version $Revision$ $date$ */ public static class NutationTerms { /** nutation component in longitude */ public double dpsi; /** nutation component in obliquity */ public double deps; public NutationTerms(double dpsi, double deps) { this.dpsi = dpsi; this.deps = deps; } } private static final class NutationModel { int nl,nlp,nf,nd,nom; /* coefficients of l,l',F,D,Om */ double sp,spt,cp; /* longitude sin, t*sin, cos coefficients */ double ce,cet,se; /* obliquity cos, t*cos, sin coefficients */ public NutationModel(int nl,int nlp,int nf,int nd, int nom, double sp,double spt,double cp, double ce,double cet,double se ) { this.nl = nl; this.nlp = nlp; this.nf = nf; this.nd = nd; this.nom = nom; this.sp = sp; this.spt = spt; this.cp = cp; this.ce = ce; this.cet = cet; this.se = se; } } private final static class PlanetaryNutModel { final int nl, /* coefficients of l, F, D and Omega */ nf, nd, nom, nme, /* coefficients of planetary longitudes */ nve, nea, nma, nju, nsa, nur, nne, npa; /* coefficient of general precession */ final int sp,cp; /* longitude sin, cos coefficients */ final int se,ce; /* obliquity sin, cos coefficients */ public PlanetaryNutModel( int nl, int nf, int nd, int nom, int nme, int nve, int nea, int nma, int nju, int nsa, int nur, int nne, int npa, int sp,int cp, int se,int ce ) { this.nl = nl; /* coefficients of l, F, D and Omega */ this.nf = nf; this.nd = nd; this.nom = nom; this.nme = nme; /* coefficients of planetary longitudes */ this.nve = nve; this.nea = nea; this.nma = nma; this.nju = nju; this.nsa = nsa; this.nur = nur; this.nne = nne; this.npa = npa; /* coefficient of general precession */ this.sp = sp; this.cp = cp; /* longitude sin, cos coefficients */ this.se = se; this.ce = ce; /* obliquity sin, cos coefficients */ } } /** * Nutation, IAU 2000A model (MHB2000 luni-solar and planetary nutation * with free core nutation omitted). * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return returned nutation, luni-solar + planetary (Note 2) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The nutation components in longitude and obliquity are in radians * and with respect to the equinox and ecliptic of date. The * obliquity at J2000.0 is assumed to be the Lieske et al. (1977) * value of 84381.448 arcsec. * * Both the luni-solar and planetary nutations are included. The * latter are due to direct planetary nutations and the * perturbations of the lunar and terrestrial orbits. * *
  3. The function computes the MHB2000 nutation series with the * associated corrections for planetary nutations. It is an * implementation of the nutation part of the IAU 2000A precession- * nutation model, formally adopted by the IAU General Assembly in * 2000, namely MHB2000 (Mathews et al. 2002), but with the free * core nutation (FCN - see Note 4) omitted. * *
  4. The full MHB2000 model also contains contributions to the * nutations in longitude and obliquity due to the free-excitation * of the free-core-nutation during the period 1979-2000. These FCN * terms, which are time-dependent and unpredictable, are NOT * included in the present function and, if required, must be * independently computed. With the FCN corrections included, the * present function delivers a pole which is at current epochs * accurate to a few hundred microarcseconds. The omission of FCN * introduces further errors of about that size. * *
  5. The present function provides classical nutation. The MHB2000 * algorithm, from which it is adapted, deals also with (i) the * offsets between the GCRS and mean poles and (ii) the adjustments * in longitude and obliquity due to the changed precession rates. * These additional functions, namely frame bias and precession * adjustments, are supported by the JSOFA functions jauBi00 and * jauPr00. * *
  6. The MHB2000 algorithm also provides "total" nutations, comprising * the arithmetic sum of the frame bias, precession adjustments, * luni-solar nutation and planetary nutation. These total * nutations can be used in combination with an existing IAU 1976 * precession implementation, such as jauPmat76, to deliver GCRS- * to-true predictions of sub-mas accuracy at current dates. * However, there are three shortcomings in the MHB2000 model that * must be taken into account if more accurate or definitive results * are required (see Wallace 2002): * * (i) The MHB2000 total nutations are simply arithmetic sums, * yet in reality the various components are successive Euler * rotations. This slight lack of rigor leads to cross terms * that exceed 1 mas after a century. The rigorous procedure * is to form the GCRS-to-true rotation matrix by applying the * bias, precession and nutation in that order. * * (ii) Although the precession adjustments are stated to be with * respect to Lieske et al. (1977), the MHB2000 model does * not specify which set of Euler angles are to be used and * how the adjustments are to be applied. The most literal * and straightforward procedure is to adopt the 4-rotation * epsilon_0, psi_A, omega_A, xi_A option, and to add DPSIPR * to psi_A and DEPSPR to both omega_A and eps_A. * * (iii) The MHB2000 model predates the determination by Chapront * et al. (2002) of a 14.6 mas displacement between the * J2000.0 mean equinox and the origin of the ICRS frame. It * should, however, be noted that neglecting this displacement * when calculating star coordinates does not lead to a * 14.6 mas change in right ascension, only a small second- * order distortion in the pattern of the precession-nutation * effect. * * For these reasons, the JSOFA functions do not generate the "total * nutations" directly, though they can of course easily be * generated by calling jauBi00, jauPr00 and the present function * and adding the results. * *
  7. The MHB2000 model contains 41 instances where the same frequency * appears multiple times, of which 38 are duplicates and three are * triplicates. To keep the present code close to the original MHB * algorithm, this small inefficiency has not been corrected. *
*

Called:

    *
  • {@link #jauFal03} mean anomaly of the Moon *
  • {@link #jauFaf03} mean argument of the latitude of the Moon *
  • {@link #jauFaom03} mean longitude of the Moon's ascending node *
  • {@link #jauFame03} mean longitude of Mercury *
  • {@link #jauFave03} mean longitude of Venus *
  • {@link #jauFae03} mean longitude of Earth *
  • {@link #jauFama03} mean longitude of Mars *
  • {@link #jauFaju03} mean longitude of Jupiter *
  • {@link #jauFasa03} mean longitude of Saturn *
  • {@link #jauFaur03} mean longitude of Uranus *
  • {@link #jauFapa03} general accumulated precession in longitude *
*

References: * *

Chapront, J., Chapront-Touze, M. & Francou, G. 2002, * Astron.Astrophys. 387, 700 * *

Lieske, J.H., Lederle, T., Fricke, W. & Morando, B. 1977, * Astron.Astrophys. 58, 1-16 * *

Mathews, P.M., Herring, T.A., Buffet, B.A. 2002, J.Geophys.Res. * 107, B4. The MHB_2000 code itself was obtained on 9th September * 2002 from ftp//maia.usno.navy.mil/conv2000/chapter5/IAU2000A. * *

Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 * *

Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M. 1999, * Astron.Astrophys.Supp.Ser. 135, 111 * *

Wallace, P.T., "Software for Implementing the IAU 2000 * Resolutions", in IERS Workshop 5.1 (2002) * *@version 2009 December 17 * * @since Release 20101201 * * */ public static NutationTerms jauNut00a(double date1, double date2 ) { int i; double t, el, elp, f, d, om, arg, dp, de, sarg, carg, al, af, ad, aom, alme, alve, alea, alma, alju, alsa, alur, alne, apa, dpsils, depsls, dpsipl, depspl; /* Units of 0.1 microarcsecond to radians */ final double U2R = DAS2R / 1e7; /* ------------------------- */ /* Luni-Solar nutation model */ /* ------------------------- */ /* The units for the sine and cosine coefficients are */ /* 0.1 microarcsecond and the same per Julian century */ NutationModel xls[] = { /* 1- 10 */ new NutationModel( 0, 0, 0, 0, 1, -172064161.0, -174666.0, 33386.0, 92052331.0, 9086.0, 15377.0), new NutationModel( 0, 0, 2,-2, 2, -13170906.0, -1675.0, -13696.0, 5730336.0, -3015.0, -4587.0), new NutationModel( 0, 0, 2, 0, 2,-2276413.0,-234.0,2796.0,978459.0,-485.0, 1374.0), new NutationModel( 0, 0, 0, 0, 2,2074554.0, 207.0, -698.0,-897492.0,470.0, -291.0), new NutationModel( 0, 1, 0, 0, 0,1475877.0,-3633.0,11817.0,73871.0,-184.0,-1924.0), new NutationModel( 0, 1, 2,-2, 2,-516821.0,1226.0, -524.0,224386.0,-677.0, -174.0), new NutationModel( 1, 0, 0, 0, 0, 711159.0, 73.0, -872.0, -6750.0, 0.0, 358.0), new NutationModel( 0, 0, 2, 0, 1,-387298.0,-367.0, 380.0, 200728.0, 18.0, 318.0), new NutationModel( 1, 0, 2, 0, 2,-301461.0, -36.0, 816.0, 129025.0,-63.0, 367.0), new NutationModel( 0,-1, 2,-2, 2, 215829.0,-494.0, 111.0, -95929.0,299.0, 132.0), /* 11-20 */ new NutationModel( 0, 0, 2,-2, 1, 128227.0, 137.0, 181.0, -68982.0, -9.0, 39.0), new NutationModel(-1, 0, 2, 0, 2, 123457.0, 11.0, 19.0, -53311.0, 32.0, -4.0), new NutationModel(-1, 0, 0, 2, 0, 156994.0, 10.0, -168.0, -1235.0, 0.0, 82.0), new NutationModel( 1, 0, 0, 0, 1, 63110.0, 63.0, 27.0, -33228.0, 0.0, -9.0), new NutationModel(-1, 0, 0, 0, 1, -57976.0, -63.0, -189.0, 31429.0, 0.0, -75.0), new NutationModel(-1, 0, 2, 2, 2, -59641.0, -11.0, 149.0, 25543.0,-11.0, 66.0), new NutationModel( 1, 0, 2, 0, 1, -51613.0, -42.0, 129.0, 26366.0, 0.0, 78.0), new NutationModel(-2, 0, 2, 0, 1, 45893.0, 50.0, 31.0, -24236.0,-10.0, 20.0), new NutationModel( 0, 0, 0, 2, 0, 63384.0, 11.0, -150.0, -1220.0, 0.0, 29.0), new NutationModel( 0, 0, 2, 2, 2, -38571.0, -1.0, 158.0, 16452.0,-11.0, 68.0), /* 21-30 */ new NutationModel( 0,-2, 2,-2, 2, 32481.0, 0.0, 0.0, -13870.0, 0.0, 0.0), new NutationModel(-2, 0, 0, 2, 0, -47722.0, 0.0, -18.0, 477.0, 0.0, -25.0), new NutationModel( 2, 0, 2, 0, 2, -31046.0, -1.0, 131.0, 13238.0,-11.0, 59.0), new NutationModel( 1, 0, 2,-2, 2, 28593.0, 0.0, -1.0, -12338.0, 10.0, -3.0), new NutationModel(-1, 0, 2, 0, 1, 20441.0, 21.0, 10.0, -10758.0, 0.0, -3.0), new NutationModel( 2, 0, 0, 0, 0, 29243.0, 0.0, -74.0, -609.0, 0.0, 13.0), new NutationModel( 0, 0, 2, 0, 0, 25887.0, 0.0, -66.0, -550.0, 0.0, 11.0), new NutationModel( 0, 1, 0, 0, 1, -14053.0, -25.0, 79.0, 8551.0, -2.0, -45.0), new NutationModel(-1, 0, 0, 2, 1, 15164.0, 10.0, 11.0, -8001.0, 0.0, -1.0), new NutationModel( 0, 2, 2,-2, 2, -15794.0, 72.0, -16.0, 6850.0,-42.0, -5.0), /* 31-40 */ new NutationModel( 0, 0,-2, 2, 0, 21783.0, 0.0, 13.0, -167.0, 0.0, 13.0), new NutationModel( 1, 0, 0,-2, 1, -12873.0, -10.0, -37.0, 6953.0, 0.0, -14.0), new NutationModel( 0,-1, 0, 0, 1, -12654.0, 11.0, 63.0, 6415.0, 0.0, 26.0), new NutationModel(-1, 0, 2, 2, 1, -10204.0, 0.0, 25.0, 5222.0, 0.0, 15.0), new NutationModel( 0, 2, 0, 0, 0, 16707.0, -85.0, -10.0, 168.0, -1.0, 10.0), new NutationModel( 1, 0, 2, 2, 2, -7691.0, 0.0, 44.0, 3268.0, 0.0, 19.0), new NutationModel(-2, 0, 2, 0, 0, -11024.0, 0.0, -14.0, 104.0, 0.0, 2.0), new NutationModel( 0, 1, 2, 0, 2, 7566.0, -21.0, -11.0, -3250.0, 0.0, -5.0), new NutationModel( 0, 0, 2, 2, 1, -6637.0, -11.0, 25.0, 3353.0, 0.0, 14.0), new NutationModel( 0,-1, 2, 0, 2, -7141.0, 21.0, 8.0, 3070.0, 0.0, 4.0), /* 41-50 */ new NutationModel( 0, 0, 0, 2, 1, -6302.0, -11.0, 2.0, 3272.0, 0.0, 4.0), new NutationModel( 1, 0, 2,-2, 1, 5800.0, 10.0, 2.0, -3045.0, 0.0, -1.0), new NutationModel( 2, 0, 2,-2, 2, 6443.0, 0.0, -7.0, -2768.0, 0.0, -4.0), new NutationModel(-2, 0, 0, 2, 1, -5774.0, -11.0, -15.0, 3041.0, 0.0, -5.0), new NutationModel( 2, 0, 2, 0, 1, -5350.0, 0.0, 21.0, 2695.0, 0.0, 12.0), new NutationModel( 0,-1, 2,-2, 1, -4752.0, -11.0, -3.0, 2719.0, 0.0, -3.0), new NutationModel( 0, 0, 0,-2, 1, -4940.0, -11.0, -21.0, 2720.0, 0.0, -9.0), new NutationModel(-1,-1, 0, 2, 0, 7350.0, 0.0, -8.0, -51.0, 0.0, 4.0), new NutationModel( 2, 0, 0,-2, 1, 4065.0, 0.0, 6.0, -2206.0, 0.0, 1.0), new NutationModel( 1, 0, 0, 2, 0, 6579.0, 0.0, -24.0, -199.0, 0.0, 2.0), /* 51-60 */ new NutationModel( 0, 1, 2,-2, 1, 3579.0, 0.0, 5.0, -1900.0, 0.0, 1.0), new NutationModel( 1,-1, 0, 0, 0, 4725.0, 0.0, -6.0, -41.0, 0.0, 3.0), new NutationModel(-2, 0, 2, 0, 2, -3075.0, 0.0, -2.0, 1313.0, 0.0, -1.0), new NutationModel( 3, 0, 2, 0, 2, -2904.0, 0.0, 15.0, 1233.0, 0.0, 7.0), new NutationModel( 0,-1, 0, 2, 0, 4348.0, 0.0, -10.0, -81.0, 0.0, 2.0), new NutationModel( 1,-1, 2, 0, 2, -2878.0, 0.0, 8.0, 1232.0, 0.0, 4.0), new NutationModel( 0, 0, 0, 1, 0, -4230.0, 0.0, 5.0, -20.0, 0.0, -2.0), new NutationModel(-1,-1, 2, 2, 2, -2819.0, 0.0, 7.0, 1207.0, 0.0, 3.0), new NutationModel(-1, 0, 2, 0, 0, -4056.0, 0.0, 5.0, 40.0, 0.0, -2.0), new NutationModel( 0,-1, 2, 2, 2, -2647.0, 0.0, 11.0, 1129.0, 0.0, 5.0), /* 61-70 */ new NutationModel(-2, 0, 0, 0, 1, -2294.0, 0.0, -10.0, 1266.0, 0.0, -4.0), new NutationModel( 1, 1, 2, 0, 2, 2481.0, 0.0, -7.0, -1062.0, 0.0, -3.0), new NutationModel( 2, 0, 0, 0, 1, 2179.0, 0.0, -2.0, -1129.0, 0.0, -2.0), new NutationModel(-1, 1, 0, 1, 0, 3276.0, 0.0, 1.0, -9.0, 0.0, 0.0), new NutationModel( 1, 1, 0, 0, 0, -3389.0, 0.0, 5.0, 35.0, 0.0, -2.0), new NutationModel( 1, 0, 2, 0, 0, 3339.0, 0.0, -13.0, -107.0, 0.0, 1.0), new NutationModel(-1, 0, 2,-2, 1, -1987.0, 0.0, -6.0, 1073.0, 0.0, -2.0), new NutationModel( 1, 0, 0, 0, 2, -1981.0, 0.0, 0.0, 854.0, 0.0, 0.0), new NutationModel(-1, 0, 0, 1, 0, 4026.0, 0.0, -353.0, -553.0, 0.0, -139.0), new NutationModel( 0, 0, 2, 1, 2, 1660.0, 0.0, -5.0, -710.0, 0.0, -2.0), /* 71-80 */ new NutationModel(-1, 0, 2, 4, 2, -1521.0, 0.0, 9.0, 647.0, 0.0, 4.0), new NutationModel(-1, 1, 0, 1, 1, 1314.0, 0.0, 0.0, -700.0, 0.0, 0.0), new NutationModel( 0,-2, 2,-2, 1, -1283.0, 0.0, 0.0, 672.0, 0.0, 0.0), new NutationModel( 1, 0, 2, 2, 1, -1331.0, 0.0, 8.0, 663.0, 0.0, 4.0), new NutationModel(-2, 0, 2, 2, 2, 1383.0, 0.0, -2.0, -594.0, 0.0, -2.0), new NutationModel(-1, 0, 0, 0, 2, 1405.0, 0.0, 4.0, -610.0, 0.0, 2.0), new NutationModel( 1, 1, 2,-2, 2, 1290.0, 0.0, 0.0, -556.0, 0.0, 0.0), new NutationModel(-2, 0, 2, 4, 2, -1214.0, 0.0, 5.0, 518.0, 0.0, 2.0), new NutationModel(-1, 0, 4, 0, 2, 1146.0, 0.0, -3.0, -490.0, 0.0, -1.0), new NutationModel( 2, 0, 2,-2, 1, 1019.0, 0.0, -1.0, -527.0, 0.0, -1.0), /* 81-90 */ new NutationModel( 2, 0, 2, 2, 2, -1100.0, 0.0, 9.0, 465.0, 0.0, 4.0), new NutationModel( 1, 0, 0, 2, 1, -970.0, 0.0, 2.0, 496.0, 0.0, 1.0), new NutationModel( 3, 0, 0, 0, 0, 1575.0, 0.0, -6.0, -50.0, 0.0, 0.0), new NutationModel( 3, 0, 2,-2, 2, 934.0, 0.0, -3.0, -399.0, 0.0, -1.0), new NutationModel( 0, 0, 4,-2, 2, 922.0, 0.0, -1.0, -395.0, 0.0, -1.0), new NutationModel( 0, 1, 2, 0, 1, 815.0, 0.0, -1.0, -422.0, 0.0, -1.0), new NutationModel( 0, 0,-2, 2, 1, 834.0, 0.0, 2.0, -440.0, 0.0, 1.0), new NutationModel( 0, 0, 2,-2, 3, 1248.0, 0.0, 0.0, -170.0, 0.0, 1.0), new NutationModel(-1, 0, 0, 4, 0, 1338.0, 0.0, -5.0, -39.0, 0.0, 0.0), new NutationModel( 2, 0,-2, 0, 1, 716.0, 0.0, -2.0, -389.0, 0.0, -1.0), /* 91-100 */ new NutationModel(-2, 0, 0, 4, 0, 1282.0, 0.0, -3.0, -23.0, 0.0, 1.0), new NutationModel(-1,-1, 0, 2, 1, 742.0, 0.0, 1.0, -391.0, 0.0, 0.0), new NutationModel(-1, 0, 0, 1, 1, 1020.0, 0.0, -25.0, -495.0, 0.0, -10.0), new NutationModel( 0, 1, 0, 0, 2, 715.0, 0.0, -4.0, -326.0, 0.0, 2.0), new NutationModel( 0, 0,-2, 0, 1, -666.0, 0.0, -3.0, 369.0, 0.0, -1.0), new NutationModel( 0,-1, 2, 0, 1, -667.0, 0.0, 1.0, 346.0, 0.0, 1.0), new NutationModel( 0, 0, 2,-1, 2, -704.0, 0.0, 0.0, 304.0, 0.0, 0.0), new NutationModel( 0, 0, 2, 4, 2, -694.0, 0.0, 5.0, 294.0, 0.0, 2.0), new NutationModel(-2,-1, 0, 2, 0, -1014.0, 0.0, -1.0, 4.0, 0.0, -1.0), new NutationModel( 1, 1, 0,-2, 1, -585.0, 0.0, -2.0, 316.0, 0.0, -1.0), /* 101-110 */ new NutationModel(-1, 1, 0, 2, 0, -949.0, 0.0, 1.0, 8.0, 0.0, -1.0), new NutationModel(-1, 1, 0, 1, 2, -595.0, 0.0, 0.0, 258.0, 0.0, 0.0), new NutationModel( 1,-1, 0, 0, 1, 528.0, 0.0, 0.0, -279.0, 0.0, 0.0), new NutationModel( 1,-1, 2, 2, 2, -590.0, 0.0, 4.0, 252.0, 0.0, 2.0), new NutationModel(-1, 1, 2, 2, 2, 570.0, 0.0, -2.0, -244.0, 0.0, -1.0), new NutationModel( 3, 0, 2, 0, 1, -502.0, 0.0, 3.0, 250.0, 0.0, 2.0), new NutationModel( 0, 1,-2, 2, 0, -875.0, 0.0, 1.0, 29.0, 0.0, 0.0), new NutationModel(-1, 0, 0,-2, 1, -492.0, 0.0, -3.0, 275.0, 0.0, -1.0), new NutationModel( 0, 1, 2, 2, 2, 535.0, 0.0, -2.0, -228.0, 0.0, -1.0), new NutationModel(-1,-1, 2, 2, 1, -467.0, 0.0, 1.0, 240.0, 0.0, 1.0), /* 111-120 */ new NutationModel( 0,-1, 0, 0, 2, 591.0, 0.0, 0.0, -253.0, 0.0, 0.0), new NutationModel( 1, 0, 2,-4, 1, -453.0, 0.0, -1.0, 244.0, 0.0, -1.0), new NutationModel(-1, 0,-2, 2, 0, 766.0, 0.0, 1.0, 9.0, 0.0, 0.0), new NutationModel( 0,-1, 2, 2, 1, -446.0, 0.0, 2.0, 225.0, 0.0, 1.0), new NutationModel( 2,-1, 2, 0, 2, -488.0, 0.0, 2.0, 207.0, 0.0, 1.0), new NutationModel( 0, 0, 0, 2, 2, -468.0, 0.0, 0.0, 201.0, 0.0, 0.0), new NutationModel( 1,-1, 2, 0, 1, -421.0, 0.0, 1.0, 216.0, 0.0, 1.0), new NutationModel(-1, 1, 2, 0, 2, 463.0, 0.0, 0.0, -200.0, 0.0, 0.0), new NutationModel( 0, 1, 0, 2, 0, -673.0, 0.0, 2.0, 14.0, 0.0, 0.0), new NutationModel( 0,-1,-2, 2, 0, 658.0, 0.0, 0.0, -2.0, 0.0, 0.0), /* 121-130 */ new NutationModel( 0, 3, 2,-2, 2, -438.0, 0.0, 0.0, 188.0, 0.0, 0.0), new NutationModel( 0, 0, 0, 1, 1, -390.0, 0.0, 0.0, 205.0, 0.0, 0.0), new NutationModel(-1, 0, 2, 2, 0, 639.0, -11.0, -2.0, -19.0, 0.0, 0.0), new NutationModel( 2, 1, 2, 0, 2, 412.0, 0.0, -2.0, -176.0, 0.0, -1.0), new NutationModel( 1, 1, 0, 0, 1, -361.0, 0.0, 0.0, 189.0, 0.0, 0.0), new NutationModel( 1, 1, 2, 0, 1, 360.0, 0.0, -1.0, -185.0, 0.0, -1.0), new NutationModel( 2, 0, 0, 2, 0, 588.0, 0.0, -3.0, -24.0, 0.0, 0.0), new NutationModel( 1, 0,-2, 2, 0, -578.0, 0.0, 1.0, 5.0, 0.0, 0.0), new NutationModel(-1, 0, 0, 2, 2, -396.0, 0.0, 0.0, 171.0, 0.0, 0.0), new NutationModel( 0, 1, 0, 1, 0, 565.0, 0.0, -1.0, -6.0, 0.0, 0.0), /* 131-140 */ new NutationModel( 0, 1, 0,-2, 1, -335.0, 0.0, -1.0, 184.0, 0.0, -1.0), new NutationModel(-1, 0, 2,-2, 2, 357.0, 0.0, 1.0, -154.0, 0.0, 0.0), new NutationModel( 0, 0, 0,-1, 1, 321.0, 0.0, 1.0, -174.0, 0.0, 0.0), new NutationModel(-1, 1, 0, 0, 1, -301.0, 0.0, -1.0, 162.0, 0.0, 0.0), new NutationModel( 1, 0, 2,-1, 2, -334.0, 0.0, 0.0, 144.0, 0.0, 0.0), new NutationModel( 1,-1, 0, 2, 0, 493.0, 0.0, -2.0, -15.0, 0.0, 0.0), new NutationModel( 0, 0, 0, 4, 0, 494.0, 0.0, -2.0, -19.0, 0.0, 0.0), new NutationModel( 1, 0, 2, 1, 2, 337.0, 0.0, -1.0, -143.0, 0.0, -1.0), new NutationModel( 0, 0, 2, 1, 1, 280.0, 0.0, -1.0, -144.0, 0.0, 0.0), new NutationModel( 1, 0, 0,-2, 2, 309.0, 0.0, 1.0, -134.0, 0.0, 0.0), /* 141-150 */ new NutationModel(-1, 0, 2, 4, 1, -263.0, 0.0, 2.0, 131.0, 0.0, 1.0), new NutationModel( 1, 0,-2, 0, 1, 253.0, 0.0, 1.0, -138.0, 0.0, 0.0), new NutationModel( 1, 1, 2,-2, 1, 245.0, 0.0, 0.0, -128.0, 0.0, 0.0), new NutationModel( 0, 0, 2, 2, 0, 416.0, 0.0, -2.0, -17.0, 0.0, 0.0), new NutationModel(-1, 0, 2,-1, 1, -229.0, 0.0, 0.0, 128.0, 0.0, 0.0), new NutationModel(-2, 0, 2, 2, 1, 231.0, 0.0, 0.0, -120.0, 0.0, 0.0), new NutationModel( 4, 0, 2, 0, 2, -259.0, 0.0, 2.0, 109.0, 0.0, 1.0), new NutationModel( 2,-1, 0, 0, 0, 375.0, 0.0, -1.0, -8.0, 0.0, 0.0), new NutationModel( 2, 1, 2,-2, 2, 252.0, 0.0, 0.0, -108.0, 0.0, 0.0), new NutationModel( 0, 1, 2, 1, 2, -245.0, 0.0, 1.0, 104.0, 0.0, 0.0), /* 151-160 */ new NutationModel( 1, 0, 4,-2, 2, 243.0, 0.0, -1.0, -104.0, 0.0, 0.0), new NutationModel(-1,-1, 0, 0, 1, 208.0, 0.0, 1.0, -112.0, 0.0, 0.0), new NutationModel( 0, 1, 0, 2, 1, 199.0, 0.0, 0.0, -102.0, 0.0, 0.0), new NutationModel(-2, 0, 2, 4, 1, -208.0, 0.0, 1.0, 105.0, 0.0, 0.0), new NutationModel( 2, 0, 2, 0, 0, 335.0, 0.0, -2.0, -14.0, 0.0, 0.0), new NutationModel( 1, 0, 0, 1, 0, -325.0, 0.0, 1.0, 7.0, 0.0, 0.0), new NutationModel(-1, 0, 0, 4, 1, -187.0, 0.0, 0.0, 96.0, 0.0, 0.0), new NutationModel(-1, 0, 4, 0, 1, 197.0, 0.0, -1.0, -100.0, 0.0, 0.0), new NutationModel( 2, 0, 2, 2, 1, -192.0, 0.0, 2.0, 94.0, 0.0, 1.0), new NutationModel( 0, 0, 2,-3, 2, -188.0, 0.0, 0.0, 83.0, 0.0, 0.0), /* 161-170 */ new NutationModel(-1,-2, 0, 2, 0, 276.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 2, 1, 0, 0, 0, -286.0, 0.0, 1.0, 6.0, 0.0, 0.0), new NutationModel( 0, 0, 4, 0, 2, 186.0, 0.0, -1.0, -79.0, 0.0, 0.0), new NutationModel( 0, 0, 0, 0, 3, -219.0, 0.0, 0.0, 43.0, 0.0, 0.0), new NutationModel( 0, 3, 0, 0, 0, 276.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 0, 0, 2,-4, 1, -153.0, 0.0, -1.0, 84.0, 0.0, 0.0), new NutationModel( 0,-1, 0, 2, 1, -156.0, 0.0, 0.0, 81.0, 0.0, 0.0), new NutationModel( 0, 0, 0, 4, 1, -154.0, 0.0, 1.0, 78.0, 0.0, 0.0), new NutationModel(-1,-1, 2, 4, 2, -174.0, 0.0, 1.0, 75.0, 0.0, 0.0), new NutationModel( 1, 0, 2, 4, 2, -163.0, 0.0, 2.0, 69.0, 0.0, 1.0), /* 171-180 */ new NutationModel(-2, 2, 0, 2, 0, -228.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel(-2,-1, 2, 0, 1, 91.0, 0.0, -4.0, -54.0, 0.0, -2.0), new NutationModel(-2, 0, 0, 2, 2, 175.0, 0.0, 0.0, -75.0, 0.0, 0.0), new NutationModel(-1,-1, 2, 0, 2, -159.0, 0.0, 0.0, 69.0, 0.0, 0.0), new NutationModel( 0, 0, 4,-2, 1, 141.0, 0.0, 0.0, -72.0, 0.0, 0.0), new NutationModel( 3, 0, 2,-2, 1, 147.0, 0.0, 0.0, -75.0, 0.0, 0.0), new NutationModel(-2,-1, 0, 2, 1, -132.0, 0.0, 0.0, 69.0, 0.0, 0.0), new NutationModel( 1, 0, 0,-1, 1, 159.0, 0.0, -28.0, -54.0, 0.0, 11.0), new NutationModel( 0,-2, 0, 2, 0, 213.0, 0.0, 0.0, -4.0, 0.0, 0.0), new NutationModel(-2, 0, 0, 4, 1, 123.0, 0.0, 0.0, -64.0, 0.0, 0.0), /* 181-190 */ new NutationModel(-3, 0, 0, 0, 1, -118.0, 0.0, -1.0, 66.0, 0.0, 0.0), new NutationModel( 1, 1, 2, 2, 2, 144.0, 0.0, -1.0, -61.0, 0.0, 0.0), new NutationModel( 0, 0, 2, 4, 1, -121.0, 0.0, 1.0, 60.0, 0.0, 0.0), new NutationModel( 3, 0, 2, 2, 2, -134.0, 0.0, 1.0, 56.0, 0.0, 1.0), new NutationModel(-1, 1, 2,-2, 1, -105.0, 0.0, 0.0, 57.0, 0.0, 0.0), new NutationModel( 2, 0, 0,-4, 1, -102.0, 0.0, 0.0, 56.0, 0.0, 0.0), new NutationModel( 0, 0, 0,-2, 2, 120.0, 0.0, 0.0, -52.0, 0.0, 0.0), new NutationModel( 2, 0, 2,-4, 1, 101.0, 0.0, 0.0, -54.0, 0.0, 0.0), new NutationModel(-1, 1, 0, 2, 1, -113.0, 0.0, 0.0, 59.0, 0.0, 0.0), new NutationModel( 0, 0, 2,-1, 1, -106.0, 0.0, 0.0, 61.0, 0.0, 0.0), /* 191-200 */ new NutationModel( 0,-2, 2, 2, 2, -129.0, 0.0, 1.0, 55.0, 0.0, 0.0), new NutationModel( 2, 0, 0, 2, 1, -114.0, 0.0, 0.0, 57.0, 0.0, 0.0), new NutationModel( 4, 0, 2,-2, 2, 113.0, 0.0, -1.0, -49.0, 0.0, 0.0), new NutationModel( 2, 0, 0,-2, 2, -102.0, 0.0, 0.0, 44.0, 0.0, 0.0), new NutationModel( 0, 2, 0, 0, 1, -94.0, 0.0, 0.0, 51.0, 0.0, 0.0), new NutationModel( 1, 0, 0,-4, 1, -100.0, 0.0, -1.0, 56.0, 0.0, 0.0), new NutationModel( 0, 2, 2,-2, 1, 87.0, 0.0, 0.0, -47.0, 0.0, 0.0), new NutationModel(-3, 0, 0, 4, 0, 161.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel(-1, 1, 2, 0, 1, 96.0, 0.0, 0.0, -50.0, 0.0, 0.0), new NutationModel(-1,-1, 0, 4, 0, 151.0, 0.0, -1.0, -5.0, 0.0, 0.0), /* 201-210 */ new NutationModel(-1,-2, 2, 2, 2, -104.0, 0.0, 0.0, 44.0, 0.0, 0.0), new NutationModel(-2,-1, 2, 4, 2, -110.0, 0.0, 0.0, 48.0, 0.0, 0.0), new NutationModel( 1,-1, 2, 2, 1, -100.0, 0.0, 1.0, 50.0, 0.0, 0.0), new NutationModel(-2, 1, 0, 2, 0, 92.0, 0.0, -5.0, 12.0, 0.0, -2.0), new NutationModel(-2, 1, 2, 0, 1, 82.0, 0.0, 0.0, -45.0, 0.0, 0.0), new NutationModel( 2, 1, 0,-2, 1, 82.0, 0.0, 0.0, -45.0, 0.0, 0.0), new NutationModel(-3, 0, 2, 0, 1, -78.0, 0.0, 0.0, 41.0, 0.0, 0.0), new NutationModel(-2, 0, 2,-2, 1, -77.0, 0.0, 0.0, 43.0, 0.0, 0.0), new NutationModel(-1, 1, 0, 2, 2, 2.0, 0.0, 0.0, 54.0, 0.0, 0.0), new NutationModel( 0,-1, 2,-1, 2, 94.0, 0.0, 0.0, -40.0, 0.0, 0.0), /* 211-220 */ new NutationModel(-1, 0, 4,-2, 2, -93.0, 0.0, 0.0, 40.0, 0.0, 0.0), new NutationModel( 0,-2, 2, 0, 2, -83.0, 0.0, 10.0, 40.0, 0.0, -2.0), new NutationModel(-1, 0, 2, 1, 2, 83.0, 0.0, 0.0, -36.0, 0.0, 0.0), new NutationModel( 2, 0, 0, 0, 2, -91.0, 0.0, 0.0, 39.0, 0.0, 0.0), new NutationModel( 0, 0, 2, 0, 3, 128.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel(-2, 0, 4, 0, 2, -79.0, 0.0, 0.0, 34.0, 0.0, 0.0), new NutationModel(-1, 0,-2, 0, 1, -83.0, 0.0, 0.0, 47.0, 0.0, 0.0), new NutationModel(-1, 1, 2, 2, 1, 84.0, 0.0, 0.0, -44.0, 0.0, 0.0), new NutationModel( 3, 0, 0, 0, 1, 83.0, 0.0, 0.0, -43.0, 0.0, 0.0), new NutationModel(-1, 0, 2, 3, 2, 91.0, 0.0, 0.0, -39.0, 0.0, 0.0), /* 221-230 */ new NutationModel( 2,-1, 2, 0, 1, -77.0, 0.0, 0.0, 39.0, 0.0, 0.0), new NutationModel( 0, 1, 2, 2, 1, 84.0, 0.0, 0.0, -43.0, 0.0, 0.0), new NutationModel( 0,-1, 2, 4, 2, -92.0, 0.0, 1.0, 39.0, 0.0, 0.0), new NutationModel( 2,-1, 2, 2, 2, -92.0, 0.0, 1.0, 39.0, 0.0, 0.0), new NutationModel( 0, 2,-2, 2, 0, -94.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1,-1, 2,-1, 1, 68.0, 0.0, 0.0, -36.0, 0.0, 0.0), new NutationModel( 0,-2, 0, 0, 1, -61.0, 0.0, 0.0, 32.0, 0.0, 0.0), new NutationModel( 1, 0, 2,-4, 2, 71.0, 0.0, 0.0, -31.0, 0.0, 0.0), new NutationModel( 1,-1, 0,-2, 1, 62.0, 0.0, 0.0, -34.0, 0.0, 0.0), new NutationModel(-1,-1, 2, 0, 1, -63.0, 0.0, 0.0, 33.0, 0.0, 0.0), /* 231-240 */ new NutationModel( 1,-1, 2,-2, 2, -73.0, 0.0, 0.0, 32.0, 0.0, 0.0), new NutationModel(-2,-1, 0, 4, 0, 115.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel(-1, 0, 0, 3, 0, -103.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-2,-1, 2, 2, 2, 63.0, 0.0, 0.0, -28.0, 0.0, 0.0), new NutationModel( 0, 2, 2, 0, 2, 74.0, 0.0, 0.0, -32.0, 0.0, 0.0), new NutationModel( 1, 1, 0, 2, 0, -103.0, 0.0, -3.0, 3.0, 0.0, -1.0), new NutationModel( 2, 0, 2,-1, 2, -69.0, 0.0, 0.0, 30.0, 0.0, 0.0), new NutationModel( 1, 0, 2, 1, 1, 57.0, 0.0, 0.0, -29.0, 0.0, 0.0), new NutationModel( 4, 0, 0, 0, 0, 94.0, 0.0, 0.0, -4.0, 0.0, 0.0), new NutationModel( 2, 1, 2, 0, 1, 64.0, 0.0, 0.0, -33.0, 0.0, 0.0), /* 241-250 */ new NutationModel( 3,-1, 2, 0, 2, -63.0, 0.0, 0.0, 26.0, 0.0, 0.0), new NutationModel(-2, 2, 0, 2, 1, -38.0, 0.0, 0.0, 20.0, 0.0, 0.0), new NutationModel( 1, 0, 2,-3, 1, -43.0, 0.0, 0.0, 24.0, 0.0, 0.0), new NutationModel( 1, 1, 2,-4, 1, -45.0, 0.0, 0.0, 23.0, 0.0, 0.0), new NutationModel(-1,-1, 2,-2, 1, 47.0, 0.0, 0.0, -24.0, 0.0, 0.0), new NutationModel( 0,-1, 0,-1, 1, -48.0, 0.0, 0.0, 25.0, 0.0, 0.0), new NutationModel( 0,-1, 0,-2, 1, 45.0, 0.0, 0.0, -26.0, 0.0, 0.0), new NutationModel(-2, 0, 0, 0, 2, 56.0, 0.0, 0.0, -25.0, 0.0, 0.0), new NutationModel(-2, 0,-2, 2, 0, 88.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-1, 0,-2, 4, 0, -75.0, 0.0, 0.0, 0.0, 0.0, 0.0), /* 251-260 */ new NutationModel( 1,-2, 0, 0, 0, 85.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0, 1, 0, 1, 1, 49.0, 0.0, 0.0, -26.0, 0.0, 0.0), new NutationModel(-1, 2, 0, 2, 0, -74.0, 0.0, -3.0, -1.0, 0.0, -1.0), new NutationModel( 1,-1, 2,-2, 1, -39.0, 0.0, 0.0, 21.0, 0.0, 0.0), new NutationModel( 1, 2, 2,-2, 2, 45.0, 0.0, 0.0, -20.0, 0.0, 0.0), new NutationModel( 2,-1, 2,-2, 2, 51.0, 0.0, 0.0, -22.0, 0.0, 0.0), new NutationModel( 1, 0, 2,-1, 1, -40.0, 0.0, 0.0, 21.0, 0.0, 0.0), new NutationModel( 2, 1, 2,-2, 1, 41.0, 0.0, 0.0, -21.0, 0.0, 0.0), new NutationModel(-2, 0, 0,-2, 1, -42.0, 0.0, 0.0, 24.0, 0.0, 0.0), new NutationModel( 1,-2, 2, 0, 2, -51.0, 0.0, 0.0, 22.0, 0.0, 0.0), /* 261-270 */ new NutationModel( 0, 1, 2, 1, 1, -42.0, 0.0, 0.0, 22.0, 0.0, 0.0), new NutationModel( 1, 0, 4,-2, 1, 39.0, 0.0, 0.0, -21.0, 0.0, 0.0), new NutationModel(-2, 0, 4, 2, 2, 46.0, 0.0, 0.0, -18.0, 0.0, 0.0), new NutationModel( 1, 1, 2, 1, 2, -53.0, 0.0, 0.0, 22.0, 0.0, 0.0), new NutationModel( 1, 0, 0, 4, 0, 82.0, 0.0, 0.0, -4.0, 0.0, 0.0), new NutationModel( 1, 0, 2, 2, 0, 81.0, 0.0, -1.0, -4.0, 0.0, 0.0), new NutationModel( 2, 0, 2, 1, 2, 47.0, 0.0, 0.0, -19.0, 0.0, 0.0), new NutationModel( 3, 1, 2, 0, 2, 53.0, 0.0, 0.0, -23.0, 0.0, 0.0), new NutationModel( 4, 0, 2, 0, 1, -45.0, 0.0, 0.0, 22.0, 0.0, 0.0), new NutationModel(-2,-1, 2, 0, 0, -44.0, 0.0, 0.0, -2.0, 0.0, 0.0), /* 271-280 */ new NutationModel( 0, 1,-2, 2, 1, -33.0, 0.0, 0.0, 16.0, 0.0, 0.0), new NutationModel( 1, 0,-2, 1, 0, -61.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel( 0,-1,-2, 2, 1, 28.0, 0.0, 0.0, -15.0, 0.0, 0.0), new NutationModel( 2,-1, 0,-2, 1, -38.0, 0.0, 0.0, 19.0, 0.0, 0.0), new NutationModel(-1, 0, 2,-1, 2, -33.0, 0.0, 0.0, 21.0, 0.0, 0.0), new NutationModel( 1, 0, 2,-3, 2, -60.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0, 1, 2,-2, 3, 48.0, 0.0, 0.0, -10.0, 0.0, 0.0), new NutationModel( 0, 0, 2,-3, 1, 27.0, 0.0, 0.0, -14.0, 0.0, 0.0), new NutationModel(-1, 0,-2, 2, 1, 38.0, 0.0, 0.0, -20.0, 0.0, 0.0), new NutationModel( 0, 0, 2,-4, 2, 31.0, 0.0, 0.0, -13.0, 0.0, 0.0), /* 281-290 */ new NutationModel(-2, 1, 0, 0, 1, -29.0, 0.0, 0.0, 15.0, 0.0, 0.0), new NutationModel(-1, 0, 0,-1, 1, 28.0, 0.0, 0.0, -15.0, 0.0, 0.0), new NutationModel( 2, 0, 2,-4, 2, -32.0, 0.0, 0.0, 15.0, 0.0, 0.0), new NutationModel( 0, 0, 4,-4, 4, 45.0, 0.0, 0.0, -8.0, 0.0, 0.0), new NutationModel( 0, 0, 4,-4, 2, -44.0, 0.0, 0.0, 19.0, 0.0, 0.0), new NutationModel(-1,-2, 0, 2, 1, 28.0, 0.0, 0.0, -15.0, 0.0, 0.0), new NutationModel(-2, 0, 0, 3, 0, -51.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1, 0,-2, 2, 1, -36.0, 0.0, 0.0, 20.0, 0.0, 0.0), new NutationModel(-3, 0, 2, 2, 2, 44.0, 0.0, 0.0, -19.0, 0.0, 0.0), new NutationModel(-3, 0, 2, 2, 1, 26.0, 0.0, 0.0, -14.0, 0.0, 0.0), /* 291-300 */ new NutationModel(-2, 0, 2, 2, 0, -60.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 2,-1, 0, 0, 1, 35.0, 0.0, 0.0, -18.0, 0.0, 0.0), new NutationModel(-2, 1, 2, 2, 2, -27.0, 0.0, 0.0, 11.0, 0.0, 0.0), new NutationModel( 1, 1, 0, 1, 0, 47.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel( 0, 1, 4,-2, 2, 36.0, 0.0, 0.0, -15.0, 0.0, 0.0), new NutationModel(-1, 1, 0,-2, 1, -36.0, 0.0, 0.0, 20.0, 0.0, 0.0), new NutationModel( 0, 0, 0,-4, 1, -35.0, 0.0, 0.0, 19.0, 0.0, 0.0), new NutationModel( 1,-1, 0, 2, 1, -37.0, 0.0, 0.0, 19.0, 0.0, 0.0), new NutationModel( 1, 1, 0, 2, 1, 32.0, 0.0, 0.0, -16.0, 0.0, 0.0), new NutationModel(-1, 2, 2, 2, 2, 35.0, 0.0, 0.0, -14.0, 0.0, 0.0), /* 301-310 */ new NutationModel( 3, 1, 2,-2, 2, 32.0, 0.0, 0.0, -13.0, 0.0, 0.0), new NutationModel( 0,-1, 0, 4, 0, 65.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 2,-1, 0, 2, 0, 47.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel( 0, 0, 4, 0, 1, 32.0, 0.0, 0.0, -16.0, 0.0, 0.0), new NutationModel( 2, 0, 4,-2, 2, 37.0, 0.0, 0.0, -16.0, 0.0, 0.0), new NutationModel(-1,-1, 2, 4, 1, -30.0, 0.0, 0.0, 15.0, 0.0, 0.0), new NutationModel( 1, 0, 0, 4, 1, -32.0, 0.0, 0.0, 16.0, 0.0, 0.0), new NutationModel( 1,-2, 2, 2, 2, -31.0, 0.0, 0.0, 13.0, 0.0, 0.0), new NutationModel( 0, 0, 2, 3, 2, 37.0, 0.0, 0.0, -16.0, 0.0, 0.0), new NutationModel(-1, 1, 2, 4, 2, 31.0, 0.0, 0.0, -13.0, 0.0, 0.0), /* 311-320 */ new NutationModel( 3, 0, 0, 2, 0, 49.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel(-1, 0, 4, 2, 2, 32.0, 0.0, 0.0, -13.0, 0.0, 0.0), new NutationModel( 1, 1, 2, 2, 1, 23.0, 0.0, 0.0, -12.0, 0.0, 0.0), new NutationModel(-2, 0, 2, 6, 2, -43.0, 0.0, 0.0, 18.0, 0.0, 0.0), new NutationModel( 2, 1, 2, 2, 2, 26.0, 0.0, 0.0, -11.0, 0.0, 0.0), new NutationModel(-1, 0, 2, 6, 2, -32.0, 0.0, 0.0, 14.0, 0.0, 0.0), new NutationModel( 1, 0, 2, 4, 1, -29.0, 0.0, 0.0, 14.0, 0.0, 0.0), new NutationModel( 2, 0, 2, 4, 2, -27.0, 0.0, 0.0, 12.0, 0.0, 0.0), new NutationModel( 1, 1,-2, 1, 0, 30.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-3, 1, 2, 1, 2, -11.0, 0.0, 0.0, 5.0, 0.0, 0.0), /* 321-330 */ new NutationModel( 2, 0,-2, 0, 2, -21.0, 0.0, 0.0, 10.0, 0.0, 0.0), new NutationModel(-1, 0, 0, 1, 2, -34.0, 0.0, 0.0, 15.0, 0.0, 0.0), new NutationModel(-4, 0, 2, 2, 1, -10.0, 0.0, 0.0, 6.0, 0.0, 0.0), new NutationModel(-1,-1, 0, 1, 0, -36.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0, 0,-2, 2, 2, -9.0, 0.0, 0.0, 4.0, 0.0, 0.0), new NutationModel( 1, 0, 0,-1, 2, -12.0, 0.0, 0.0, 5.0, 0.0, 0.0), new NutationModel( 0,-1, 2,-2, 3, -21.0, 0.0, 0.0, 5.0, 0.0, 0.0), new NutationModel(-2, 1, 2, 0, 0, -29.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel( 0, 0, 2,-2, 4, -15.0, 0.0, 0.0, 3.0, 0.0, 0.0), new NutationModel(-2,-2, 0, 2, 0, -20.0, 0.0, 0.0, 0.0, 0.0, 0.0), /* 331-340 */ new NutationModel(-2, 0,-2, 4, 0, 28.0, 0.0, 0.0, 0.0, 0.0, -2.0), new NutationModel( 0,-2,-2, 2, 0, 17.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1, 2, 0,-2, 1, -22.0, 0.0, 0.0, 12.0, 0.0, 0.0), new NutationModel( 3, 0, 0,-4, 1, -14.0, 0.0, 0.0, 7.0, 0.0, 0.0), new NutationModel(-1, 1, 2,-2, 2, 24.0, 0.0, 0.0, -11.0, 0.0, 0.0), new NutationModel( 1,-1, 2,-4, 1, 11.0, 0.0, 0.0, -6.0, 0.0, 0.0), new NutationModel( 1, 1, 0,-2, 2, 14.0, 0.0, 0.0, -6.0, 0.0, 0.0), new NutationModel(-3, 0, 2, 0, 0, 24.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-3, 0, 2, 0, 2, 18.0, 0.0, 0.0, -8.0, 0.0, 0.0), new NutationModel(-2, 0, 0, 1, 0, -38.0, 0.0, 0.0, 0.0, 0.0, 0.0), /* 341-350 */ new NutationModel( 0, 0,-2, 1, 0, -31.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-3, 0, 0, 2, 1, -16.0, 0.0, 0.0, 8.0, 0.0, 0.0), new NutationModel(-1,-1,-2, 2, 0, 29.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0, 1, 2,-4, 1, -18.0, 0.0, 0.0, 10.0, 0.0, 0.0), new NutationModel( 2, 1, 0,-4, 1, -10.0, 0.0, 0.0, 5.0, 0.0, 0.0), new NutationModel( 0, 2, 0,-2, 1, -17.0, 0.0, 0.0, 10.0, 0.0, 0.0), new NutationModel( 1, 0, 0,-3, 1, 9.0, 0.0, 0.0, -4.0, 0.0, 0.0), new NutationModel(-2, 0, 2,-2, 2, 16.0, 0.0, 0.0, -6.0, 0.0, 0.0), new NutationModel(-2,-1, 0, 0, 1, 22.0, 0.0, 0.0, -12.0, 0.0, 0.0), new NutationModel(-4, 0, 0, 2, 0, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0), /* 351-360 */ new NutationModel( 1, 1, 0,-4, 1, -13.0, 0.0, 0.0, 6.0, 0.0, 0.0), new NutationModel(-1, 0, 2,-4, 1, -17.0, 0.0, 0.0, 9.0, 0.0, 0.0), new NutationModel( 0, 0, 4,-4, 1, -14.0, 0.0, 0.0, 8.0, 0.0, 0.0), new NutationModel( 0, 3, 2,-2, 2, 0.0, 0.0, 0.0, -7.0, 0.0, 0.0), new NutationModel(-3,-1, 0, 4, 0, 14.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-3, 0, 0, 4, 1, 19.0, 0.0, 0.0, -10.0, 0.0, 0.0), new NutationModel( 1,-1,-2, 2, 0, -34.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1,-1, 0, 2, 2, -20.0, 0.0, 0.0, 8.0, 0.0, 0.0), new NutationModel( 1,-2, 0, 0, 1, 9.0, 0.0, 0.0, -5.0, 0.0, 0.0), new NutationModel( 1,-1, 0, 0, 2, -18.0, 0.0, 0.0, 7.0, 0.0, 0.0), /* 361-370 */ new NutationModel( 0, 0, 0, 1, 2, 13.0, 0.0, 0.0, -6.0, 0.0, 0.0), new NutationModel(-1,-1, 2, 0, 0, 17.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1,-2, 2,-2, 2, -12.0, 0.0, 0.0, 5.0, 0.0, 0.0), new NutationModel( 0,-1, 2,-1, 1, 15.0, 0.0, 0.0, -8.0, 0.0, 0.0), new NutationModel(-1, 0, 2, 0, 3, -11.0, 0.0, 0.0, 3.0, 0.0, 0.0), new NutationModel( 1, 1, 0, 0, 2, 13.0, 0.0, 0.0, -5.0, 0.0, 0.0), new NutationModel(-1, 1, 2, 0, 0, -18.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1, 2, 0, 0, 0, -35.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1, 2, 2, 0, 2, 9.0, 0.0, 0.0, -4.0, 0.0, 0.0), new NutationModel(-1, 0, 4,-2, 1, -19.0, 0.0, 0.0, 10.0, 0.0, 0.0), /* 371-380 */ new NutationModel( 3, 0, 2,-4, 2, -26.0, 0.0, 0.0, 11.0, 0.0, 0.0), new NutationModel( 1, 2, 2,-2, 1, 8.0, 0.0, 0.0, -4.0, 0.0, 0.0), new NutationModel( 1, 0, 4,-4, 2, -10.0, 0.0, 0.0, 4.0, 0.0, 0.0), new NutationModel(-2,-1, 0, 4, 1, 10.0, 0.0, 0.0, -6.0, 0.0, 0.0), new NutationModel( 0,-1, 0, 2, 2, -21.0, 0.0, 0.0, 9.0, 0.0, 0.0), new NutationModel(-2, 1, 0, 4, 0, -15.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-2,-1, 2, 2, 1, 9.0, 0.0, 0.0, -5.0, 0.0, 0.0), new NutationModel( 2, 0,-2, 2, 0, -29.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1, 0, 0, 1, 1, -19.0, 0.0, 0.0, 10.0, 0.0, 0.0), new NutationModel( 0, 1, 0, 2, 2, 12.0, 0.0, 0.0, -5.0, 0.0, 0.0), /* 381-390 */ new NutationModel( 1,-1, 2,-1, 2, 22.0, 0.0, 0.0, -9.0, 0.0, 0.0), new NutationModel(-2, 0, 4, 0, 1, -10.0, 0.0, 0.0, 5.0, 0.0, 0.0), new NutationModel( 2, 1, 0, 0, 1, -20.0, 0.0, 0.0, 11.0, 0.0, 0.0), new NutationModel( 0, 1, 2, 0, 0, -20.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0,-1, 4,-2, 2, -17.0, 0.0, 0.0, 7.0, 0.0, 0.0), new NutationModel( 0, 0, 4,-2, 4, 15.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel( 0, 2, 2, 0, 1, 8.0, 0.0, 0.0, -4.0, 0.0, 0.0), new NutationModel(-3, 0, 0, 6, 0, 14.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1,-1, 0, 4, 1, -12.0, 0.0, 0.0, 6.0, 0.0, 0.0), new NutationModel( 1,-2, 0, 2, 0, 25.0, 0.0, 0.0, 0.0, 0.0, 0.0), /* 391-400 */ new NutationModel(-1, 0, 0, 4, 2, -13.0, 0.0, 0.0, 6.0, 0.0, 0.0), new NutationModel(-1,-2, 2, 2, 1, -14.0, 0.0, 0.0, 8.0, 0.0, 0.0), new NutationModel(-1, 0, 0,-2, 2, 13.0, 0.0, 0.0, -5.0, 0.0, 0.0), new NutationModel( 1, 0,-2,-2, 1, -17.0, 0.0, 0.0, 9.0, 0.0, 0.0), new NutationModel( 0, 0,-2,-2, 1, -12.0, 0.0, 0.0, 6.0, 0.0, 0.0), new NutationModel(-2, 0,-2, 0, 1, -10.0, 0.0, 0.0, 5.0, 0.0, 0.0), new NutationModel( 0, 0, 0, 3, 1, 10.0, 0.0, 0.0, -6.0, 0.0, 0.0), new NutationModel( 0, 0, 0, 3, 0, -15.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1, 1, 0, 4, 0, -22.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1,-1, 2, 2, 0, 28.0, 0.0, 0.0, -1.0, 0.0, 0.0), /* 401-410 */ new NutationModel(-2, 0, 2, 3, 2, 15.0, 0.0, 0.0, -7.0, 0.0, 0.0), new NutationModel( 1, 0, 0, 2, 2, 23.0, 0.0, 0.0, -10.0, 0.0, 0.0), new NutationModel( 0,-1, 2, 1, 2, 12.0, 0.0, 0.0, -5.0, 0.0, 0.0), new NutationModel( 3,-1, 0, 0, 0, 29.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel( 2, 0, 0, 1, 0, -25.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel( 1,-1, 2, 0, 0, 22.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0, 0, 2, 1, 0, -18.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1, 0, 2, 0, 3, 15.0, 0.0, 0.0, 3.0, 0.0, 0.0), new NutationModel( 3, 1, 0, 0, 0, -23.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 3,-1, 2,-2, 2, 12.0, 0.0, 0.0, -5.0, 0.0, 0.0), /* 411-420 */ new NutationModel( 2, 0, 2,-1, 1, -8.0, 0.0, 0.0, 4.0, 0.0, 0.0), new NutationModel( 1, 1, 2, 0, 0, -19.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0, 0, 4,-1, 2, -10.0, 0.0, 0.0, 4.0, 0.0, 0.0), new NutationModel( 1, 2, 2, 0, 2, 21.0, 0.0, 0.0, -9.0, 0.0, 0.0), new NutationModel(-2, 0, 0, 6, 0, 23.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel( 0,-1, 0, 4, 1, -16.0, 0.0, 0.0, 8.0, 0.0, 0.0), new NutationModel(-2,-1, 2, 4, 1, -19.0, 0.0, 0.0, 9.0, 0.0, 0.0), new NutationModel( 0,-2, 2, 2, 1, -22.0, 0.0, 0.0, 10.0, 0.0, 0.0), new NutationModel( 0,-1, 2, 2, 0, 27.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel(-1, 0, 2, 3, 1, 16.0, 0.0, 0.0, -8.0, 0.0, 0.0), /* 421-430 */ new NutationModel(-2, 1, 2, 4, 2, 19.0, 0.0, 0.0, -8.0, 0.0, 0.0), new NutationModel( 2, 0, 0, 2, 2, 9.0, 0.0, 0.0, -4.0, 0.0, 0.0), new NutationModel( 2,-2, 2, 0, 2, -9.0, 0.0, 0.0, 4.0, 0.0, 0.0), new NutationModel(-1, 1, 2, 3, 2, -9.0, 0.0, 0.0, 4.0, 0.0, 0.0), new NutationModel( 3, 0, 2,-1, 2, -8.0, 0.0, 0.0, 4.0, 0.0, 0.0), new NutationModel( 4, 0, 2,-2, 1, 18.0, 0.0, 0.0, -9.0, 0.0, 0.0), new NutationModel(-1, 0, 0, 6, 0, 16.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel(-1,-2, 2, 4, 2, -10.0, 0.0, 0.0, 4.0, 0.0, 0.0), new NutationModel(-3, 0, 2, 6, 2, -23.0, 0.0, 0.0, 9.0, 0.0, 0.0), new NutationModel(-1, 0, 2, 4, 0, 16.0, 0.0, 0.0, -1.0, 0.0, 0.0), /* 431-440 */ new NutationModel( 3, 0, 0, 2, 1, -12.0, 0.0, 0.0, 6.0, 0.0, 0.0), new NutationModel( 3,-1, 2, 0, 1, -8.0, 0.0, 0.0, 4.0, 0.0, 0.0), new NutationModel( 3, 0, 2, 0, 0, 30.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 1, 0, 4, 0, 2, 24.0, 0.0, 0.0, -10.0, 0.0, 0.0), new NutationModel( 5, 0, 2,-2, 2, 10.0, 0.0, 0.0, -4.0, 0.0, 0.0), new NutationModel( 0,-1, 2, 4, 1, -16.0, 0.0, 0.0, 7.0, 0.0, 0.0), new NutationModel( 2,-1, 2, 2, 1, -16.0, 0.0, 0.0, 7.0, 0.0, 0.0), new NutationModel( 0, 1, 2, 4, 2, 17.0, 0.0, 0.0, -7.0, 0.0, 0.0), new NutationModel( 1,-1, 2, 4, 2, -24.0, 0.0, 0.0, 10.0, 0.0, 0.0), new NutationModel( 3,-1, 2, 2, 2, -12.0, 0.0, 0.0, 5.0, 0.0, 0.0), /* 441-450 */ new NutationModel( 3, 0, 2, 2, 1, -24.0, 0.0, 0.0, 11.0, 0.0, 0.0), new NutationModel( 5, 0, 2, 0, 2, -23.0, 0.0, 0.0, 9.0, 0.0, 0.0), new NutationModel( 0, 0, 2, 6, 2, -13.0, 0.0, 0.0, 5.0, 0.0, 0.0), new NutationModel( 4, 0, 2, 2, 2, -15.0, 0.0, 0.0, 7.0, 0.0, 0.0), new NutationModel( 0,-1, 1,-1, 1, 0.0, 0.0,-1988.0, 0.0, 0.0,-1679.0), new NutationModel(-1, 0, 1, 0, 3, 0.0, 0.0, -63.0, 0.0, 0.0, -27.0), new NutationModel( 0,-2, 2,-2, 3, -4.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1, 0,-1, 0, 1, 0.0, 0.0, 5.0, 0.0, 0.0, 4.0), new NutationModel( 2,-2, 0,-2, 1, 5.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel(-1, 0, 1, 0, 2, 0.0, 0.0, 364.0, 0.0, 0.0, 176.0), /* 451-460 */ new NutationModel(-1, 0, 1, 0, 1, 0.0, 0.0,-1044.0, 0.0, 0.0, -891.0), new NutationModel(-1,-1, 2,-1, 2, -3.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel(-2, 2, 0, 2, 2, 4.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel(-1, 0, 1, 0, 0, 0.0, 0.0, 330.0, 0.0, 0.0, 0.0), new NutationModel(-4, 1, 2, 2, 2, 5.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel(-3, 0, 2, 1, 1, 3.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel(-2,-1, 2, 0, 2, -3.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel( 1, 0,-2, 1, 1, -5.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 2,-1,-2, 0, 1, 3.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel(-4, 0, 2, 2, 0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0), /* 461-470 */ new NutationModel(-3, 1, 0, 3, 0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1, 0,-1, 2, 0, 0.0, 0.0, 5.0, 0.0, 0.0, 0.0), new NutationModel( 0,-2, 0, 0, 2, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel( 0,-2, 0, 0, 2, 4.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel(-3, 0, 0, 3, 0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-2,-1, 0, 2, 2, 5.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel(-1, 0,-2, 3, 0, -7.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-4, 0, 0, 4, 0, -12.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 2, 1,-2, 0, 1, 5.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel( 2,-1, 0,-2, 2, 3.0, 0.0, 0.0, -1.0, 0.0, 0.0), /* 471-480 */ new NutationModel( 0, 0, 1,-1, 0, -5.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1, 2, 0, 1, 0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-2, 1, 2, 0, 2, -7.0, 0.0, 0.0, 3.0, 0.0, 0.0), new NutationModel( 1, 1, 0,-1, 1, 7.0, 0.0, 0.0, -4.0, 0.0, 0.0), new NutationModel( 1, 0, 1,-2, 1, 0.0, 0.0, -12.0, 0.0, 0.0, -10.0), new NutationModel( 0, 2, 0, 0, 2, 4.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 1,-1, 2,-3, 1, 3.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel(-1, 1, 2,-1, 1, -3.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-2, 0, 4,-2, 2, -7.0, 0.0, 0.0, 3.0, 0.0, 0.0), new NutationModel(-2, 0, 4,-2, 1, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), /* 481-490 */ new NutationModel(-2,-2, 0, 2, 1, -3.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel(-2, 0,-2, 4, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1, 2, 2,-4, 1, -3.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel( 1, 1, 2,-4, 2, 7.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel(-1, 2, 2,-2, 1, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 2, 0, 0,-3, 1, 4.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel(-1, 2, 0, 0, 1, -5.0, 0.0, 0.0, 3.0, 0.0, 0.0), new NutationModel( 0, 0, 0,-2, 0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1,-1, 2,-2, 2, -5.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-1, 1, 0, 0, 2, 5.0, 0.0, 0.0, -2.0, 0.0, 0.0), /* 491-500 */ new NutationModel( 0, 0, 0,-1, 2, -8.0, 0.0, 0.0, 3.0, 0.0, 0.0), new NutationModel(-2, 1, 0, 1, 0, 9.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1,-2, 0,-2, 1, 6.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel( 1, 0,-2, 0, 2, -5.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-3, 1, 0, 2, 0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1, 1,-2, 2, 0, -7.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1,-1, 0, 0, 2, -3.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel(-3, 0, 0, 2, 0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-3,-1, 0, 2, 0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 2, 0, 2,-6, 1, -3.0, 0.0, 0.0, 2.0, 0.0, 0.0), /* 501-510 */ new NutationModel( 0, 1, 2,-4, 2, 4.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 2, 0, 0,-4, 2, 3.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel(-2, 1, 2,-2, 1, -5.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 0,-1, 2,-4, 1, 4.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 0, 1, 0,-2, 2, 9.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel(-1, 0, 0,-2, 0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 2, 0,-2,-2, 1, 4.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel(-4, 0, 2, 0, 1, -3.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-1,-1, 0,-1, 1, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 0, 0,-2, 0, 2, 9.0, 0.0, 0.0, -3.0, 0.0, 0.0), /* 511-520 */ new NutationModel(-3, 0, 0, 1, 0, -4.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1, 0,-2, 1, 0, -4.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-2, 0,-2, 2, 1, 3.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 0, 0,-4, 2, 0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-2,-1,-2, 2, 0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1, 0, 2,-6, 1, -3.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-1, 0, 2,-4, 2, 3.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel( 1, 0, 0,-4, 2, 3.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel( 2, 1, 2,-4, 2, -3.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel( 2, 1, 2,-4, 1, 6.0, 0.0, 0.0, -3.0, 0.0, 0.0), /* 521-530 */ new NutationModel( 0, 1, 4,-4, 4, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0, 1, 4,-4, 2, -3.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel(-1,-1,-2, 4, 0, -7.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1,-3, 0, 2, 0, 9.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1, 0,-2, 4, 1, -3.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-2,-1, 0, 3, 0, -3.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0, 0,-2, 3, 0, -4.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-2, 0, 0, 3, 1, -5.0, 0.0, 0.0, 3.0, 0.0, 0.0), new NutationModel( 0,-1, 0, 1, 0, -13.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-3, 0, 2, 2, 0, -7.0, 0.0, 0.0, 0.0, 0.0, 0.0), /* 531-540 */ new NutationModel( 1, 1,-2, 2, 0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1, 1, 0, 2, 2, 3.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel( 1,-2, 2,-2, 1, 10.0, 0.0, 13.0, 6.0, 0.0, -5.0), new NutationModel( 0, 0, 1, 0, 2, 0.0, 0.0, 30.0, 0.0, 0.0, 14.0), new NutationModel( 0, 0, 1, 0, 1, 0.0, 0.0, -162.0, 0.0, 0.0, -138.0), new NutationModel( 0, 0, 1, 0, 0, 0.0, 0.0, 75.0, 0.0, 0.0, 0.0), new NutationModel(-1, 2, 0, 2, 1, -7.0, 0.0, 0.0, 4.0, 0.0, 0.0), new NutationModel( 0, 0, 2, 0, 2, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-2, 0, 2, 0, 2, 4.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 2, 0, 0,-1, 1, 5.0, 0.0, 0.0, -2.0, 0.0, 0.0), /* 541-550 */ new NutationModel( 3, 0, 0,-2, 1, 5.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel( 1, 0, 2,-2, 3, -3.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1, 2, 0, 0, 1, -3.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 2, 0, 2,-3, 2, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-1, 1, 4,-2, 2, -5.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-2,-2, 0, 4, 0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0,-3, 0, 2, 0, 9.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0, 0,-2, 4, 0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1,-1, 0, 3, 0, -7.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-2, 0, 0, 4, 2, -3.0, 0.0, 0.0, 1.0, 0.0, 0.0), /* 551-560 */ new NutationModel(-1, 0, 0, 3, 1, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 2,-2, 0, 0, 0, 7.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1,-1, 0, 1, 0, -4.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1, 0, 0, 2, 0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0,-2, 2, 0, 1, -6.0, 0.0, -3.0, 3.0, 0.0, 1.0), new NutationModel(-1, 0, 1, 2, 1, 0.0, 0.0, -3.0, 0.0, 0.0, -2.0), new NutationModel(-1, 1, 0, 3, 0, 11.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1,-1, 2, 1, 2, 3.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel( 0,-1, 2, 0, 0, 11.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-2, 1, 2, 2, 1, -3.0, 0.0, 0.0, 2.0, 0.0, 0.0), /* 561-570 */ new NutationModel( 2,-2, 2,-2, 2, -1.0, 0.0, 3.0, 3.0, 0.0, -1.0), new NutationModel( 1, 1, 0, 1, 1, 4.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 1, 0, 1, 0, 1, 0.0, 0.0, -13.0, 0.0, 0.0, -11.0), new NutationModel( 1, 0, 1, 0, 0, 3.0, 0.0, 6.0, 0.0, 0.0, 0.0), new NutationModel( 0, 2, 0, 2, 0, -7.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 2,-1, 2,-2, 1, 5.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel( 0,-1, 4,-2, 1, -3.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel( 0, 0, 4,-2, 3, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0, 1, 4,-2, 1, 5.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel( 4, 0, 2,-4, 2, -7.0, 0.0, 0.0, 3.0, 0.0, 0.0), /* 571-580 */ new NutationModel( 2, 2, 2,-2, 2, 8.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel( 2, 0, 4,-4, 2, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-1,-2, 0, 4, 0, 11.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1,-3, 2, 2, 2, -3.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel(-3, 0, 2, 4, 2, 3.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel(-3, 0, 2,-2, 1, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-1,-1, 0,-2, 1, 8.0, 0.0, 0.0, -4.0, 0.0, 0.0), new NutationModel(-3, 0, 0, 0, 2, 3.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel(-3, 0,-2, 2, 0, 11.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0, 1, 0,-4, 1, -6.0, 0.0, 0.0, 3.0, 0.0, 0.0), /* 581-590 */ new NutationModel(-2, 1, 0,-2, 1, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-4, 0, 0, 0, 1, -8.0, 0.0, 0.0, 4.0, 0.0, 0.0), new NutationModel(-1, 0, 0,-4, 1, -7.0, 0.0, 0.0, 3.0, 0.0, 0.0), new NutationModel(-3, 0, 0,-2, 1, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 0, 0, 0, 3, 2, 3.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel(-1, 1, 0, 4, 1, 6.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel( 1,-2, 2, 0, 1, -6.0, 0.0, 0.0, 3.0, 0.0, 0.0), new NutationModel( 0, 1, 0, 3, 0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-1, 0, 2, 2, 3, 6.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel( 0, 0, 2, 2, 2, 5.0, 0.0, 0.0, -2.0, 0.0, 0.0), /* 591-600 */ new NutationModel(-2, 0, 2, 2, 2, -5.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-1, 1, 2, 2, 0, -4.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 3, 0, 0, 0, 2, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 2, 1, 0, 1, 0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 2,-1, 2,-1, 2, 6.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel( 0, 0, 2, 0, 1, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 0, 0, 3, 0, 3, 0.0, 0.0, -26.0, 0.0, 0.0, -11.0), new NutationModel( 0, 0, 3, 0, 2, 0.0, 0.0, -10.0, 0.0, 0.0, -5.0), new NutationModel(-1, 2, 2, 2, 1, 5.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel(-1, 0, 4, 0, 0, -13.0, 0.0, 0.0, 0.0, 0.0, 0.0), /* 601-610 */ new NutationModel( 1, 2, 2, 0, 1, 3.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 3, 1, 2,-2, 1, 4.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 1, 1, 4,-2, 2, 7.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel(-2,-1, 0, 6, 0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0,-2, 0, 4, 0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-2, 0, 0, 6, 1, -3.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-2,-2, 2, 4, 2, -6.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 0,-3, 2, 2, 2, -5.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 0, 0, 0, 4, 2, -7.0, 0.0, 0.0, 3.0, 0.0, 0.0), new NutationModel(-1,-1, 2, 3, 2, 5.0, 0.0, 0.0, -2.0, 0.0, 0.0), /* 611-620 */ new NutationModel(-2, 0, 2, 4, 0, 13.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 2,-1, 0, 2, 1, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 1, 0, 0, 3, 0, -3.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0, 1, 0, 4, 1, 5.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 0, 1, 0, 4, 0, -11.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1,-1, 2, 1, 2, 5.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 0, 0, 2, 2, 3, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1, 0, 2, 2, 2, 4.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel(-1, 0, 2, 2, 2, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-2, 0, 4, 2, 1, 6.0, 0.0, 0.0, -3.0, 0.0, 0.0), /* 621-630 */ new NutationModel( 2, 1, 0, 2, 1, 3.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 2, 1, 0, 2, 0, -12.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 2,-1, 2, 0, 0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1, 0, 2, 1, 0, -3.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0, 1, 2, 2, 0, -4.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 2, 0, 2, 0, 3, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 3, 0, 2, 0, 2, 3.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel( 1, 0, 2, 0, 2, -3.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel( 1, 0, 3, 0, 3, 0.0, 0.0, -5.0, 0.0, 0.0, -2.0), new NutationModel( 1, 1, 2, 1, 1, -7.0, 0.0, 0.0, 4.0, 0.0, 0.0), /* 631-640 */ new NutationModel( 0, 2, 2, 2, 2, 6.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel( 2, 1, 2, 0, 0, -3.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 2, 0, 4,-2, 1, 5.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel( 4, 1, 2,-2, 2, 3.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel(-1,-1, 0, 6, 0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel(-3,-1, 2, 6, 2, -3.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel(-1, 0, 0, 6, 1, -5.0, 0.0, 0.0, 3.0, 0.0, 0.0), new NutationModel(-3, 0, 2, 6, 1, -3.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 1,-1, 0, 4, 1, -3.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 1,-1, 0, 4, 0, 12.0, 0.0, 0.0, 0.0, 0.0, 0.0), /* 641-650 */ new NutationModel(-2, 0, 2, 5, 2, 3.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel( 1,-2, 2, 2, 1, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 3,-1, 0, 2, 0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1,-1, 2, 2, 0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0, 0, 2, 3, 1, 5.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel(-1, 1, 2, 4, 1, 4.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 0, 1, 2, 3, 2, -6.0, 0.0, 0.0, 3.0, 0.0, 0.0), new NutationModel(-1, 0, 4, 2, 1, 4.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 2, 0, 2, 1, 1, 6.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel( 5, 0, 0, 0, 0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0), /* 651-660 */ new NutationModel( 2, 1, 2, 1, 2, -6.0, 0.0, 0.0, 3.0, 0.0, 0.0), new NutationModel( 1, 0, 4, 0, 1, 3.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 3, 1, 2, 0, 1, 7.0, 0.0, 0.0, -4.0, 0.0, 0.0), new NutationModel( 3, 0, 4,-2, 2, 4.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel(-2,-1, 2, 6, 2, -5.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 0, 0, 0, 6, 0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0,-2, 2, 4, 2, -6.0, 0.0, 0.0, 3.0, 0.0, 0.0), new NutationModel(-2, 0, 2, 6, 1, -6.0, 0.0, 0.0, 3.0, 0.0, 0.0), new NutationModel( 2, 0, 0, 4, 1, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 2, 0, 0, 4, 0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0), /* 661-670 */ new NutationModel( 2,-2, 2, 2, 2, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 0, 0, 2, 4, 0, 7.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 1, 0, 2, 3, 2, 7.0, 0.0, 0.0, -3.0, 0.0, 0.0), new NutationModel( 4, 0, 0, 2, 0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 2, 0, 2, 2, 0, 11.0, 0.0, 0.0, 0.0, 0.0, 0.0), new NutationModel( 0, 0, 4, 2, 2, 5.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 4,-1, 2, 0, 2, -6.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 3, 0, 2, 1, 2, 4.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 2, 1, 2, 2, 1, 3.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 4, 1, 2, 0, 2, 5.0, 0.0, 0.0, -2.0, 0.0, 0.0), /* 671-678 */ new NutationModel(-1,-1, 2, 6, 2, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel(-1, 0, 2, 6, 1, -4.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 1,-1, 2, 4, 1, -3.0, 0.0, 0.0, 2.0, 0.0, 0.0), new NutationModel( 1, 1, 2, 4, 2, 4.0, 0.0, 0.0, -2.0, 0.0, 0.0), new NutationModel( 3, 1, 2, 2, 2, 3.0, 0.0, 0.0, -1.0, 0.0, 0.0), new NutationModel( 5, 0, 2, 0, 1, -3.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel( 2,-1, 2, 4, 2, -3.0, 0.0, 0.0, 1.0, 0.0, 0.0), new NutationModel( 2, 0, 2, 4, 1, -3.0, 0.0, 0.0, 2.0, 0.0, 0.0) }; /* Number of terms in the luni-solar nutation model */ final int NLS = xls.length; /* ------------------------ /* Planetary nutation model */ /* ------------------------ */ /* The units for the sine and cosine coefficients are */ /* 0.1 microarcsecond */ PlanetaryNutModel xpl[] = { /* 1-10 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 8,-16, 4, 5, 0, 0, 0, 1440, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -8, 16,-4,-5, 0, 0, 2, 56,-117, -42, -40), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 8,-16, 4, 5, 0, 0, 2, 125, -43, 0, -54), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 2, 2, 0, 5, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -4, 8,-1,-5, 0, 0, 2, 3, -7, -3, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, -8, 3, 0, 0, 0, 1, 3, 0, 0, -2), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, 3, -8, 3, 0, 0, 0, 0, -114, 0, 0, 61), new PlanetaryNutModel(-1, 0, 0, 0, 0, 10, -3, 0, 0, 0, 0, 0, 0, -219, 89, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0,-2, 6,-3, 0, 2, -3, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, -8, 3, 0, 0, 0, 0, -462,1604, 0, 0), /* 11-20 */ new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -5, 8,-3, 0, 0, 0, 0, 99, 0, 0, -53), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -4, 8,-3, 0, 0, 0, 1, -3, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, -8, 1, 5, 0, 0, 2, 0, 6, 2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -5, 6, 4, 0, 0, 0, 0, 2, 3, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 2,-5, 0, 0, 2, -12, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 2,-5, 0, 0, 1, 14,-218, 117, 8), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0, 2,-5, 0, 0, 0, 31,-481, -257, -17), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 2,-5, 0, 0, 0, -491, 128, 0, 0), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0,-2, 5, 0, 0, 0,-3084,5123, 2735,1647), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0,-2, 5, 0, 0, 1,-1444,2409,-1286,-771), /* 21-30 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0,-2, 5, 0, 0, 2, 11, -24, -11, -9), new PlanetaryNutModel( 2,-1,-1, 0, 0, 0, 3, -7, 0, 0, 0, 0, 0, 26, -9, 0, 0), new PlanetaryNutModel( 1, 0,-2, 0, 0, 19,-21, 3, 0, 0, 0, 0, 0, 103, -60, 0, 0), new PlanetaryNutModel( 0, 1,-1, 1, 0, 2, -4, 0,-3, 0, 0, 0, 0, 0, -13, -7, 0), new PlanetaryNutModel( 1, 0,-1, 1, 0, 0, -1, 0, 2, 0, 0, 0, 0, -26, -29, -16, 14), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0,-4,10, 0, 0, 0, 9, -27, -14, -5), new PlanetaryNutModel(-2, 0, 2, 1, 0, 0, 2, 0, 0,-5, 0, 0, 0, 12, 0, 0, -6), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -7, 4, 0, 0, 0, 0, 0, -7, 0, 0, 0), new PlanetaryNutModel( 0,-1, 1, 0, 0, 0, 1, 0, 1,-1, 0, 0, 0, 0, 24, 0, 0), new PlanetaryNutModel(-2, 0, 2, 1, 0, 0, 2, 0,-2, 0, 0, 0, 0, 284, 0, 0,-151), /* 31-40 */ new PlanetaryNutModel(-1, 0, 0, 0, 0, 18,-16, 0, 0, 0, 0, 0, 0, 226, 101, 0, 0), new PlanetaryNutModel(-2, 1, 1, 2, 0, 0, 1, 0,-2, 0, 0, 0, 0, 0, -8, -2, 0), new PlanetaryNutModel(-1, 1,-1, 1, 0, 18,-17, 0, 0, 0, 0, 0, 0, 0, -6, -3, 0), new PlanetaryNutModel(-1, 0, 1, 1, 0, 0, 2, -2, 0, 0, 0, 0, 0, 5, 0, 0, -3), new PlanetaryNutModel( 0, 0, 0, 0, 0, -8, 13, 0, 0, 0, 0, 0, 2, -41, 175, 76, 17), new PlanetaryNutModel( 0, 2,-2, 2, 0, -8, 11, 0, 0, 0, 0, 0, 0, 0, 15, 6, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -8, 13, 0, 0, 0, 0, 0, 1, 425, 212, -133, 269), new PlanetaryNutModel( 0, 1,-1, 1, 0, -8, 12, 0, 0, 0, 0, 0, 0, 1200, 598, 319,-641), new PlanetaryNutModel( 0, 0, 0, 0, 0, 8,-13, 0, 0, 0, 0, 0, 0, 235, 334, 0, 0), new PlanetaryNutModel( 0, 1,-1, 1, 0, 8,-14, 0, 0, 0, 0, 0, 0, 11, -12, -7, -6), /* 41-50 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 8,-13, 0, 0, 0, 0, 0, 1, 5, -6, 3, 3), new PlanetaryNutModel(-2, 0, 2, 1, 0, 0, 2, 0,-4, 5, 0, 0, 0, -5, 0, 0, 3), new PlanetaryNutModel(-2, 0, 2, 2, 0, 3, -3, 0, 0, 0, 0, 0, 0, 6, 0, 0, -3), new PlanetaryNutModel(-2, 0, 2, 0, 0, 0, 2, 0,-3, 1, 0, 0, 0, 15, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, 3, -5, 0, 2, 0, 0, 0, 0, 13, 0, 0, -7), new PlanetaryNutModel(-2, 0, 2, 0, 0, 0, 2, 0,-4, 3, 0, 0, 0, -6, -9, 0, 0), new PlanetaryNutModel( 0,-1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 266, -78, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, -1, 2, 0, 0, 0, 0, 0, -460,-435, -232, 246), new PlanetaryNutModel( 0, 1,-1, 2, 0, 0, -2, 2, 0, 0, 0, 0, 0, 0, 15, 7, 0), new PlanetaryNutModel(-1, 1, 0, 1, 0, 3, -5, 0, 0, 0, 0, 0, 0, -3, 0, 0, 2), /* 51-60 */ new PlanetaryNutModel(-1, 0, 1, 0, 0, 3, -4, 0, 0, 0, 0, 0, 0, 0, 131, 0, 0), new PlanetaryNutModel(-2, 0, 2, 0, 0, 0, 2, 0,-2,-2, 0, 0, 0, 4, 0, 0, 0), new PlanetaryNutModel(-2, 2, 0, 2, 0, 0, -5, 9, 0, 0, 0, 0, 0, 0, 3, 0, 0), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0, 0, 0,-1, 0, 0, 0, 4, 2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0, 0, 0, 0, 2, 0, -17, -19, -10, 9), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, -9, -11, 6, -5), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, -6, 0, 0, 3), new PlanetaryNutModel(-1, 0, 1, 0, 0, 0, 3, -4, 0, 0, 0, 0, 0, -16, 8, 0, 0), new PlanetaryNutModel( 0,-1, 1, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 3, 0, 0), /* 61-70 */ new PlanetaryNutModel( 0, 1,-1, 2, 0, 0, -1, 0, 0, 2, 0, 0, 0, 11, 24, 11, -5), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, -9, 17, 0, 0, 0, 0, 0, -3, -4, -2, 1), new PlanetaryNutModel( 0, 0, 0, 2, 0, -3, 5, 0, 0, 0, 0, 0, 0, 3, 0, 0, -1), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0,-1, 2, 0, 0, 0, 0, -8, -4, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 1,-2, 0, 0, 0, 0, 3, 0, 0), new PlanetaryNutModel( 1, 0,-2, 0, 0, 17,-16, 0,-2, 0, 0, 0, 0, 0, 5, 0, 0), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0, 1,-3, 0, 0, 0, 0, 3, 2, 0), new PlanetaryNutModel(-2, 0, 2, 1, 0, 0, 5, -6, 0, 0, 0, 0, 0, -6, 4, 2, 3), new PlanetaryNutModel( 0,-2, 2, 0, 0, 0, 9,-13, 0, 0, 0, 0, 0, -3, -5, 0, 0), new PlanetaryNutModel( 0, 1,-1, 2, 0, 0, -1, 0, 0, 1, 0, 0, 0, -5, 0, 0, 2), /* 71-80 */ new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 24, 13, -2), new PlanetaryNutModel( 0,-1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, -42, 20, 0, 0), new PlanetaryNutModel( 0,-2, 2, 0, 0, 5, -6, 0, 0, 0, 0, 0, 0, -10, 233, 0, 0), new PlanetaryNutModel( 0,-1, 1, 1, 0, 5, -7, 0, 0, 0, 0, 0, 0, -3, 0, 0, 1), new PlanetaryNutModel(-2, 0, 2, 0, 0, 6, -8, 0, 0, 0, 0, 0, 0, 78, -18, 0, 0), new PlanetaryNutModel( 2, 1,-3, 1, 0, -6, 7, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0), new PlanetaryNutModel( 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -3, -1, 0), new PlanetaryNutModel( 0,-1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, -4, -2, 1), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0, 0, 0, 2, 0, 0, 0, -8, -4, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, -5, 3, 0), /* 81-90 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, -7, 0, 0, 3), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -8, 15, 0, 0, 0, 0, 2, -14, 8, 3, 6), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -8, 15, 0, 0, 0, 0, 1, 0, 8, -4, 0), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -9, 15, 0, 0, 0, 0, 0, 0, 19, 10, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 8,-15, 0, 0, 0, 0, 0, 45, -22, 0, 0), new PlanetaryNutModel( 1,-1,-1, 0, 0, 0, 8,-15, 0, 0, 0, 0, 0, -3, 0, 0, 0), new PlanetaryNutModel( 2, 0,-2, 0, 0, 2, -5, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0), new PlanetaryNutModel(-2, 0, 2, 0, 0, 0, 2, 0,-5, 5, 0, 0, 0, 0, 3, 0, 0), new PlanetaryNutModel( 2, 0,-2, 1, 0, 0, -6, 8, 0, 0, 0, 0, 0, 3, 5, 3, -2), new PlanetaryNutModel( 2, 0,-2, 1, 0, 0, -2, 0, 3, 0, 0, 0, 0, 89, -16, -9, -48), /* 91-100 */ new PlanetaryNutModel(-2, 1, 1, 0, 0, 0, 1, 0,-3, 0, 0, 0, 0, 0, 3, 0, 0), new PlanetaryNutModel(-2, 1, 1, 1, 0, 0, 1, 0,-3, 0, 0, 0, 0, -3, 7, 4, 2), new PlanetaryNutModel(-2, 0, 2, 0, 0, 0, 2, 0,-3, 0, 0, 0, 0, -349, -62, 0, 0), new PlanetaryNutModel(-2, 0, 2, 0, 0, 0, 6, -8, 0, 0, 0, 0, 0, -15, 22, 0, 0), new PlanetaryNutModel(-2, 0, 2, 0, 0, 0, 2, 0,-1,-5, 0, 0, 0, -3, 0, 0, 0), new PlanetaryNutModel(-1, 0, 1, 0, 0, 0, 1, 0,-1, 0, 0, 0, 0, -53, 0, 0, 0), new PlanetaryNutModel(-1, 1, 1, 1, 0,-20, 20, 0, 0, 0, 0, 0, 0, 5, 0, 0, -3), new PlanetaryNutModel( 1, 0,-2, 0, 0, 20,-21, 0, 0, 0, 0, 0, 0, 0, -8, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, 8,-15, 0, 0, 0, 0, 0, 15, -7, -4, -8), new PlanetaryNutModel( 0, 2,-2, 1, 0, 0,-10, 15, 0, 0, 0, 0, 0, -3, 0, 0, 1), /* 101-110 */ new PlanetaryNutModel( 0,-1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, -21, -78, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 20, -70, -37, -11), new PlanetaryNutModel( 0, 1,-1, 2, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 6, 3, 0), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0,-2, 4, 0, 0, 0, 5, 3, 2, -2), new PlanetaryNutModel( 2, 0,-2, 1, 0, -6, 8, 0, 0, 0, 0, 0, 0, -17, -4, -2, 9), new PlanetaryNutModel( 0,-2, 2, 1, 0, 5, -6, 0, 0, 0, 0, 0, 0, 0, 6, 3, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 1, 32, 15, -8, 17), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0, 0,-1, 0, 0, 0, 174, 84, 45, -93), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 11, 56, 0, 0), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0, 0, 1, 0, 0, 0, -66, -12, -6, 35), /* 111-120 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 47, 8, 4, -25), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 8, 4, 0), new PlanetaryNutModel( 0, 2,-2, 1, 0, 0, -9, 13, 0, 0, 0, 0, 0, 10, -22, -12, -5), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, 7,-13, 0, 0, 0, 0, 0, -3, 0, 0, 2), new PlanetaryNutModel(-2, 0, 2, 0, 0, 0, 5, -6, 0, 0, 0, 0, 0, -24, 12, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 9,-17, 0, 0, 0, 0, 0, 5, -6, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -9, 17, 0, 0, 0, 0, 2, 3, 0, 0, -2), new PlanetaryNutModel( 1, 0,-1, 1, 0, 0, -3, 4, 0, 0, 0, 0, 0, 4, 3, 1, -2), new PlanetaryNutModel( 1, 0,-1, 1, 0, -3, 4, 0, 0, 0, 0, 0, 0, 0, 29, 15, 0), new PlanetaryNutModel( 0, 0, 0, 2, 0, 0, -1, 2, 0, 0, 0, 0, 0, -5, -4, -2, 2), /* 121-130 */ new PlanetaryNutModel( 0,-1, 1, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 8, -3, -1, -5), new PlanetaryNutModel( 0,-2, 2, 0, 1, 0, -2, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -5, 0, 2, 0, 0, 0, 0, 10, 0, 0, 0), new PlanetaryNutModel(-2, 0, 2, 1, 0, 0, 2, 0,-3, 1, 0, 0, 0, 3, 0, 0, -2), new PlanetaryNutModel(-2, 0, 2, 1, 0, 3, -3, 0, 0, 0, 0, 0, 0, -5, 0, 0, 3), new PlanetaryNutModel( 0, 0, 0, 1, 0, 8,-13, 0, 0, 0, 0, 0, 0, 46, 66, 35, -25), new PlanetaryNutModel( 0,-1, 1, 0, 0, 8,-12, 0, 0, 0, 0, 0, 0, -14, 7, 0, 0), new PlanetaryNutModel( 0, 2,-2, 1, 0, -8, 11, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0), new PlanetaryNutModel(-1, 0, 1, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, -5, 0, 0, 0), new PlanetaryNutModel(-1, 0, 0, 1, 0, 18,-16, 0, 0, 0, 0, 0, 0, -68, -34, -18, 36), /* 131-140 */ new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0,-1, 1, 0, 0, 0, 0, 14, 7, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, 3, -7, 4, 0, 0, 0, 0, 0, 10, -6, -3, -5), new PlanetaryNutModel(-2, 1, 1, 1, 0, 0, -3, 7, 0, 0, 0, 0, 0, -5, -4, -2, 3), new PlanetaryNutModel( 0, 1,-1, 2, 0, 0, -1, 0,-2, 5, 0, 0, 0, -3, 5, 2, 1), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, 0, 0,-2, 5, 0, 0, 0, 76, 17, 9, -41), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, -4, 8,-3, 0, 0, 0, 0, 84, 298, 159, -45), new PlanetaryNutModel( 1, 0, 0, 1, 0,-10, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, -1), new PlanetaryNutModel( 0, 2,-2, 1, 0, 0, -2, 0, 0, 0, 0, 0, 0, -3, 0, 0, 2), new PlanetaryNutModel(-1, 0, 0, 1, 0, 10, -3, 0, 0, 0, 0, 0, 0, -3, 0, 0, 1), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, 4, -8, 3, 0, 0, 0, 0, -82, 292, 156, 44), /* 141-150 */ new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, 0, 0, 2,-5, 0, 0, 0, -73, 17, 9, 39), new PlanetaryNutModel( 0,-1, 1, 0, 0, 0, 1, 0, 2,-5, 0, 0, 0, -9, -16, 0, 0), new PlanetaryNutModel( 2,-1,-1, 1, 0, 0, 3, -7, 0, 0, 0, 0, 0, 3, 0, -1, -2), new PlanetaryNutModel(-2, 0, 2, 0, 0, 0, 2, 0, 0,-5, 0, 0, 0, -3, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, -3, 7, -4, 0, 0, 0, 0, 0, -9, -5, -3, 5), new PlanetaryNutModel(-2, 0, 2, 0, 0, 0, 2, 0,-2, 0, 0, 0, 0, -439, 0, 0, 0), new PlanetaryNutModel( 1, 0, 0, 1, 0,-18, 16, 0, 0, 0, 0, 0, 0, 57, -28, -15, -30), new PlanetaryNutModel(-2, 1, 1, 1, 0, 0, 1, 0,-2, 0, 0, 0, 0, 0, -6, -3, 0), new PlanetaryNutModel( 0, 1,-1, 2, 0, -8, 12, 0, 0, 0, 0, 0, 0, -4, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 1, 0, -8, 13, 0, 0, 0, 0, 0, 0, -40, 57, 30, 21), /* 151-160 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, -2, 0, 0, 0, 0, 1, 23, 7, 3, -13), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, 0, -2, 0, 0, 0, 0, 0, 273, 80, 43,-146), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, -2, 0, 0, 0, 0, 0, -449, 430, 0, 0), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -2, 2, 0, 0, 0, 0, 0, -8, -47, -25, 4), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -1, 2, 0, 0, 0, 0, 1, 6, 47, 25, -3), new PlanetaryNutModel(-1, 0, 1, 1, 0, 3, -4, 0, 0, 0, 0, 0, 0, 0, 23, 13, 0), new PlanetaryNutModel(-1, 0, 1, 1, 0, 0, 3, -4, 0, 0, 0, 0, 0, -3, 0, 0, 2), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0, 0,-2, 0, 0, 0, 3, -4, -2, -2), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0, 0, 2, 0, 0, 0, -48,-110, -59, 26), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 51, 114, 61, -27), /* 161-170 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, -133, 0, 0, 57), new PlanetaryNutModel( 0, 1,-1, 0, 0, 3, -6, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, -3, 5, 0, 0, 0, 0, 0, 0, -21, -6, -3, 11), new PlanetaryNutModel( 0, 1,-1, 2, 0, -3, 4, 0, 0, 0, 0, 0, 0, 0, -3, -1, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, -2, 4, 0, 0, 0, 0, 0, -11, -21, -11, 6), new PlanetaryNutModel( 0, 2,-2, 1, 0, -5, 6, 0, 0, 0, 0, 0, 0, -18,-436, -233, 9), new PlanetaryNutModel( 0,-1, 1, 0, 0, 5, -7, 0, 0, 0, 0, 0, 0, 35, -7, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, 5, -8, 0, 0, 0, 0, 0, 0, 0, 5, 3, 0), new PlanetaryNutModel(-2, 0, 2, 1, 0, 6, -8, 0, 0, 0, 0, 0, 0, 11, -3, -1, -6), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, -8, 15, 0, 0, 0, 0, 0, -5, -3, -1, 3), /* 171-180 */ new PlanetaryNutModel(-2, 0, 2, 1, 0, 0, 2, 0,-3, 0, 0, 0, 0, -53, -9, -5, 28), new PlanetaryNutModel(-2, 0, 2, 1, 0, 0, 6, -8, 0, 0, 0, 0, 0, 0, 3, 2, 1), new PlanetaryNutModel( 1, 0,-1, 1, 0, 0, -1, 0, 1, 0, 0, 0, 0, 4, 0, 0, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 3,-5, 0, 0, 0, 0, -4, 0, 0), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0,-1, 0, 0, 0, 0, -50, 194, 103, 27), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 1, -13, 52, 28, 7), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -91, 248, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 6, 49, 26, -3), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0, 1, 0, 0, 0, 0, -6, -47, -25, 3), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 3, 0), /* 181-190 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 52, 23, 10, -23), new PlanetaryNutModel( 0, 1,-1, 2, 0, 0, -1, 0, 0,-1, 0, 0, 0, -3, 0, 0, 1), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 5, 3, 0), new PlanetaryNutModel( 0,-1, 1, 0, 0, 0, 1, 0, 0,-1, 0, 0, 0, -4, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -7, 13, 0, 0, 0, 0, 2, -4, 8, 3, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 7,-13, 0, 0, 0, 0, 0, 10, 0, 0, 0), new PlanetaryNutModel( 2, 0,-2, 1, 0, 0, -5, 6, 0, 0, 0, 0, 0, 3, 0, 0, -2), new PlanetaryNutModel( 0, 2,-2, 1, 0, 0, -8, 11, 0, 0, 0, 0, 0, 0, 8, 4, 0), new PlanetaryNutModel( 0, 2,-2, 1,-1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 8, 4, 1), new PlanetaryNutModel(-2, 0, 2, 0, 0, 0, 4, -4, 0, 0, 0, 0, 0, -4, 0, 0, 0), /* 191-200 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 2,-2, 0, 0, 0, -4, 0, 0, 0), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0, 0, 3, 0, 0, 0, -8, 4, 2, 4), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 8, -4, -2, -4), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 15, 7, 0), new PlanetaryNutModel(-2, 0, 2, 0, 0, 3, -3, 0, 0, 0, 0, 0, 0, -138, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 2, 0, 0, -4, 8,-3, 0, 0, 0, 0, 0, -7, -3, 0), new PlanetaryNutModel( 0, 0, 0, 2, 0, 0, 4, -8, 3, 0, 0, 0, 0, 0, -7, -3, 0), new PlanetaryNutModel( 2, 0,-2, 1, 0, 0, -2, 0, 2, 0, 0, 0, 0, 54, 0, 0, -29), new PlanetaryNutModel( 0, 1,-1, 2, 0, 0, -1, 0, 2, 0, 0, 0, 0, 0, 10, 4, 0), new PlanetaryNutModel( 0, 1,-1, 2, 0, 0, 0, -2, 0, 0, 0, 0, 0, -7, 0, 0, 3), /* 201-210 */ new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, 1, -2, 0, 0, 0, 0, 0, -37, 35, 19, 20), new PlanetaryNutModel( 0,-1, 1, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, 4, 0, 0), new PlanetaryNutModel( 0,-1, 1, 0, 0, 0, 1, 0, 0,-2, 0, 0, 0, -4, 9, 0, 0), new PlanetaryNutModel( 0, 2,-2, 1, 0, 0, -2, 0, 0, 2, 0, 0, 0, 8, 0, 0, -4), new PlanetaryNutModel( 0, 1,-1, 1, 0, 3, -6, 0, 0, 0, 0, 0, 0, -9, -14, -8, 5), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -5, 0, 0, 0, 0, 0, 1, -3, -9, -5, 3), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -5, 0, 0, 0, 0, 0, 0, -145, 47, 0, 0), new PlanetaryNutModel( 0, 1,-1, 1, 0, -3, 4, 0, 0, 0, 0, 0, 0, -10, 40, 21, 5), new PlanetaryNutModel( 0, 0, 0, 0, 0, -3, 5, 0, 0, 0, 0, 0, 1, 11, -49, -26, -7), new PlanetaryNutModel( 0, 0, 0, 0, 0, -3, 5, 0, 0, 0, 0, 0, 2,-2150, 0, 0, 932), /* 211-220 */ new PlanetaryNutModel( 0, 2,-2, 2, 0, -3, 3, 0, 0, 0, 0, 0, 0, -12, 0, 0, 5), new PlanetaryNutModel( 0, 0, 0, 0, 0, -3, 5, 0, 0, 0, 0, 0, 2, 85, 0, 0, -37), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, -4, 0, 0, 0, 0, 1, 4, 0, 0, -2), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, 1, -4, 0, 0, 0, 0, 0, 3, 0, 0, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, -4, 0, 0, 0, 0, 0, -86, 153, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -2, 4, 0, 0, 0, 0, 1, -6, 9, 5, 3), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -3, 4, 0, 0, 0, 0, 0, 9, -13, -7, -5), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -2, 4, 0, 0, 0, 0, 1, -8, 12, 6, 4), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -2, 4, 0, 0, 0, 0, 2, -51, 0, 0, 22), new PlanetaryNutModel( 0, 0, 0, 0, 0, -5, 8, 0, 0, 0, 0, 0, 2, -11,-268, -116, 5), /* 221-230 */ new PlanetaryNutModel( 0, 2,-2, 2, 0, -5, 6, 0, 0, 0, 0, 0, 0, 0, 12, 5, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -5, 8, 0, 0, 0, 0, 0, 2, 0, 7, 3, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -5, 8, 0, 0, 0, 0, 0, 1, 31, 6, 3, -17), new PlanetaryNutModel( 0, 1,-1, 1, 0, -5, 7, 0, 0, 0, 0, 0, 0, 140, 27, 14, -75), new PlanetaryNutModel( 0, 0, 0, 0, 0, -5, 8, 0, 0, 0, 0, 0, 1, 57, 11, 6, -30), new PlanetaryNutModel( 0, 0, 0, 0, 0, 5, -8, 0, 0, 0, 0, 0, 0, -14, -39, 0, 0), new PlanetaryNutModel( 0, 1,-1, 2, 0, 0, -1, 0,-1, 0, 0, 0, 0, 0, -6, -2, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, 0, 0,-1, 0, 0, 0, 0, 4, 15, 8, -2), new PlanetaryNutModel( 0,-1, 1, 0, 0, 0, 1, 0,-1, 0, 0, 0, 0, 0, 4, 0, 0), new PlanetaryNutModel( 0, 2,-2, 1, 0, 0, -2, 0, 1, 0, 0, 0, 0, -3, 0, 0, 1), /* 231-240 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -6, 11, 0, 0, 0, 0, 2, 0, 11, 5, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 6,-11, 0, 0, 0, 0, 0, 9, 6, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0,-1, 0, 4, 0, 0, 0, 0, 0, 2, -4, 10, 4, 2), new PlanetaryNutModel( 0, 0, 0, 0, 1, 0, -4, 0, 0, 0, 0, 0, 0, 5, 3, 0, 0), new PlanetaryNutModel( 2, 0,-2, 1, 0, -3, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, -9), new PlanetaryNutModel(-2, 0, 2, 0, 0, 0, 2, 0, 0,-2, 0, 0, 0, -3, 0, 0, 0), new PlanetaryNutModel( 0, 2,-2, 1, 0, 0, -7, 9, 0, 0, 0, 0, 0, 0, 3, 2, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 4,-5, 0, 0, 2, 7, 0, 0, -3), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, -25, 22, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 42, 223, 119, -22), /* 241-250 */ new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0, 2, 0, 0, 0, 0, -27,-143, -77, 14), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 9, 49, 26, -5), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2,-1166, 0, 0, 505), new PlanetaryNutModel( 0, 2,-2, 2, 0, 0, -2, 0, 2, 0, 0, 0, 0, -5, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 2, -6, 0, 0, 3), new PlanetaryNutModel( 0, 0, 0, 1, 0, 3, -5, 0, 0, 0, 0, 0, 0, -8, 0, 1, 4), new PlanetaryNutModel( 0,-1, 1, 0, 0, 3, -4, 0, 0, 0, 0, 0, 0, 0, -4, 0, 0), new PlanetaryNutModel( 0, 2,-2, 1, 0, -3, 3, 0, 0, 0, 0, 0, 0, 117, 0, 0, -63), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, 2, -4, 0, 0, 0, 0, 0, -4, 8, 4, 2), new PlanetaryNutModel( 0, 2,-2, 1, 0, 0, -4, 4, 0, 0, 0, 0, 0, 3, 0, 0, -2), /* 251-260 */ new PlanetaryNutModel( 0, 1,-1, 2, 0, -5, 7, 0, 0, 0, 0, 0, 0, -5, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, -6, 0, 0, 0, 0, 0, 0, 31, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -3, 6, 0, 0, 0, 0, 1, -5, 0, 1, 3), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -4, 6, 0, 0, 0, 0, 0, 4, 0, 0, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -3, 6, 0, 0, 0, 0, 1, -4, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -3, 6, 0, 0, 0, 0, 2, -24, -13, -6, 10), new PlanetaryNutModel( 0,-1, 1, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, 2, -3, 0, 0, 0, 0, 0, 0, 0, -32, -17, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -5, 9, 0, 0, 0, 0, 2, 8, 12, 5, -3), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -5, 9, 0, 0, 0, 0, 1, 3, 0, 0, -1), /* 261-270 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 5, -9, 0, 0, 0, 0, 0, 7, 13, 0, 0), new PlanetaryNutModel( 0,-1, 1, 0, 0, 0, 1, 0,-2, 0, 0, 0, 0, -3, 16, 0, 0), new PlanetaryNutModel( 0, 2,-2, 1, 0, 0, -2, 0, 2, 0, 0, 0, 0, 50, 0, 0, -27), new PlanetaryNutModel(-2, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -5, -3, 0), new PlanetaryNutModel( 0,-2, 2, 0, 0, 3, -3, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -6, 10, 0, 0, 0, 0, 0, 1, 0, 5, 3, 1), new PlanetaryNutModel( 0, 0, 0, 0, 0, -6, 10, 0, 0, 0, 0, 0, 2, 24, 5, 2, -11), new PlanetaryNutModel( 0, 0, 0, 0, 0, -2, 3, 0, 0, 0, 0, 0, 2, 5, -11, -5, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, -2, 3, 0, 0, 0, 0, 0, 1, 30, -3, -2, -16), new PlanetaryNutModel( 0, 1,-1, 1, 0, -2, 2, 0, 0, 0, 0, 0, 0, 18, 0, 0, -9), /* 271-280 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 2, -3, 0, 0, 0, 0, 0, 0, 8, 614, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 2, -3, 0, 0, 0, 0, 0, 1, 3, -3, -1, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 6, 17, 9, -3), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, -1, 0, 3, 0, 0, 0, 0, -3, -9, -5, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 6, 3, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, -127, 21, 9, 55), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, -8, 0, 0, 0, 0, 0, 3, 5, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -4, 8, 0, 0, 0, 0, 2, -6, -10, -4, 3), new PlanetaryNutModel( 0,-2, 2, 0, 0, 0, 2, 0,-2, 0, 0, 0, 0, 5, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -4, 7, 0, 0, 0, 0, 2, 16, 9, 4, -7), /* 281-290 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -4, 7, 0, 0, 0, 0, 1, 3, 0, 0, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, -7, 0, 0, 0, 0, 0, 0, 22, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, -2, 3, 0, 0, 0, 0, 0, 0, 0, 19, 10, 0), new PlanetaryNutModel( 0, 2,-2, 1, 0, 0, -2, 0, 3, 0, 0, 0, 0, 7, 0, 0, -4), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -5, 10, 0, 0, 0, 0, 2, 0, -5, -2, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2, -9, 3, 1, 4), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -3, 5, 0, 0, 0, 0, 2, 17, 0, 0, -7), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -3, 5, 0, 0, 0, 0, 1, 0, -3, -2, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, -5, 0, 0, 0, 0, 0, -20, 34, 0, 0), /* 291-300 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 1, -2, 0, 0, 0, 0, 0, 1, -10, 0, 1, 5), new PlanetaryNutModel( 0, 1,-1, 1, 0, 1, -3, 0, 0, 0, 0, 0, 0, -4, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 1, -2, 0, 0, 0, 0, 0, 0, 22, -87, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 1, -4, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 2, -3, -6, -2, 1), new PlanetaryNutModel( 0, 0, 0, 0, 0, -7, 11, 0, 0, 0, 0, 0, 2, -16, -3, -1, 7), new PlanetaryNutModel( 0, 0, 0, 0, 0, -7, 11, 0, 0, 0, 0, 0, 1, 0, -3, -2, 0), new PlanetaryNutModel( 0,-2, 2, 0, 0, 4, -4, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, -3, 0, 0, 0, 0, 0, -68, 39, 0, 0), new PlanetaryNutModel( 0, 2,-2, 1, 0, -4, 4, 0, 0, 0, 0, 0, 0, 27, 0, 0, -14), /* 301-310 */ new PlanetaryNutModel( 0,-1, 1, 0, 0, 4, -5, 0, 0, 0, 0, 0, 0, 0, -4, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, -25, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -4, 7, 0, 0, 0, 0, 0, 1, -12, -3, -2, 6), new PlanetaryNutModel( 0, 1,-1, 1, 0, -4, 6, 0, 0, 0, 0, 0, 0, 3, 0, 0, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, -4, 7, 0, 0, 0, 0, 0, 2, 3, 66, 29, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, -4, 6, 0, 0, 0, 0, 0, 2, 490, 0, 0,-213), new PlanetaryNutModel( 0, 0, 0, 0, 0, -4, 6, 0, 0, 0, 0, 0, 1, -22, 93, 49, 12), new PlanetaryNutModel( 0, 1,-1, 1, 0, -4, 5, 0, 0, 0, 0, 0, 0, -7, 28, 15, 4), new PlanetaryNutModel( 0, 0, 0, 0, 0, -4, 6, 0, 0, 0, 0, 0, 1, -3, 13, 7, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 4, -6, 0, 0, 0, 0, 0, 0, -46, 14, 0, 0), /* 311-320 */ new PlanetaryNutModel(-2, 0, 2, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 1, 0, 0), new PlanetaryNutModel( 0,-1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, 1, -1, 0, 0, 0, 0, 0, 0, -28, 0, 0, 15), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -1, 0, 5, 0, 0, 0, 2, 5, 0, 0, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, -3, 0, 0, 0, 0, 0, 0, 3, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -1, 3, 0, 0, 0, 0, 2, -11, 0, 0, 5), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -7, 12, 0, 0, 0, 0, 2, 0, 3, 1, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 2, -3, 0, 0, 1), new PlanetaryNutModel( 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 1, 25, 106, 57, -13), /* 321-330 */ new PlanetaryNutModel( 0, 1,-1, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 5, 21, 11, -3), new PlanetaryNutModel( 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 1485, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 1, -7, -32, -17, 4), new PlanetaryNutModel( 0, 1,-1, 1, 0, 1, -2, 0, 0, 0, 0, 0, 0, 0, 5, 3, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -2, 5, 0, 0, 0, 0, 2, -6, -3, -2, 3), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -1, 0, 4, 0, 0, 0, 2, 30, -6, -2, -13), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0,-4, 0, 0, 0, 0, -4, 4, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, -1, 1, 0, 0, 0, 0, 0, 0, -19, 0, 0, 10), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -6, 10, 0, 0, 0, 0, 2, 0, 4, 2, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -6, 10, 0, 0, 0, 0, 0, 0, 3, 0, 0), /* 331-340 */ new PlanetaryNutModel( 0, 2,-2, 1, 0, 0, -3, 0, 3, 0, 0, 0, 0, 4, 0, 0, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -3, 7, 0, 0, 0, 0, 2, 0, -3, -1, 0), new PlanetaryNutModel(-2, 0, 2, 0, 0, 4, -4, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -5, 8, 0, 0, 0, 0, 2, 5, 3, 1, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 5, -8, 0, 0, 0, 0, 0, 0, 11, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -1, 0, 3, 0, 0, 0, 2, 118, 0, 0, -52), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -1, 0, 3, 0, 0, 0, 1, 0, -5, -3, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0,-3, 0, 0, 0, 0, -28, 36, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 2, -4, 0, 0, 0, 0, 0, 0, 5, -5, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -2, 4, 0, 0, 0, 0, 0, 1, 14, -59, -31, -8), /* 341-350 */ new PlanetaryNutModel( 0, 1,-1, 1, 0, -2, 3, 0, 0, 0, 0, 0, 0, 0, 9, 5, 1), new PlanetaryNutModel( 0, 0, 0, 0, 0, -2, 4, 0, 0, 0, 0, 0, 2, -458, 0, 0, 198), new PlanetaryNutModel( 0, 0, 0, 0, 0, -6, 9, 0, 0, 0, 0, 0, 2, 0, -45, -20, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -6, 9, 0, 0, 0, 0, 0, 1, 9, 0, 0, -5), new PlanetaryNutModel( 0, 0, 0, 0, 0, 6, -9, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, 1, 0,-2, 0, 0, 0, 0, 0, -4, -2, -1), new PlanetaryNutModel( 0, 2,-2, 1, 0, -2, 2, 0, 0, 0, 0, 0, 0, 11, 0, 0, -6), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -4, 6, 0, 0, 0, 0, 2, 6, 0, 0, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, -6, 0, 0, 0, 0, 0, -16, 23, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, 3, -4, 0, 0, 0, 0, 0, 0, 0, -4, -2, 0), /* 351-360 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -1, 0, 2, 0, 0, 0, 2, -5, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0,-2, 0, 0, 0, 0, -166, 269, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, 1, 0,-1, 0, 0, 0, 0, 15, 0, 0, -8), new PlanetaryNutModel( 0, 0, 0, 0, 0, -5, 9, 0, 0, 0, 0, 0, 2, 10, 0, 0, -4), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, -4, 0, 0, 0, 0, 0, -78, 45, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -3, 4, 0, 0, 0, 0, 0, 2, 0, -5, -2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -3, 4, 0, 0, 0, 0, 0, 1, 7, 0, 0, -4), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -4, 0, 0, 0, 0, 0, 0, -5, 328, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -4, 0, 0, 0, 0, 0, 1, 3, 0, 0, -2), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, 2, -2, 0, 0, 0, 0, 0, 5, 0, 0, -2), /* 361-370 */ new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, -1, 0, 2, 0, 0, 0, 0, 0, 3, 1, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0, 0,-3, 0, 0, 0, -3, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0, 1,-5, 0, 0, 0, -3, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 1, 0, -4, -2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0,-1, 0, 0, 0, 0,-1223, -26, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0,-1, 0, 0, 0, 1, 0, 7, 3, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0,-3, 5, 0, 0, 0, 3, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, -3, 4, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0, 0,-2, 0, 0, 0, -6, 20, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, -368, 0, 0, 0), /* 371-380 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0, 0,-1, 0, 0, 0, -75, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, -1, 0, 1, 0, 0, 0, 0, 11, 0, 0, -6), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, -2, 2, 0, 0, 0, 0, 0, 3, 0, 0, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, -8, 14, 0, 0, 0, 0, 0, 2, -3, 0, 0, 1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0, 2,-5, 0, 0, 0, -13, -30, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 5, -8, 3, 0, 0, 0, 0, 21, 3, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 5, -8, 3, 0, 0, 0, 2, -3, 0, 0, 1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, -4, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 8, -27, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, -8, 3, 0, 0, 0, 0, -19, -11, 0, 0), /* 381-390 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -3, 8,-3, 0, 0, 0, 2, -4, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0,-2, 5, 0, 0, 2, 0, 5, 2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -8, 12, 0, 0, 0, 0, 0, 2, -6, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, -8, 12, 0, 0, 0, 0, 0, 0, -8, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0, 1,-2, 0, 0, 0, -1, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 2, -14, 0, 0, 6), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 6, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, -74, 0, 0, 32), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 2, 0, -3, -1, 0), new PlanetaryNutModel( 0, 2,-2, 1, 0, -5, 5, 0, 0, 0, 0, 0, 0, 4, 0, 0, -2), /* 391-400 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 8, 11, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 3, 2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, -262, 0, 0, 114), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -6, 0, 0, 0, 0, 0, 0, 0, -4, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -3, 6, 0, 0, 0, 0, 0, 1, -7, 0, 0, 4), new PlanetaryNutModel( 0, 0, 0, 0, 0, -3, 6, 0, 0, 0, 0, 0, 2, 0, -27, -12, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -1, 4, 0, 0, 0, 0, 2, -19, -8, -4, 8), new PlanetaryNutModel( 0, 0, 0, 0, 0, -5, 7, 0, 0, 0, 0, 0, 2, 202, 0, 0, -87), new PlanetaryNutModel( 0, 0, 0, 0, 0, -5, 7, 0, 0, 0, 0, 0, 1, -8, 35, 19, 5), new PlanetaryNutModel( 0, 1,-1, 1, 0, -5, 6, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0), /* 401-410 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 5, -7, 0, 0, 0, 0, 0, 0, 16, -5, 0, 0), new PlanetaryNutModel( 0, 2,-2, 1, 0, 0, -1, 0, 1, 0, 0, 0, 0, 5, 0, 0, -3), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, -3, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0,-1, 0, 3, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 2, -35, -48, -21, 15), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -2, 6, 0, 0, 0, 0, 2, -3, -5, -2, 1), new PlanetaryNutModel( 0, 0, 0, 1, 0, 2, -2, 0, 0, 0, 0, 0, 0, 6, 0, 0, -3), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -6, 9, 0, 0, 0, 0, 2, 3, 0, 0, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 6, -9, 0, 0, 0, 0, 0, 0, -5, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -2, 2, 0, 0, 0, 0, 0, 1, 12, 55, 29, -6), /* 411-420 */ new PlanetaryNutModel( 0, 1,-1, 1, 0, -2, 1, 0, 0, 0, 0, 0, 0, 0, 5, 3, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, -598, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, 1, -3, -13, -7, 1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 2, -5, -7, -3, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -5, 7, 0, 0, 0, 0, 2, 3, 0, 0, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 5, -7, 0, 0, 0, 0, 0, 5, -7, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, -2, 2, 0, 0, 0, 0, 0, 0, 4, 0, 0, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, -5, 0, 0, 0, 0, 0, 16, -6, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 1, -3, 0, 0, 0, 0, 0, 0, 8, -3, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -1, 3, 0, 0, 0, 0, 0, 1, 8, -31, -16, -4), /* 421-430 */ new PlanetaryNutModel( 0, 1,-1, 1, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -1, 3, 0, 0, 0, 0, 0, 2, 113, 0, 0, -49), new PlanetaryNutModel( 0, 0, 0, 0, 0, -7, 10, 0, 0, 0, 0, 0, 2, 0, -24, -10, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -7, 10, 0, 0, 0, 0, 0, 1, 4, 0, 0, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, -3, 0, 0, 0, 0, 0, 27, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -4, 8, 0, 0, 0, 0, 0, 2, -3, 0, 0, 1), new PlanetaryNutModel( 0, 0, 0, 0, 0, -4, 5, 0, 0, 0, 0, 0, 2, 0, -4, -2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -4, 5, 0, 0, 0, 0, 0, 1, 5, 0, 0, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 4, -5, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 2, -13, 0, 0, 6), /* 431-440 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -2, 0, 5, 0, 0, 0, 2, 5, 0, 0, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -18, -10, -4, 8), new PlanetaryNutModel( 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -4, -28, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, -5, 6, 3, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, -9, 13, 0, 0, 0, 0, 0, 2, -3, 0, 0, 1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -1, 5, 0, 0, 0, 0, 2, -5, -9, -4, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -2, 0, 4, 0, 0, 0, 2, 17, 0, 0, -7), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0,-4, 0, 0, 0, 0, 11, 4, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -2, 7, 0, 0, 0, 0, 2, 0, -6, -2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0,-3, 0, 0, 0, 0, 83, 15, 0, 0), /* 441-450 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, -2, 5, 0, 0, 0, 0, 0, 1, -4, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, -2, 5, 0, 0, 0, 0, 0, 2, 0,-114, -49, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -6, 8, 0, 0, 0, 0, 0, 2, 117, 0, 0, -51), new PlanetaryNutModel( 0, 0, 0, 0, 0, -6, 8, 0, 0, 0, 0, 0, 1, -5, 19, 10, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 6, -8, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 1, 0, 0, 2, 0,-2, 0, 0, 0, 0, -3, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -3, 9, 0, 0, 0, 0, 2, 0, -3, -1, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 5, -6, 0, 0, 0, 0, 0, 3, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 5, -6, 0, 0, 0, 0, 2, 0, -6, -2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0,-2, 0, 0, 0, 0, 393, 3, 0, 0), /* 451-460 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0,-2, 0, 0, 0, 1, -4, 21, 11, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0,-2, 0, 0, 0, 2, -6, 0, -1, 3), new PlanetaryNutModel( 0, 0, 0, 0, 0, -5, 10, 0, 0, 0, 0, 0, 2, -3, 8, 4, 1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, -4, 0, 0, 0, 0, 0, 8, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, -4, 0, 0, 0, 0, 2, 18, -29, -13, -8), new PlanetaryNutModel( 0, 0, 0, 0, 0, -3, 3, 0, 0, 0, 0, 0, 1, 8, 34, 18, -4), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -3, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -3, 0, 0, 0, 0, 0, 1, 3, 12, 6, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -3, 0, 0, 0, 0, 0, 2, 54, -15, -7, -24), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0, 0,-3, 0, 0, 0, 0, 3, 0, 0), /* 461-470 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -5, 13, 0, 0, 0, 0, 2, 3, 0, 0, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0,-1, 0, 0, 0, 0, 0, 35, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0,-1, 0, 0, 0, 2, -154, -30, -13, 67), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0, 0,-2, 0, 0, 0, 15, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0, 0,-2, 0, 0, 1, 0, 4, 2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, -2, 0, 0, 0, 0, 0, 0, 9, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, -2, 0, 0, 0, 0, 2, 80, -71, -31, -35), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0, 0,-1, 0, 0, 2, 0, -20, -9, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -6, 15, 0, 0, 0, 0, 2, 11, 5, 2, -5), new PlanetaryNutModel( 0, 0, 0, 0, 0, -8, 15, 0, 0, 0, 0, 0, 2, 61, -96, -42, -27), /* 471-480 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, -3, 9, -4, 0, 0, 0, 0, 2, 14, 9, 4, -6), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0, 2,-5, 0, 0, 2, -11, -6, -3, 5), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -2, 8,-1,-5, 0, 0, 2, 0, -3, -1, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 6, -8, 3, 0, 0, 0, 2, 123,-415, -180, -53), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, -35), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 7, -32, -17, -4), new PlanetaryNutModel( 0, 1,-1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -9, -5, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, -4, 2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, -89, 0, 0, 38), /* 481-490 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -6, 16,-4,-5, 0, 0, 2, 0, -86, -19, -6), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -2, 8,-3, 0, 0, 0, 2, 0, 0, -19, 6), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -2, 8,-3, 0, 0, 0, 2, -123,-416, -180, 53), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 6, -8, 1, 5, 0, 0, 2, 0, -3, -1, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0,-2, 5, 0, 0, 2, 12, -6, -3, -5), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -5, 4, 0, 0, 0, 0, 2, -13, 9, 4, 6), new PlanetaryNutModel( 0, 0, 0, 0, 0, -8, 11, 0, 0, 0, 0, 0, 2, 0, -15, -7, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -8, 11, 0, 0, 0, 0, 0, 1, 3, 0, 0, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, -8, 11, 0, 0, 0, 0, 0, 2, -62, -97, -42, 27), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 2, -11, 5, 2, 5), /* 491-500 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 0, 2, 0, -19, -8, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -3, 0, 2, 0, 0, 0, 2, -3, 0, 0, 1), new PlanetaryNutModel( 0, 2,-2, 1, 0, 0, 4, -8, 3, 0, 0, 0, 0, 0, 4, 2, 0), new PlanetaryNutModel( 0, 1,-1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0), new PlanetaryNutModel( 0, 2,-2, 1, 0, 0, -4, 8,-3, 0, 0, 0, 0, 0, 4, 2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 2, -85, -70, -31, 37), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 2, 163, -12, -5, -72), new PlanetaryNutModel( 0, 0, 0, 0, 0, -3, 7, 0, 0, 0, 0, 0, 2, -63, -16, -7, 28), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 2, -21, -32, -14, 9), new PlanetaryNutModel( 0, 0, 0, 0, 0, -5, 6, 0, 0, 0, 0, 0, 2, 0, -3, -1, 0), /* 501-510 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, -5, 6, 0, 0, 0, 0, 0, 1, 3, 0, 0, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 5, -6, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 5, -6, 0, 0, 0, 0, 0, 2, 3, 10, 4, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 3, 0, 0, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -1, 6, 0, 0, 0, 0, 2, 0, -7, -3, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 7, -9, 0, 0, 0, 0, 2, 0, -4, -2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 2, -1, 0, 0, 0, 0, 0, 0, 6, 19, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 2, -1, 0, 0, 0, 0, 0, 2, 5,-173, -75, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 6, -7, 0, 0, 0, 0, 2, 0, -7, -3, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 5, -5, 0, 0, 0, 0, 2, 7, -12, -5, -3), /* 511-520 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 1, -3, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 2, 3, -4, -2, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, -7, 9, 0, 0, 0, 0, 0, 2, 74, 0, 0, -32), new PlanetaryNutModel( 0, 0, 0, 0, 0, -7, 9, 0, 0, 0, 0, 0, 1, -3, 12, 6, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, -3, 0, 0, 0, 0, 2, 26, -14, -6, -11), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, -1, 0, 0, 0, 0, 2, 19, 0, 0, -8), new PlanetaryNutModel( 0, 0, 0, 0, 0, -4, 4, 0, 0, 0, 0, 0, 1, 6, 24, 13, -3), new PlanetaryNutModel( 0, 0, 0, 0, 0, 4, -4, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 4, -4, 0, 0, 0, 0, 0, 1, 0, -10, -5, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 4, -4, 0, 0, 0, 0, 0, 2, 11, -3, -1, -5), /* 521-530 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 2, 3, 0, 1, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -3, 0, 5, 0, 0, 0, 2, 3, 0, 0, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -4, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 5, -23, -12, -3), new PlanetaryNutModel( 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 2, -339, 0, 0, 147), new PlanetaryNutModel( 0, 0, 0, 0, 0, -9, 12, 0, 0, 0, 0, 0, 2, 0, -10, -5, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, 0,-4, 0, 0, 0, 0, 5, 0, 0, 0), new PlanetaryNutModel( 0, 2,-2, 1, 0, 1, -1, 0, 0, 0, 0, 0, 0, 3, 0, 0, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 7, -8, 0, 0, 0, 0, 2, 0, -4, -2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, 0,-3, 0, 0, 0, 0, 18, -3, 0, 0), /* 531-540 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, 0,-3, 0, 0, 0, 2, 9, -11, -5, -4), new PlanetaryNutModel( 0, 0, 0, 0, 0, -2, 6, 0, 0, 0, 0, 0, 2, -8, 0, 0, 4), new PlanetaryNutModel( 0, 0, 0, 0, 0, -6, 7, 0, 0, 0, 0, 0, 1, 3, 0, 0, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 6, -7, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 6, -6, 0, 0, 0, 0, 2, 6, -9, -4, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, 0,-2, 0, 0, 0, 0, -4, -12, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, 0,-2, 0, 0, 0, 2, 67, -91, -39, -29), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 5, -4, 0, 0, 0, 0, 2, 30, -18, -8, -13), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -2, 0, 0, 0, 0, 0, 2, 0,-114, -50, 0), /* 541-550 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, 0,-1, 0, 0, 0, 2, 0, 0, 0, 23), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, 0,-1, 0, 0, 0, 2, 517, 16, 7,-224), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, 0, 0,-2, 0, 0, 2, 0, -7, -3, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, -2, 0, 0, 0, 0, 2, 143, -3, -1, -62), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, 0, 0,-1, 0, 0, 2, 29, 0, 0, -13), new PlanetaryNutModel( 0, 2,-2, 1, 0, 0, 1, 0,-1, 0, 0, 0, 0, -4, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, -8, 16, 0, 0, 0, 0, 0, 2, -6, 0, 0, 3), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, 0, 2,-5, 0, 0, 2, 5, 12, 5, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 7, -8, 3, 0, 0, 0, 2, -25, 0, 0, 11), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -5, 16,-4,-5, 0, 0, 2, -3, 0, 0, 1), /* 551-560 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 2, 0, 4, 2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, -1, 8,-3, 0, 0, 0, 2, -22, 12, 5, 10), new PlanetaryNutModel( 0, 0, 0, 0, 0, -8, 10, 0, 0, 0, 0, 0, 2, 50, 0, 0, -22), new PlanetaryNutModel( 0, 0, 0, 0, 0, -8, 10, 0, 0, 0, 0, 0, 1, 0, 7, 4, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -8, 10, 0, 0, 0, 0, 0, 2, 0, 3, 1, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, -4, 4, 2, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 2, -5, -11, -5, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, -3, 8, 0, 0, 0, 0, 0, 2, 0, 4, 2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -5, 5, 0, 0, 0, 0, 0, 1, 4, 17, 9, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 5, -5, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0), /* 561-570 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 5, -5, 0, 0, 0, 0, 0, 1, 0, -4, -2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 5, -5, 0, 0, 0, 0, 0, 2, -8, 0, 0, 4), new PlanetaryNutModel( 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 4, -15, -8, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 370, -8, 0,-160), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 7, -7, 0, 0, 0, 0, 2, 0, 0, -3, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 7, -7, 0, 0, 0, 0, 2, 0, 3, 1, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 6, -5, 0, 0, 0, 0, 2, -6, 3, 1, 3), new PlanetaryNutModel( 0, 0, 0, 0, 0, 7, -8, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 5, -3, 0, 0, 0, 0, 2, -10, 0, 0, 4), /* 571-580 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 4, -3, 0, 0, 0, 0, 0, 2, 0, 9, 4, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 2, 4, 17, 7, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, -9, 11, 0, 0, 0, 0, 0, 2, 34, 0, 0, -15), new PlanetaryNutModel( 0, 0, 0, 0, 0, -9, 11, 0, 0, 0, 0, 0, 1, 0, 5, 3, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, 0,-4, 0, 0, 0, 2, -5, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, 0,-3, 0, 0, 0, 2, -37, -7, -3, 16), new PlanetaryNutModel( 0, 0, 0, 0, 0, -6, 6, 0, 0, 0, 0, 0, 1, 3, 13, 7, -2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 6, -6, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 6, -6, 0, 0, 0, 0, 0, 1, 0, -3, -2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, 0,-2, 0, 0, 0, 2, -184, -3, -1, 80), /* 581-590 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 6, -4, 0, 0, 0, 0, 2, -3, 0, 0, 1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -1, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -1, 0, 0, 0, 0, 0, 1, 0, -10, -6, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, -1, 0, 0, 0, 0, 0, 2, 31, -6, 0, -13), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, 0,-1, 0, 0, 0, 2, -3, -32, -14, 1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, 0, 0,-2, 0, 0, 2, -7, 0, 0, 3), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 5, -2, 0, 0, 0, 0, 2, 0, -8, -4, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 3, -4, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 8, -9, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 5, -4, 0, 0, 0, 0, 0, 2, 0, 3, 1, 0), /* 591-600 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 2, 19, -23, -10, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, -10), new PlanetaryNutModel( 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 1, 0, 3, 2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -7, 7, 0, 0, 0, 0, 0, 1, 0, 9, 5, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 7, -7, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 4, -2, 0, 0, 0, 0, 0, 1, 0, -7, -4, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 4, -2, 0, 0, 0, 0, 0, 2, 8, -4, 0, -4), new PlanetaryNutModel( 0, 0, 0, 0, 0, 4, -2, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 4, -2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 5, 0,-4, 0, 0, 0, 2, -3, 0, 0, 1), /* 601-610 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 5, 0,-3, 0, 0, 0, 2, -9, 0, 1, 4), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 5, 0,-2, 0, 0, 0, 2, 3, 12, 5, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 17, -3, -1, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -8, 8, 0, 0, 0, 0, 0, 1, 0, 7, 4, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 8, -8, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 5, -3, 0, 0, 0, 0, 0, 1, 0, -5, -3, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 5, -3, 0, 0, 0, 0, 0, 2, 14, -3, 0, -1), new PlanetaryNutModel( 0, 0, 0, 0, 0, -9, 9, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, -9, 9, 0, 0, 0, 0, 0, 1, 0, 0, 0, -5), new PlanetaryNutModel( 0, 0, 0, 0, 0, -9, 9, 0, 0, 0, 0, 0, 1, 0, 5, 3, 0), /* 611-620 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 9, -9, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 6, -4, 0, 0, 0, 0, 0, 1, 0, -3, -2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 2, 2, 9, 4, 3), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 1, 0, 4, 2, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 2, 6, 0, 0, -3), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 1, 0, 3, 1, 0), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 2, 5, 0, 0, -2), /* 621-630 */ new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, -1), new PlanetaryNutModel( 1, 0,-2, 0, 0, 0, 2, 0,-2, 0, 0, 0, 0, -3, 0, 0, 0), new PlanetaryNutModel( 1, 0,-2, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0), new PlanetaryNutModel( 1, 0,-2, 0, 0, 0, 1, 0,-1, 0, 0, 0, 0, 7, 0, 0, 0), new PlanetaryNutModel( 1, 0,-2, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, -4, 0, 0, 0), new PlanetaryNutModel(-1, 0, 0, 0, 0, 3, -3, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0), new PlanetaryNutModel(-1, 0, 0, 0, 0, 0, 2, 0,-2, 0, 0, 0, 0, 6, 0, 0, 0), new PlanetaryNutModel(-1, 0, 2, 0, 0, 0, 4, -8, 3, 0, 0, 0, 0, 0, -4, 0, 0), new PlanetaryNutModel( 1, 0,-2, 0, 0, 0, 4, -8, 3, 0, 0, 0, 0, 0, -4, 0, 0), new PlanetaryNutModel(-2, 0, 2, 0, 0, 0, 4, -8, 3, 0, 0, 0, 0, 5, 0, 0, 0), /* 631-640 */ new PlanetaryNutModel(-1, 0, 0, 0, 0, 0, 2, 0,-3, 0, 0, 0, 0, -3, 0, 0, 0), new PlanetaryNutModel(-1, 0, 0, 0, 0, 0, 1, 0,-1, 0, 0, 0, 0, 4, 0, 0, 0), new PlanetaryNutModel(-1, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0), new PlanetaryNutModel(-1, 0, 2, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0), new PlanetaryNutModel( 1,-1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0), new PlanetaryNutModel(-1, 0, 2, 0, 0, 0, 2, 0,-3, 0, 0, 0, 0, 13, 0, 0, 0), new PlanetaryNutModel(-2, 0, 0, 0, 0, 0, 2, 0,-3, 0, 0, 0, 0, 21, 11, 0, 0), new PlanetaryNutModel( 1, 0, 0, 0, 0, 0, 4, -8, 3, 0, 0, 0, 0, 0, -5, 0, 0), new PlanetaryNutModel(-1, 1,-1, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -5, -2, 0), new PlanetaryNutModel( 1, 1,-1, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 5, 3, 0), /* 641-650 */ new PlanetaryNutModel(-1, 0, 0, 0, 0, 0, 4, -8, 3, 0, 0, 0, 0, 0, -5, 0, 0), new PlanetaryNutModel(-1, 0, 2, 1, 0, 0, 2, 0,-2, 0, 0, 0, 0, -3, 0, 0, 2), new PlanetaryNutModel( 0, 0, 0, 0, 0, 0, 2, 0,-2, 0, 0, 0, 0, 20, 10, 0, 0), new PlanetaryNutModel(-1, 0, 2, 0, 0, 0, 2, 0,-2, 0, 0, 0, 0, -34, 0, 0, 0), new PlanetaryNutModel(-1, 0, 2, 0, 0, 3, -3, 0, 0, 0, 0, 0, 0, -19, 0, 0, 0), new PlanetaryNutModel( 1, 0,-2, 1, 0, 0, -2, 0, 2, 0, 0, 0, 0, 3, 0, 0, -2), new PlanetaryNutModel( 1, 2,-2, 2, 0, -3, 3, 0, 0, 0, 0, 0, 0, -3, 0, 0, 1), new PlanetaryNutModel( 1, 2,-2, 2, 0, 0, -2, 0, 2, 0, 0, 0, 0, -6, 0, 0, 3), new PlanetaryNutModel( 1, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, -4, 0, 0, 0), new PlanetaryNutModel( 1, 0, 0, 0, 0, 0, 1, 0,-1, 0, 0, 0, 0, 3, 0, 0, 0), /* 651-660 */ new PlanetaryNutModel( 0, 0,-2, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0), new PlanetaryNutModel( 0, 0,-2, 0, 0, 0, 1, 0,-1, 0, 0, 0, 0, 4, 0, 0, 0), new PlanetaryNutModel( 0, 2, 0, 2, 0, -2, 2, 0, 0, 0, 0, 0, 0, 3, 0, 0, -1), new PlanetaryNutModel( 0, 2, 0, 2, 0, 0, -1, 0, 1, 0, 0, 0, 0, 6, 0, 0, -3), new PlanetaryNutModel( 0, 2, 0, 2, 0, -1, 1, 0, 0, 0, 0, 0, 0, -8, 0, 0, 3), new PlanetaryNutModel( 0, 2, 0, 2, 0, -2, 3, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0), new PlanetaryNutModel( 0, 0, 2, 0, 0, 0, 2, 0,-2, 0, 0, 0, 0, -3, 0, 0, 0), new PlanetaryNutModel( 0, 1, 1, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -3, -2, 0), new PlanetaryNutModel( 1, 2, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 126, -63, -27, -55), new PlanetaryNutModel(-1, 2, 0, 2, 0, 10, -3, 0, 0, 0, 0, 0, 0, -5, 0, 1, 2), /* 661-670 */ new PlanetaryNutModel( 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, -3, 28, 15, 2), new PlanetaryNutModel( 1, 2, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 5, 0, 1, -2), new PlanetaryNutModel( 0, 2, 0, 2, 0, 0, 4, -8, 3, 0, 0, 0, 0, 0, 9, 4, 1), new PlanetaryNutModel( 0, 2, 0, 2, 0, 0, -4, 8,-3, 0, 0, 0, 0, 0, 9, 4, -1), new PlanetaryNutModel(-1, 2, 0, 2, 0, 0, -4, 8,-3, 0, 0, 0, 0, -126, -63, -27, 55), new PlanetaryNutModel( 2, 2,-2, 2, 0, 0, -2, 0, 3, 0, 0, 0, 0, 3, 0, 0, -1), new PlanetaryNutModel( 1, 2, 0, 1, 0, 0, -2, 0, 3, 0, 0, 0, 0, 21, -11, -6, -11), new PlanetaryNutModel( 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -4, 0, 0), new PlanetaryNutModel(-1, 2, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, -21, -11, -6, 11), new PlanetaryNutModel(-2, 2, 2, 2, 0, 0, 2, 0,-2, 0, 0, 0, 0, -3, 0, 0, 1), /* 671-680 */ new PlanetaryNutModel( 0, 2, 0, 2, 0, 2, -3, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0), new PlanetaryNutModel( 0, 2, 0, 2, 0, 1, -1, 0, 0, 0, 0, 0, 0, 8, 0, 0, -4), new PlanetaryNutModel( 0, 2, 0, 2, 0, 0, 1, 0,-1, 0, 0, 0, 0, -6, 0, 0, 3), new PlanetaryNutModel( 0, 2, 0, 2, 0, 2, -2, 0, 0, 0, 0, 0, 0, -3, 0, 0, 1), new PlanetaryNutModel(-1, 2, 2, 2, 0, 0, -1, 0, 1, 0, 0, 0, 0, 3, 0, 0, -1), new PlanetaryNutModel( 1, 2, 0, 2, 0, -1, 1, 0, 0, 0, 0, 0, 0, -3, 0, 0, 1), new PlanetaryNutModel(-1, 2, 2, 2, 0, 0, 2, 0,-3, 0, 0, 0, 0, -5, 0, 0, 2), new PlanetaryNutModel( 2, 2, 0, 2, 0, 0, 2, 0,-3, 0, 0, 0, 0, 24, -12, -5, -11), new PlanetaryNutModel( 1, 2, 0, 2, 0, 0, -4, 8,-3, 0, 0, 0, 0, 0, 3, 1, 0), new PlanetaryNutModel( 1, 2, 0, 2, 0, 0, 4, -8, 3, 0, 0, 0, 0, 0, 3, 1, 0), /* 681-687 */ new PlanetaryNutModel( 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0), new PlanetaryNutModel( 0, 2, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, -24, -12, -5, 10), new PlanetaryNutModel( 2, 2, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 4, 0, -1, -2), new PlanetaryNutModel(-1, 2, 2, 2, 0, 0, 2, 0,-2, 0, 0, 0, 0, 13, 0, 0, -6), new PlanetaryNutModel(-1, 2, 2, 2, 0, 3, -3, 0, 0, 0, 0, 0, 0, 7, 0, 0, -3), new PlanetaryNutModel( 1, 2, 0, 2, 0, 1, -1, 0, 0, 0, 0, 0, 0, 3, 0, 0, -1), new PlanetaryNutModel( 0, 2, 2, 2, 0, 0, 2, 0,-2, 0, 0, 0, 0, 3, 0, 0, -1) }; /* Number of terms in the planetary nutation model */ final int NPL = xpl.length; /*--------------------------------------------------------------------*/ /* Interval between fundamental date J2000.0 and given date (JC). */ t = ((date1 - DJ00) + date2) / DJC; /* ------------------- */ /* LUNI-SOLAR NUTATION */ /* ------------------- */ /* Fundamental (Delaunay) arguments */ /* Mean anomaly of the Moon (IERS 2003). */ el = jauFal03(t); /* Mean anomaly of the Sun (MHB2000). */ elp = fmod(1287104.79305 + t * (129596581.0481 + t * (-0.5532 + t * (0.000136 + t * (-0.00001149)))), TURNAS) * DAS2R; /* Mean longitude of the Moon minus that of the ascending node */ /* (IERS 2003. */ f = jauFaf03(t); /* Mean elongation of the Moon from the Sun (MHB2000). */ d = fmod(1072260.70369 + t * (1602961601.2090 + t * (-6.3706 + t * (0.006593 + t * (-0.00003169)))), TURNAS) * DAS2R; /* Mean longitude of the ascending node of the Moon (IERS 2003). */ om = jauFaom03(t); /* Initialize the nutation values. */ dp = 0.0; de = 0.0; /* Summation of luni-solar nutation series (in reverse order). */ for (i = NLS-1; i >= 0; i--) { /* Argument and functions. */ arg = fmod((double)xls[i].nl * el + (double)xls[i].nlp * elp + (double)xls[i].nf * f + (double)xls[i].nd * d + (double)xls[i].nom * om, D2PI); sarg = sin(arg); carg = cos(arg); /* Term. */ dp += (xls[i].sp + xls[i].spt * t) * sarg + xls[i].cp * carg; de += (xls[i].ce + xls[i].cet * t) * carg + xls[i].se * sarg; } /* Convert from 0.1 microarcsec units to radians. */ dpsils = dp * U2R; depsls = de * U2R; /* ------------------ */ /* PLANETARY NUTATION */ /* ------------------ */ /* n.b. The MHB2000 code computes the luni-solar and planetary nutation */ /* in different functions, using slightly different Delaunay */ /* arguments in the two cases. This behaviour is faithfully */ /* reproduced here. Use of the IERS 2003 expressions for both */ /* cases leads to negligible changes, well below */ /* 0.1 microarcsecond. */ /* Mean anomaly of the Moon (MHB2000). */ al = fmod(2.35555598 + 8328.6914269554 * t, D2PI); /* Mean longitude of the Moon minus that of the ascending node */ /*(MHB2000). */ af = fmod(1.627905234 + 8433.466158131 * t, D2PI); /* Mean elongation of the Moon from the Sun (MHB2000). */ ad = fmod(5.198466741 + 7771.3771468121 * t, D2PI); /* Mean longitude of the ascending node of the Moon (MHB2000). */ aom = fmod(2.18243920 - 33.757045 * t, D2PI); /* General accumulated precession in longitude (IERS 2003). */ apa = jauFapa03(t); /* Planetary longitudes, Mercury through Uranus (IERS 2003). */ alme = jauFame03(t); alve = jauFave03(t); alea = jauFae03(t); alma = jauFama03(t); alju = jauFaju03(t); alsa = jauFasa03(t); alur = jauFaur03(t); /* Neptune longitude (MHB2000). */ alne = fmod(5.321159000 + 3.8127774000 * t, D2PI); /* Initialize the nutation values. */ dp = 0.0; de = 0.0; /* Summation of planetary nutation series (in reverse order). */ for (i = NPL-1; i >= 0; i--) { /* Argument and functions. */ arg = fmod((double)xpl[i].nl * al + (double)xpl[i].nf * af + (double)xpl[i].nd * ad + (double)xpl[i].nom * aom + (double)xpl[i].nme * alme + (double)xpl[i].nve * alve + (double)xpl[i].nea * alea + (double)xpl[i].nma * alma + (double)xpl[i].nju * alju + (double)xpl[i].nsa * alsa + (double)xpl[i].nur * alur + (double)xpl[i].nne * alne + (double)xpl[i].npa * apa, D2PI); sarg = sin(arg); carg = cos(arg); /* Term. */ dp += (double)xpl[i].sp * sarg + (double)xpl[i].cp * carg; de += (double)xpl[i].se * sarg + (double)xpl[i].ce * carg; } /* Convert from 0.1 microarcsec units to radians. */ dpsipl = dp * U2R; depspl = de * U2R; /* ------- */ /* RESULTS */ /* ------- */ /* Add luni-solar and planetary components. */ return new NutationTerms( dpsils + dpsipl, depsls + depspl); } private final static class LSNutationModel { final int nl,nlp,nf,nd,nom; /* coefficients of l,l',F,D,Om */ final double ps,pst,pc; /* longitude sin, t*sin, cos coefficients */ final double ec,ect,es; /* obliquity cos, t*cos, sin coefficients */ public LSNutationModel( int nl,int nlp,int nf,int nd,int nom, double ps, double pst, double pc, double ec, double ect, double es ) { this.nl = nl;this.nlp = nlp;this.nf = nf;this.nd = nd;this.nom = nom; this.ps = ps;this.pst = pst;this.pc = pc; this.ec = ec;this.ect = ect; this.es= es; } } /** * Nutation, IAU 2000B model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return nutation, luni-solar + planetary (Note 2) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The nutation components in longitude and obliquity are in radians * and with respect to the equinox and ecliptic of date. The * obliquity at J2000.0 is assumed to be the Lieske et al. (1977) * value of 84381.448 arcsec. (The errors that result from using * this function with the IAU 2006 value of 84381.406 arcsec can be * neglected.) * * The nutation model consists only of luni-solar terms, but * includes also a fixed offset which compensates for certain long- * period planetary terms (Note 7). * *
  3. This function is an implementation of the IAU 2000B abridged * nutation model formally adopted by the IAU General Assembly in * 2000. The function computes the MHB_2000_SHORT luni-solar * nutation series (Luzum 2001), but without the associated * corrections for the precession rate adjustments and the offset * between the GCRS and J2000.0 mean poles. * *
  4. The full IAU 2000A (MHB2000) nutation model contains nearly 1400 * terms. The IAU 2000B model (McCarthy & Luzum 2003) contains only * 77 terms, plus additional simplifications, yet still delivers * results of 1 mas accuracy at present epochs. This combination of * accuracy and size makes the IAU 2000B abridged nutation model * suitable for most practical applications. * * The function delivers a pole accurate to 1 mas from 1900 to 2100 * (usually better than 1 mas, very occasionally just outside * 1 mas). The full IAU 2000A model, which is implemented in the * function jauNut00a (q.v.), delivers considerably greater accuracy * at current dates; however, to realize this improved accuracy, * corrections for the essentially unpredictable free-core-nutation * (FCN) must also be included. * *
  5. The present function provides classical nutation. The * MHB_2000_SHORT algorithm, from which it is adapted, deals also * with (i) the offsets between the GCRS and mean poles and (ii) the * adjustments in longitude and obliquity due to the changed * precession rates. These additional functions, namely frame bias * and precession adjustments, are supported by the JSOFA functions * jauBi00 and jauPr00. * *
  6. The MHB_2000_SHORT algorithm also provides "total" nutations, * comprising the arithmetic sum of the frame bias, precession * adjustments, and nutation (luni-solar + planetary). These total * nutations can be used in combination with an existing IAU 1976 * precession implementation, such as jauPmat76, to deliver GCRS- * to-true predictions of mas accuracy at current epochs. However, * for symmetry with the jauNut00a function (q.v. for the reasons), * the JSOFA functions do not generate the "total nutations" * directly. Should they be required, they could of course easily * be generated by calling jauBi00, jauPr00 and the present function * and adding the results. * *
  7. The IAU 2000B model includes "planetary bias" terms that are * fixed in size but compensate for long-period nutations. The * amplitudes quoted in McCarthy & Luzum (2003), namely * Dpsi = -1.5835 mas and Depsilon = +1.6339 mas, are optimized for * the "total nutations" method described in Note 6. The Luzum * (2001) values used in this JSOFA implementation, namely -0.135 mas * and +0.388 mas, are optimized for the "rigorous" method, where * frame bias, precession and nutation are applied separately and in * that order. During the interval 1995-2050, the JSOFA * implementation delivers a maximum error of 1.001 mas (not * including FCN). *
*

References: * *

Lieske, J.H., Lederle, T., Fricke, W., Morando, B., "Expressions * for the precession quantities based upon the IAU /1976/ system of * astronomical constants", Astron.Astrophys. 58, 1-2, 1-16. (1977) * *

Luzum, B., private communication, 2001 (Fortran code * MHB_2000_SHORT) * *

McCarthy, D.D. & Luzum, B.J., "An abridged model of the * precession-nutation of the celestial pole", Cel.Mech.Dyn.Astron. * 85, 37-49 (2003) * *

Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G., Laskar, J., Astron.Astrophys. 282, 663-683 (1994) * *@version 2009 December 17 * * @since Release 20101201 * * */ public static NutationTerms jauNut00b(double date1, double date2) { double t, el, elp, f, d, om, arg, dp, de, sarg, carg, dpsils, depsls, dpsipl, depspl; int i; /* Units of 0.1 microarcsecond to radians */ final double U2R = DAS2R / 1e7; /* ---------------------------------------- */ /* Fixed offsets in lieu of planetary terms */ /* ---------------------------------------- */ final double DPPLAN = -0.135 * DMAS2R; final double DEPLAN = 0.388 * DMAS2R; /* --------------------------------------------------- */ /* Luni-solar nutation: argument and term coefficients */ /* --------------------------------------------------- */ /* The units for the sine and cosine coefficients are */ /* 0.1 microarcsec and the same per Julian century */ LSNutationModel x[] = { /* 1-10 */ new LSNutationModel( 0, 0, 0, 0,1, -172064161.0, -174666.0, 33386.0, 92052331.0, 9086.0, 15377.0), new LSNutationModel( 0, 0, 2,-2,2, -13170906.0, -1675.0, -13696.0, 5730336.0, -3015.0, -4587.0), new LSNutationModel( 0, 0, 2, 0,2,-2276413.0,-234.0, 2796.0, 978459.0,-485.0,1374.0), new LSNutationModel( 0, 0, 0, 0,2,2074554.0, 207.0, -698.0,-897492.0, 470.0,-291.0), new LSNutationModel( 0, 1, 0, 0,0,1475877.0,-3633.0,11817.0, 73871.0,-184.0,-1924.0), new LSNutationModel( 0, 1, 2,-2,2,-516821.0, 1226.0, -524.0, 224386.0,-677.0,-174.0), new LSNutationModel( 1, 0, 0, 0,0, 711159.0, 73.0, -872.0, -6750.0, 0.0, 358.0), new LSNutationModel( 0, 0, 2, 0,1,-387298.0, -367.0, 380.0, 200728.0, 18.0, 318.0), new LSNutationModel( 1, 0, 2, 0,2,-301461.0, -36.0, 816.0, 129025.0, -63.0, 367.0), new LSNutationModel( 0,-1, 2,-2,2, 215829.0, -494.0, 111.0, -95929.0, 299.0, 132.0), /* 11-20 */ new LSNutationModel( 0, 0, 2,-2,1, 128227.0, 137.0, 181.0, -68982.0, -9.0, 39.0), new LSNutationModel(-1, 0, 2, 0,2, 123457.0, 11.0, 19.0, -53311.0, 32.0, -4.0), new LSNutationModel(-1, 0, 0, 2,0, 156994.0, 10.0, -168.0, -1235.0, 0.0, 82.0), new LSNutationModel( 1, 0, 0, 0,1, 63110.0, 63.0, 27.0, -33228.0, 0.0, -9.0), new LSNutationModel(-1, 0, 0, 0,1, -57976.0, -63.0, -189.0, 31429.0, 0.0, -75.0), new LSNutationModel(-1, 0, 2, 2,2, -59641.0, -11.0, 149.0, 25543.0, -11.0, 66.0), new LSNutationModel( 1, 0, 2, 0,1, -51613.0, -42.0, 129.0, 26366.0, 0.0, 78.0), new LSNutationModel(-2, 0, 2, 0,1, 45893.0, 50.0, 31.0, -24236.0, -10.0, 20.0), new LSNutationModel( 0, 0, 0, 2,0, 63384.0, 11.0, -150.0, -1220.0, 0.0, 29.0), new LSNutationModel( 0, 0, 2, 2,2, -38571.0, -1.0, 158.0, 16452.0, -11.0, 68.0), /* 21-30 */ new LSNutationModel( 0,-2, 2,-2,2, 32481.0, 0.0, 0.0, -13870.0, 0.0, 0.0), new LSNutationModel(-2, 0, 0, 2,0, -47722.0, 0.0, -18.0, 477.0, 0.0, -25.0), new LSNutationModel( 2, 0, 2, 0,2, -31046.0, -1.0, 131.0, 13238.0, -11.0, 59.0), new LSNutationModel( 1, 0, 2,-2,2, 28593.0, 0.0, -1.0, -12338.0, 10.0, -3.0), new LSNutationModel(-1, 0, 2, 0,1, 20441.0, 21.0, 10.0, -10758.0, 0.0, -3.0), new LSNutationModel( 2, 0, 0, 0,0, 29243.0, 0.0, -74.0, -609.0, 0.0, 13.0), new LSNutationModel( 0, 0, 2, 0,0, 25887.0, 0.0, -66.0, -550.0, 0.0, 11.0), new LSNutationModel( 0, 1, 0, 0,1, -14053.0, -25.0, 79.0, 8551.0, -2.0, -45.0), new LSNutationModel(-1, 0, 0, 2,1, 15164.0, 10.0, 11.0, -8001.0, 0.0, -1.0), new LSNutationModel( 0, 2, 2,-2,2, -15794.0, 72.0, -16.0, 6850.0, -42.0, -5.0), /* 31-40 */ new LSNutationModel( 0, 0,-2, 2,0, 21783.0, 0.0, 13.0, -167.0, 0.0, 13.0), new LSNutationModel( 1, 0, 0,-2,1, -12873.0, -10.0, -37.0, 6953.0, 0.0, -14.0), new LSNutationModel( 0,-1, 0, 0,1, -12654.0, 11.0, 63.0, 6415.0, 0.0, 26.0), new LSNutationModel(-1, 0, 2, 2,1, -10204.0, 0.0, 25.0, 5222.0, 0.0, 15.0), new LSNutationModel( 0, 2, 0, 0,0, 16707.0, -85.0, -10.0, 168.0, -1.0, 10.0), new LSNutationModel( 1, 0, 2, 2,2, -7691.0, 0.0, 44.0, 3268.0, 0.0, 19.0), new LSNutationModel(-2, 0, 2, 0,0, -11024.0, 0.0, -14.0, 104.0, 0.0, 2.0), new LSNutationModel( 0, 1, 2, 0,2, 7566.0, -21.0, -11.0, -3250.0, 0.0, -5.0), new LSNutationModel( 0, 0, 2, 2,1, -6637.0, -11.0, 25.0, 3353.0, 0.0, 14.0), new LSNutationModel( 0,-1, 2, 0,2, -7141.0, 21.0, 8.0, 3070.0, 0.0, 4.0), /* 41-50 */ new LSNutationModel( 0, 0, 0, 2,1, -6302.0, -11.0, 2.0, 3272.0, 0.0, 4.0), new LSNutationModel( 1, 0, 2,-2,1, 5800.0, 10.0, 2.0, -3045.0, 0.0, -1.0), new LSNutationModel( 2, 0, 2,-2,2, 6443.0, 0.0, -7.0, -2768.0, 0.0, -4.0), new LSNutationModel(-2, 0, 0, 2,1, -5774.0, -11.0, -15.0, 3041.0, 0.0, -5.0), new LSNutationModel( 2, 0, 2, 0,1, -5350.0, 0.0, 21.0, 2695.0, 0.0, 12.0), new LSNutationModel( 0,-1, 2,-2,1, -4752.0, -11.0, -3.0, 2719.0, 0.0, -3.0), new LSNutationModel( 0, 0, 0,-2,1, -4940.0, -11.0, -21.0, 2720.0, 0.0, -9.0), new LSNutationModel(-1,-1, 0, 2,0, 7350.0, 0.0, -8.0, -51.0, 0.0, 4.0), new LSNutationModel( 2, 0, 0,-2,1, 4065.0, 0.0, 6.0, -2206.0, 0.0, 1.0), new LSNutationModel( 1, 0, 0, 2,0, 6579.0, 0.0, -24.0, -199.0, 0.0, 2.0), /* 51-60 */ new LSNutationModel( 0, 1, 2,-2,1, 3579.0, 0.0, 5.0, -1900.0, 0.0, 1.0), new LSNutationModel( 1,-1, 0, 0,0, 4725.0, 0.0, -6.0, -41.0, 0.0, 3.0), new LSNutationModel(-2, 0, 2, 0,2, -3075.0, 0.0, -2.0, 1313.0, 0.0, -1.0), new LSNutationModel( 3, 0, 2, 0,2, -2904.0, 0.0, 15.0, 1233.0, 0.0, 7.0), new LSNutationModel( 0,-1, 0, 2,0, 4348.0, 0.0, -10.0, -81.0, 0.0, 2.0), new LSNutationModel( 1,-1, 2, 0,2, -2878.0, 0.0, 8.0, 1232.0, 0.0, 4.0), new LSNutationModel( 0, 0, 0, 1,0, -4230.0, 0.0, 5.0, -20.0, 0.0, -2.0), new LSNutationModel(-1,-1, 2, 2,2, -2819.0, 0.0, 7.0, 1207.0, 0.0, 3.0), new LSNutationModel(-1, 0, 2, 0,0, -4056.0, 0.0, 5.0, 40.0, 0.0, -2.0), new LSNutationModel( 0,-1, 2, 2,2, -2647.0, 0.0, 11.0, 1129.0, 0.0, 5.0), /* 61-70 */ new LSNutationModel(-2, 0, 0, 0,1, -2294.0, 0.0, -10.0, 1266.0, 0.0, -4.0), new LSNutationModel( 1, 1, 2, 0,2, 2481.0, 0.0, -7.0, -1062.0, 0.0, -3.0), new LSNutationModel( 2, 0, 0, 0,1, 2179.0, 0.0, -2.0, -1129.0, 0.0, -2.0), new LSNutationModel(-1, 1, 0, 1,0, 3276.0, 0.0, 1.0, -9.0, 0.0, 0.0), new LSNutationModel( 1, 1, 0, 0,0, -3389.0, 0.0, 5.0, 35.0, 0.0, -2.0), new LSNutationModel( 1, 0, 2, 0,0, 3339.0, 0.0, -13.0, -107.0, 0.0, 1.0), new LSNutationModel(-1, 0, 2,-2,1, -1987.0, 0.0, -6.0, 1073.0, 0.0, -2.0), new LSNutationModel( 1, 0, 0, 0,2, -1981.0, 0.0, 0.0, 854.0, 0.0, 0.0), new LSNutationModel(-1, 0, 0, 1,0, 4026.0, 0.0, -353.0, -553.0, 0.0,-139.0), new LSNutationModel( 0, 0, 2, 1,2, 1660.0, 0.0, -5.0, -710.0, 0.0, -2.0), /* 71-77 */ new LSNutationModel(-1, 0, 2, 4,2, -1521.0, 0.0, 9.0, 647.0, 0.0, 4.0), new LSNutationModel(-1, 1, 0, 1,1, 1314.0, 0.0, 0.0, -700.0, 0.0, 0.0), new LSNutationModel( 0,-2, 2,-2,1, -1283.0, 0.0, 0.0, 672.0, 0.0, 0.0), new LSNutationModel( 1, 0, 2, 2,1, -1331.0, 0.0, 8.0, 663.0, 0.0, 4.0), new LSNutationModel(-2, 0, 2, 2,2, 1383.0, 0.0, -2.0, -594.0, 0.0, -2.0), new LSNutationModel(-1, 0, 0, 0,2, 1405.0, 0.0, 4.0, -610.0, 0.0, 2.0), new LSNutationModel( 1, 1, 2,-2,2, 1290.0, 0.0, 0.0, -556.0, 0.0, 0.0) }; /* Number of terms in the series */ final int NLS = x.length; /*--------------------------------------------------------------------*/ /* Interval between fundamental epoch J2000.0 and given date (JC). */ t = ((date1 - DJ00) + date2) / DJC; /* --------------------*/ /* LUNI-SOLAR NUTATION */ /* --------------------*/ /* Fundamental (Delaunay) arguments from Simon et al. (1994) */ /* Mean anomaly of the Moon. */ el = fmod(485868.249036 + (1717915923.2178) * t, TURNAS) * DAS2R; /* Mean anomaly of the Sun. */ elp = fmod(1287104.79305 + (129596581.0481) * t, TURNAS) * DAS2R; /* Mean argument of the latitude of the Moon. */ f = fmod(335779.526232 + (1739527262.8478) * t, TURNAS) * DAS2R; /* Mean elongation of the Moon from the Sun. */ d = fmod(1072260.70369 + (1602961601.2090) * t, TURNAS) * DAS2R; /* Mean longitude of the ascending node of the Moon. */ om = fmod(450160.398036 + (-6962890.5431) * t, TURNAS) * DAS2R; /* Initialize the nutation values. */ dp = 0.0; de = 0.0; /* Summation of luni-solar nutation series (smallest terms first). */ for (i = NLS-1; i >= 0; i--) { /* Argument and functions. */ arg = fmod( (double)x[i].nl * el + (double)x[i].nlp * elp + (double)x[i].nf * f + (double)x[i].nd * d + (double)x[i].nom * om, D2PI ); sarg = sin(arg); carg = cos(arg); /* Term. */ dp += (x[i].ps + x[i].pst * t) * sarg + x[i].pc * carg; de += (x[i].ec + x[i].ect * t) * carg + x[i].es * sarg; } /* Convert from 0.1 microarcsec units to radians. */ dpsils = dp * U2R; depsls = de * U2R; /* ------------------------------*/ /* IN LIEU OF PLANETARY NUTATION */ /* ------------------------------*/ /* Fixed offset to correct for missing terms in truncated series. */ dpsipl = DPPLAN; depspl = DEPLAN; /* --------*/ /* RESULTS */ /* --------*/ /* Add luni-solar and planetary components. */ return new NutationTerms( dpsils + dpsipl, depsls + depspl); } /** * IAU 2000A nutation with adjustments to match the IAU 2006 * precession. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return nutation, luni-solar + planetary (Note 2) * *

Status: canonical model. * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The nutation components in longitude and obliquity are in radians * and with respect to the mean equinox and ecliptic of date, * IAU 2006 precession model (Hilton et al. 2006, Capitaine et al. * 2005). * *
  3. The function first computes the IAU 2000A nutation, then applies * adjustments for (i) the consequences of the change in obliquity * from the IAU 1980 ecliptic to the IAU 2006 ecliptic and (ii) the * secular variation in the Earth's dynamical flattening. * *
  4. The present function provides classical nutation, complementing * the IAU 2000 frame bias and IAU 2006 precession. It delivers a * pole which is at current epochs accurate to a few tens of * microarcseconds, apart from the free core nutation. *
*

Called:

    *
  • {@link #jauNut00a} nutation, IAU 2000A *
*

References: * *

Chapront, J., Chapront-Touze, M. & Francou, G. 2002, * Astron.Astrophys. 387, 700 * *

Lieske, J.H., Lederle, T., Fricke, W. & Morando, B. 1977, * Astron.Astrophys. 58, 1-16 * *

Mathews, P.M., Herring, T.A., Buffet, B.A. 2002, J.Geophys.Res. * 107, B4. The MHB_2000 code itself was obtained on 9th September * 2002 from ftp//maia.usno.navy.mil/conv2000/chapter5/IAU2000A. * *

Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G., Laskar, J. 1994, Astron.Astrophys. 282, 663-683 * *

Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M. 1999, * Astron.Astrophys.Supp.Ser. 135, 111 * *

Wallace, P.T., "Software for Implementing the IAU 2000 * Resolutions", in IERS Workshop 5.1 (2002) * *@version 2008 May 24 * * @since Release 20101201 * * */ public static NutationTerms jauNut06a(double date1, double date2) { double t, fj2; /* Interval between fundamental date J2000.0 and given date (JC). */ t = ((date1 - DJ00) + date2) / DJC; /* Factor correcting for secular variation of J2. */ fj2 = -2.7774e-6 * t; /* Obtain IAU 2000A nutation. */ NutationTerms nt = jauNut00a(date1, date2); /* Apply P03 adjustments (Wallace & Capitaine, 2006, Eqs.5). */ return new NutationTerms( nt.dpsi + nt.dpsi * (0.4697e-6 + fj2), nt.deps + nt.deps * fj2); } private final static class NutationModel2 { final int nl,nlp,nf,nd,nom; /* coefficients of l,l',F,D,Om */ final double sp,spt; /* longitude sine, 1 and t coefficients */ final double ce,cet; /* obliquity cosine, 1 and t coefficients */ public NutationModel2(int nl,int nlp,int nf,int nd,int nom, double sp,double spt, double ce,double cet ) { this.nl = nl;this.nlp = nlp;this.nf = nf;this.nd = nd;this.nom = nom; this.sp = sp;this.spt = spt; this.ce = ce;this.cet = cet; } } /** * Nutation, IAU 1980 model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return dpsi double returned nutation in longitude (radians) * deps double returned nutation in obliquity (radians) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The nutation components are with respect to the ecliptic of * date. *
*

Called:

    *
  • {@link #jauAnpm} normalize angle into range +/- pi *
*

Reference: * *

Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992), * Section 3.222 (p111). * *@version 2008 September 30 * * @since Release 20101201 * * */ public static NutationTerms jauNut80(double date1, double date2) { double t, el, elp, f, d, om, dp, de, arg, s, c; int j; /* Units of 0.1 milliarcsecond to radians */ final double U2R = DAS2R / 1e4; /* ------------------------------------------------ */ /* Table of multiples of arguments and coefficients */ /* ------------------------------------------------ */ /* The units for the sine and cosine coefficients are 0.1 mas and */ /* the same per Julian century */ NutationModel2 x[] = { /* 1-10 */ new NutationModel2( 0, 0, 0, 0, 1, -171996.0, -174.2, 92025.0, 8.9 ), new NutationModel2( 0, 0, 0, 0, 2, 2062.0, 0.2, -895.0, 0.5 ), new NutationModel2( -2, 0, 2, 0, 1, 46.0, 0.0, -24.0, 0.0 ), new NutationModel2( 2, 0, -2, 0, 0, 11.0, 0.0, 0.0, 0.0 ), new NutationModel2( -2, 0, 2, 0, 2, -3.0, 0.0, 1.0, 0.0 ), new NutationModel2( 1, -1, 0, -1, 0, -3.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, -2, 2, -2, 1, -2.0, 0.0, 1.0, 0.0 ), new NutationModel2( 2, 0, -2, 0, 1, 1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, 0, 2, -2, 2, -13187.0, -1.6, 5736.0, -3.1 ), new NutationModel2( 0, 1, 0, 0, 0, 1426.0, -3.4, 54.0, -0.1 ), /* 11-20 */ new NutationModel2( 0, 1, 2, -2, 2, -517.0, 1.2, 224.0, -0.6 ), new NutationModel2( 0, -1, 2, -2, 2, 217.0, -0.5, -95.0, 0.3 ), new NutationModel2( 0, 0, 2, -2, 1, 129.0, 0.1, -70.0, 0.0 ), new NutationModel2( 2, 0, 0, -2, 0, 48.0, 0.0, 1.0, 0.0 ), new NutationModel2( 0, 0, 2, -2, 0, -22.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, 2, 0, 0, 0, 17.0, -0.1, 0.0, 0.0 ), new NutationModel2( 0, 1, 0, 0, 1, -15.0, 0.0, 9.0, 0.0 ), new NutationModel2( 0, 2, 2, -2, 2, -16.0, 0.1, 7.0, 0.0 ), new NutationModel2( 0, -1, 0, 0, 1, -12.0, 0.0, 6.0, 0.0 ), new NutationModel2( -2, 0, 0, 2, 1, -6.0, 0.0, 3.0, 0.0 ), /* 21-30 */ new NutationModel2( 0, -1, 2, -2, 1, -5.0, 0.0, 3.0, 0.0 ), new NutationModel2( 2, 0, 0, -2, 1, 4.0, 0.0, -2.0, 0.0 ), new NutationModel2( 0, 1, 2, -2, 1, 4.0, 0.0, -2.0, 0.0 ), new NutationModel2( 1, 0, 0, -1, 0, -4.0, 0.0, 0.0, 0.0 ), new NutationModel2( 2, 1, 0, -2, 0, 1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, 0, -2, 2, 1, 1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, 1, -2, 2, 0, -1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, 1, 0, 0, 2, 1.0, 0.0, 0.0, 0.0 ), new NutationModel2( -1, 0, 0, 1, 1, 1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, 1, 2, -2, 0, -1.0, 0.0, 0.0, 0.0 ), /* 31-40 */ new NutationModel2( 0, 0, 2, 0, 2, -2274.0, -0.2, 977.0, -0.5 ), new NutationModel2( 1, 0, 0, 0, 0, 712.0, 0.1, -7.0, 0.0 ), new NutationModel2( 0, 0, 2, 0, 1, -386.0, -0.4, 200.0, 0.0 ), new NutationModel2( 1, 0, 2, 0, 2, -301.0, 0.0, 129.0, -0.1 ), new NutationModel2( 1, 0, 0, -2, 0, -158.0, 0.0, -1.0, 0.0 ), new NutationModel2( -1, 0, 2, 0, 2, 123.0, 0.0, -53.0, 0.0 ), new NutationModel2( 0, 0, 0, 2, 0, 63.0, 0.0, -2.0, 0.0 ), new NutationModel2( 1, 0, 0, 0, 1, 63.0, 0.1, -33.0, 0.0 ), new NutationModel2( -1, 0, 0, 0, 1, -58.0, -0.1, 32.0, 0.0 ), new NutationModel2( -1, 0, 2, 2, 2, -59.0, 0.0, 26.0, 0.0 ), /* 41-50 */ new NutationModel2( 1, 0, 2, 0, 1, -51.0, 0.0, 27.0, 0.0 ), new NutationModel2( 0, 0, 2, 2, 2, -38.0, 0.0, 16.0, 0.0 ), new NutationModel2( 2, 0, 0, 0, 0, 29.0, 0.0, -1.0, 0.0 ), new NutationModel2( 1, 0, 2, -2, 2, 29.0, 0.0, -12.0, 0.0 ), new NutationModel2( 2, 0, 2, 0, 2, -31.0, 0.0, 13.0, 0.0 ), new NutationModel2( 0, 0, 2, 0, 0, 26.0, 0.0, -1.0, 0.0 ), new NutationModel2( -1, 0, 2, 0, 1, 21.0, 0.0, -10.0, 0.0 ), new NutationModel2( -1, 0, 0, 2, 1, 16.0, 0.0, -8.0, 0.0 ), new NutationModel2( 1, 0, 0, -2, 1, -13.0, 0.0, 7.0, 0.0 ), new NutationModel2( -1, 0, 2, 2, 1, -10.0, 0.0, 5.0, 0.0 ), /* 51-60 */ new NutationModel2( 1, 1, 0, -2, 0, -7.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, 1, 2, 0, 2, 7.0, 0.0, -3.0, 0.0 ), new NutationModel2( 0, -1, 2, 0, 2, -7.0, 0.0, 3.0, 0.0 ), new NutationModel2( 1, 0, 2, 2, 2, -8.0, 0.0, 3.0, 0.0 ), new NutationModel2( 1, 0, 0, 2, 0, 6.0, 0.0, 0.0, 0.0 ), new NutationModel2( 2, 0, 2, -2, 2, 6.0, 0.0, -3.0, 0.0 ), new NutationModel2( 0, 0, 0, 2, 1, -6.0, 0.0, 3.0, 0.0 ), new NutationModel2( 0, 0, 2, 2, 1, -7.0, 0.0, 3.0, 0.0 ), new NutationModel2( 1, 0, 2, -2, 1, 6.0, 0.0, -3.0, 0.0 ), new NutationModel2( 0, 0, 0, -2, 1, -5.0, 0.0, 3.0, 0.0 ), /* 61-70 */ new NutationModel2( 1, -1, 0, 0, 0, 5.0, 0.0, 0.0, 0.0 ), new NutationModel2( 2, 0, 2, 0, 1, -5.0, 0.0, 3.0, 0.0 ), new NutationModel2( 0, 1, 0, -2, 0, -4.0, 0.0, 0.0, 0.0 ), new NutationModel2( 1, 0, -2, 0, 0, 4.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, 0, 0, 1, 0, -4.0, 0.0, 0.0, 0.0 ), new NutationModel2( 1, 1, 0, 0, 0, -3.0, 0.0, 0.0, 0.0 ), new NutationModel2( 1, 0, 2, 0, 0, 3.0, 0.0, 0.0, 0.0 ), new NutationModel2( 1, -1, 2, 0, 2, -3.0, 0.0, 1.0, 0.0 ), new NutationModel2( -1, -1, 2, 2, 2, -3.0, 0.0, 1.0, 0.0 ), new NutationModel2( -2, 0, 0, 0, 1, -2.0, 0.0, 1.0, 0.0 ), /* 71-80 */ new NutationModel2( 3, 0, 2, 0, 2, -3.0, 0.0, 1.0, 0.0 ), new NutationModel2( 0, -1, 2, 2, 2, -3.0, 0.0, 1.0, 0.0 ), new NutationModel2( 1, 1, 2, 0, 2, 2.0, 0.0, -1.0, 0.0 ), new NutationModel2( -1, 0, 2, -2, 1, -2.0, 0.0, 1.0, 0.0 ), new NutationModel2( 2, 0, 0, 0, 1, 2.0, 0.0, -1.0, 0.0 ), new NutationModel2( 1, 0, 0, 0, 2, -2.0, 0.0, 1.0, 0.0 ), new NutationModel2( 3, 0, 0, 0, 0, 2.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, 0, 2, 1, 2, 2.0, 0.0, -1.0, 0.0 ), new NutationModel2( -1, 0, 0, 0, 2, 1.0, 0.0, -1.0, 0.0 ), new NutationModel2( 1, 0, 0, -4, 0, -1.0, 0.0, 0.0, 0.0 ), /* 81-90 */ new NutationModel2( -2, 0, 2, 2, 2, 1.0, 0.0, -1.0, 0.0 ), new NutationModel2( -1, 0, 2, 4, 2, -2.0, 0.0, 1.0, 0.0 ), new NutationModel2( 2, 0, 0, -4, 0, -1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 1, 1, 2, -2, 2, 1.0, 0.0, -1.0, 0.0 ), new NutationModel2( 1, 0, 2, 2, 1, -1.0, 0.0, 1.0, 0.0 ), new NutationModel2( -2, 0, 2, 4, 2, -1.0, 0.0, 1.0, 0.0 ), new NutationModel2( -1, 0, 4, 0, 2, 1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 1, -1, 0, -2, 0, 1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 2, 0, 2, -2, 1, 1.0, 0.0, -1.0, 0.0 ), new NutationModel2( 2, 0, 2, 2, 2, -1.0, 0.0, 0.0, 0.0 ), /* 91-100 */ new NutationModel2( 1, 0, 0, 2, 1, -1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, 0, 4, -2, 2, 1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 3, 0, 2, -2, 2, 1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 1, 0, 2, -2, 0, -1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, 1, 2, 0, 1, 1.0, 0.0, 0.0, 0.0 ), new NutationModel2( -1, -1, 0, 2, 1, 1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, 0, -2, 0, 1, -1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, 0, 2, -1, 2, -1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, 1, 0, 2, 0, -1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 1, 0, -2, -2, 0, -1.0, 0.0, 0.0, 0.0 ), /* 101-106 */ new NutationModel2( 0, -1, 2, 0, 1, -1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 1, 1, 0, -2, 1, -1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 1, 0, -2, 2, 0, -1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 2, 0, 0, 2, 0, 1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, 0, 2, 4, 2, -1.0, 0.0, 0.0, 0.0 ), new NutationModel2( 0, 1, 0, 1, 0, 1.0, 0.0, 0.0, 0.0 ) }; /* Number of terms in the series */ final int NT = x.length; /*--------------------------------------------------------------------*/ /* Interval between fundamental epoch J2000.0 and given date (JC). */ t = ((date1 - DJ00) + date2) / DJC; /* --------------------- */ /* Fundamental arguments */ /* --------------------- */ /* Mean longitude of Moon minus mean longitude of Moon's perigee. */ el = jauAnpm( (485866.733 + (715922.633 + (31.310 + 0.064 * t) * t) * t) * DAS2R + fmod(1325.0 * t, 1.0) * D2PI); /* Mean longitude of Sun minus mean longitude of Sun's perigee. */ elp = jauAnpm( (1287099.804 + (1292581.224 + (-0.577 - 0.012 * t) * t) * t) * DAS2R + fmod(99.0 * t, 1.0) * D2PI); /* Mean longitude of Moon minus mean longitude of Moon's node. */ f = jauAnpm( (335778.877 + (295263.137 + (-13.257 + 0.011 * t) * t) * t) * DAS2R + fmod(1342.0 * t, 1.0) * D2PI); /* Mean elongation of Moon from Sun. */ d = jauAnpm( (1072261.307 + (1105601.328 + (-6.891 + 0.019 * t) * t) * t) * DAS2R + fmod(1236.0 * t, 1.0) * D2PI); /* Longitude of the mean ascending node of the lunar orbit on the */ /* ecliptic, measured from the mean equinox of date. */ om = jauAnpm( (450160.280 + (-482890.539 + (7.455 + 0.008 * t) * t) * t) * DAS2R + fmod(-5.0 * t, 1.0) * D2PI); /* --------------- */ /* Nutation series */ /* --------------- */ /* Initialize nutation components. */ dp = 0.0; de = 0.0; /* Sum the nutation terms, ending with the biggest. */ for (j = NT-1; j >= 0; j--) { /* Form argument for current term. */ arg = (double)x[j].nl * el + (double)x[j].nlp * elp + (double)x[j].nf * f + (double)x[j].nd * d + (double)x[j].nom * om; /* Accumulate current nutation term. */ s = x[j].sp + x[j].spt * t; c = x[j].ce + x[j].cet * t; if (s != 0.0) dp += s * sin(arg); if (c != 0.0) de += c * cos(arg); } /* Convert results from 0.1 mas units to radians. */ return new NutationTerms( dp * U2R, de * U2R); } /** * Form the matrix of nutation for a given date, IAU 1980 model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TDB date (Note 1) * @param date2 double TDB date (Note 1) * * * @return double[3][3] nutation matrix * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The matrix operates in the sense V(true) = rmatn * V(mean), * where the p-vector V(true) is with respect to the true * equatorial triad of date and the p-vector V(mean) is with * respect to the mean equatorial triad of date. *
*

Called:

    *
  • {@link #jauNut80} nutation, IAU 1980 *
  • {@link #jauObl80} mean obliquity, IAU 1980 *
  • {@link #jauNumat} form nutation matrix *
*@version 2008 May 12 * * @since Release 20101201 * * */ public static double[][] jauNutm80(double date1, double date2) { double rmatn[][]; /* Nutation components and mean obliquity. */ NutationTerms nt = jauNut80(date1, date2); double epsa = jauObl80(date1, date2); /* Build the rotation matrix. */ rmatn = jauNumat(epsa, nt.dpsi, nt.deps); return rmatn; } /** * Mean obliquity of the ecliptic, IAU 2006 precession model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return double obliquity of the ecliptic (radians, Note 2) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The result is the angle between the ecliptic and mean equator of * date date1+date2. *
*

Reference: * * Hilton, J. et al., 2006, Celest.Mech.Dyn.Astron. 94, 351 * *@version 2009 March 16 * * @since Release 20101201 * * */ public static double jauObl06(double date1, double date2) { double t, eps0; /* Interval between fundamental date J2000.0 and given date (JC). */ t = ((date1 - DJ00) + date2) / DJC; /* Mean obliquity. */ eps0 = (84381.406 + (-46.836769 + ( -0.0001831 + ( 0.00200340 + ( -0.000000576 + ( -0.0000000434) * t) * t) * t) * t) * t) * DAS2R; return eps0; } /** * Mean obliquity of the ecliptic, IAU 1980 model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return double obliquity of the ecliptic (radians, Note 2) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The result is the angle between the ecliptic and mean equator of * date date1+date2. *
*

Reference: * *

Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992), * Expression 3.222-1 (p114). * *@version 2009 March 16 * * @since Release 20101201 * * */ public static double jauObl80(double date1, double date2) { double t, eps0; /* Interval between fundamental epoch J2000.0 and given date (JC). */ t = ((date1 - DJ00) + date2) / DJC; /* Mean obliquity of date. */ eps0 = DAS2R * (84381.448 + (-46.8150 + (-0.00059 + ( 0.001813) * t) * t) * t); return eps0; } /** * equinox based precession angles. * . * @author Paul Harrison (paul.harrison@manchester.ac.uk) 21 Nov 2011 * @version $Revision$ $date$ */ public static class PrecessionAngles { /** epsilon_0 obliquity at J2000.0. */ public double eps0; /** psi_A luni-solar precession. */ public double psia; /** omega_A inclination of equator wrt J2000.0 ecliptic. */ public double oma; /** P_A ecliptic pole x, J2000.0 ecliptic triad. */ public double bpa; /** Q_A ecliptic pole -y, J2000.0 ecliptic triad. */ public double bqa; /** pi_A angle between moving and J2000.0 ecliptics. */ public double pia; /** Pi_A longitude of ascending node of the ecliptic. */ public double bpia; /** epsilon_A obliquity of the ecliptic. */ public double epsa; /** chi_A planetary precession. */ public double chia; /** z_A equatorial precession: -3rd 323 Euler angle. */ public double za; /** zeta_A equatorial precession: -1st 323 Euler angle. */ public double zetaa; /** theta_A equatorial precession: 2nd 323 Euler angle. */ public double thetaa; /** p_A general precession. */ public double pa; /** gamma_J2000 J2000.0 RA difference of ecliptic poles. */ public double gam; /** phi_J2000 J2000.0 codeclination of ecliptic pole. */ public double phi; /** psi_J2000 longitude difference of equator poles, J2000.0. */ public double psi; public PrecessionAngles ( double eps0, double psia, double oma, double bpa, double bqa, double pia, double bpia, double epsa, double chia, double za, double zetaa, double thetaa, double pa, double gam, double phi, double psi){ this.eps0 = eps0; this.psia = psia; this.oma = oma; this.bpa = bpa; this.bqa = bqa; this.pia = pia; this.bpia = bpia; this.epsa = epsa; this.chia = chia; this.za = za; this.zetaa = zetaa; this.thetaa = thetaa; this.pa = pa; this.gam = gam; this.phi = phi; this.psi = psi; } } /** * Precession angles, IAU 2006, equinox based. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical models. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * @return (see Note 2): * eps0 double epsilon_0 * psia double psi_A * oma double omega_A * bpa double P_A * bqa double Q_A * pia double pi_A * bpia double Pi_A * epsa double obliquity epsilon_A * chia double chi_A * za double z_A * zetaa double zeta_A * thetaa double theta_A * pa double p_A * gam double F-W angle gamma_J2000 * phi double F-W angle phi_J2000 * psi double F-W angle psi_J2000 * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. This function returns the set of equinox based angles for the * Capitaine et al. "P03" precession theory, adopted by the IAU in * 2006. The angles are set out in Table 1 of Hilton et al. (2006): * * eps0 epsilon_0 obliquity at J2000.0 * psia psi_A luni-solar precession * oma omega_A inclination of equator wrt J2000.0 ecliptic * bpa P_A ecliptic pole x, J2000.0 ecliptic triad * bqa Q_A ecliptic pole -y, J2000.0 ecliptic triad * pia pi_A angle between moving and J2000.0 ecliptics * bpia Pi_A longitude of ascending node of the ecliptic * epsa epsilon_A obliquity of the ecliptic * chia chi_A planetary precession * za z_A equatorial precession: -3rd 323 Euler angle * zetaa zeta_A equatorial precession: -1st 323 Euler angle * thetaa theta_A equatorial precession: 2nd 323 Euler angle * pa p_A general precession (see note below) * gam gamma_J2000 J2000.0 RA difference of ecliptic poles * phi phi_J2000 J2000.0 codeclination of ecliptic pole * psi psi_J2000 longitude difference of equator poles, J2000.0 * * The returned values are all radians. * *
  3. Note that the t^5 coefficient in the series for p_A from * Capitaine et al. (2003) is incorrectly signed in Hilton et al. (2006). * *
  4. Hilton et al. (2006) Table 1 also contains angles that depend on * models distinct from the P03 precession theory itself, namely the * IAU 2000A frame bias and nutation. The quoted polynomials are * used in other JSOFA functions: * * . jauXy06 contains the polynomial parts of the X and Y series. * * . jauS06 contains the polynomial part of the s+XY/2 series. * * . jauPfw06 implements the series for the Fukushima-Williams * angles that are with respect to the GCRS pole (i.e. the variants * that include frame bias). * *
  5. The IAU resolution stipulated that the choice of parameterization * was left to the user, and so an IAU compliant precession * implementation can be constructed using various combinations of * the angles returned by the present function. * *
  6. The parameterization used by JSOFA is the Fukushima-Williams angles * referred directly to the GCRS pole. These are the final four * arguments returned by the present function, but are more * efficiently calculated by calling the function jauPfw06. JSOFA * also supports the direct computation of the CIP GCRS X,Y by * series, available by calling jauXy06. * *
  7. The agreement between the different parameterizations is at the * 1 microarcsecond level in the present era. * *
  8. When constructing a precession formulation that refers to the GCRS * pole rather than the dynamical pole, it may (depending on the * choice of angles) be necessary to introduce the frame bias * explicitly. * *
  9. It is permissible to re-use the same variable in the returned * arguments. The quantities are stored in the stated order. *
*

References:

    *
  1. Capitaine, N., Wallace, P.T. & Chapront, J., 2003, Astron.Astrophys., 412, 567 *
  2. Hilton, J. et al., 2006, Celest.Mech.Dyn.Astron. 94, 351 *
*

Called:

    *
  • {@link #jauObl06} mean obliquity, IAU 2006 *
*@version 2020 Nov 13 * * @since Release 20101201 * * */ public static PrecessionAngles jauP06e(double date1, double date2) { double t; double eps0, psia, oma, bpa, bqa, pia, bpia, epsa, chia, za, zetaa, thetaa, pa, gam, phi, psi; /* Interval between fundamental date J2000.0 and given date (JC). */ t = ((date1 - DJ00) + date2) / DJC; /* Obliquity at J2000.0. */ eps0 = 84381.406 * DAS2R; /* Luni-solar precession. */ psia = ( 5038.481507 + ( -1.0790069 + ( -0.00114045 + ( 0.000132851 + ( -0.0000000951 ) * t) * t) * t) * t) * t * DAS2R; /* Inclination of mean equator with respect to the J2000.0 ecliptic. */ oma = eps0 + ( -0.025754 + ( 0.0512623 + ( -0.00772503 + ( -0.000000467 + ( 0.0000003337 ) * t) * t) * t) * t) * t * DAS2R; /* Ecliptic pole x, J2000.0 ecliptic triad. */ bpa = ( 4.199094 + ( 0.1939873 + ( -0.00022466 + ( -0.000000912 + ( 0.0000000120 ) * t) * t) * t) * t) * t * DAS2R; /* Ecliptic pole -y, J2000.0 ecliptic triad. */ bqa = ( -46.811015 + ( 0.0510283 + ( 0.00052413 + ( -0.000000646 + ( -0.0000000172 ) * t) * t) * t) * t) * t * DAS2R; /* Angle between moving and J2000.0 ecliptics. */ pia = ( 46.998973 + ( -0.0334926 + ( -0.00012559 + ( 0.000000113 + ( -0.0000000022 ) * t) * t) * t) * t) * t * DAS2R; /* Longitude of ascending node of the moving ecliptic. */ bpia = ( 629546.7936 + ( -867.95758 + ( 0.157992 + ( -0.0005371 + ( -0.00004797 + ( 0.000000072 ) * t) * t) * t) * t) * t) * DAS2R; /* Mean obliquity of the ecliptic. */ epsa = jauObl06(date1, date2); /* Planetary precession. */ chia = ( 10.556403 + ( -2.3814292 + ( -0.00121197 + ( 0.000170663 + ( -0.0000000560 ) * t) * t) * t) * t) * t * DAS2R; /* Equatorial precession: minus the third of the 323 Euler angles. */ za = ( -2.650545 + ( 2306.077181 + ( 1.0927348 + ( 0.01826837 + ( -0.000028596 + ( -0.0000002904 ) * t) * t) * t) * t) * t) * DAS2R; /* Equatorial precession: minus the first of the 323 Euler angles. */ zetaa = ( 2.650545 + ( 2306.083227 + ( 0.2988499 + ( 0.01801828 + ( -0.000005971 + ( -0.0000003173 ) * t) * t) * t) * t) * t) * DAS2R; /* Equatorial precession: second of the 323 Euler angles. */ thetaa = ( 2004.191903 + ( -0.4294934 + ( -0.04182264 + ( -0.000007089 + ( -0.0000001274 ) * t) * t) * t) * t) * t * DAS2R; /* General precession. */ pa = ( 5028.796195 + ( 1.1054348 + ( 0.00007964 + ( -0.000023857 + ( -0.0000000383 ) * t) * t) * t) * t) * t * DAS2R; /* Fukushima-Williams angles for precession. */ gam = ( 10.556403 + ( 0.4932044 + ( -0.00031238 + ( -0.000002788 + ( 0.0000000260 ) * t) * t) * t) * t) * t * DAS2R; phi = eps0 + ( -46.811015 + ( 0.0511269 + ( 0.00053289 + ( -0.000000440 + ( -0.0000000176 ) * t) * t) * t) * t) * t * DAS2R; psi = ( 5038.481507 + ( 1.5584176 + ( -0.00018522 + ( -0.000026452 + ( -0.0000000148 ) * t) * t) * t) * t) * t * DAS2R; return new PrecessionAngles(eps0, psia, oma, bpa, bqa, pia, bpia, epsa, chia, za, zetaa, thetaa, pa, gam, phi, psi); } /** * Extend a p-vector to a pv-vector by appending a zero velocity. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param p double[3] p-vector * * * @return pv double[2][3] returned pv-vector * *

Called:

    *
  • {@link #jauCp} copy p-vector *
  • {@link #jauZp} zero p-vector *
*@version 2008 May 11 * * @since Release 20101201 * * */ public static double[][] jauP2pv(double p[] ) { double pv[][] = new double[3][3]; jauCp(p, pv[0]); jauZp(pv[1]); return pv; } /** * A position expressed in spherical polar coordinates. * . * @author Paul Harrison (paul.harrison@manchester.ac.uk) 21 Nov 2011 * @version $Revision$ $date$ */ public static class SphericalPosition { /** longitude angle (radians) */ public double theta; /** latitude angle (radians) */ public double phi; /** radial distance */ public double r; public SphericalPosition(double theta, double phi, double r) { this.theta = theta; this.phi = phi; this.r = r; } } /** * P-vector to spherical polar coordinates. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param p double[3] p-vector * * * @return theta double returned longitude angle (radians) * phi double returned latitude angle (radians) * r double returned radial distance * *

Notes: *

    * *
  1. If P is null, zero theta, phi and r are returned. * *
  2. At either pole, zero theta is returned. *
*

Called:

    *
  • {@link #jauC2s} p-vector to spherical *
  • {@link #jauPm} modulus of p-vector *
*@version 2008 May 22 * * @since Release 20101201 * * */ public static SphericalPosition jauP2s(double p[]) { SphericalCoordinate sc = jauC2s(p); double r = jauPm(p); return new SphericalPosition(sc.alpha, sc.delta, r); } /** * Position-angle from two p-vectors. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param a double[3] direction of reference point * @param b double[3] direction of point whose PA is required * * * @return double position angle of b with respect to a (radians) * *

Notes: *

    * *
  1. The result is the position angle, in radians, of direction b with * respect to direction a. It is in the range -pi to +pi. The * sense is such that if b is a small distance "north" of a the * position angle is approximately zero, and if b is a small * distance "east" of a the position angle is approximately +pi/2. * *
  2. The vectors a and b need not be of unit length. * *
  3. Zero is returned if the two directions are the same or if either * vector is null. * *
  4. If vector a is at a pole, the result is ill-defined. *
*

Called:

    *
  • {@link #jauPn} decompose p-vector into modulus and direction *
  • {@link #jauPm} modulus of p-vector *
  • {@link #jauPxp} vector product of two p-vectors *
  • {@link #jauPmp} p-vector minus p-vector *
  • {@link #jauPdp} scalar product of two p-vectors *
*@version 2008 May 25 * * @since Release 20101201 * * */ public static double jauPap(double a[] , double b[] ) { double am, au[] = new double[3], bm, st, ct, xa, ya, za, eta[] = new double[3], xi[] = new double[3], a2b[] = new double[3], pa; /* Modulus and direction of the a vector. */ NormalizedVector nv = jauPn(a ); am = nv.r; au = nv.u; /* Modulus of the b vector. */ bm = jauPm(b); /* Deal with the case of a null vector. */ if ((am == 0.0) || (bm == 0.0)) { st = 0.0; ct = 1.0; } else { /* The "north" axis tangential from a (arbitrary length). */ xa = a[0]; ya = a[1]; za = a[2]; eta[0] = -xa * za; eta[1] = -ya * za; eta[2] = xa*xa + ya*ya; /* The "east" axis tangential from a (same length). */ xi = jauPxp(eta,au); /* The vector from a to b. */ a2b = jauPmp(b, a); /* Resolve into components along the north and east axes. */ st = jauPdp(a2b, xi); ct = jauPdp(a2b, eta); /* Deal with degenerate cases. */ if ((st == 0.0) && (ct == 0.0)) ct = 1.0; } /* Position angle. */ pa = atan2(st, ct); return pa; } /** * Position-angle from spherical coordinates. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param al double longitude of point A (e.g. RA) in radians * @param ap double latitude of point A (e.g. Dec) in radians * @param bl double longitude of point B * @param bp double latitude of point B * * * @return double position angle of B with respect to A * *

Notes: *

    * *
  1. The result is the bearing (position angle), in radians, of point * B with respect to point A. It is in the range -pi to +pi. The * sense is such that if B is a small distance "east" of point A, * the bearing is approximately +pi/2. * *
  2. Zero is returned if the two points are coincident. *
*@version 2008 May 22 * * @since Release 20101201 * * */ public static double jauPas(double al, double ap, double bl, double bp) { double dl, x, y, pa; dl = bl - al; y = sin(dl) * cos(bp); x = sin(bp) * cos(ap) - cos(bp) * sin(ap) * cos(dl); pa = ((x != 0.0) || (y != 0.0)) ? atan2(y, x) : 0.0; return pa; } /** * This function forms three Euler angles which implement general * precession from epoch J2000.0, using the IAU 2006 model. Frame * bias (the offset between ICRS and mean J2000.0) is included. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return bzeta 1st rotation: radians cw around z, * 3rd rotation: radians cw around z, * 2nd rotation: radians ccw around y. * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The traditional accumulated precession angles zeta_A, z_A, * theta_A cannot be obtained in the usual way, namely through * polynomial expressions, because of the frame bias. The latter * means that two of the angles undergo rapid changes near this * date. They are instead the results of decomposing the * precession-bias matrix obtained by using the Fukushima-Williams * method, which does not suffer from the problem. The * decomposition returns values which can be used in the * conventional formulation and which include frame bias. * *
  3. The three angles are returned in the conventional order, which * is not the same as the order of the corresponding Euler * rotations. The precession-bias matrix is * R_3(-z) x R_2(+theta) x R_3(-zeta). * *
  4. Should zeta_A, z_A, theta_A angles be required that do not * contain frame bias, they are available by calling the JSOFA * function jauP06e. *
*

Called:

    *
  • {@link #jauPmat06} PB matrix, IAU 2006 *
  • {@link #jauRz} rotate around Z-axis *
*@version 2008 May 26 * * @since Release 20101201 * * */ public static EulerAngles jauPb06(double date1, double date2) { double r[][] = new double[3][3], y, x; /* Precession matrix via Fukushima-Williams angles. */ r = jauPmat06(date1, date2); /* Solve for z, choosing the +/- pi alternative. */ y = r[1][2]; x = -r[0][2]; if ( x < 0.0 ) { y = -y; x = -x; } double bz = ( x != 0.0 || y != 0.0 ) ? - atan2(y,x) : 0.0; /* Derotate it out of the matrix. */ jauRz ( bz, r ); /* Solve for the remaining two angles. */ y = r[0][2]; x = r[2][2]; double btheta = ( x != 0.0 || y != 0.0 ) ? - atan2(y,x) : 0.0; y = -r[1][0]; x = r[1][1]; double bzeta = ( x != 0.0 || y != 0.0 ) ? - atan2(y,x) : 0.0; return new EulerAngles(bzeta, bz, btheta); } /** * p-vector inner (=scalar=dot) product. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param a double[3] first p-vector * @param b double[3] second p-vector * * * @return double a . b * *@version 2008 May 22 * * @since Release 20101201 * * */ public static double jauPdp(double a[] , double b[] ) { double w; w = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; return w; } /** * Precession angles, IAU 2006 (Fukushima-Williams 4-angle formulation). * * @author Paul Harrison (paul.harrison@manchester.ac.uk) 1 Feb 2010 * * @since AIDA Stage 1 */ public static class FWPrecessionAngles{ /** F-W angle gamma_bar (radians) */ public double gamb; /** F-W angle phi_bar (radians) */ public double phib; /** F-W angle psi_bar (radians) */ public double psib; /** F-W angle epsilon_A (radians) */ public double epsa; public FWPrecessionAngles(double gamb, double phib, double psib, double epsa) { this.gamb = gamb; this.phib = phib; this.psib = psib; this.epsa = epsa; } } /** * Precession angles, IAU 2006 (Fukushima-Williams 4-angle formulation). * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return gamb double returned F-W angle gamma_bar (radians) * phib double returned F-W angle phi_bar (radians) * psib double returned F-W angle psi_bar (radians) * epsa double returned F-W angle epsilon_A (radians) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. Naming the following points: * * e = J2000.0 ecliptic pole, * p = GCRS pole, * E = mean ecliptic pole of date, * and P = mean pole of date, * * the four Fukushima-Williams angles are as follows: * * gamb = gamma_bar = epE * phib = phi_bar = pE * psib = psi_bar = pEP * epsa = epsilon_A = EP * *
  3. The matrix representing the combined effects of frame bias and * precession is: * * PxB = R_1(-epsa).R_3(-psib).R_1(phib).R_3(gamb) * *
  4. The matrix representing the combined effects of frame bias, * precession and nutation is simply: * * NxPxB = R_1(-epsa-dE).R_3(-psib-dP).R_1(phib).R_3(gamb) * * where dP and dE are the nutation components with respect to the * ecliptic of date. *
*

Reference: * * Hilton, J. et al., 2006, Celest.Mech.Dyn.Astron. 94, 351 * *

Called:

    *
  • {@link #jauObl06} mean obliquity, IAU 2006 *
*@version 2009 December 17 * * @since Release 20101201 * * */ public static FWPrecessionAngles jauPfw06(double date1, double date2 ) { double t; /* Interval between fundamental date J2000.0 and given date (JC). */ t = ((date1 - DJ00) + date2) / DJC; /* P03 bias+precession angles. */ double gamb = ( -0.052928 + ( 10.556378 + ( 0.4932044 + ( -0.00031238 + ( -0.000002788 + ( 0.0000000260 ) * t) * t) * t) * t) * t) * DAS2R; double phib = ( 84381.412819 + ( -46.811016 + ( 0.0511268 + ( 0.00053289 + ( -0.000000440 + ( -0.0000000176 ) * t) * t) * t) * t) * t) * DAS2R; double psib = ( -0.041775 + ( 5038.481484 + ( 1.5584175 + ( -0.00018522 + ( -0.000026452 + ( -0.0000000148 ) * t) * t) * t) * t) * t) * DAS2R; double epsa = jauObl06(date1, date2); return new FWPrecessionAngles(gamb, phib, psib, epsa); } /** * * Approximate heliocentric position and velocity of a nominated major * planet: Mercury, Venus, EMB, Mars, Jupiter, Saturn, Uranus or * Neptune (but not the Earth itself). * * n.b. Not IAU-endorsed and without canonical status. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TDB date part A (Note 1) * @param date2 double TDB date part B (Note 1) * @param np int planet (1=Mercury, 2=Venus, 3=EMB, 4=Mars, * 5=Jupiter, 6=Saturn, 7=Uranus, 8=Neptune) * * Returned (argument): * @return pv double[2][3] (returned) planet p,v (heliocentric, J2000.0, au,au/d) * * *

Notes: *

    * *
  1. The date date1+date2 is in the TDB time scale (in practice TT can * be used) and is a Julian Date, apportioned in any convenient way * between the two arguments. For example, JD(TDB)=2450123.7 could * be expressed in any of these ways, among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 method is best matched to the way the * argument is handled internally and will deliver the optimum * resolution. The MJD method and the date & time methods are both * good compromises between resolution and convenience. The limited * accuracy of the present algorithm is such that any of the methods * is satisfactory. * *
  2. If an np value outside the range 1-8 is supplied, an exception is thrown. * *
  3. For np=3 the result is for the Earth-Moon Barycenter. To obtain * the heliocentric position and velocity of the Earth, use instead * the JSOFA function jauEpv00. * *
  4. On successful return, the array pv contains the following: *
        *        pv[0][0]   x      }
        *        pv[0][1]   y      } heliocentric position, au
        *        pv[0][2]   z      }
        *
        *        pv[1][0]   xdot   }
        *        pv[1][1]   ydot   } heliocentric velocity, au/d
        *        pv[1][2]   zdot   }
        *
    * The reference frame is equatorial and is with respect to the * mean equator and equinox of epoch J2000.0. * *
  5. The algorithm is due to J.L. Simon, P. Bretagnon, J. Chapront, * M. Chapront-Touze, G. Francou and J. Laskar (Bureau des * Longitudes, Paris, France). From comparisons with JPL * ephemeris DE102, they quote the following maximum errors * over the interval 1800-2050: *
        *                     L (arcsec)    B (arcsec)      R (km)
        *
        *        Mercury          4             1             300
        *        Venus            5             1             800
        *        EMB              6             1            1000
        *        Mars            17             1            7700
        *        Jupiter         71             5           76000
        *        Saturn          81            13          267000
        *        Uranus          86             7          712000
        *        Neptune         11             1          253000
        *
    * Over the interval 1000-3000, they report that the accuracy is no * worse than 1.5 times that over 1800-2050. Outside 1000-3000 the * accuracy declines. * * Comparisons of the present function with the JPL DE200 ephemeris * give the following RMS errors over the interval 1960-2025: *
        *                      position (km)     velocity (m/s)
        *
        *        Mercury            334               0.437
        *        Venus             1060               0.855
        *        EMB               2010               0.815
        *        Mars              7690               1.98
        *        Jupiter          71700               7.70
        *        Saturn          199000              19.4
        *        Uranus          564000              16.4
        *        Neptune         158000              14.4
        *
    * Comparisons against DE200 over the interval 1800-2100 gave the * following maximum absolute differences. (The results using * DE406 were essentially the same.) *
        *                   L (arcsec)   B (arcsec)     R (km)   Rdot (m/s)
        *
        *        Mercury        7            1            500       0.7
        *        Venus          7            1           1100       0.9
        *        EMB            9            1           1300       1.0
        *        Mars          26            1           9000       2.5
        *        Jupiter       78            6          82000       8.2
        *        Saturn        87           14         263000      24.6
        *        Uranus        86            7         661000      27.4
        *        Neptune       11            2         248000      21.4
        *
    *
  6. The present JSOFA re-implementation of the original Simon et al. * Fortran code differs from the original in the following respects: *
      *
    • C instead of Fortran. * *
    • The date is supplied in two parts. * *
    • The result is returned only in equatorial Cartesian form; * the ecliptic longitude, latitude and radius vector are not * returned. * *
    • The result is in the J2000.0 equatorial frame, not ecliptic. * *
    • More is done in-line: there are fewer calls to subroutines. * *
    • Different error/warning status values are used. * *
    • A different Kepler's-equation-solver is used (avoiding * use of double precision complex). * *
    • Polynomials in t are nested to minimize rounding errors. * *
    • Explicit double constants are used to avoid mixed-mode * expressions. *
    * None of the above changes affects the result significantly. * *
  7. The returned status indicates the most serious condition * encountered during execution of the function. Illegal np is * considered the most serious, overriding failure to converge, * which in turn takes precedence over the remote date warning. *
*

Called:

    *
  • {@link #jauAnp} normalize angle into range 0 to 2pi *
*

Reference: Simon, J.L, Bretagnon, P., Chapront, J., * Chapront-Touze, M., Francou, G., and Laskar, J., * Astron. Astrophys. 282, 663 (1994). * *@version 2009 December 17 * @throws JSOFAIllegalParameter for a bad np (planet number) * * @since Release 20101201 * * */ public static double[][] jauPlan94(double date1, double date2, int np) throws JSOFAIllegalParameter { double pv[][] = new double[2][3]; /* Gaussian constant */ final double GK = 0.017202098950; /* Sin and cos of J2000.0 mean obliquity (IAU 1976) */ final double SINEPS = 0.3977771559319137; final double COSEPS = 0.9174820620691818; /* Maximum number of iterations allowed to solve Kepler's equation */ final int KMAX = 10; int jstat, i, k; double t, da, dl, de, dp, di, dom, dmu, arga, argl, am, ae, dae, ae2, at, r, v, si2, xq, xp, tl, xsw, xcw, xm2, xf, ci2, xms, xmc, xpxq2, x, y, z; /* Planetary inverse masses */ final double amas[] = { 6023600.0, /* Mercury */ 408523.5, /* Venus */ 328900.5, /* EMB */ 3098710.0, /* Mars */ 1047.355, /* Jupiter */ 3498.5, /* Saturn */ 22869.0, /* Uranus */ 19314.0 }; /* Neptune */ /* * Tables giving the mean Keplerian elements, limited to t^2 terms: * * a semi-major axis (au) * dlm mean longitude (degree and arcsecond) * e eccentricity * pi longitude of the perihelion (degree and arcsecond) * dinc inclination (degree and arcsecond) * omega longitude of the ascending node (degree and arcsecond) */ final double a[][] = { { 0.3870983098, 0.0, 0.0 }, /* Mercury */ { 0.7233298200, 0.0, 0.0 }, /* Venus */ { 1.0000010178, 0.0, 0.0 }, /* EMB */ { 1.5236793419, 3e-10, 0.0 }, /* Mars */ { 5.2026032092, 19132e-10, -39e-10 }, /* Jupiter */ { 9.5549091915, -0.0000213896, 444e-10 }, /* Saturn */ { 19.2184460618, -3716e-10, 979e-10 }, /* Uranus */ { 30.1103868694, -16635e-10, 686e-10 } /* Neptune */ }; final double dlm[][] = { { 252.25090552, 5381016286.88982, -1.92789 }, { 181.97980085, 2106641364.33548, 0.59381 }, { 100.46645683, 1295977422.83429, -2.04411 }, { 355.43299958, 689050774.93988, 0.94264 }, { 34.35151874, 109256603.77991, -30.60378 }, { 50.07744430, 43996098.55732, 75.61614 }, { 314.05500511, 15424811.93933, -1.75083 }, { 304.34866548, 7865503.20744, 0.21103 } }; final double e[][] = { { 0.2056317526, 0.0002040653, -28349e-10 }, { 0.0067719164, -0.0004776521, 98127e-10 }, { 0.0167086342, -0.0004203654, -0.0000126734 }, { 0.0934006477, 0.0009048438, -80641e-10 }, { 0.0484979255, 0.0016322542, -0.0000471366 }, { 0.0555481426, -0.0034664062, -0.0000643639 }, { 0.0463812221, -0.0002729293, 0.0000078913 }, { 0.0094557470, 0.0000603263, 0.0 } }; final double pi[][] = { { 77.45611904, 5719.11590, -4.83016 }, { 131.56370300, 175.48640, -498.48184 }, { 102.93734808, 11612.35290, 53.27577 }, { 336.06023395, 15980.45908, -62.32800 }, { 14.33120687, 7758.75163, 259.95938 }, { 93.05723748, 20395.49439, 190.25952 }, { 173.00529106, 3215.56238, -34.09288 }, { 48.12027554, 1050.71912, 27.39717 } }; final double dinc[][] = { { 7.00498625, -214.25629, 0.28977 }, { 3.39466189, -30.84437, -11.67836 }, { 0.0, 469.97289, -3.35053 }, { 1.84972648, -293.31722, -8.11830 }, { 1.30326698, -71.55890, 11.95297 }, { 2.48887878, 91.85195, -17.66225 }, { 0.77319689, -60.72723, 1.25759 }, { 1.76995259, 8.12333, 0.08135 } }; final double omega[][] = { { 48.33089304, -4515.21727, -31.79892 }, { 76.67992019, -10008.48154, -51.32614 }, { 174.87317577, -8679.27034, 15.34191 }, { 49.55809321, -10620.90088, -230.57416 }, { 100.46440702, 6362.03561, 326.52178 }, { 113.66550252, -9240.19942, -66.23743 }, { 74.00595701, 2669.15033, 145.93964 }, { 131.78405702, -221.94322, -0.78728 } }; /* Tables for trigonometric terms to be added to the mean elements of */ /* the semi-major axes */ final double kp[][] = { { 69613, 75645, 88306, 59899, 15746, 71087, 142173, 3086, 0 }, { 21863, 32794, 26934, 10931, 26250, 43725, 53867, 28939, 0 }, { 16002, 21863, 32004, 10931, 14529, 16368, 15318, 32794, 0 }, { 6345, 7818, 15636, 7077, 8184, 14163, 1107, 4872, 0 }, { 1760, 1454, 1167, 880, 287, 2640, 19, 2047, 1454 }, { 574, 0, 880, 287, 19, 1760, 1167, 306, 574 }, { 204, 0, 177, 1265, 4, 385, 200, 208, 204 }, { 0, 102, 106, 4, 98, 1367, 487, 204, 0 } }; final double ca[][] = { { 4, -13, 11, -9, -9, -3, -1, 4, 0 }, { -156, 59, -42, 6, 19, -20, -10, -12, 0 }, { 64, -152, 62, -8, 32, -41, 19, -11, 0 }, { 124, 621, -145, 208, 54, -57, 30, 15, 0 }, { -23437, -2634, 6601, 6259, -1507,-1821, 2620, -2115, -1489 }, { 62911,-119919, 79336,17814,-24241,12068, 8306, -4893, 8902 }, { 389061,-262125,-44088, 8387,-22976,-2093, -615, -9720, 6633 }, { -412235,-157046,-31430,37817, -9740, -13, -7449, 9644, 0 } }; final double sa[][] = { { -29, -1, 9, 6, -6, 5, 4, 0, 0 }, { -48, -125, -26, -37, 18, -13, -20, -2, 0 }, { -150, -46, 68, 54, 14, 24, -28, 22, 0 }, { -621, 532, -694, -20, 192, -94, 71, -73, 0 }, { -14614,-19828, -5869, 1881, -4372, -2255, 782, 930, 913 }, { 139737, 0, 24667, 51123, -5102, 7429, -4095, -1976, -9566 }, { -138081, 0, 37205,-49039,-41901,-33872,-27037,-12474, 18797 }, { 0, 28492,133236, 69654, 52322,-49577,-26430, -3593, 0 } }; /* Tables giving the trigonometric terms to be added to the mean */ /* elements of the mean longitudes */ final double kq[][] = { { 3086,15746,69613,59899,75645,88306, 12661, 2658, 0, 0 }, { 21863,32794,10931, 73, 4387,26934, 1473, 2157, 0, 0 }, { 10,16002,21863,10931, 1473,32004, 4387, 73, 0, 0 }, { 10, 6345, 7818, 1107,15636, 7077, 8184, 532, 10, 0 }, { 19, 1760, 1454, 287, 1167, 880, 574, 2640, 19, 1454 }, { 19, 574, 287, 306, 1760, 12, 31, 38, 19, 574 }, { 4, 204, 177, 8, 31, 200, 1265, 102, 4, 204 }, { 4, 102, 106, 8, 98, 1367, 487, 204, 4, 102 } }; final double cl[][] = { { 21, -95, -157, 41, -5, 42, 23, 30, 0, 0 }, { -160, -313, -235, 60, -74, -76, -27, 34, 0, 0 }, { -325, -322, -79, 232, -52, 97, 55, -41, 0, 0 }, { 2268, -979, 802, 602, -668, -33, 345, 201, -55, 0 }, { 7610, -4997,-7689,-5841,-2617, 1115,-748,-607, 6074, 354 }, { -18549, 30125,20012, -730, 824, 23,1289,-352, -14767, -2062 }, { -135245,-14594, 4197,-4030,-5630,-2898,2540,-306, 2939, 1986 }, { 89948, 2103, 8963, 2695, 3682, 1648, 866,-154, -1963, -283 } }; final double sl[][] = { { -342, 136, -23, 62, 66, -52, -33, 17, 0, 0 }, { 524, -149, -35, 117, 151, 122, -71, -62, 0, 0 }, { -105, -137, 258, 35, -116, -88,-112, -80, 0, 0 }, { 854, -205, -936, -240, 140, -341, -97, -232, 536, 0 }, { -56980, 8016, 1012, 1448,-3024,-3710, 318, 503, 3767, 577 }, { 138606,-13478,-4964, 1441,-1319,-1482, 427, 1236, -9167, -1918 }, { 71234,-41116, 5334,-4935,-1848, 66, 434, -1748, 3780, -701 }, { -47645, 11647, 2166, 3194, 679, 0,-244, -419, -2531, 48 } }; /*--------------------------------------------------------------------*/ /* Validate the planet number. */ if ((np < 1) || (np > 8)) { throw new JSOFAIllegalParameter("planet number out of range", -1); } else { /* Decrement the planet number to start at zero. */ np--; /* Time: Julian millennia since J2000.0. */ t = ((date1 - DJ00) + date2) / DJM; /* OK status unless remote date. */ jstat = abs(t) <= 1.0 ? 0 : 1; // do not signal as error.. if(jstat != 0) throw new JSOFAIllegalParameter("Date too remote", jstat); /* Compute the mean elements. */ da = a[np][0] + (a[np][1] + a[np][2] * t) * t; dl = (3600.0 * dlm[np][0] + (dlm[np][1] + dlm[np][2] * t) * t) * DAS2R; de = e[np][0] + ( e[np][1] + e[np][2] * t) * t; dp = jauAnpm((3600.0 * pi[np][0] + (pi[np][1] + pi[np][2] * t) * t) * DAS2R); di = (3600.0 * dinc[np][0] + (dinc[np][1] + dinc[np][2] * t) * t) * DAS2R; dom = jauAnpm((3600.0 * omega[np][0] + (omega[np][1] + omega[np][2] * t) * t) * DAS2R); /* Apply the trigonometric terms. */ dmu = 0.35953620 * t; for (k = 0; k < 8; k++) { arga = kp[np][k] * dmu; argl = kq[np][k] * dmu; da += (ca[np][k] * cos(arga) + sa[np][k] * sin(arga)) * 1e-7; dl += (cl[np][k] * cos(argl) + sl[np][k] * sin(argl)) * 1e-7; } arga = kp[np][8] * dmu; da += t * (ca[np][8] * cos(arga) + sa[np][8] * sin(arga)) * 1e-7; for (k = 8; k < 10; k++) { argl = kq[np][k] * dmu; dl += t * (cl[np][k] * cos(argl) + sl[np][k] * sin(argl)) * 1e-7; } dl = fmod(dl, D2PI); /* Iterative soln. of Kepler's equation to get eccentric anomaly. */ am = dl - dp; ae = am + de * sin(am); k = 0; dae = 1.0; while (k < KMAX && abs(dae) > 1e-12) { dae = (am - ae + de * sin(ae)) / (1.0 - de * cos(ae)); ae += dae; k++; if (k == KMAX-1) jstat = 2; } /* True anomaly. */ ae2 = ae / 2.0; at = 2.0 * atan2(sqrt((1.0 + de) / (1.0 - de)) * sin(ae2), cos(ae2)); /* Distance (au) and speed (radians per day). */ r = da * (1.0 - de * cos(ae)); v = GK * sqrt((1.0 + 1.0 / amas[np]) / (da * da * da)); si2 = sin(di / 2.0); xq = si2 * cos(dom); xp = si2 * sin(dom); tl = at + dp; xsw = sin(tl); xcw = cos(tl); xm2 = 2.0 * (xp * xcw - xq * xsw); xf = da / sqrt(1 - de * de); ci2 = cos(di / 2.0); xms = (de * sin(dp) + xsw) * xf; xmc = (de * cos(dp) + xcw) * xf; xpxq2 = 2 * xp * xq; /* Position (J2000.0 ecliptic x,y,z in au). */ x = r * (xcw - xm2 * xp); y = r * (xsw + xm2 * xq); z = r * (-xm2 * ci2); /* Rotate to equatorial. */ pv[0][0] = x; pv[0][1] = y * COSEPS - z * SINEPS; pv[0][2] = y * SINEPS + z * COSEPS; /* Velocity (J2000.0 ecliptic xdot,ydot,zdot in au/d). */ x = v * (( -1.0 + 2.0 * xp * xp) * xms + xpxq2 * xmc); y = v * (( 1.0 - 2.0 * xq * xq) * xmc - xpxq2 * xms); z = v * (2.0 * ci2 * (xp * xms + xq * xmc)); /* Rotate to equatorial. */ pv[1][0] = x; pv[1][1] = y * COSEPS - z * SINEPS; pv[1][2] = y * SINEPS + z * COSEPS; } /* Return the value. */ return pv; } /** * Modulus of p-vector. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param p double[3] p-vector * * * @return double modulus * *@version 2008 May 22 * * @since Release 20101201 * * */ public static double jauPm(double p[] ) { double w; w = sqrt( p[0] * p[0] + p[1] * p[1] + p[2] * p[2] ); return w; } /** * Precession matrix (including frame bias) from GCRS to a specified * date, IAU 2000 model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return rbp double[3][3] returned bias-precession matrix (Note 2) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The matrix operates in the sense V(date) = rbp * V(GCRS), where * the p-vector V(GCRS) is with respect to the Geocentric Celestial * Reference System (IAU, 2000) and the p-vector V(date) is with * respect to the mean equatorial triad of the given date. *
*

Called:

    *
  • {@link #jauBp00} frame bias and precession matrices, IAU 2000 *
*

Reference: * * IAU: Trans. International Astronomical Union, Vol. XXIVB; Proc. * 24th General Assembly, Manchester, UK. Resolutions B1.3, B1.6. * (2000) * *@version 2009 December 21 * * @since Release 20101201 * * */ public static double[][] jauPmat00(double date1, double date2) { double rb[][] = new double[3][3], rp[][] = new double[3][3], rbp[][] = new double[3][3]; /* Obtain the required matrix (discarding others). */ jauBp00(date1, date2, rb, rp, rbp); return rbp; } /** * Precession matrix (including frame bias) from GCRS to a specified * date, IAU 2006 model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return rbp double[3][3] returned bias-precession matrix (Note 2) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The matrix operates in the sense V(date) = rbp * V(GCRS), where * the p-vector V(GCRS) is with respect to the Geocentric Celestial * Reference System (IAU, 2000) and the p-vector V(date) is with * respect to the mean equatorial triad of the given date. *
*

Called:

    *
  • {@link #jauPfw06} bias-precession F-W angles, IAU 2006 *
  • {@link #jauFw2m} F-W angles to r-matrix *
*

References: * *

Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 * *

Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 * *

IAU: Trans. International Astronomical Union, Vol. XXIVB; Proc. 24th General Assembly, Manchester, UK. Resolutions B1.3, B1.6.(2000) * *@version 2009 December 21 * * @since Release 20101201 * * */ public static double[][] jauPmat06(double date1, double date2) { /* Bias-precession Fukushima-Williams angles. */ FWPrecessionAngles fw = jauPfw06(date1, date2); /* Form the matrix. */ double[][] rbp = jauFw2m(fw.gamb, fw.phib, fw.psib, fw.epsa ); return rbp; } /** * Precession matrix from J2000.0 to a specified date, IAU 1976 model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double ending date, TT (Note 1) * @param date2 double ending date, TT (Note 1) * * * @return rmatp double[3][3] returned precession matrix, J2000.0 -> date1+date2 * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The matrix operates in the sense V(date) = RMATP * V(J2000), * where the p-vector V(J2000) is with respect to the mean * equatorial triad of epoch J2000.0 and the p-vector V(date) * is with respect to the mean equatorial triad of the given * date. * *
  3. Though the matrix method itself is rigorous, the precession * angles are expressed through canonical polynomials which are * valid only for a limited time span. In addition, the IAU 1976 * precession rate is known to be imperfect. The absolute accuracy * of the present formulation is better than 0.1 arcsec from * 1960AD to 2040AD, better than 1 arcsec from 1640AD to 2360AD, * and remains below 3 arcsec for the whole of the period * 500BC to 3000AD. The errors exceed 10 arcsec outside the * range 1200BC to 3900AD, exceed 100 arcsec outside 4200BC to * 5600AD and exceed 1000 arcsec outside 6800BC to 8200AD. *
*

Called:

    *
  • {@link #jauPrec76} accumulated precession angles, IAU 1976 *
  • {@link #jauIr} initialize r-matrix to identity *
  • {@link #jauRz} rotate around Z-axis *
  • {@link #jauRy} rotate around Y-axis *
  • {@link #jauCr} copy r-matrix *
*

References: * *

Lieske, J.H., 1979, Astron.Astrophys. 73, 282. * equations (6) & (7), p283. * * Kaplan,G.H., 1981. USNO circular no. 163, pA2. * *@version 2009 December 18 * * @since Release 20101201 * * */ public static double[][] jauPmat76(double date1, double date2) { double wmat[][] = new double[3][3]; double rmatp[][] = new double[3][3]; /* Precession Euler angles, J2000.0 to specified date. */ EulerAngles euler = jauPrec76(DJ00, 0.0, date1, date2); /* Form the rotation matrix. */ jauIr( wmat); jauRz( -euler.zeta, wmat); jauRy( euler.theta, wmat); jauRz( -euler.z, wmat); jauCr(wmat, rmatp); return rmatp; } /** * P-vector subtraction. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param a double[3] first p-vector * @param b double[3] second p-vector * * * @return amb double[3] returned a - b * * Note: * It is permissible to re-use the same array for any of the * arguments. * *@version 2008 November 18 * * @since Release 20101201 * * */ public static double[] jauPmp(double a[] , double b[] ) { double amb[] = new double[3]; amb[0] = a[0] - b[0]; amb[1] = a[1] - b[1]; amb[2] = a[2] - b[2]; return amb; } /** * A normalized vector with r being the modulus and u[3] being the unit vector. * @author Paul Harrison (paul.harrison@manchester.ac.uk) 1 Feb 2010 * * @since AIDA Stage 1 */ public static class NormalizedVector { public double r; public double u[]; public NormalizedVector(double r, double u[] ) { this.r = r; this.u = u; } } /** * Convert a p-vector into modulus and unit vector. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param p double[3] p-vector * * * @return r double returned modulus * u double[3] returned unit vector * *

Notes: *

    * *
  1. If p is null, the result is null. Otherwise the result is a unit * vector. * *
  2. It is permissible to re-use the same array for any of the * arguments. *
*

Called:

    *
  • {@link #jauPm} modulus of p-vector *
  • {@link #jauZp} zero p-vector *
  • {@link #jauSxp} multiply p-vector by scalar *
*@version 2008 November 18 * * @since Release 20101201 * * */ public static NormalizedVector jauPn(double p[]) { double w; /* Obtain the modulus and test for zero. */ w = jauPm(p); NormalizedVector nv = new NormalizedVector(w, new double[3]); if (w == 0.0) { /* Null vector. */ jauZp(nv.u); } else { /* Unit vector. */ nv.u = jauSxp(1.0/w, p); } return nv; } /** * Precession-nutation, IAU 2000 model: a multi-purpose function, * supporting classical (equinox-based) use directly and CIO-based * use indirectly. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * @param dpsi double nutation (Note 2) * @param deps double nutation (Note 2) * * * @return epsa double returned mean obliquity (Note 3), * rb double[3][3] returned frame bias matrix (Note 4), * rp double[3][3] returned precession matrix (Note 5), * rbp double[3][3] returned bias-precession matrix (Note 6), * rn double[3][3] returned nutation matrix (Note 7), * rbpn double[3][3] returned GCRS-to-true matrix (Note 8) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The caller is responsible for providing the nutation components; * they are in longitude and obliquity, in radians and are with * respect to the equinox and ecliptic of date. For high-accuracy * applications, free core nutation should be included as well as * any other relevant corrections to the position of the CIP. * *
  3. The returned mean obliquity is consistent with the IAU 2000 * precession-nutation models. * *
  4. The matrix rb transforms vectors from GCRS to J2000.0 mean * equator and equinox by applying frame bias. * *
  5. The matrix rp transforms vectors from J2000.0 mean equator and * equinox to mean equator and equinox of date by applying * precession. * *
  6. The matrix rbp transforms vectors from GCRS to mean equator and * equinox of date by applying frame bias then precession. It is * the product rp x rb. * *
  7. The matrix rn transforms vectors from mean equator and equinox of * date to true equator and equinox of date by applying the nutation * (luni-solar + planetary). * *
  8. The matrix rbpn transforms vectors from GCRS to true equator and * equinox of date. It is the product rn x rbp, applying frame * bias, precession and nutation in that order. * *
  9. It is permissible to re-use the same array in the returned * arguments. The arrays are filled in the stated order. *
*

Called:

    *
  • {@link #jauPr00} IAU 2000 precession adjustments *
  • {@link #jauObl80} mean obliquity, IAU 1980 *
  • {@link #jauBp00} frame bias and precession matrices, IAU 2000 *
  • {@link #jauCr} copy r-matrix *
  • {@link #jauNumat} form nutation matrix *
  • {@link #jauRxr} product of two r-matrices *
*

Reference: * *

Capitaine, N., Chapront, J., Lambert, S. and Wallace, P., * "Expressions for the Celestial Intermediate Pole and Celestial * Ephemeris Origin consistent with the IAU 2000A precession- * nutation model", Astron.Astrophys. 400, 1145-1154 (2003) * * n.b. The celestial ephemeris origin (CEO) was renamed "celestial * intermediate origin" (CIO) by IAU 2006 Resolution 2. * *@version 2010 January 18 * * @since Release 20101201 * * */ public static PrecessionNutation jauPn00(double date1, double date2, double dpsi, double deps) { double rbpw[][] = new double[3][3], rnw[][] = new double[3][3]; double[][] rb = new double[3][3]; double[][] rp = new double[3][3]; double[][] rbp = new double[3][3]; double[][] rn = new double[3][3]; double[][] rbpn = new double[3][3]; /* IAU 2000 precession-rate adjustments. */ PrecessionDeltaTerms nut = jauPr00(date1, date2); /* Mean obliquity, consistent with IAU 2000 precession-nutation. */ double epsa = jauObl80(date1, date2) + nut.depspr; /* Frame bias and precession matrices and their product. */ jauBp00(date1, date2, rb, rp, rbpw); jauCr(rbpw, rbp); /* Nutation matrix. */ rnw = jauNumat(epsa, dpsi, deps); jauCr(rnw, rn); /* Bias-precession-nutation matrix (classical). */ rbpn = jauRxr(rnw, rbpw); return new PrecessionNutation(dpsi, deps, epsa, rb, rp, rbp, rn, rbpn); } /** * Precession-nutation model. * @author Paul Harrison (paul.harrison@manchester.ac.uk) 4 Feb 2010 * * @since AIDA Stage 1 */ public static class PrecessionNutation { public NutationTerms nut; /** mean obliquity */ public double epsa; /** frame bias matrix */ public double rb[][]; /** precession matrix */ public double rp[][]; /** bias-precession matrix */ public double rbp[][]; /** nutation matrix */ public double rn[][]; /** GCRS-to-true matrix */ public double rbpn[][]; public PrecessionNutation(double dpsi, double deps, double epsa, double rb[][], double rp[][], double rbp[][], double rn[][], double rbpn[][]){ this.nut = new NutationTerms(dpsi, deps); this.epsa = epsa; this.rb = rb; this.rp = rp; this.rbp = rbp; this.rn = rn; this.rbpn = rbpn; } } /** * Precession-nutation, IAU 2000A model: a multi-purpose function, * supporting classical (equinox-based) use directly and CIO-based * use indirectly. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return dpsi double returned nutation (Note 2) * deps double returned nutation (Note 2) * epsa double returned mean obliquity (Note 3) * rb double[3][3] returned frame bias matrix (Note 4) * rp double[3][3] returned precession matrix (Note 5) * rbp double[3][3] returned bias-precession matrix (Note 6) * rn double[3][3] returned nutation matrix (Note 7) * rbpn double[3][3] returned GCRS-to-true matrix (Notes 8,9) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *             date1          date2
        *
        *          2450123.7           0.0       (JD method)
        *          2451545.0       -1421.3       (J2000 method)
        *          2400000.5       50123.2       (MJD method)
        *          2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The nutation components (luni-solar + planetary, IAU 2000A) in * longitude and obliquity are in radians and with respect to the * equinox and ecliptic of date. Free core nutation is omitted; * for the utmost accuracy, use the jauPn00 function, where the * nutation components are caller-specified. For faster but * slightly less accurate results, use the jauPn00b function. * *
  3. The mean obliquity is consistent with the IAU 2000 precession. * *
  4. The matrix rb transforms vectors from GCRS to J2000.0 mean * equator and equinox by applying frame bias. * *
  5. The matrix rp transforms vectors from J2000.0 mean equator and * equinox to mean equator and equinox of date by applying * precession. * *
  6. The matrix rbp transforms vectors from GCRS to mean equator and * equinox of date by applying frame bias then precession. It is * the product rp x rb. * *
  7. The matrix rn transforms vectors from mean equator and equinox * of date to true equator and equinox of date by applying the * nutation (luni-solar + planetary). * *
  8. The matrix rbpn transforms vectors from GCRS to true equator and * equinox of date. It is the product rn x rbp, applying frame * bias, precession and nutation in that order. * *
  9. The X,Y,Z coordinates of the IAU 2000A Celestial Intermediate * Pole are elements (3,1-3) of the GCRS-to-true matrix, * i.e. rbpn[2][0-2]. * *
  10. It is permissible to re-use the same array in the returned * arguments. The arrays are filled in the order given. *
*

Called:

    *
  • {@link #jauNut00a} nutation, IAU 2000A *
  • {@link #jauPn00} bias/precession/nutation results, IAU 2000 *
*

Reference: * *

Capitaine, N., Chapront, J., Lambert, S. and Wallace, P., * "Expressions for the Celestial Intermediate Pole and Celestial * Ephemeris Origin consistent with the IAU 2000A precession- * nutation model", Astron.Astrophys. 400, 1145-1154 (2003) * * n.b. The celestial ephemeris origin (CEO) was renamed "celestial * intermediate origin" (CIO) by IAU 2006 Resolution 2. * *@version 2010 January 18 * * @since Release 20101201 * * */ public static PrecessionNutation jauPn00a(double date1, double date2) { /* Nutation. */ NutationTerms nut = jauNut00a(date1, date2); /* Remaining results. */ return jauPn00(date1, date2, nut.dpsi, nut.deps); } /** * Precession-nutation, IAU 2000B model: a multi-purpose function, * supporting classical (equinox-based) use directly and CIO-based * use indirectly. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return dpsi,deps double returned nutation (Note 2) * epsa double returned mean obliquity (Note 3) * rb double[3][3] returned frame bias matrix (Note 4) * rp double[3][3] returned precession matrix (Note 5) * rbp double[3][3] returned bias-precession matrix (Note 6) * rn double[3][3] returned nutation matrix (Note 7) * rbpn double[3][3] returned GCRS-to-true matrix (Notes 8,9) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *             date1          date2
        *
        *          2450123.7           0.0       (JD method)
        *          2451545.0       -1421.3       (J2000 method)
        *          2400000.5       50123.2       (MJD method)
        *          2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The nutation components (luni-solar + planetary, IAU 2000B) in * longitude and obliquity are in radians and with respect to the * equinox and ecliptic of date. For more accurate results, but * at the cost of increased computation, use the jauPn00a function. * For the utmost accuracy, use the jauPn00 function, where the * nutation components are caller-specified. * *
  3. The mean obliquity is consistent with the IAU 2000 precession. * *
  4. The matrix rb transforms vectors from GCRS to J2000.0 mean * equator and equinox by applying frame bias. * *
  5. The matrix rp transforms vectors from J2000.0 mean equator and * equinox to mean equator and equinox of date by applying * precession. * *
  6. The matrix rbp transforms vectors from GCRS to mean equator and * equinox of date by applying frame bias then precession. It is * the product rp x rb. * *
  7. The matrix rn transforms vectors from mean equator and equinox * of date to true equator and equinox of date by applying the * nutation (luni-solar + planetary). * *
  8. The matrix rbpn transforms vectors from GCRS to true equator and * equinox of date. It is the product rn x rbp, applying frame * bias, precession and nutation in that order. * *
  9. The X,Y,Z coordinates of the IAU 2000B Celestial Intermediate * Pole are elements (3,1-3) of the matrix rbpn. * *
  10. It is permissible to re-use the same array in the returned * arguments. The arrays are filled in the stated order. *
*

Called:

    *
  • {@link #jauNut00b} nutation, IAU 2000B *
  • {@link #jauPn00} bias/precession/nutation results, IAU 2000 *
*

Reference: * *

Capitaine, N., Chapront, J., Lambert, S. and Wallace, P., * "Expressions for the Celestial Intermediate Pole and Celestial * Ephemeris Origin consistent with the IAU 2000A precession- * nutation model", Astron.Astrophys. 400, 1145-1154 (2003). * * n.b. The celestial ephemeris origin (CEO) was renamed "celestial * intermediate origin" (CIO) by IAU 2006 Resolution 2. * *@version 2010 January 18 * * @since Release 20101201 * * */ public static PrecessionNutation jauPn00b(double date1, double date2) { /* Nutation. */ NutationTerms nut = jauNut00b(date1, date2); /* Remaining results. */ return jauPn00(date1, date2, nut.dpsi, nut.deps); } /** * Precession-nutation, IAU 2006 model: a multi-purpose function, * supporting classical (equinox-based) use directly and CIO-based use * indirectly. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * @param dpsi double nutation (Note 2) * @param deps double nutation (Note 2) * * * @return epsa double returned mean obliquity (Note 3) * rb double[3][3] returned frame bias matrix (Note 4) * rp double[3][3] returned precession matrix (Note 5) * rbp double[3][3] returned bias-precession matrix (Note 6) * rn double[3][3] returned nutation matrix (Note 7) * rbpn double[3][3] returned GCRS-to-true matrix (Note 8,9) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *             date1          date2
        *
        *          2450123.7           0.0       (JD method)
        *          2451545.0       -1421.3       (J2000 method)
        *          2400000.5       50123.2       (MJD method)
        *          2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The caller is responsible for providing the nutation components; * they are in longitude and obliquity, in radians and are with * respect to the equinox and ecliptic of date. For high-accuracy * applications, free core nutation should be included as well as * any other relevant corrections to the position of the CIP. * *
  3. The returned mean obliquity is consistent with the IAU 2006 * precession. * *
  4. The matrix rb transforms vectors from GCRS to J2000.0 mean * equator and equinox by applying frame bias. * *
  5. The matrix rp transforms vectors from J2000.0 mean equator and * equinox to mean equator and equinox of date by applying * precession. * *
  6. The matrix rbp transforms vectors from GCRS to mean equator and * equinox of date by applying frame bias then precession. It is * the product rp x rb. * *
  7. The matrix rn transforms vectors from mean equator and equinox * of date to true equator and equinox of date by applying the * nutation (luni-solar + planetary). * *
  8. The matrix rbpn transforms vectors from GCRS to true equator and * equinox of date. It is the product rn x rbp, applying frame * bias, precession and nutation in that order. * *
  9. The X,Y,Z coordinates of the IAU 2000B Celestial Intermediate * Pole are elements (3,1-3) of the matrix rbpn. * *
  10. It is permissible to re-use the same array in the returned * arguments. The arrays are filled in the stated order. *
*

Called:

    *
  • {@link #jauPfw06} bias-precession F-W angles, IAU 2006 *
  • {@link #jauFw2m} F-W angles to r-matrix *
  • {@link #jauCr} copy r-matrix *
  • {@link #jauTr} transpose r-matrix *
  • {@link #jauRxr} product of two r-matrices *
*

References: * *

Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 * *

Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 * *@version 2009 December 17 * * @since Release 20101201 * * */ public static PrecessionNutation jauPn06(double date1, double date2, double dpsi, double deps) { double rb[][] = new double[3][3], rbp[][] = new double[3][3], rbpn[][] = new double[3][3]; /* Bias-precession Fukushima-Williams angles of J2000.0 = frame bias. */ FWPrecessionAngles fw = jauPfw06(DJM0, DJM00); /* B matrix. */ double[][] r1 = jauFw2m(fw.gamb, fw.phib, fw.psib, fw.epsa); jauCr(r1, rb); /* Bias-precession Fukushima-Williams angles of date. */ fw = jauPfw06(date1, date2); /* Bias-precession matrix. */ double[][] r2 = jauFw2m(fw.gamb, fw.phib, fw.psib, fw.epsa ); jauCr(r2, rbp); /* Solve for precession matrix. */ double[][] rt = jauTr(r1); double[][] rp = jauRxr(r2, rt); /* Equinox-based bias-precession-nutation matrix. */ r1 = jauFw2m(fw.gamb, fw.phib, fw.psib + dpsi, fw.epsa + deps); jauCr(r1, rbpn); /* Solve for nutation matrix. */ rt = jauTr(r2); double[][] rn = jauRxr(r1, rt); /* Obliquity, mean of date. */ double epsa = fw.epsa; return new PrecessionNutation(dpsi, deps, epsa, rb, rp, rbp, rn, rbpn); } /** * Precession-nutation, IAU 2006/2000A models: a multi-purpose function, * supporting classical (equinox-based) use directly and CIO-based use * indirectly. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return dpsi,deps double returned nutation (Note 2) * epsa double returned mean obliquity (Note 3) * rb double[3][3] returned frame bias matrix (Note 4) * rp double[3][3] returned precession matrix (Note 5) * rbp double[3][3] returned bias-precession matrix (Note 6) * rn double[3][3] returned nutation matrix (Note 7) * rbpn double[3][3] returned GCRS-to-true matrix (Notes 8,9) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *             date1          date2
        *
        *          2450123.7           0.0       (JD method)
        *          2451545.0       -1421.3       (J2000 method)
        *          2400000.5       50123.2       (MJD method)
        *          2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The nutation components (luni-solar + planetary, IAU 2000A) in * longitude and obliquity are in radians and with respect to the * equinox and ecliptic of date. Free core nutation is omitted; * for the utmost accuracy, use the jauPn06 function, where the * nutation components are caller-specified. * *
  3. The mean obliquity is consistent with the IAU 2006 precession. * *
  4. The matrix rb transforms vectors from GCRS to mean J2000.0 by * applying frame bias. * *
  5. The matrix rp transforms vectors from mean J2000.0 to mean of * date by applying precession. * *
  6. The matrix rbp transforms vectors from GCRS to mean of date by * applying frame bias then precession. It is the product rp x rb. * *
  7. The matrix rn transforms vectors from mean of date to true of * date by applying the nutation (luni-solar + planetary). * *
  8. The matrix rbpn transforms vectors from GCRS to true of date * (CIP/equinox). It is the product rn x rbp, applying frame bias, * precession and nutation in that order. * *
  9. The X,Y,Z coordinates of the IAU 2006/2000A Celestial * Intermediate Pole are elements (1,1-3) of the matrix rbpn. * *
  10. It is permissible to re-use the same array in the returned * arguments. The arrays are filled in the stated order. *
*

Called:

    *
  • {@link #jauNut06a} nutation, IAU 2006/2000A *
  • {@link #jauPn06} bias/precession/nutation results, IAU 2006 *
*

Reference: * *

Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 * *@version 2009 December 18 * * @since Release 20101201 * * */ public static PrecessionNutation jauPn06a(double date1, double date2) { /* Nutation. */ NutationTerms nut = jauNut06a(date1, date2); /* Remaining results. */ return jauPn06(date1, date2, nut.dpsi, nut.deps); } /** * Form the matrix of precession-nutation for a given date (including * frame bias), equinox-based, IAU 2000A model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return rbpn double[3][3] returned bias-precession-nutation matrix (Note 2) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The matrix operates in the sense V(date) = rbpn * V(GCRS), where * the p-vector V(date) is with respect to the true equatorial triad * of date date1+date2 and the p-vector V(GCRS) is with respect to * the Geocentric Celestial Reference System (IAU, 2000). * *
  3. A faster, but slightly less accurate, result (about 1 mas), can be * obtained by using instead the jauPnm00b function. *
*

Called:

    *
  • {@link #jauPn00a} bias/precession/nutation, IAU 2000A *
*

Reference: * * IAU: Trans. International Astronomical Union, Vol. XXIVB; Proc. * 24th General Assembly, Manchester, UK. Resolutions B1.3, B1.6. * (2000) * *@version 2009 December 21 * * @since Release 20101201 * * */ public static double[][] jauPnm00a(double date1, double date2) { /* Obtain the required matrix (discarding other results). */ PrecessionNutation pn = jauPn00a(date1, date2); return pn.rbpn; } /** * Form the matrix of precession-nutation for a given date (including * frame bias), equinox-based, IAU 2000B model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return rbpn double[3][3] returned bias-precession-nutation matrix (Note 2) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The matrix operates in the sense V(date) = rbpn * V(GCRS), where * the p-vector V(date) is with respect to the true equatorial triad * of date date1+date2 and the p-vector V(GCRS) is with respect to * the Geocentric Celestial Reference System (IAU, 2000). * *
  3. The present function is faster, but slightly less accurate (about * 1 mas), than the jauPnm00a function. *
*

Called:

    *
  • {@link #jauPn00b} bias/precession/nutation, IAU 2000B *
*

Reference: * * IAU: Trans. International Astronomical Union, Vol. XXIVB; Proc. * 24th General Assembly, Manchester, UK. Resolutions B1.3, B1.6. * (2000) * *@version 2009 December 21 * * @since Release 20101201 * * */ public static double[][] jauPnm00b(double date1, double date2) { /* Obtain the required matrix (discarding other results). */ PrecessionNutation pn = jauPn00b(date1, date2); return pn.rbpn; } /** * Form the matrix of precession-nutation for a given date (including * frame bias), equinox based, IAU 2006 precession and IAU 2000A nutation models. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return rbpn double[3][3] returned bias-precession-nutation matrix (Note 2) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The matrix operates in the sense V(date) = rbpn * V(GCRS), where * the p-vector V(date) is with respect to the true equatorial triad * of date date1+date2 and the p-vector V(GCRS) is with respect to * the Geocentric Celestial Reference System (IAU, 2000). *
*

Called:

    *
  • {@link #jauPfw06} bias-precession F-W angles, IAU 2006 *
  • {@link #jauNut06a} nutation, IAU 2006/2000A *
  • {@link #jauFw2m} F-W angles to r-matrix *
*

Reference: * *

Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855. * *@version 2009 December 21 * * @since Release 20101201 * * */ public static double[][] jauPnm06a(double date1, double date2) { /* Fukushima-Williams angles for frame bias and precession. */ FWPrecessionAngles fw = jauPfw06(date1, date2); /* Nutation components. */ NutationTerms nut = jauNut06a(date1, date2); /* Equinox based nutation x precession x bias matrix. */ double[][] rbpn = jauFw2m(fw.gamb, fw.phib, fw.psib + nut.dpsi, fw.epsa + nut.deps); return rbpn; } /** * Form the matrix of precession/nutation for a given date, IAU 1976 * precession model, IAU 1980 nutation model. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param date1 double TDB date (Note 1) * @param date2 double TDB date (Note 1) * * * @return rmatpn double[3][3] returned combined precession/nutation matrix * *

Notes: *

    * *
  1. The TDB date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TDB)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The matrix operates in the sense V(date) = rmatpn * V(J2000), * where the p-vector V(date) is with respect to the true equatorial * triad of date date1+date2 and the p-vector V(J2000) is with * respect to the mean equatorial triad of epoch J2000.0. *
*

Called:

    *
  • {@link #jauPmat76} precession matrix, IAU 1976 *
  • {@link #jauNutm80} nutation matrix, IAU 1980 *
  • {@link #jauRxr} product of two r-matrices *
*

Reference: * *

Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992), * Section 3.3 (p145). * *@version 2010 January 23 * * @since Release 20101201 * * */ public static double[][] jauPnm80(double date1, double date2) { double rmatp[][] = new double[3][3], rmatn[][] = new double[3][3]; /* Precession matrix, J2000.0 to date. */ rmatp = jauPmat76(date1, date2 ); /* Nutation matrix. */ rmatn = jauNutm80(date1, date2); /* Combine the matrices: PN = N x P. */ double[][] rmatpn = jauRxr(rmatn, rmatp); return rmatpn; } /** * Form the matrix of polar motion for a given date, IAU 2000. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: support function. * * * @param xp double coordinates of the pole (radians, Note 1) * @param yp double coordinates of the pole (radians, Note 1) * @param sp double the TIO locator s' (radians, Note 2) * * * @return double[3][3] returned polar-motion matrix (Note 3) * *

Notes: *

    * *
  1. The arguments xp and yp are the coordinates (in radians) of the * Celestial Intermediate Pole with respect to the International * Terrestrial Reference System (see IERS Conventions 2003), * measured along the meridians 0 and 90 deg west respectively. * *
  2. The argument sp is the TIO locator s', in radians, which * positions the Terrestrial Intermediate Origin on the equator. It * is obtained from polar motion observations by numerical * integration, and so is in essence unpredictable. However, it is * dominated by a secular drift of about 47 microarcseconds per * century, and so can be taken into account by using s' = -47*t, * where t is centuries since J2000.0. The function jauSp00 * implements this approximation. * *
  3. The matrix operates in the sense V(TRS) = rpom * V(CIP), meaning * that it is the final rotation when computing the pointing * direction to a celestial source. *
*

Called:

    *
  • {@link #jauIr} initialize r-matrix to identity *
  • {@link #jauRz} rotate around Z-axis *
  • {@link #jauRy} rotate around Y-axis *
  • {@link #jauRx} rotate around X-axis *
*

Reference: * *

McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2009 December 17 * * @since Release 20101201 * * */ public static double[][] jauPom00(double xp, double yp, double sp) { /* Construct the matrix. */ double rpom[][] = new double[3][3]; jauIr(rpom); jauRz(sp, rpom); jauRy(-xp, rpom); jauRx(-yp, rpom); return rpom; } /** * P-vector addition. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param a double[3] first p-vector * @param b double[3] second p-vector * * * @return apb double[3] returned a + b * * Note: * It is permissible to re-use the same array for any of the * arguments. * *@version 2008 November 18 * * @since Release 20101201 * * */ public static double[] jauPpp(double a[] , double b[] ) { double apb[] = new double[3]; apb[0] = a[0] + b[0]; apb[1] = a[1] + b[1]; apb[2] = a[2] + b[2]; return apb; } /** * P-vector plus scaled p-vector. * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: vector/matrix support function. * * * @param a double[3] first p-vector * @param s double scalar (multiplier for b) * @param b double[3] second p-vector * * * @return apsb double[3] returned a + s*b * * Note: * It is permissible for any of a, b and apsb to be the same array. * *

Called:

    *
  • {@link #jauSxp} multiply p-vector by scalar *
  • {@link #jauPpp} p-vector plus p-vector *
*@version 2008 November 18 * * @since Release 20101201 * * */ static double[] jauPpsp(double a[] , double s, double b[] ) { double sb[] = new double[3], apsb[]; /* s*b. */ sb = jauSxp(s,b); /* a + s*b. */ apsb = jauPpp(a, sb); return apsb; } /** * Precession correction terms. * @author Paul Harrison (paul.harrison@manchester.ac.uk) 4 Feb 2010 * * @since AIDA Stage 1 */ public static class PrecessionDeltaTerms { /** precession correction in longitude */ public double dpsipr; /** precession correction in obliquity */ public double depspr; public PrecessionDeltaTerms(double dpsipr, double depspr) { this.dpsipr = dpsipr; this.depspr = depspr; } } /** * Precession-rate part of the IAU 2000 precession-nutation models * (part of MHB2000). * *

This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

Status: canonical model. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @param dpsipr double returned precession corrections (Notes 2,3) * @param depspr double returned precession corrections (Notes 2,3) * *

Notes: *

    * *
  1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
        *            date1          date2
        *
        *         2450123.7           0.0       (JD method)
        *         2451545.0       -1421.3       (J2000 method)
        *         2400000.5       50123.2       (MJD method)
        *         2450123.5           0.2       (date & time method)
        *
    * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
  2. The precession adjustments are expressed as "nutation * components", corrections in longitude and obliquity with respect * to the J2000.0 equinox and ecliptic. * *
  3. Although the precession adjustments are stated to be with respect * to Lieske et al. (1977), the MHB2000 model does not specify which * set of Euler angles are to be used and how the adjustments are to * be applied. The most literal and straightforward procedure is to * adopt the 4-rotation epsilon_0, psi_A, omega_A, xi_A option, and * to add dpsipr to psi_A and depspr to both omega_A and eps_A. * *
  4. This is an implementation of one aspect of the IAU 2000A nutation * model, formally adopted by the IAU General Assembly in 2000, * namely MHB2000 (Mathews et al. 2002). * *

    References: * *

    Lieske, J.H., Lederle, T., Fricke, W. & Morando, B., "Expressions * for the precession quantities based upon the IAU (1976) System of * Astronomical Constants", Astron.Astrophys., 58, 1-16 (1977) * *

    Mathews, P.M., Herring, T.A., Buffet, B.A., "Modeling of nutation * and precession New nutation series for nonrigid Earth and * insights into the Earth's interior", J.Geophys.Res., 107, B4, * 2002. The MHB2000 code itself was obtained on 9th September 2002 * from ftp://maia.usno.navy.mil/conv2000/chapter5/IAU2000A. * *

    Wallace, P.T., "Software for Implementing the IAU 2000 * Resolutions", in IERS Workshop 5.1 (2002). * *@version 2009 December 17 * * @since Release 20101201 * * */ static PrecessionDeltaTerms jauPr00(double date1, double date2) { double t; /* Precession and obliquity corrections (radians per century) */ final double PRECOR = -0.29965 * DAS2R, OBLCOR = -0.02524 * DAS2R; /* Interval between fundamental epoch J2000.0 and given date (JC). */ t = ((date1 - DJ00) + date2) / DJC; /* Precession rate contributions with respect to IAU 1976/80. */ double dpsipr = PRECOR * t; double depspr = OBLCOR * t; return new PrecessionDeltaTerms(dpsipr, depspr); } /** * Euler Angles. * @author Paul Harrison (paul.harrison@manchester.ac.uk) 4 Feb 2010 * * @since AIDA Stage 1 */ public static class EulerAngles { /** 1st rotation: radians cw around z */ public double zeta; /** 3rd rotation: radians cw around z */ public double z; /** 2nd rotation: radians ccw around y */ public double theta; public EulerAngles(double zeta, double z, double theta){ this.zeta = zeta; this.z = z; this.theta = theta; } } /** * IAU 1976 precession model. * * This function forms the three Euler angles which implement general * precession between two epochs, using the IAU 1976 model (as for * the FK5 catalog). * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: canonical model. * * * @param ep01 double TDB starting epoch (Note 1) * @param ep02 double TDB starting epoch (Note 1) * @param ep11 double TDB ending epoch (Note 1) * @param ep12 double TDB ending epoch (Note 1) * * * @param zeta double returned 1st rotation: radians cw around z * @param z double returned 3rd rotation: radians cw around z * @param theta double returned 2nd rotation: radians ccw around y * *

    Notes: *

      * *
    1. The epochs ep01+ep02 and ep11+ep12 are Julian Dates, apportioned * in any convenient way between the arguments epn1 and epn2. For * example, JD(TDB)=2450123.7 could be expressed in any of these * ways, among others: * * epn1 epn2 * * 2450123.7 0.0 (JD method) * 2451545.0 -1421.3 (J2000 method) * 2400000.5 50123.2 (MJD method) * 2450123.5 0.2 (date & time method) *
* The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 method is best matched to the way the * argument is handled internally and will deliver the optimum * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * The two epochs may be expressed using different methods, but at * the risk of losing some resolution. * *
  • The accumulated precession angles zeta, z, theta are expressed * through canonical polynomials which are valid only for a limited * time span. In addition, the IAU 1976 precession rate is known to * be imperfect. The absolute accuracy of the present formulation * is better than 0.1 arcsec from 1960AD to 2040AD, better than * 1 arcsec from 1640AD to 2360AD, and remains below 3 arcsec for * the whole of the period 500BC to 3000AD. The errors exceed * 10 arcsec outside the range 1200BC to 3900AD, exceed 100 arcsec * outside 4200BC to 5600AD and exceed 1000 arcsec outside 6800BC to * 8200AD. * *
  • The three angles are returned in the conventional order, which * is not the same as the order of the corresponding Euler * rotations. The precession matrix is * R_3(-z) x R_2(+theta) x R_3(-zeta). * *

    Reference: * *

    Lieske, J.H., 1979, Astron.Astrophys. 73, 282, equations * (6) & (7), p283. * *@version 2009 December 17 * * @since Release 20101201 * * */ static EulerAngles jauPrec76(double ep01, double ep02, double ep11, double ep12) { double t0, t, tas2r, w; /* Interval between fundamental epoch J2000.0 and start epoch (JC). */ t0 = ((ep01 - DJ00) + ep02) / DJC; /* Interval over which precession required (JC). */ t = ((ep11 - ep01) + (ep12 - ep02)) / DJC; /* Euler angles. */ tas2r = t * DAS2R; w = 2306.2181 + (1.39656 - 0.000139 * t0) * t0; double zeta = (w + ((0.30188 - 0.000344 * t0) + 0.017998 * t) * t) * tas2r; double z = (w + ((1.09468 + 0.000066 * t0) + 0.018203 * t) * t) * tas2r; double theta = ((2004.3109 + (-0.85330 - 0.000217 * t0) * t0) + ((-0.42665 - 0.000217 * t0) - 0.041833 * t) * t) * tas2r; return new EulerAngles(zeta, z, theta); } /** * Discard velocity component of a pv-vector. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param pv double[2][3] pv-vector * * * @return p double[3] returned p-vector * *

    Called:

      *
    • {@link #jauCp} copy p-vector *
    *@version 2008 May 11 * * @since Release 20101201 * * */ public static double[] jauPv2p(double pv[][] ) { double p[] = new double[3]; jauCp(pv[0], p); return p; } /** * A position and velocity expressed in spherical polar coordinates. * @author Paul Harrison (paul.harrison@manchester.ac.uk) 4 Feb 2010 * * @since AIDA Stage 1 */ public static class SphericalPositionVelocity { public SphericalPosition pos; public SphericalPosition vel; public SphericalPositionVelocity( double theta, double phi, double r, double td, double pd, double rd) { pos = new SphericalPosition(theta, phi, r); vel = new SphericalPosition(td,pd,rd); } } /** * Convert position/velocity from Cartesian to spherical coordinates. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param pv double[2][3] pv-vector * * * @return theta double returned longitude angle (radians) * phi double returned latitude angle (radians) * r double returned radial distance * td double returned rate of change of theta * pd double returned rate of change of phi * rd double returned rate of change of r * *

    Notes: *

      * *
    1. If the position part of pv is null, theta, phi, td and pd * are indeterminate. This is handled by extrapolating the * position through unit time by using the velocity part of * pv. This moves the origin without changing the direction * of the velocity component. If the position and velocity * components of pv are both null, zeroes are returned for all * six results. * *
    2. If the position is a pole, theta, td and pd are indeterminate. * In such cases zeroes are returned for all three. *
    *@version 2008 October 28 * * @since Release 20101201 * * */ public static SphericalPositionVelocity jauPv2s(double pv[][]) { double x, y, z, xd, yd, zd, rxy2, rxy, r2, rtrue, rw, xyp; double theta, phi, r, td, pd, rd; /* Components of position/velocity vector. */ x = pv[0][0]; y = pv[0][1]; z = pv[0][2]; xd = pv[1][0]; yd = pv[1][1]; zd = pv[1][2]; /* Component of r in XY plane squared. */ rxy2 = x*x + y*y; /* Modulus squared. */ r2 = rxy2 + z*z; /* Modulus. */ rtrue = sqrt(r2); /* If null vector, move the origin along the direction of movement. */ rw = rtrue; if (rtrue == 0.0) { x = xd; y = yd; z = zd; rxy2 = x*x + y*y; r2 = rxy2 + z*z; rw = sqrt(r2); } /* Position and velocity in spherical coordinates. */ rxy = sqrt(rxy2); xyp = x*xd + y*yd; if (rxy2 != 0.0) { theta = atan2(y, x); phi = atan2(z, rxy); td = (x*yd - y*xd) / rxy2; pd = (zd*rxy2 - z*xyp) / (r2*rxy); } else { theta = 0.0; phi = (z != 0.0) ? atan2(z, rxy) : 0.0; td = 0.0; pd = 0.0; } r = rtrue; rd = (rw != 0.0) ? (xyp + z*zd) / rw : 0.0; return new SphericalPositionVelocity(theta, phi, r, td, pd, rd); } /** * Inner (=scalar=dot) product of two pv-vectors. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param a double[2][3] first pv-vector * @param b double[2][3] second pv-vector * * * @return adb double[2] returned a . b (see note) * * Note: * * If the position and velocity components of the two pv-vectors are * ( ap, av ) and ( bp, bv ), the result, a . b, is the pair of * numbers ( ap . bp , ap . bv + av . bp ). The two numbers are the * dot-product of the two p-vectors and its derivative. * *

    Called:

      *
    • {@link #jauPdp} scalar product of two p-vectors *
    *@version 2008 May 22 * * @since Release 20101201 * * */ public static double[] jauPvdpv(double a[][], double b[][] ) { double adbd, addb, adb[] = new double[2]; /* a . b = constant part of result. */ adb[0] = jauPdp(a[0], b[0]); /* a . bdot */ adbd = jauPdp(a[0], b[1]); /* adot . b */ addb = jauPdp(a[1], b[0]); /* Velocity part of result. */ adb[1] = adbd + addb; return adb; } /** * Modulus of pv-vector. * @author Paul Harrison (paul.harrison@manchester.ac.uk) 4 Feb 2010 * * @since AIDA Stage 1 */ public static class PVModulus{ public double r; public double s; public PVModulus( double r, double s){ this.r = r; this.s = s; } } /** * Modulus of pv-vector. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param pv double[2][3] pv-vector * * * @return modulus of position component, * modulus of velocity component * *

    Called:

      *
    • {@link #jauPm} modulus of p-vector *
    *@version 2008 May 22 * * @since Release 20101201 * * */ public static PVModulus jauPvm(double pv[][]) { /* Distance. */ double r = jauPm(pv[0]); /* Speed. */ double s = jauPm(pv[1]); return new PVModulus(r, s); } /** * Subtract one pv-vector from another. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param a double[2][3] first pv-vector * @param b double[2][3] second pv-vector * * * @return double[2][3] returned a - b * * Note: * It is permissible to re-use the same array for any of the * arguments. * *

    Called:

      *
    • {@link #jauPmp} p-vector minus p-vector *
    *@version 2008 November 18 * * @since Release 20101201 * * */ public static double[][] jauPvmpv(double a[][], double b[][]) { double amb[][] = new double[2][3]; amb[0] = jauPmp(a[0], b[0]); amb[1] = jauPmp(a[1], b[1]); return amb; } /** * Add one pv-vector to another. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param a double[2][3] first pv-vector * @param b double[2][3] second pv-vector * * * @return apb double[2][3] returned a + b * * Note: * It is permissible to re-use the same array for any of the * arguments. * *

    Called:

      *
    • {@link #jauPpp} p-vector plus p-vector *
    *@version 2008 November 18 * * @since Release 20101201 * * */ public static double[][] jauPvppv(double a[][], double b[][]) { double apb[][] = new double[2][3]; apb[0] = jauPpp(a[0], b[0]); apb[1] = jauPpp(a[1], b[1]); return apb; } /** * Typical catalogue coordinates. i.e. Position, proper motion, parallax and radial velocity. * @author Paul Harrison (paul.harrison@manchester.ac.uk) 4 Feb 2010 * * @since AIDA Stage 1 */ public static class CatalogCoords { /** position (radians) */ public SphericalCoordinate pos; /** proper motion (radians/year)*/ public SphericalCoordinate pm; /** parallax (arcsec) */ public double px; /** radial velocity (km/s, positive = receding) */ public double rv; public CatalogCoords(double ra, double dec, double pmr, double pmd, double px, double rv) { this.pos = new SphericalCoordinate(ra, dec); this.pm = new SphericalCoordinate(pmr, pmd); this.px = px; this.rv = rv; } } /** * Convert star position+velocity vector to catalog coordinates. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: support function. * * Given (Note 1): * @param pv double[2][3] pv-vector (au, au/day) * * * * @return catalogue value * * * @throws JSOFAInternalError superluminal speed (Note 5), or null position vector * *

    Notes: *

      * *
    1. The specified pv-vector is the coordinate direction (and its rate * of change) for the date at which the light leaving the star * reached the solar-system barycenter. * *
    2. The star data returned by this function are "observables" for an * imaginary observer at the solar-system barycenter. Proper motion * and radial velocity are, strictly, in terms of barycentric * coordinate time, TCB. For most practical applications, it is * permissible to neglect the distinction between TCB and ordinary * "proper" time on Earth (TT/TAI). The result will, as a rule, be * limited by the intrinsic accuracy of the proper-motion and * radial-velocity data; moreover, the supplied pv-vector is likely * to be merely an intermediate result (for example generated by the * function jauStarpv), so that a change of time unit will cancel * out overall. * * In accordance with normal star-catalog conventions, the object's * right ascension and declination are freed from the effects of * secular aberration. The frame, which is aligned to the catalog * equator and equinox, is Lorentzian and centered on the SSB. * * Summarizing, the specified pv-vector is for most stars almost * identical to the result of applying the standard geometrical * "space motion" transformation to the catalog data. The * differences, which are the subject of the Stumpff paper cited * below, are: * * (i) In stars with significant radial velocity and proper motion, * the constantly changing light-time distorts the apparent proper * motion. Note that this is a classical, not a relativistic, * effect. * * (ii) The transformation complies with special relativity. * *
    3. Care is needed with units. The star coordinates are in radians * and the proper motions in radians per Julian year, but the * parallax is in arcseconds; the radial velocity is in km/s, but * the pv-vector result is in au and au/day. * *
    4. The proper motions are the rate of change of the right ascension * and declination at the catalog epoch and are in radians per Julian * year. The RA proper motion is in terms of coordinate angle, not * true angle, and will thus be numerically larger at high * declinations. * *
    5. Straight-line motion at constant speed in the inertial frame is * assumed. If the speed is greater than or equal to the speed of * light, the function aborts with an error status. * *
    6. The inverse transformation is performed by the function jauStarpv. *
    *

    Called:

      *
    • {@link #jauPn} decompose p-vector into modulus and direction *
    • {@link #jauPdp} scalar product of two p-vectors *
    • {@link #jauSxp} multiply p-vector by scalar *
    • {@link #jauPmp} p-vector minus p-vector *
    • {@link #jauPm} modulus of p-vector *
    • {@link #jauPpp} p-vector plus p-vector *
    • {@link #jauPv2s} pv-vector to spherical *
    • {@link #jauAnp} normalize angle into range 0 to 2pi *
    *

    Reference: * * Stumpff, P., 1985, Astron.Astrophys. 144, 232-240. * *@version 2017 May 30 * * @since Release 20101201 * * */ public static CatalogCoords jauPvstar(double pv[][]) throws JSOFAInternalError { double x[] = new double[3], vr, ur[] = new double[3], vt, ut[] = new double[3], bett, betr, d, w, del, usr[] = new double[3], ust[] = new double[3]; /* Isolate the radial component of the velocity (au/day, inertial). */ NormalizedVector nv = jauPn(pv[0]); x = nv.u; vr = jauPdp(x, pv[1]); ur = jauSxp(vr,x); /* Isolate the transverse component of the velocity (au/day, inertial). */ ut = jauPmp(pv[1], ur); vt = jauPm(ut); /* Special-relativity dimensionless parameters. */ bett = vt / DC; betr = vr / DC; /* The inertial-to-observed correction terms. */ d = 1.0 + betr; w = betr*betr + bett*bett; if (d == 0.0 || w > 1) throw new JSOFAInternalError("Superluminal speed", -1); del = -w / (sqrt(1.0 -w) + 1.0); /* Apply relativistic correction factor to radial velocity component. */ w = (betr != 0) ? (betr - del) / (betr * d) : 1.0; usr = jauSxp(w,ur); /* Apply relativistic correction factor to tangential velocity */ /* component. */ ust = jauSxp(1.0/d, ut); /* Combine the two to obtain the observed velocity vector (au/day). */ pv[1] = jauPpp(usr, ust); /* Cartesian to spherical. */ SphericalPositionVelocity pvs = jauPv2s(pv); if (pvs.pos.r == 0.0) throw new JSOFAInternalError("null position vector", -2); /* Return RA in range 0 to 2pi. */ double ra = jauAnp(pvs.pos.theta); /* Return proper motions in radians per year. */ double pmr = pvs.vel.theta * DJY; double pmd = pvs.vel.phi * DJY; /* Return parallax in arcsec. */ double px = DR2AS / pvs.pos.r; /* Return radial velocity in km/s. */ double rv = 1e-3 * pvs.vel.r * DAU / DAYSEC; /* OK status. */ return new CatalogCoords(ra, pvs.pos.phi, pmr, pmd, px, rv); } /** * Update a pv-vector. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param dt double time interval * @param pv double[2][3] pv-vector * * * @return upv double[2][3] returned p updated, v unchanged * *

    Notes: *

      * *
    1. "Update" means "refer the position component of the vector * to a new date dt time units from the existing date". * *
    2. The time units of dt must match those of the velocity. * *
    3. It is permissible for pv and upv to be the same array. *
    *

    Called:

      *
    • {@link #jauPpsp} p-vector plus scaled p-vector *
    • {@link #jauCp} copy p-vector *
    *@version 2008 November 17 * * @since Release 20101201 * * */ public static double[][] jauPvu(double dt, double pv[][] ) { double upv[][] = new double[2][3]; upv[0] = jauPpsp(pv[0], dt, pv[1]); jauCp(pv[1], upv[1]); return upv; } /** * Update a pv-vector, discarding the velocity component. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param dt double time interval * @param pv double[2][3] pv-vector * * * @return p double[3] returned p-vector * *

    Notes: *

      * *
    1. "Update" means "refer the position component of the vector to a * new date dt time units from the existing date". * *
    2. The time units of dt must match those of the velocity. *
    *@version 2008 May 11 * * @since Release 20101201 * * */ public static double[] jauPvup(double dt, double pv[][] ) { double p[] = new double[3]; p[0] = pv[0][0] + dt * pv[1][0]; p[1] = pv[0][1] + dt * pv[1][1]; p[2] = pv[0][2] + dt * pv[1][2]; return p; } /** * Outer (=vector=cross) product of two pv-vectors. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param a double[2][3] first pv-vector * @param b double[2][3] second pv-vector * * * @return axb double[2][3] returned a x b * *

    Notes: *

      * *
    1. If the position and velocity components of the two pv-vectors are * ( ap, av ) and ( bp, bv ), the result, a x b, is the pair of * vectors ( ap x bp, ap x bv + av x bp ). The two vectors are the * cross-product of the two p-vectors and its derivative. * *
    2. It is permissible to re-use the same array for any of the * arguments. *
    *

    Called:

      *
    • {@link #jauCpv} copy pv-vector *
    • {@link #jauPxp} vector product of two p-vectors *
    • {@link #jauPpp} p-vector plus p-vector *
    *@version 2008 November 18 * * @since Release 20101201 * * */ public static double[][] jauPvxpv(double a[][], double b[][] ) { double wa[][] = new double[2][3], wb[][] = new double[2][3], axbd[] = new double[3], adxb[] = new double[3]; double axb[][] = new double[2][3]; /* Make copies of the inputs. */ jauCpv(a, wa); jauCpv(b, wb); /* a x b = position part of result. */ axb[0] = jauPxp(wa[0], wb[0]); /* a x bdot + adot x b = velocity part of result. */ axbd = jauPxp(wa[0],wb[1]); adxb = jauPxp(wa[1],wb[0]); axb[1] = jauPpp(axbd, adxb); return axb; } /** * p-vector outer (=vector=cross) product. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param a double[3] first p-vector * @param b double[3] second p-vector * * * @return axb double[3] returned a x b * * Note: * It is permissible to re-use the same array for any of the * arguments. * *@version 2008 November 18 * * @since Release 20101201 * * */ public static double[] jauPxp(double a[] , double b[] ) { double xa, ya, za, xb, yb, zb; double axb[] = new double[3]; xa = a[0]; ya = a[1]; za = a[2]; xb = b[0]; yb = b[1]; zb = b[2]; axb[0] = ya*zb - za*yb; axb[1] = za*xb - xa*zb; axb[2] = xa*yb - ya*xb; return axb; } /** * Express an r-matrix as an r-vector. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param r double[3][3] rotation matrix * * * @return w double[3] returned rotation vector (Note 1) * *

    Notes: *

      * *
    1. A rotation matrix describes a rotation through some angle about * some arbitrary axis called the Euler axis. The "rotation vector" * returned by this function has the same direction as the Euler axis, * and its magnitude is the angle in radians. (The magnitude and * direction can be separated by means of the function jauPn.) * *
    2. If r is null, so is the result. If r is not a rotation matrix * the result is undefined; r must be proper (i.e. have a positive * determinant) and real orthogonal (inverse = transpose). * *
    3. The reference frame rotates clockwise as seen looking along * the rotation vector from the origin. *
    *@version 2008 May 12 * * @since Release 20101201 * * */ public static double[] jauRm2v(double r[][] ) { double x, y, z, s2, c2, phi, f; double w[] = new double[3]; x = r[1][2] - r[2][1]; y = r[2][0] - r[0][2]; z = r[0][1] - r[1][0]; s2 = sqrt(x*x + y*y + z*z); if (s2 > 0) { c2 = r[0][0] + r[1][1] + r[2][2] - 1; phi = atan2(s2, c2); f = phi / s2; w[0] = x * f; w[1] = y * f; w[2] = z * f; } else { w[0] = 0.0; w[1] = 0.0; w[2] = 0.0; } return w; } /** * Form the r-matrix corresponding to a given r-vector. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param w double[3] rotation vector (Note 1) * * * @return r double[3][3] returned rotation matrix * *

    Notes: *

      * *
    1. A rotation matrix describes a rotation through some angle about * some arbitrary axis called the Euler axis. The "rotation vector" * supplied to This function has the same direction as the Euler * axis, and its magnitude is the angle in radians. * *
    2. If w is null, the identity matrix is returned. * *
    3. The reference frame rotates clockwise as seen looking along the * rotation vector from the origin. *
    *@version 2008 May 11 * * @since Release 20101201 * * */ public static double[][] jauRv2m(double w[]) { double x, y, z, phi, s, c, f; double r[][] = new double[3][3]; /* Euler angle (magnitude of rotation vector) and functions. */ x = w[0]; y = w[1]; z = w[2]; phi = sqrt(x*x + y*y + z*z); s = sin(phi); c = cos(phi); f = 1.0 - c; /* Euler axis (direction of rotation vector), perhaps null. */ if (phi > 0.0) { x /= phi; y /= phi; z /= phi; } /* Form the rotation matrix. */ r[0][0] = x*x*f + c; r[0][1] = x*y*f + z*s; r[0][2] = x*z*f - y*s; r[1][0] = y*x*f - z*s; r[1][1] = y*y*f + c; r[1][2] = y*z*f + x*s; r[2][0] = z*x*f + y*s; r[2][1] = z*y*f - x*s; r[2][2] = z*z*f + c; return r; } /** * Rotate an r-matrix about the x-axis. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param phi double angle (radians) * * Given and returned: * @param r double[3][3] r-matrix given and returned * * Sign convention: The matrix can be used to rotate the reference * frame of a vector. Calling this function with positive phi * incorporates in the matrix an additional rotation, about the x-axis, * anticlockwise as seen looking towards the origin from positive x. * *

    Called:

      *
    • {@link #jauIr} initialize r-matrix to identity *
    • {@link #jauRxr} product of two r-matrices *
    • {@link #jauCr} copy r-matrix *
    *@version 2008 May 22 * * @since Release 20101201 * * */ public static void jauRx(double phi, double r[][]) { double s, c, a[][] = new double[3][3], w[][]; /* Matrix representing new rotation. */ s = sin(phi); c = cos(phi); jauIr(a); a[1][1] = c; a[2][1] = -s; a[1][2] = s; a[2][2] = c; /* Rotate. */ w = jauRxr(a, r); /* Return result. */ jauCr(w, r); return; } /** * Multiply a p-vector by an r-matrix. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param r double[3][3] r-matrix * @param p double[3] p-vector * * * @return rp double[3] returned r * p * * Note: *

      *
    1. The algorithm is for the simple case where the r-matrix r is not * a function of time. The case where r is a function of time leads * to an additional velocity component equal to the product of the * derivative of r and the position vector. * *
    2. It is permissible for p and rp to be the same array. *
    * *

    Called:

      *
    • {@link #jauCp} copy p-vector *
    *@version 2008 October 28 * * @since Release 20101201 * * */ public static double[] jauRxp(double r[][], double p[]) { double w, wrp[] = new double[3] ; int i, j; /* Matrix r * vector p. */ for (j = 0; j < 3; j++) { w = 0.0; for (i = 0; i < 3; i++) { w += r[j][i] * p[i]; } wrp[j] = w; } return wrp; } /** * Multiply a pv-vector by an r-matrix. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param r double[3][3] r-matrix * @param pv double[2][3] pv-vector * * * @return rpv double[2][3] returned r * pv * * Note: * It is permissible for pv and rpv to be the same array. * *

    Called:

      *
    • {@link #jauRxp} product of r-matrix and p-vector *
    *@version 2008 October 28 * * @since Release 20101201 * * */ public static double[][] jauRxpv(double r[][], double pv[][]) { double rpv[][] = new double[2][0]; rpv[0] = jauRxp(r, pv[0]); rpv[1] = jauRxp(r, pv[1]); return rpv; } /** * Multiply two r-matrices. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param a double[3][3] first r-matrix * @param b double[3][3] second r-matrix * * * @return atb double[3][3] returned a * b * * Note: * It is permissible to re-use the same array for any of the * arguments. * *

    Called:

      *
    • {@link #jauCr} copy r-matrix *
    *@version 2008 November 18 * * @since Release 20101201 * * */ public static double[][] jauRxr(double a[][], double b[][]) { int i, j, k; double w, wm[][] = new double[3][3]; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { w = 0.0; for (k = 0; k < 3; k++) { w += a[i][k] * b[k][j]; } wm[i][j] = w; } } return wm; } /** * Rotate an r-matrix about the y-axis. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param theta double angle (radians) * * Given and returned: * @param r double[3][3] given & returned r-matrix * * Sign convention: The matrix can be used to rotate the reference * frame of a vector. Calling This function with positive theta * incorporates in the matrix an additional rotation, about the y-axis, * anticlockwise as seen looking towards the origin from positive y. * *

    Called:

      *
    • {@link #jauIr} initialize r-matrix to identity *
    • {@link #jauRxr} product of two r-matrices *
    • {@link #jauCr} copy r-matrix *
    *@version 2008 May 22 * * @since Release 20101201 * * */ public static void jauRy(double theta, double r[][]) { double s, c, a[][] = new double[3][3], w[][]; /* Matrix representing new rotation. */ s = sin(theta); c = cos(theta); jauIr(a); a[0][0] = c; a[2][0] = s; a[0][2] = -s; a[2][2] = c; /* Rotate. */ w = jauRxr(a, r); /* Return result. */ jauCr(w, r); return; } /** * Rotate an r-matrix about the z-axis. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param psi double angle (radians) * * Given and returned: * @param r double[3][3] given & retunedr-matrix, rotated * * Sign convention: The matrix can be used to rotate the reference * frame of a vector. Calling This function with positive psi * incorporates in the matrix an additional rotation, about the z-axis, * anticlockwise as seen looking towards the origin from positive z. * *

    Called:

      *
    • {@link #jauIr} initialize r-matrix to identity *
    • {@link #jauRxr} product of two r-matrices *
    • {@link #jauCr} copy r-matrix *
    *@version 2008 May 22 * * @since Release 20101201 * * */ public static void jauRz(double psi, double r[][]) { double s, c, a[][] = new double[3][3], w[][]; /* Matrix representing new rotation. */ s = sin(psi); c = cos(psi); jauIr(a); a[0][0] = c; a[1][0] = -s; a[0][1] = s; a[1][1] = c; /* Rotate. */ w = jauRxr(a, r); /* Return result. */ jauCr(w, r); return; } /** * The CIO locator s, positioning the Celestial Intermediate Origin on * the equator of the Celestial Intermediate Pole, given the CIP's X,Y * coordinates. Compatible with IAU 2000A precession-nutation. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: canonical model. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * @param x double CIP coordinates (Note 3) * @param y double CIP coordinates (Note 3) * * * @return double the CIO locator s in radians (Note 2) * *

    Notes: *

      * *
    1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
          *            date1          date2
          *
          *         2450123.7           0.0       (JD method)
          *         2451545.0       -1421.3       (J2000 method)
          *         2400000.5       50123.2       (MJD method)
          *         2450123.5           0.2       (date & time method)
          *
      * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
    2. The CIO locator s is the difference between the right ascensions * of the same point in two systems: the two systems are the GCRS * and the CIP,CIO, and the point is the ascending node of the * CIP equator. The quantity s remains below 0.1 arcsecond * throughout 1900-2100. * *
    3. The series used to compute s is in fact for s+XY/2, where X and Y * are the x and y components of the CIP unit vector; this series * is more compact than a direct series for s would be. This * function requires X,Y to be supplied by the caller, who is * responsible for providing values that are consistent with the * supplied date. * *
    4. The model is consistent with the IAU 2000A precession-nutation. *
    *

    Called:

      *
    • {@link #jauFal03} mean anomaly of the Moon *
    • {@link #jauFalp03} mean anomaly of the Sun *
    • {@link #jauFaf03} mean argument of the latitude of the Moon *
    • {@link #jauFad03} mean elongation of the Moon from the Sun *
    • {@link #jauFaom03} mean longitude of the Moon's ascending node *
    • {@link #jauFave03} mean longitude of Venus *
    • {@link #jauFae03} mean longitude of Earth *
    • {@link #jauFapa03} general accumulated precession in longitude *
    *

    References: * *

    Capitaine, N., Chapront, J., Lambert, S. and Wallace, P., * "Expressions for the Celestial Intermediate Pole and Celestial * Ephemeris Origin consistent with the IAU 2000A precession- * nutation model", Astron.Astrophys. 400, 1145-1154 (2003) * * n.b. The celestial ephemeris origin (CEO) was renamed "celestial * intermediate origin" (CIO) by IAU 2006 Resolution 2. * *

    McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2010 January 18 * * @since Release 20101201 * * */ public static double jauS00(double date1, double date2, double x, double y) { /* Time since J2000.0, in Julian centuries */ double t; /* Miscellaneous */ int i, j; double a, w0, w1, w2, w3, w4, w5; /* Fundamental arguments */ double fa[] = new double[8]; /* Returned value */ double s; /* --------------------- */ /* The series for s+XY/2 */ /* --------------------- */ /* Polynomial coefficients */ final double sp[] = { /* 1-6 */ 94.00e-6, 3808.35e-6, -119.94e-6, -72574.09e-6, 27.70e-6, 15.61e-6 }; /* Terms of order t^0 */ final TERM s0[] = { /* 1-10 */ new TERM(new int[]{ 0, 0, 0, 0, 1, 0, 0, 0}, -2640.73e-6, 0.39e-6 ), new TERM(new int[]{ 0, 0, 0, 0, 2, 0, 0, 0}, -63.53e-6, 0.02e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 3, 0, 0, 0}, -11.75e-6, -0.01e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 1, 0, 0, 0}, -11.21e-6, -0.01e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 2, 0, 0, 0}, 4.57e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 3, 0, 0, 0}, -2.02e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 1, 0, 0, 0}, -1.98e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 0, 0, 3, 0, 0, 0}, 1.72e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, 0, 0, 1, 0, 0, 0}, 1.41e-6, 0.01e-6 ), new TERM(new int[]{ 0, 1, 0, 0, -1, 0, 0, 0}, 1.26e-6, 0.01e-6 ), /* 11-20 */ new TERM(new int[]{ 1, 0, 0, 0, -1, 0, 0, 0}, 0.63e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 0, 0, 1, 0, 0, 0}, 0.63e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, 2, -2, 3, 0, 0, 0}, -0.46e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, 2, -2, 1, 0, 0, 0}, -0.45e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 4, -4, 4, 0, 0, 0}, -0.36e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 1, -1, 1, -8, 12, 0}, 0.24e-6, 0.12e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 0, 0, 0, 0}, -0.32e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 2, 0, 0, 0}, -0.28e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 2, 0, 3, 0, 0, 0}, -0.27e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 2, 0, 1, 0, 0, 0}, -0.26e-6, 0.00e-6 ), /* 21-30 */ new TERM(new int[]{ 0, 0, 2, -2, 0, 0, 0, 0}, 0.21e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, -2, 2, -3, 0, 0, 0}, -0.19e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, -2, 2, -1, 0, 0, 0}, -0.18e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 0, 0, 0, 8,-13, -1}, 0.10e-6, -0.05e-6 ), new TERM(new int[]{ 0, 0, 0, 2, 0, 0, 0, 0}, -0.15e-6, 0.00e-6 ), new TERM(new int[]{ 2, 0, -2, 0, -1, 0, 0, 0}, 0.14e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, 2, -2, 2, 0, 0, 0}, 0.14e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 0, -2, 1, 0, 0, 0}, -0.14e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 0, -2, -1, 0, 0, 0}, -0.14e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 4, -2, 4, 0, 0, 0}, -0.13e-6, 0.00e-6 ), /* 31-33 */ new TERM(new int[]{ 0, 0, 2, -2, 4, 0, 0, 0}, 0.11e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, -2, 0, -3, 0, 0, 0}, -0.11e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, -2, 0, -1, 0, 0, 0}, -0.11e-6, 0.00e-6 ) }; /* Terms of order t^1 */ final TERM s1[] ={ /* 1-3 */ new TERM(new int[]{ 0, 0, 0, 0, 2, 0, 0, 0}, -0.07e-6, 3.57e-6 ), new TERM(new int[]{ 0, 0, 0, 0, 1, 0, 0, 0}, 1.71e-6, -0.03e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 3, 0, 0, 0}, 0.00e-6, 0.48e-6 ) }; /* Terms of order t^2 */ final TERM s2[] ={ /* 1-10 */ new TERM(new int[]{ 0, 0, 0, 0, 1, 0, 0, 0}, 743.53e-6, -0.17e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 2, 0, 0, 0}, 56.91e-6, 0.06e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 2, 0, 0, 0}, 9.84e-6, -0.01e-6 ), new TERM(new int[]{ 0, 0, 0, 0, 2, 0, 0, 0}, -8.85e-6, 0.01e-6 ), new TERM(new int[]{ 0, 1, 0, 0, 0, 0, 0, 0}, -6.38e-6, -0.05e-6 ), new TERM(new int[]{ 1, 0, 0, 0, 0, 0, 0, 0}, -3.07e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, 2, -2, 2, 0, 0, 0}, 2.23e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 1, 0, 0, 0}, 1.67e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 2, 0, 2, 0, 0, 0}, 1.30e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, -2, 2, -2, 0, 0, 0}, 0.93e-6, 0.00e-6 ), /* 11-20 */ new TERM(new int[]{ 1, 0, 0, -2, 0, 0, 0, 0}, 0.68e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 1, 0, 0, 0}, -0.55e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, -2, 0, -2, 0, 0, 0}, 0.53e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 0, 2, 0, 0, 0, 0}, -0.27e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 0, 0, 1, 0, 0, 0}, -0.27e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, -2, -2, -2, 0, 0, 0}, -0.26e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 0, 0, -1, 0, 0, 0}, -0.25e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 2, 0, 1, 0, 0, 0}, 0.22e-6, 0.00e-6 ), new TERM(new int[]{ 2, 0, 0, -2, 0, 0, 0, 0}, -0.21e-6, 0.00e-6 ), new TERM(new int[]{ 2, 0, -2, 0, -1, 0, 0, 0}, 0.20e-6, 0.00e-6 ), /* 21-25 */ new TERM(new int[]{ 0, 0, 2, 2, 2, 0, 0, 0}, 0.17e-6, 0.00e-6 ), new TERM(new int[]{ 2, 0, 2, 0, 2, 0, 0, 0}, 0.13e-6, 0.00e-6 ), new TERM(new int[]{ 2, 0, 0, 0, 0, 0, 0, 0}, -0.13e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 2, -2, 2, 0, 0, 0}, -0.12e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 0, 0, 0, 0}, -0.11e-6, 0.00e-6 ) }; /* Terms of order t^3 */ final TERM s3[] ={ /* 1-4 */ new TERM(new int[]{ 0, 0, 0, 0, 1, 0, 0, 0}, 0.30e-6, -23.51e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 2, 0, 0, 0}, -0.03e-6, -1.39e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 2, 0, 0, 0}, -0.01e-6, -0.24e-6 ), new TERM(new int[]{ 0, 0, 0, 0, 2, 0, 0, 0}, 0.00e-6, 0.22e-6 ) }; /* Terms of order t^4 */ final TERM s4[] ={ /* 1-1 */ new TERM(new int[]{ 0, 0, 0, 0, 1, 0, 0, 0}, -0.26e-6, -0.01e-6 ) }; /* Number of terms in the series */ final int NS0 = s0.length; final int NS1 = s1.length; final int NS2 = s2.length; final int NS3 = s3.length; final int NS4 = s4.length; /*--------------------------------------------------------------------*/ /* Interval between fundamental epoch J2000.0 and current date (JC). */ t = ((date1 - DJ00) + date2) / DJC; /* Fundamental Arguments (from IERS Conventions 2003) */ /* Mean anomaly of the Moon. */ fa[0] = jauFal03(t); /* Mean anomaly of the Sun. */ fa[1] = jauFalp03(t); /* Mean longitude of the Moon minus that of the ascending node. */ fa[2] = jauFaf03(t); /* Mean elongation of the Moon from the Sun. */ fa[3] = jauFad03(t); /* Mean longitude of the ascending node of the Moon. */ fa[4] = jauFaom03(t); /* Mean longitude of Venus. */ fa[5] = jauFave03(t); /* Mean longitude of Earth. */ fa[6] = jauFae03(t); /* General precession in longitude. */ fa[7] = jauFapa03(t); /* Evaluate s. */ w0 = sp[0]; w1 = sp[1]; w2 = sp[2]; w3 = sp[3]; w4 = sp[4]; w5 = sp[5]; for (i = NS0-1; i >= 0; i--) { a = 0.0; for (j = 0; j < 8; j++) { a += (double)s0[i].nfa[j] * fa[j]; } w0 += s0[i].s * sin(a) + s0[i].c * cos(a); } for (i = NS1-1; i >= 0; i--) { a = 0.0; for (j = 0; j < 8; j++) { a += (double)s1[i].nfa[j] * fa[j]; } w1 += s1[i].s * sin(a) + s1[i].c * cos(a); } for (i = NS2-1; i >= 0; i--) { a = 0.0; for (j = 0; j < 8; j++) { a += (double)s2[i].nfa[j] * fa[j]; } w2 += s2[i].s * sin(a) + s2[i].c * cos(a); } for (i = NS3-1; i >= 0; i--) { a = 0.0; for (j = 0; j < 8; j++) { a += (double)s3[i].nfa[j] * fa[j]; } w3 += s3[i].s * sin(a) + s3[i].c * cos(a); } for (i = NS4-1; i >= 0; i--) { a = 0.0; for (j = 0; j < 8; j++) { a += (double)s4[i].nfa[j] * fa[j]; } w4 += s4[i].s * sin(a) + s4[i].c * cos(a); } s = (w0 + (w1 + (w2 + (w3 + (w4 + w5 * t) * t) * t) * t) * t) * DAS2R - x*y/2.0; return s; } /** * The CIO locator s, positioning the Celestial Intermediate Origin on * the equator of the Celestial Intermediate Pole, using the IAU 2000A * precession-nutation model. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return double the CIO locator s in radians (Note 2) * *

    Notes: *

      * *
    1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
          *            date1          date2
          *
          *         2450123.7           0.0       (JD method)
          *         2451545.0       -1421.3       (J2000 method)
          *         2400000.5       50123.2       (MJD method)
          *         2450123.5           0.2       (date & time method)
          *
      * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
    2. The CIO locator s is the difference between the right ascensions * of the same point in two systems. The two systems are the GCRS * and the CIP,CIO, and the point is the ascending node of the * CIP equator. The CIO locator s remains a small fraction of * 1 arcsecond throughout 1900-2100. * *
    3. The series used to compute s is in fact for s+XY/2, where X and Y * are the x and y components of the CIP unit vector; this series * is more compact than a direct series for s would be. The present * function uses the full IAU 2000A nutation model when predicting * the CIP position. Faster results, with no significant loss of * accuracy, can be obtained via the function jauS00b, which uses * instead the IAU 2000B truncated model. *
    *

    Called:

      *
    • {@link #jauPnm00a} classical NPB matrix, IAU 2000A *
    • {@link #jauBpn2xy} extract CIP X,Y from the BPN matrix *
    • {@link #jauS00} the CIO locator s, given X,Y, IAU 2000A *
    *

    References: * *

    Capitaine, N., Chapront, J., Lambert, S. and Wallace, P., * "Expressions for the Celestial Intermediate Pole and Celestial * Ephemeris Origin consistent with the IAU 2000A precession- * nutation model", Astron.Astrophys. 400, 1145-1154 (2003) * * n.b. The celestial ephemeris origin (CEO) was renamed "celestial * intermediate origin" (CIO) by IAU 2006 Resolution 2. * *

    McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2010 January 18 * * @since Release 20101201 * * */ public static double jauS00a(double date1, double date2) { double s; /* Bias-precession-nutation-matrix, IAU 2000A. */ double rbpn[][] = jauPnm00a(date1, date2); /* Extract the CIP coordinates. */ CelestialIntermediatePole cip = jauBpn2xy(rbpn); /* Compute the CIO locator s, given the CIP coordinates. */ s = jauS00(date1, date2, cip.x, cip.y); return s; } /** * The CIO locator s, positioning the Celestial Intermediate Origin on * the equator of the Celestial Intermediate Pole, using the IAU 2000B * precession-nutation model. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return double the CIO locator s in radians (Note 2) * *

    Notes: *

      * *
    1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
          *            date1          date2
          *
          *         2450123.7           0.0       (JD method)
          *         2451545.0       -1421.3       (J2000 method)
          *         2400000.5       50123.2       (MJD method)
          *         2450123.5           0.2       (date & time method)
          *
      * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
    2. The CIO locator s is the difference between the right ascensions * of the same point in two systems. The two systems are the GCRS * and the CIP,CIO, and the point is the ascending node of the * CIP equator. The CIO locator s remains a small fraction of * 1 arcsecond throughout 1900-2100. * *
    3. The series used to compute s is in fact for s+XY/2, where X and Y * are the x and y components of the CIP unit vector; this series * is more compact than a direct series for s would be. The present * function uses the IAU 2000B truncated nutation model when * predicting the CIP position. The function jauS00a uses instead * the full IAU 2000A model, but with no significant increase in * accuracy and at some cost in speed. *
    *

    Called:

      *
    • {@link #jauPnm00b} classical NPB matrix, IAU 2000B *
    • {@link #jauBpn2xy} extract CIP X,Y from the BPN matrix *
    • {@link #jauS00} the CIO locator s, given X,Y, IAU 2000A *
    *

    References: * *

    Capitaine, N., Chapront, J., Lambert, S. and Wallace, P., * "Expressions for the Celestial Intermediate Pole and Celestial * Ephemeris Origin consistent with the IAU 2000A precession- * nutation model", Astron.Astrophys. 400, 1145-1154 (2003) * * n.b. The celestial ephemeris origin (CEO) was renamed "celestial * intermediate origin" (CIO) by IAU 2006 Resolution 2. * *

    McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2010 January 18 * * @since Release 20101201 * * */ public static double jauS00b(double date1, double date2) { double rbpn[][] = new double[3][3], s; /* Bias-precession-nutation-matrix, IAU 2000B. */ rbpn = jauPnm00b(date1, date2); /* Extract the CIP coordinates. */ CelestialIntermediatePole cip = jauBpn2xy(rbpn); /* Compute the CIO locator s, given the CIP coordinates. */ s = jauS00(date1, date2, cip.x, cip.y); return s; } /** * The CIO locator s, positioning the Celestial Intermediate Origin on * the equator of the Celestial Intermediate Pole, given the CIP's X,Y * coordinates. Compatible with IAU 2006/2000A precession-nutation. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: canonical model. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * @param x double CIP coordinates (Note 3) * @param y double CIP coordinates (Note 3) * * * @return double the CIO locator s in radians (Note 2) * *

    Notes: *

      * *
    1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
          *            date1          date2
          *
          *         2450123.7           0.0       (JD method)
          *         2451545.0       -1421.3       (J2000 method)
          *         2400000.5       50123.2       (MJD method)
          *         2450123.5           0.2       (date & time method)
          *
      * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
    2. The CIO locator s is the difference between the right ascensions * of the same point in two systems: the two systems are the GCRS * and the CIP,CIO, and the point is the ascending node of the * CIP equator. The quantity s remains below 0.1 arcsecond * throughout 1900-2100. * *
    3. The series used to compute s is in fact for s+XY/2, where X and Y * are the x and y components of the CIP unit vector; this series * is more compact than a direct series for s would be. This * function requires X,Y to be supplied by the caller, who is * responsible for providing values that are consistent with the * supplied date. * *
    4. The model is consistent with the "P03" precession (Capitaine et * al. 2003), adopted by IAU 2006 Resolution 1, 2006, and the * IAU 2000A nutation (with P03 adjustments). *
    *

    Called:

      *
    • {@link #jauFal03} mean anomaly of the Moon *
    • {@link #jauFalp03} mean anomaly of the Sun *
    • {@link #jauFaf03} mean argument of the latitude of the Moon *
    • {@link #jauFad03} mean elongation of the Moon from the Sun *
    • {@link #jauFaom03} mean longitude of the Moon's ascending node *
    • {@link #jauFave03} mean longitude of Venus *
    • {@link #jauFae03} mean longitude of Earth *
    • {@link #jauFapa03} general accumulated precession in longitude *
    *

    References: * *

    Capitaine, N., Wallace, P.T. & Chapront, J., 2003, Astron. * Astrophys. 432, 355 * *

    McCarthy, D.D., Petit, G. (eds.) 2004, IERS Conventions (2003), * IERS Technical Note No. 32, BKG * *@version 2009 December 17 * * @since Release 20101201 * * */ public static double jauS06(double date1, double date2, double x, double y) { /* Time since J2000.0, in Julian centuries */ double t; /* Miscellaneous */ int i, j; double a, w0, w1, w2, w3, w4, w5; /* Fundamental arguments */ double fa[] = new double[8]; /* Returned value */ double s; /* --------------------- */ /* The series for s+XY/2 */ /* --------------------- */ /* Polynomial coefficients */ final double sp[] = { /* 1-6 */ 94.00e-6, 3808.65e-6, -122.68e-6, -72574.11e-6, 27.98e-6, 15.62e-6 }; /* Terms of order t^0 */ final TERM s0[] = { /* 1-10 */ new TERM(new int[]{ 0, 0, 0, 0, 1, 0, 0, 0}, -2640.73e-6, 0.39e-6 ), new TERM(new int[]{ 0, 0, 0, 0, 2, 0, 0, 0}, -63.53e-6, 0.02e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 3, 0, 0, 0}, -11.75e-6, -0.01e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 1, 0, 0, 0}, -11.21e-6, -0.01e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 2, 0, 0, 0}, 4.57e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 3, 0, 0, 0}, -2.02e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 1, 0, 0, 0}, -1.98e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 0, 0, 3, 0, 0, 0}, 1.72e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, 0, 0, 1, 0, 0, 0}, 1.41e-6, 0.01e-6 ), new TERM(new int[]{ 0, 1, 0, 0, -1, 0, 0, 0}, 1.26e-6, 0.01e-6 ), /* 11-20 */ new TERM(new int[]{ 1, 0, 0, 0, -1, 0, 0, 0}, 0.63e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 0, 0, 1, 0, 0, 0}, 0.63e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, 2, -2, 3, 0, 0, 0}, -0.46e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, 2, -2, 1, 0, 0, 0}, -0.45e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 4, -4, 4, 0, 0, 0}, -0.36e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 1, -1, 1, -8, 12, 0}, 0.24e-6, 0.12e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 0, 0, 0, 0}, -0.32e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 2, 0, 0, 0}, -0.28e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 2, 0, 3, 0, 0, 0}, -0.27e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 2, 0, 1, 0, 0, 0}, -0.26e-6, 0.00e-6 ), /* 21-30 */ new TERM(new int[]{ 0, 0, 2, -2, 0, 0, 0, 0}, 0.21e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, -2, 2, -3, 0, 0, 0}, -0.19e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, -2, 2, -1, 0, 0, 0}, -0.18e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 0, 0, 0, 8,-13, -1}, 0.10e-6, -0.05e-6 ), new TERM(new int[]{ 0, 0, 0, 2, 0, 0, 0, 0}, -0.15e-6, 0.00e-6 ), new TERM(new int[]{ 2, 0, -2, 0, -1, 0, 0, 0}, 0.14e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, 2, -2, 2, 0, 0, 0}, 0.14e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 0, -2, 1, 0, 0, 0}, -0.14e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 0, -2, -1, 0, 0, 0}, -0.14e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 4, -2, 4, 0, 0, 0}, -0.13e-6, 0.00e-6 ), /* 31-33 */ new TERM(new int[]{ 0, 0, 2, -2, 4, 0, 0, 0}, 0.11e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, -2, 0, -3, 0, 0, 0}, -0.11e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, -2, 0, -1, 0, 0, 0}, -0.11e-6, 0.00e-6 ) }; /* Terms of order t^1 */ final TERM s1[] = { /* 1 - 3 */ new TERM(new int[]{ 0, 0, 0, 0, 2, 0, 0, 0}, -0.07e-6, 3.57e-6 ), new TERM(new int[]{ 0, 0, 0, 0, 1, 0, 0, 0}, 1.73e-6, -0.03e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 3, 0, 0, 0}, 0.00e-6, 0.48e-6 ) }; /* Terms of order t^2 */ final TERM s2[] = { /* 1-10 */ new TERM(new int[]{ 0, 0, 0, 0, 1, 0, 0, 0}, 743.52e-6, -0.17e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 2, 0, 0, 0}, 56.91e-6, 0.06e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 2, 0, 0, 0}, 9.84e-6, -0.01e-6 ), new TERM(new int[]{ 0, 0, 0, 0, 2, 0, 0, 0}, -8.85e-6, 0.01e-6 ), new TERM(new int[]{ 0, 1, 0, 0, 0, 0, 0, 0}, -6.38e-6, -0.05e-6 ), new TERM(new int[]{ 1, 0, 0, 0, 0, 0, 0, 0}, -3.07e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, 2, -2, 2, 0, 0, 0}, 2.23e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 1, 0, 0, 0}, 1.67e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 2, 0, 2, 0, 0, 0}, 1.30e-6, 0.00e-6 ), new TERM(new int[]{ 0, 1, -2, 2, -2, 0, 0, 0}, 0.93e-6, 0.00e-6 ), /* 11-20 */ new TERM(new int[]{ 1, 0, 0, -2, 0, 0, 0, 0}, 0.68e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 1, 0, 0, 0}, -0.55e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, -2, 0, -2, 0, 0, 0}, 0.53e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 0, 2, 0, 0, 0, 0}, -0.27e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 0, 0, 1, 0, 0, 0}, -0.27e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, -2, -2, -2, 0, 0, 0}, -0.26e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 0, 0, -1, 0, 0, 0}, -0.25e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 2, 0, 1, 0, 0, 0}, 0.22e-6, 0.00e-6 ), new TERM(new int[]{ 2, 0, 0, -2, 0, 0, 0, 0}, -0.21e-6, 0.00e-6 ), new TERM(new int[]{ 2, 0, -2, 0, -1, 0, 0, 0}, 0.20e-6, 0.00e-6 ), /* 21-25 */ new TERM(new int[]{ 0, 0, 2, 2, 2, 0, 0, 0}, 0.17e-6, 0.00e-6 ), new TERM(new int[]{ 2, 0, 2, 0, 2, 0, 0, 0}, 0.13e-6, 0.00e-6 ), new TERM(new int[]{ 2, 0, 0, 0, 0, 0, 0, 0}, -0.13e-6, 0.00e-6 ), new TERM(new int[]{ 1, 0, 2, -2, 2, 0, 0, 0}, -0.12e-6, 0.00e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 0, 0, 0, 0}, -0.11e-6, 0.00e-6 ) }; /* Terms of order t^3 */ final TERM s3[] = { /* 1-4 */ new TERM(new int[]{ 0, 0, 0, 0, 1, 0, 0, 0}, 0.30e-6, -23.42e-6 ), new TERM(new int[]{ 0, 0, 2, -2, 2, 0, 0, 0}, -0.03e-6, -1.46e-6 ), new TERM(new int[]{ 0, 0, 2, 0, 2, 0, 0, 0}, -0.01e-6, -0.25e-6 ), new TERM(new int[]{ 0, 0, 0, 0, 2, 0, 0, 0}, 0.00e-6, 0.23e-6 ) }; /* Terms of order t^4 */ final TERM s4[] = { /* 1-1 */ new TERM(new int[]{ 0, 0, 0, 0, 1, 0, 0, 0}, -0.26e-6, -0.01e-6 ) }; /* Number of terms in the series */ final int NS0 = s0.length; final int NS1 = s1.length; final int NS2 = s2.length; final int NS3 = s3.length; final int NS4 = s4.length; /*--------------------------------------------------------------------*/ /* Interval between fundamental epoch J2000.0 and current date (JC). */ t = ((date1 - DJ00) + date2) / DJC; /* Fundamental Arguments (from IERS Conventions 2003) */ /* Mean anomaly of the Moon. */ fa[0] = jauFal03(t); /* Mean anomaly of the Sun. */ fa[1] = jauFalp03(t); /* Mean longitude of the Moon minus that of the ascending node. */ fa[2] = jauFaf03(t); /* Mean elongation of the Moon from the Sun. */ fa[3] = jauFad03(t); /* Mean longitude of the ascending node of the Moon. */ fa[4] = jauFaom03(t); /* Mean longitude of Venus. */ fa[5] = jauFave03(t); /* Mean longitude of Earth. */ fa[6] = jauFae03(t); /* General precession in longitude. */ fa[7] = jauFapa03(t); /* Evaluate s. */ w0 = sp[0]; w1 = sp[1]; w2 = sp[2]; w3 = sp[3]; w4 = sp[4]; w5 = sp[5]; for (i = NS0-1; i >= 0; i--) { a = 0.0; for (j = 0; j < 8; j++) { a += (double)s0[i].nfa[j] * fa[j]; } w0 += s0[i].s * sin(a) + s0[i].c * cos(a); } for (i = NS1-1; i >= 0; i--) { a = 0.0; for (j = 0; j < 8; j++) { a += (double)s1[i].nfa[j] * fa[j]; } w1 += s1[i].s * sin(a) + s1[i].c * cos(a); } for (i = NS2-1; i >= 0; i--) { a = 0.0; for (j = 0; j < 8; j++) { a += (double)s2[i].nfa[j] * fa[j]; } w2 += s2[i].s * sin(a) + s2[i].c * cos(a); } for (i = NS3-1; i >= 0; i--) { a = 0.0; for (j = 0; j < 8; j++) { a += (double)s3[i].nfa[j] * fa[j]; } w3 += s3[i].s * sin(a) + s3[i].c * cos(a); } for (i = NS4-1; i >= 0; i--) { a = 0.0; for (j = 0; j < 8; j++) { a += (double)s4[i].nfa[j] * fa[j]; } w4 += s4[i].s * sin(a) + s4[i].c * cos(a); } s = (w0 + (w1 + (w2 + (w3 + (w4 + w5 * t) * t) * t) * t) * t) * DAS2R - x*y/2.0; return s; } /** * The CIO locator s, positioning the Celestial Intermediate Origin on * the equator of the Celestial Intermediate Pole, using the IAU 2006 * precession and IAU 2000A nutation models. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return double the CIO locator s in radians (Note 2) * *

    Notes: *

      * *
    1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
          *            date1          date2
          *
          *         2450123.7           0.0       (JD method)
          *         2451545.0       -1421.3       (J2000 method)
          *         2400000.5       50123.2       (MJD method)
          *         2450123.5           0.2       (date & time method)
          *
      * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
    2. The CIO locator s is the difference between the right ascensions * of the same point in two systems. The two systems are the GCRS * and the CIP,CIO, and the point is the ascending node of the * CIP equator. The CIO locator s remains a small fraction of * 1 arcsecond throughout 1900-2100. * *
    3. The series used to compute s is in fact for s+XY/2, where X and Y * are the x and y components of the CIP unit vector; this series is * more compact than a direct series for s would be. The present * function uses the full IAU 2000A nutation model when predicting * the CIP position. *
    *

    Called:

      *
    • {@link #jauPnm06a} classical NPB matrix, IAU 2006/2000A *
    • {@link #jauBpn2xy} extract CIP X,Y coordinates from NPB matrix *
    • {@link #jauS06} the CIO locator s, given X,Y, IAU 2006 *
    *

    References: * *

    Capitaine, N., Chapront, J., Lambert, S. and Wallace, P., * "Expressions for the Celestial Intermediate Pole and Celestial * Ephemeris Origin consistent with the IAU 2000A precession- * nutation model", Astron.Astrophys. 400, 1145-1154 (2003) * * n.b. The celestial ephemeris origin (CEO) was renamed "celestial * intermediate origin" (CIO) by IAU 2006 Resolution 2. * *

    Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 * *

    McCarthy, D. D., Petit, G. (eds.), 2004, IERS Conventions (2003), * IERS Technical Note No. 32, BKG * *

    Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 * *@version 2010 January 18 * * @since Release 20101201 * * */ public static double jauS06a(double date1, double date2) { double rnpb[][] = new double[3][3], s; /* Bias-precession-nutation-matrix, IAU 20006/2000A. */ rnpb = jauPnm06a(date1, date2); /* Extract the CIP coordinates. */ CelestialIntermediatePole cip = jauBpn2xy(rnpb); /* Compute the CIO locator s, given the CIP coordinates. */ s = jauS06(date1, date2, cip.x, cip.y); return s; } /** * Convert spherical coordinates to Cartesian. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param theta double longitude angle (radians) * @param phi double latitude angle (radians) * * * @return c double[3] returned direction cosines * *@version 2008 October 28 * * @since Release 20101201 * * */ public static double[] jauS2c(double theta, double phi ) { double cp, c[] = new double[3]; cp = cos(phi); c[0] = cos(theta) * cp; c[1] = sin(theta) * cp; c[2] = sin(phi); return c; } /** * Convert spherical polar coordinates to p-vector. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param theta double longitude angle (radians) * @param phi double latitude angle (radians) * @param r double radial distance * * * @return p double[3] returned Cartesian coordinates * *

    Called:

      *
    • {@link #jauS2c} spherical coordinates to unit vector *
    • {@link #jauSxp} multiply p-vector by scalar *
    *@version 2008 May 11 * * @since Release 20101201 * * */ public static double[] jauS2p(double theta, double phi, double r ) { double p[]; double u[] = new double[3]; u = jauS2c(theta,phi); p = jauSxp(r,u); return p; } /** * Convert position/velocity from spherical to Cartesian coordinates. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param theta double longitude angle (radians) * @param phi double latitude angle (radians) * @param r double radial distance * @param td double rate of change of theta * @param pd double rate of change of phi * @param rd double rate of change of r * * * @return pv double[2][3] returned pv-vector * *@version 2008 May 25 * * @since Release 20101201 * * */ public static double[][] jauS2pv(double theta, double phi, double r, double td, double pd, double rd) { double pv[][] = new double[2][3]; double st, ct, sp, cp, rcp, x, y, rpd, w; st = sin(theta); ct = cos(theta); sp = sin(phi); cp = cos(phi); rcp = r * cp; x = rcp * ct; y = rcp * st; rpd = r * pd; w = rpd*sp - cp*rd; pv[0][0] = x; pv[0][1] = y; pv[0][2] = r * sp; pv[1][0] = -y*td - w*ct; pv[1][1] = x*td - w*st; pv[1][2] = rpd*cp + sp*rd; return pv; } /** * Multiply a pv-vector by two scalars. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param s1 double scalar to multiply position component by * @param s2 double scalar to multiply velocity component by * @param pv double[2][3] pv-vector * * * @return spv double[2][3] returned pv-vector: p scaled by s1, v scaled by s2 * * Note: * It is permissible for pv and spv to be the same array. * *

    Called:

      *
    • {@link #jauSxp} multiply p-vector by scalar *
    *@version 2008 October 28 * * @since Release 20101201 * * */ public static double[][] jauS2xpv(double s1, double s2, double pv[][]) { double spv[][] = new double[2][3]; spv[0] = jauSxp(s1, pv[0]); spv[1] =jauSxp(s2, pv[1]); return spv; } /** * Angular separation between two p-vectors. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param a double[3] first p-vector (not necessarily unit length) * @param b double[3] second p-vector (not necessarily unit length) * * * @return double angular separation (radians, always positive) * *

    Notes: *

      * *
    1. If either vector is null, a zero result is returned. * *
    2. The angular separation is most simply formulated in terms of * scalar product. However, this gives poor accuracy for angles * near zero and pi. The present algorithm uses both cross product * and dot product, to deliver full accuracy whatever the size of * the angle. *
    *

    Called:

      *
    • {@link #jauPxp} vector product of two p-vectors *
    • {@link #jauPm} modulus of p-vector *
    • {@link #jauPdp} scalar product of two p-vectors *
    *@version 2008 May 22 * * @since Release 20101201 * * */ public static double jauSepp(double a[] , double b[] ) { double axb[] = new double[3], ss, cs, s; /* Sine of angle between the vectors, multiplied by the two moduli. */ axb = jauPxp(a,b); ss = jauPm(axb); /* Cosine of the angle, multiplied by the two moduli. */ cs = jauPdp(a, b); /* The angle. */ s = ((ss != 0.0) || (cs != 0.0)) ? atan2(ss, cs) : 0.0; return s; } /** * Angular separation between two sets of spherical coordinates. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param al double first longitude (radians) * @param ap double first latitude (radians) * @param bl double second longitude (radians) * @param bp double second latitude (radians) * * * @return double angular separation (radians) * *

    Called:

      *
    • {@link #jauS2c} spherical coordinates to unit vector *
    • {@link #jauSepp} angular separation between two p-vectors *
    *@version 2008 May 16 * * @since Release 20101201 * * */ public static double jauSeps(double al, double ap, double bl, double bp) { double ac[] = new double[3], bc[] = new double[3], s; /* Spherical to Cartesian. */ ac = jauS2c(al,ap); bc = jauS2c(bl,bp); /* Angle between the vectors. */ s = jauSepp(ac, bc); return s; } /** * The TIO locator s', positioning the Terrestrial Intermediate Origin * on the equator of the Celestial Intermediate Pole. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: canonical model. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return double the TIO locator s' in radians (Note 2) * *

    Notes: *

      * *
    1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
          *            date1          date2
          *
          *         2450123.7           0.0       (JD method)
          *         2451545.0       -1421.3       (J2000 method)
          *         2400000.5       50123.2       (MJD method)
          *         2450123.5           0.2       (date & time method)
          *
      * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
    2. The TIO locator s' is obtained from polar motion observations by * numerical integration, and so is in essence unpredictable. * However, it is dominated by a secular drift of about * 47 microarcseconds per century, which is the approximation * evaluated by the present function. *
    *

    Reference: * *

    McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2008 May 24 * * @since Release 20101201 * * */ public static double jauSp00(double date1, double date2) { double t, sp; /* Interval between fundamental epoch J2000.0 and current date (JC). */ t = ((date1 - DJ00) + date2) / DJC; /* Approximate s'. */ sp = -47e-6 * t * DAS2R; return sp; } /** * Star proper motion: update star catalog data for space motion. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param ra1 double right ascension (radians), before * @param dec1 double declination (radians), before * @param pmr1 double RA proper motion (radians/year), before * @param pmd1 double Dec proper motion (radians/year), before * @param px1 double parallax (arcseconds), before * @param rv1 double radial velocity (km/s, +ve = receding), before * @param ep1a double "before" epoch, part A (Note 1) * @param ep1b double "before" epoch, part B (Note 1) * @param ep2a double "after" epoch, part A (Note 1) * @param ep2b double "after" epoch, part B (Note 1) * * * @return ra2 double returned right ascension (radians), after * dec2 double returned declination (radians), after * pmr2 double returned RA proper motion (radians/year), after * pmd2 double returned Dec proper motion (radians/year), after * px2 double returned parallax (arcseconds), after * rv2 double returned radial velocity (km/s, +ve = receding), after * * * @return int status: * -1 = system error (should not occur) * 0 = no warnings or errors * 1 = distance overridden (Note 6) * 2 = excessive velocity (Note 7) * 4 = solution didn't converge (Note 8) * else = binary logical OR of the above warnings *FIXME need to return the status as well. *

    Notes: *

      * *
    1. The starting and ending TDB dates ep1a+ep1b and ep2a+ep2b are * Julian Dates, apportioned in any convenient way between the two * parts (A and B). For example, JD(TDB)=2450123.7 could be * expressed in any of these ways, among others: *
          *             epna          epnb
          *
          *         2450123.7           0.0       (JD method)
          *         2451545.0       -1421.3       (J2000 method)
          *         2400000.5       50123.2       (MJD method)
          *         2450123.5           0.2       (date & time method)
          *
      * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
    2. In accordance with normal star-catalog conventions, the object's * right ascension and declination are freed from the effects of * secular aberration. The frame, which is aligned to the catalog * equator and equinox, is Lorentzian and centered on the SSB. * * The proper motions are the rate of change of the right ascension * and declination at the catalog epoch and are in radians per TDB * Julian year. * * The parallax and radial velocity are in the same frame. * *
    3. Care is needed with units. The star coordinates are in radians * and the proper motions in radians per Julian year, but the * parallax is in arcseconds. * *
    4. The RA proper motion is in terms of coordinate angle, not true * angle. If the catalog uses arcseconds for both RA and Dec proper * motions, the RA proper motion will need to be divided by cos(Dec) * before use. * *
    5. Straight-line motion at constant speed, in the inertial frame, * is assumed. * *
    6. An extremely small (or zero or negative) parallax is interpreted * to mean that the object is on the "celestial sphere", the radius * of which is an arbitrary (large) value (see the jauStarpv * function for the value used). When the distance is overridden in * this way, the status, initially zero, has 1 added to it. * *
    7. If the space velocity is a significant fraction of c (see the * constant VMAX in the function jauStarpv), it is arbitrarily set * to zero. When this action occurs, 2 is added to the status. * *
    8. The relativistic adjustment carried out in the jauStarpv function * involves an iterative calculation. If the process fails to * converge within a set number of iterations, 4 is added to the * status. *
    *

    Called:

      *
    • {@link #jauStarpv} star catalog data to space motion pv-vector *
    • {@link #jauPvu} update a pv-vector *
    • {@link #jauPdp} scalar product of two p-vectors *
    • {@link #jauPvstar} space motion pv-vector to star catalog data *
    *@version 2008 May 16 * * @since Release 20101201 * * */ public static CatalogCoords jauStarpm(double ra1, double dec1, double pmr1, double pmd1, double px1, double rv1, double ep1a, double ep1b, double ep2a, double ep2b) throws JSOFAInternalError { double pv1[][] = new double[2][3], tl1, dt, pv[][] = new double[2][3], r2, rdv, v2, c2mv2, tl2, pv2[][] = new double[2][3]; jauStarpv(ra1, dec1, pmr1, pmd1, px1, rv1, pv1); /* Light time when observed (days). */ tl1 = jauPm(pv1[0]) / DC; /* Time interval, "before" to "after" (days). */ dt = (ep2a - ep1a) + (ep2b - ep1b); /* Move star along track from the "before" observed position to the */ /* "after" geometric position. */ pv = jauPvu(dt + tl1, pv1); /* From this geometric position, deduce the observed light time (days) */ /* at the "after" epoch (with theoretically unneccessary error check). */ r2 = jauPdp(pv[0], pv[0]); rdv = jauPdp(pv[0], pv[1]); v2 = jauPdp(pv[1], pv[1]); c2mv2 = DC*DC - v2; if (c2mv2 <= 0) throw new JSOFAInternalError("internal error", -1); tl2 = (-rdv + sqrt(rdv*rdv + c2mv2*r2)) / c2mv2; /* Move the position along track from the observed place at the */ /* "before" epoch to the observed place at the "after" epoch. */ pv2 =jauPvu(dt + (tl1 - tl2), pv1 ); /* Space motion pv-vector to RA,Dec etc. at the "after" epoch. */ CatalogCoords cat = jauPvstar(pv2); return cat; } /** * Convert star catalog coordinates to position+velocity vector. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: support function. * * Given (Note 1): * @param ra double right ascension (radians) * @param dec double declination (radians) * @param pmr double RA proper motion (radians/year) * @param pmd double Dec proper motion (radians/year) * @param px double parallax (arcseconds) * @param rv double radial velocity (km/s, positive = receding) * * Returned (Note 2): * @param pv double[2][3] pv-vector (au, au/day) * * * @return int status: * 0 = no warnings * 1 = distance overridden (Note 6) * 2 = excessive speed (Note 7) * 4 = solution didn't converge (Note 8) * else = binary logical OR of the above * *

    Notes: *

      * *
    1. The star data accepted by this function are "observables" for an * imaginary observer at the solar-system barycenter. Proper motion * and radial velocity are, strictly, in terms of barycentric * coordinate time, TCB. For most practical applications, it is * permissible to neglect the distinction between TCB and ordinary * "proper" time on Earth (TT/TAI). The result will, as a rule, be * limited by the intrinsic accuracy of the proper-motion and * radial-velocity data; moreover, the pv-vector is likely to be * merely an intermediate result, so that a change of time unit * would cancel out overall. * * In accordance with normal star-catalog conventions, the object's * right ascension and declination are freed from the effects of * secular aberration. The frame, which is aligned to the catalog * equator and equinox, is Lorentzian and centered on the SSB. * *
    2. The resulting position and velocity pv-vector is with respect to * the same frame and, like the catalog coordinates, is freed from * the effects of secular aberration. Should the "coordinate * direction", where the object was located at the catalog epoch, be * required, it may be obtained by calculating the magnitude of the * position vector pv[0][0-2] dividing by the speed of light in * au/day to give the light-time, and then multiplying the space * velocity pv[1][0-2] by this light-time and adding the result to * pv[0][0-2]. * * Summarizing, the pv-vector returned is for most stars almost * identical to the result of applying the standard geometrical * "space motion" transformation. The differences, which are the * subject of the Stumpff paper referenced below, are: * * (i) In stars with significant radial velocity and proper motion, * the constantly changing light-time distorts the apparent proper * motion. Note that this is a classical, not a relativistic, * effect. * * (ii) The transformation complies with special relativity. * *
    3. Care is needed with units. The star coordinates are in radians * and the proper motions in radians per Julian year, but the * parallax is in arcseconds; the radial velocity is in km/s, but * the pv-vector result is in au and au/day. * *
    4. The RA proper motion is in terms of coordinate angle, not true * angle. If the catalog uses arcseconds for both RA and Dec proper * motions, the RA proper motion will need to be divided by cos(Dec) * before use. * *
    5. Straight-line motion at constant speed, in the inertial frame, * is assumed. * *
    6. An extremely small (or zero or negative) parallax is interpreted * to mean that the object is on the "celestial sphere", the radius * of which is an arbitrary (large) value (see the constant PXMIN). * When the distance is overridden in this way, the status, * initially zero, has 1 added to it. * *
    7. If the space velocity is a significant fraction of c (see the * constant VMAX), it is arbitrarily set to zero. When this action * occurs, 2 is added to the status. * *
    8. The relativistic adjustment involves an iterative calculation. * If the process fails to converge within a set number (IMAX) of * iterations, 4 is added to the status. * *
    9. The inverse transformation is performed by the function * jauPvstar. *
    *

    Called:

      *
    • {@link #jauS2pv} spherical coordinates to pv-vector *
    • {@link #jauPm} modulus of p-vector *
    • {@link #jauZp} zero p-vector *
    • {@link #jauPn} decompose p-vector into modulus and direction *
    • {@link #jauPdp} scalar product of two p-vectors *
    • {@link #jauSxp} multiply p-vector by scalar *
    • {@link #jauPmp} p-vector minus p-vector *
    • {@link #jauPpp} p-vector plus p-vector *
    *

    Reference: * * Stumpff, P., 1985, Astron.Astrophys. 144, 232-240. * *@version 2009 July 6 * * @since Release 20101201 * * */ public static int jauStarpv(double ra, double dec, double pmr, double pmd, double px, double rv, double pv[][]) { /* Smallest allowed parallax */ final double PXMIN = 1e-7; /* Largest allowed speed (fraction of c) */ final double VMAX = 0.5; /* Maximum number of iterations for relativistic solution */ final int IMAX = 100; int i, iwarn; double w, r, rd, rad, decd, v, x[] = new double[3], usr[] = new double[3], ust[] = new double[3], vsr, vst, betst, betsr, bett, betr, dd, ddel, ur[] = new double[3], ut[] = new double[3], d = 0.0, del = 0.0, /* to prevent */ odd = 0.0, oddel = 0.0, /* compiler */ od = 0.0, odel = 0.0; /* warnings */ /* Distance (au). */ if (px >= PXMIN) { w = px; iwarn = 0; } else { w = PXMIN; iwarn = 1; } r = DR2AS / w; /* Radial velocity (au/day). */ rd = DAYSEC * rv * 1e3 / DAU; /* Proper motion (radian/day). */ rad = pmr / DJY; decd = pmd / DJY; /* To pv-vector (au,au/day). */ double[][] pvt = jauS2pv(ra, dec, r, rad, decd, rd); jauCpv(pvt,pv); /* If excessive velocity, arbitrarily set it to zero. */ v = jauPm(pv[1]); if (v / DC > VMAX) { jauZp(pv[1]); iwarn += 2; } /* Isolate the radial component of the velocity (au/day). */ NormalizedVector nv = jauPn(pv[0]); w = nv.r; x = nv.u; vsr = jauPdp(x, pv[1]); usr = jauSxp(vsr,x); /* Isolate the transverse component of the velocity (au/day). */ ust = jauPmp(pv[1], usr); vst = jauPm(ust); /* Special-relativity dimensionless parameters. */ betsr = vsr / DC; betst = vst / DC; /* Determine the inertial-to-observed relativistic correction terms. */ bett = betst; betr = betsr; for (i = 0; i < IMAX; i++) { d = 1.0 + betr; del = sqrt(1.0 - betr*betr - bett*bett) - 1.0; betr = d * betsr + del; bett = d * betst; if (i > 0) { dd = abs(d - od); ddel = abs(del - odel); if ((i > 1) && (dd >= odd) && (ddel >= oddel)) break; odd = dd; oddel = ddel; } od = d; odel = del; } if (i >= IMAX) iwarn += 4; /* Replace observed radial velocity with inertial value. */ w = (betsr != 0.0) ? d + del / betsr : 1.0; ur = jauSxp(w,usr); /* Replace observed tangential velocity with inertial value. */ ut = jauSxp(d,ust); /* Combine the two to obtain the inertial space velocity. */ pv[1] = jauPpp(ur, ut); /* Return the status. */ return iwarn; } /** * Multiply a p-vector by a scalar. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param s double scalar * @param p double[3] p-vector * * * @return sp double[3] returned s * p * * * *@version 2008 October 28 * * @since Release 20101201 * * */ public static double[] jauSxp(double s, double p[]) { double sp[] = new double[3]; sp[0] = s * p[0]; sp[1] = s * p[1]; sp[2] = s * p[2]; return sp; } /** * Multiply a pv-vector by a scalar. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param s double scalar * @param pv double[2][3] pv-vector * * * @return spv double[2][3] returned s * pv * * Note: * It is permissible for pv and psv to be the same array * *

    Called:

      *
    • {@link #jauS2xpv} multiply pv-vector by two scalars *
    *@version 2008 October 28 * * @since Release 20101201 * * */ public static double[][] jauSxpv(double s, double pv[][]) { double spv[][]; spv = jauS2xpv(s, s, pv); return spv; } /** * * Time scale transformation: International Atomic Time, TAI, to * Terrestrial Time, TT. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: canonical. * * * @param tai1 double TAI as a 2-part Julian Date * @param tai2 double TAI as a 2-part Julian Date * * * @return JulianDate TT as a 2-part Julian Date * * * Note: * * tai1+tai2 is Julian Date, apportioned in any convenient way * between the two arguments, for example where tai1 is the Julian * Day Number and tai2 is the fraction of a day. The returned * tt1,tt2 follow suit. * *

    References: * * McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992) * *@version 2010 May 16 * *@since SOFA release 2010-12-01 * * */ public static JulianDate jauTaitt(double tai1, double tai2) { double tt1, tt2; /* TT minus TAI (days). */ final double dtat = TTMTAI / DAYSEC; /* Result, safeguarding precision. */ if ( abs(tai1) > abs(tai2) ) { tt1 = tai1; tt2 = tai2 + dtat; } else { tt1 = tai1 + dtat; tt2 = tai2; } return new JulianDate(tt1, tt2); }; /** * * Time scale transformation: International Atomic Time, TAI, to * Universal Time, UT1. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: canonical. * * * @param tai1 double TAI as a 2-part Julian Date * @param tai2 double TAI as a 2-part Julian Date * @param dta double UT1-TAI in seconds * * * @return UT1 as a 2-part Julian Date * * *

    Notes: *

      *
    1. tai1+tai2 is Julian Date, apportioned in any convenient way * between the two arguments, for example where tai1 is the Julian * Day Number and tai2 is the fraction of a day. The returned * UT11,UT12 follow suit. * *
    2. The argument dta, i.e. UT1-TAI, is an observed quantity, and is * available from IERS tabulations. *
    * Reference: * * Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992) * *@version 2010 May 16 * *@since SOFA release 2010-12-01 * * * */ public static JulianDate jauTaiut1(double tai1, double tai2, double dta) { double dtad,ut11, ut12; /* Result, safeguarding precision. */ dtad = dta / DAYSEC; if ( abs(tai1) > abs(tai2) ) { ut11 = tai1; ut12 = tai2 + dtad; } else { ut11 = tai1 + dtad; ut12 = tai2; } return new JulianDate(ut11, ut12); }; /** * * Time scale transformation: International Atomic Time, TAI, to * Coordinated Universal Time, UTC. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: canonical. * * * @param tai1 TAI as a 2-part Julian Date (Note 1) * @param tai2 TAI as a 2-part Julian Date (Note 1) * * * @return UTC as a 2-part quasi Julian Date (Notes 1-3) * * Returned (function value): * int status: +1 = dubious year (Note 4) * 0 = OK * -1 = unacceptable date * *

    Notes:

    *
      *
    1. tai1+tai2 is Julian Date, apportioned in any convenient way * between the two arguments, for example where tai1 is the Julian * Day Number and tai2 is the fraction of a day. The returned utc1 * and utc2 form an analogous pair, except that a special convention * is used, to deal with the problem of leap seconds - see the next * note. * *
    2. JD cannot unambiguously represent UTC during a leap second unless * special measures are taken. The convention in the present * function is that the JD day represents UTC days whether the * length is 86399, 86400 or 86401 SI seconds. * *
    3. The function jauD2dtf can be used to transform the UTC quasi-JD * into calendar date and clock time, including UTC leap second * handling. * *
    4. The warning status "dubious year" flags UTCs that predate the * introduction of the time scale and that are too far in the future * to be trusted. See jauDat for further details. *
    * Called: *
      *
    • {@link #jauJd2cal} JD to Gregorian calendar *
    • {@link #jauDat} delta(AT) = TAI-UTC *
    • {@link #jauCal2jd} Gregorian calendar to JD *
    *

    References: * * McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992) * *@version 2010 May 16 * *@since SOFA release 2010-12-01 * * * @throws JSOFAIllegalParameter * @throws JSOFAInternalError an internal error has occured */ public static JulianDate jauTaiutc(double tai1, double tai2) throws JSOFAIllegalParameter, JSOFAInternalError { boolean big1; int i; double a1, a2,dats1, ddats, dats2, datd = 0.0, as1, as2, da, d1, d2, fd; double utc1, utc2; /* Put the two parts of the TAI into big-first order. */ big1 = ( abs(tai1) >= abs(tai2) ); if ( big1 ) { a1 = tai1; a2 = tai2; } else { a1 = tai2; a2 = tai1; } /* See if the TAI can possibly be in a leap-second day. */ d1 = a1; dats1 = 0.0; for ( i = -1; i <= 3; i++ ) { d2 = a2 + (double) i; Calendar dt; dt = jauJd2cal(d1, d2 ); dats2 = jauDat(dt.iy, dt.im, dt.id, 0.0); //FIXME if ( js < 0 ) return -1; if ( i == -1 ) dats1 = dats2; ddats = dats2 - dats1; datd = dats1 / DAYSEC; if ( abs(ddats) >= 0.5 ) { /* Yes. Get TAI for the start of the UTC day that */ /* ends in a leap. */ JulianDate jd = jauCal2jd(dt.iy, dt.im, dt.id ); d1 = jd.djm0; d2 = jd.djm1; as1 = d1; as2 = d2 - 1.0 + datd; /* Is the TAI after this point? */ da = a1 - as1; da = da + ( a2 - as2 ); if ( da > 0 ) { /* Yes: fraction of the current UTC day that has elapsed. */ fd = da * DAYSEC / ( DAYSEC + ddats ); /* Ramp TAI-UTC to bring about SOFA's JD(UTC) convention. */ datd += ddats * ( fd <= 1.0 ? fd : 1.0 ) / DAYSEC; } /* Done. */ break; } dats1 = dats2; } /* Subtract the (possibly adjusted) TAI-UTC from TAI to give UTC. */ a2 -= datd; /* Return the UTC result, preserving the TAI order. */ if ( big1 ) { utc1 = a1; utc2 = a2; } else { utc1 = a2; utc2 = a1; } /* TODO Status */ return new JulianDate(utc1, utc2); }; /** * * Time scale transformation: Barycentric Coordinate Time, TCB, to * Barycentric Dynamical Time, TDB. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: canonical. * * * @param tcb1 double TCB as a 2-part Julian Date * @param tcb2 double TCB as a 2-part Julian Date * * * @return TDB as a 2-part Julian Date * * *

    Notes: *

      *
    1. tcb1+tcb2 is Julian Date, apportioned in any convenient way * between the two arguments, for example where tcb1 is the Julian * Day Number and tcb2 is the fraction of a day. The returned * tdb1,tdb2 follow suit. * *
    2. The 2006 IAU General Assembly introduced a conventional linear * transformation between TDB and TCB. This transformation * compensates for the drift between TCB and terrestrial time TT, * and keeps TDB approximately centered on TT. Because the * relationship between TT and TCB depends on the adopted solar * system ephemeris, the degree of alignment between TDB and TT over * long intervals will vary according to which ephemeris is used. * Former definitions of TDB attempted to avoid this problem by * stipulating that TDB and TT should differ only by periodic * effects. This is a good description of the nature of the * relationship but eluded precise mathematical formulation. The * conventional linear relationship adopted in 2006 sidestepped * these difficulties whilst delivering a TDB that in practice was * consistent with values before that date. * *
    3. TDB is essentially the same as Teph, the time argument for the * JPL solar system ephemerides. *
    * Reference: * * IAU 2006 Resolution B3 * *@version 2010 May 16 * *@since SOFA release 2010-12-01 * * */ public static JulianDate jauTcbtdb(double tcb1, double tcb2) { double tdb1, tdb2; /* 1977 Jan 1 00:00:32.184 TT, as two-part JD */ final double t77td = DJM0 + DJM77; final double t77tf = TTMTAI/DAYSEC; /* TDB (days) at TAI 1977 Jan 1.0 */ final double tdb0 = TDB0/86400.0; double d; /* Result, safeguarding precision. */ if ( abs(tcb1) > abs(tcb2) ) { d = tcb1 - t77td; tdb1 = tcb1; tdb2 = tcb2 + tdb0 - ( d + ( tcb2 - t77tf ) ) * ELB; } else { d = tcb2 - t77td; tdb1 = tcb1 + tdb0 - ( d + ( tcb1 - t77tf ) ) * ELB; tdb2 = tcb2; } return new JulianDate(tdb1, tdb2); }; /** * Time scale transformation: Geocentric Coordinate Time, TCG, to * Terrestrial Time, TT. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: canonical. * * * @param tcg1 double TCG as a 2-part Julian Date * @param tcg2 double TCG as a 2-part Julian Date * * * @return TT as a 2-part Julian Date * * * Note: * * tcg1+tcg2 is Julian Date, apportioned in any convenient way * between the two arguments, for example where tcg1 is the Julian * Day Number and tcg22 is the fraction of a day. The returned * tt1,tt2 follow suit. * *

    References: * * McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003),. * IERS Technical Note No. 32, BKG (2004) * * IAU 2000 Resolution B1.9 * *@version 2010 May 14 * *@since SOFA release 2010-12-01 * * */ public static JulianDate jauTcgtt(double tcg1, double tcg2) { double tt1,tt2; /* 1977 Jan 1 00:00:32.184 TT, as MJD */ final double t77t = DJM77 + TTMTAI/DAYSEC; /* Result, safeguarding precision. */ if ( abs(tcg1) > abs(tcg2) ) { tt1 = tcg1; tt2 = tcg2 - ( ( tcg1 - DJM0 ) + ( tcg2 - t77t ) ) * ELG; } else { tt1 = tcg1 - ( ( tcg2 - DJM0 ) + ( tcg1 - t77t ) ) * ELG; tt2 = tcg2; } return new JulianDate(tt1, tt2); }; /** * * Time scale transformation: Barycentric Dynamical Time, TDB, to * Barycentric Coordinate Time, TCB. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: canonical. * * * @param tdb1 TDB as a 2-part Julian Date * @param tdb2 TDB as a 2-part Julian Date * * * @return TCB as a 2-part Julian Date * *

    Notes: *

      *
    1. tdb1+tdb2 is Julian Date, apportioned in any convenient way * between the two arguments, for example where tdb1 is the Julian * Day Number and tdb2 is the fraction of a day. The returned * tcb1,tcb2 follow suit. * *
    2. The 2006 IAU General Assembly introduced a conventional linear * transformation between TDB and TCB. This transformation * compensates for the drift between TCB and terrestrial time TT, * and keeps TDB approximately centered on TT. Because the * relationship between TT and TCB depends on the adopted solar * system ephemeris, the degree of alignment between TDB and TT over * long intervals will vary according to which ephemeris is used. * Former definitions of TDB attempted to avoid this problem by * stipulating that TDB and TT should differ only by periodic * effects. This is a good description of the nature of the * relationship but eluded precise mathematical formulation. The * conventional linear relationship adopted in 2006 sidestepped * these difficulties whilst delivering a TDB that in practice was * consistent with values before that date. * *
    3. TDB is essentially the same as Teph, the time argument for the * JPL solar system ephemerides. *
    * Reference: * * IAU 2006 Resolution B3 * *@version 2010 September 10 * *@since SOFA release 2010-12-01 * * */ public static JulianDate jauTdbtcb(double tdb1, double tdb2 ) { double tcb1, tcb2; /* 1977 Jan 1 00:00:32.184 TT, as two-part JD */ final double t77td = DJM0 + DJM77; final double t77tf = TTMTAI/DAYSEC; /* TDB (days) at TAI 1977 Jan 1.0 */ final double tdb0 = TDB0/DAYSEC; /* TDB to TCB rate */ final double elbb = ELB/(1.0-ELB); double d, f; /* Result, preserving date format but safeguarding precision. */ if ( abs(tdb1) > abs(tdb2) ) { d = t77td - tdb1; f = tdb2 - tdb0; tcb1 = tdb1; tcb2 = f - ( d - ( f - t77tf ) ) * elbb; } else { d = t77td - tdb2; f = tdb1 - tdb0; tcb1 = f - ( d - ( f - t77tf ) ) * elbb; tcb2 = tdb2; } return new JulianDate(tcb1, tcb2); }; /** * * Time scale transformation: Barycentric Dynamical Time, TDB, to * Terrestrial Time, TT. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: canonical. * * * @param tdb1 double TDB as a 2-part Julian Date * @param tdb2 double TDB as a 2-part Julian Date * @param dtr double TDB-TT in seconds * * * @return TT as a 2-part Julian Date * * *

    Notes: *

      *
    1. tdb1+tdb2 is Julian Date, apportioned in any convenient way * between the two arguments, for example where tdb1 is the Julian * Day Number and tdb2 is the fraction of a day. The returned * tt1,tt2 follow suit. * *
    2. The argument dtr represents the quasi-periodic component of the * GR transformation between TT and TCB. It is dependent upon the * adopted solar-system ephemeris, and can be obtained by numerical * integration, by interrogating a precomputed time ephemeris or by * evaluating a model such as that implemented in the SOFA function * jauDtdb. The quantity is dominated by an annual term of 1.7 ms * amplitude. * *
    3. TDB is essentially the same as Teph, the time argument for the * JPL solar system ephemerides. *
    *

    References: * * McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * IAU 2006 Resolution 3 * *@version 2010 May 13 * *@since SOFA release 2010-12-01 * * * */ public static JulianDate jauTdbtt(double tdb1, double tdb2, double dtr ) { double tt1, tt2; double dtrd; /* Result, safeguarding precision. */ dtrd = dtr / DAYSEC; if ( abs(tdb1) > abs(tdb2) ) { tt1 = tdb1; tt2 = tdb2 - dtrd; } else { tt1 = tdb1 - dtrd; tt2 = tdb2; } return new JulianDate(tt1, tt2); } /** * * Convert hours, minutes, seconds to radians. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param s char sign: '-' = negative, otherwise positive * @param ihour int hours * @param imin int minutes * @param sec double seconds * * * @return double angle in radians *@throws JSOFAIllegalParameter illegal parameter of some form * 1 = ihour outside range 0-23 * 2 = imin outside range 0-59 * 3 = sec outside range 0-59.999... * *

    Notes: *

      *
    • The result is computed even if any of the range checks fail. * *
    • Negative ihour, imin and/or sec produce a warning status, but * the absolute value is used in the conversion. *
    *@version 2010 August 27 * *@since SOFA release 2010-12-01 * * * */ public static double jauTf2a(char s, int ihour, int imin, double sec ) throws JSOFAIllegalParameter { double rad; /* Compute the interval. */ rad = ( s == '-' ? -1.0 : 1.0 ) * ( 60.0 * ( 60.0 * ( (double) abs(ihour) ) + ( (double) abs(imin) ) ) + abs(sec) ) * DS2R; /* Validate arguments and return status. */ if ( ihour < 0 || ihour > 23 ) throw new JSOFAIllegalParameter("bad hour", 1); if ( imin < 0 || imin > 59 ) throw new JSOFAIllegalParameter("bad minute", 2); if ( sec < 0.0 || sec >= 60.0 )throw new JSOFAIllegalParameter("bad second", 3); return rad; }; /** * * Convert hours, minutes, seconds to days. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param s char sign: '-' = negative, otherwise positive * @param ihour int hours * @param imin int minutes * @param sec double seconds * * * @return double interval in days * * Returned (function value): * int status: 0 = OK * 1 = ihour outside range 0-23 * 2 = imin outside range 0-59 * 3 = sec outside range 0-59.999... * *

    Notes: *

      *
    1. The result is computed even if any of the range checks fail. * *
    2. Negative ihour, imin and/or sec produce a warning status, but * the absolute value is used in the conversion. *
    *@version 2010 August 27 * *@since SOFA release 2010-12-01 * * * @throws JSOFAIllegalParameter whne the inputs outside range - hour outside range 0-23, imin outside range 0-59, sec outside range 0-59.999... */ public static double jauTf2d(char s, int ihour, int imin, double sec) throws JSOFAIllegalParameter { double days; /* Compute the interval. */ days = ( s == '-' ? -1.0 : 1.0 ) * ( 60.0 * ( 60.0 * ( (double) abs(ihour) ) + ( (double) abs(imin) ) ) + abs(sec) ) / DAYSEC; /* Validate arguments and return status. */ if ( ihour < 0 || ihour > 23 ) throw new JSOFAIllegalParameter("bad hour", 1); if ( imin < 0 || imin > 59 ) throw new JSOFAIllegalParameter("bad minute", 2); if ( sec < 0.0 || sec >= 60.0 ) throw new JSOFAIllegalParameter("bad second", 3); return days; } /** * Transpose an r-matrix. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param r double[3][3] r-matrix * * * @return rt double[3][3] returned transpose * * Note: * It is permissible for r and rt to be the same array. * *

    Called:

      *
    • {@link #jauCr} copy r-matrix *
    *@version 2008 May 22 * * @since Release 20101201 * * */ public static double[][] jauTr(double r[][]) { double wm[][]= new double[3][3]; int i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { wm[i][j] = r[j][i]; } } return wm; } /** * Multiply a p-vector by the transpose of an r-matrix. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param r double[3][3] r-matrix * @param p double[3] p-vector * * * @return trp double[3] returned r * p * * Note: * It is permissible for p and trp to be the same array. * *

    Called:

      *
    • {@link #jauTr} transpose r-matrix *
    • {@link #jauRxp} product of r-matrix and p-vector *
    *@version 2008 October 28 * * @since Release 20101201 * * */ public static double[] jauTrxp(double r[][], double p[] ) { double tr[][]; double trp[]; /* Transpose of matrix r. */ tr = jauTr(r); /* Matrix tr * vector p -> vector trp. */ trp = jauRxp(tr, p); return trp; } /** * Multiply a pv-vector by the transpose of an r-matrix. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param r double[3][3] r-matrix * @param pv double[2][3] pv-vector * * * @return trpv double[2][3] returned r * pv * * Note: * It is permissible for pv and trpv to be the same array. * *

    Called:

      *
    • {@link #jauTr} transpose r-matrix *
    • {@link #jauRxpv} product of r-matrix and pv-vector *
    *@version 2008 October 28 * * @since Release 20101201 * * */ public static double[][] jauTrxpv(double r[][], double pv[][] ) { double tr[][], trpv[][]; /* Transpose of matrix r. */ tr = jauTr(r); /* Matrix tr * vector pv -> vector trpv. */ trpv = jauRxpv(tr, pv); return trpv; } /* * constant arrays set outside jauXy06 to avoid problems with 65535 byte limit on function size */ static { /* need to define this function because it appears that javac lumps all of the statically defined initalizers into one function on * compilation - so this will force a second function */ init_mfals(); } /** Fundamental-argument multipliers: luni-solar terms */ private static int mfals[][]; //IMPL would like to be final really private static void init_mfals(){ mfals = new int[][] { /* 1-10 */ { 0, 0, 0, 0, 1 }, { 0, 0, 2, -2, 2 }, { 0, 0, 2, 0, 2 }, { 0, 0, 0, 0, 2 }, { 0, 1, 0, 0, 0 }, { 0, 1, 2, -2, 2 }, { 1, 0, 0, 0, 0 }, { 0, 0, 2, 0, 1 }, { 1, 0, 2, 0, 2 }, { 0, 1, -2, 2, -2 }, /* 11-20 */ { 0, 0, 2, -2, 1 }, { 1, 0, -2, 0, -2 }, { 1, 0, 0, -2, 0 }, { 1, 0, 0, 0, 1 }, { 1, 0, 0, 0, -1 }, { 1, 0, -2, -2, -2 }, { 1, 0, 2, 0, 1 }, { 2, 0, -2, 0, -1 }, { 0, 0, 0, 2, 0 }, { 0, 0, 2, 2, 2 }, /* 21-30 */ { 2, 0, 0, -2, 0 }, { 0, 2, -2, 2, -2 }, { 2, 0, 2, 0, 2 }, { 1, 0, 2, -2, 2 }, { 1, 0, -2, 0, -1 }, { 2, 0, 0, 0, 0 }, { 0, 0, 2, 0, 0 }, { 0, 1, 0, 0, 1 }, { 1, 0, 0, -2, -1 }, { 0, 2, 2, -2, 2 }, /* 31-40 */ { 0, 0, 2, -2, 0 }, { 1, 0, 0, -2, 1 }, { 0, 1, 0, 0, -1 }, { 0, 2, 0, 0, 0 }, { 1, 0, -2, -2, -1 }, { 1, 0, 2, 2, 2 }, { 0, 1, 2, 0, 2 }, { 2, 0, -2, 0, 0 }, { 0, 0, 2, 2, 1 }, { 0, 1, -2, 0, -2 }, /* 41-50 */ { 0, 0, 0, 2, 1 }, { 1, 0, 2, -2, 1 }, { 2, 0, 0, -2, -1 }, { 2, 0, 2, -2, 2 }, { 2, 0, 2, 0, 1 }, { 0, 0, 0, 2, -1 }, { 0, 1, -2, 2, -1 }, { 1, 1, 0, -2, 0 }, { 2, 0, 0, -2, 1 }, { 1, 0, 0, 2, 0 }, /* 51-60 */ { 0, 1, 2, -2, 1 }, { 1, -1, 0, 0, 0 }, { 0, 1, -1, 1, -1 }, { 2, 0, -2, 0, -2 }, { 0, 1, 0, -2, 0 }, { 1, 0, 0, -1, 0 }, { 3, 0, 2, 0, 2 }, { 0, 0, 0, 1, 0 }, { 1, -1, 2, 0, 2 }, { 1, 1, -2, -2, -2 }, /* 61-70 */ { 1, 0, -2, 0, 0 }, { 2, 0, 0, 0, -1 }, { 0, 1, -2, -2, -2 }, { 1, 1, 2, 0, 2 }, { 2, 0, 0, 0, 1 }, { 1, 1, 0, 0, 0 }, { 1, 0, -2, 2, -1 }, { 1, 0, 2, 0, 0 }, { 1, -1, 0, -1, 0 }, { 1, 0, 0, 0, 2 }, /* 71-80 */ { 1, 0, -1, 0, -1 }, { 0, 0, 2, 1, 2 }, { 1, 0, -2, -4, -2 }, { 1, -1, 0, -1, -1 }, { 1, 0, 2, 2, 1 }, { 0, 2, -2, 2, -1 }, { 1, 0, 0, 0, -2 }, { 2, 0, -2, -2, -2 }, { 1, 1, 2, -2, 2 }, { 2, 0, -2, -4, -2 }, /* 81-90 */ { 1, 0, -4, 0, -2 }, { 2, 0, 2, -2, 1 }, { 1, 0, 0, -1, -1 }, { 2, 0, 2, 2, 2 }, { 3, 0, 0, 0, 0 }, { 1, 0, 0, 2, 1 }, { 0, 0, 2, -2, -1 }, { 3, 0, 2, -2, 2 }, { 0, 0, 4, -2, 2 }, { 1, 0, 0, -4, 0 }, /* 91-100 */ { 0, 1, 2, 0, 1 }, { 2, 0, 0, -4, 0 }, { 1, 1, 0, -2, -1 }, { 2, 0, -2, 0, 1 }, { 0, 0, 2, 0, -1 }, { 0, 1, -2, 0, -1 }, { 0, 1, 0, 0, 2 }, { 0, 0, 2, -1, 2 }, { 0, 0, 2, 4, 2 }, { 2, 1, 0, -2, 0 }, /* 101-110 */ { 1, 1, 0, -2, 1 }, { 1, -1, 0, -2, 0 }, { 1, -1, 0, -1, -2 }, { 1, -1, 0, 0, 1 }, { 0, 1, -2, 2, 0 }, { 0, 1, 0, 0, -2 }, { 1, -1, 2, 2, 2 }, { 1, 0, 0, 2, -1 }, { 1, -1, -2, -2, -2 }, { 3, 0, 2, 0, 1 }, /* 111-120 */ { 0, 1, 2, 2, 2 }, { 1, 0, 2, -2, 0 }, { 1, 1, -2, -2, -1 }, { 1, 0, 2, -4, 1 }, { 0, 1, -2, -2, -1 }, { 2, -1, 2, 0, 2 }, { 0, 0, 0, 2, 2 }, { 1, -1, 2, 0, 1 }, { 1, -1, -2, 0, -2 }, { 0, 1, 0, 2, 0 }, /* 121-130 */ { 0, 1, 2, -2, 0 }, { 0, 0, 0, 1, 1 }, { 1, 0, -2, -2, 0 }, { 0, 3, 2, -2, 2 }, { 2, 1, 2, 0, 2 }, { 1, 1, 0, 0, 1 }, { 2, 0, 0, 2, 0 }, { 1, 1, 2, 0, 1 }, { 1, 0, 0, -2, -2 }, { 1, 0, -2, 2, 0 }, /* 131-140 */ { 1, 0, -1, 0, -2 }, { 0, 1, 0, -2, 1 }, { 0, 1, 0, 1, 0 }, { 0, 0, 0, 1, -1 }, { 1, 0, -2, 2, -2 }, { 1, -1, 0, 0, -1 }, { 0, 0, 0, 4, 0 }, { 1, -1, 0, 2, 0 }, { 1, 0, 2, 1, 2 }, { 1, 0, 2, -1, 2 }, /* 141-150 */ { 0, 0, 2, 1, 1 }, { 1, 0, 0, -2, 2 }, { 1, 0, -2, 0, 1 }, { 1, 0, -2, -4, -1 }, { 0, 0, 2, 2, 0 }, { 1, 1, 2, -2, 1 }, { 1, 0, -2, 1, -1 }, { 0, 0, 1, 0, 1 }, { 2, 0, -2, -2, -1 }, { 4, 0, 2, 0, 2 }, /* 151-160 */ { 2, -1, 0, 0, 0 }, { 2, 1, 2, -2, 2 }, { 0, 1, 2, 1, 2 }, { 1, 0, 4, -2, 2 }, { 1, 1, 0, 0, -1 }, { 2, 0, 2, 0, 0 }, { 2, 0, -2, -4, -1 }, { 1, 0, -1, 0, 0 }, { 1, 0, 0, 1, 0 }, { 0, 1, 0, 2, 1 }, /* 161-170 */ { 1, 0, -4, 0, -1 }, { 1, 0, 0, -4, -1 }, { 2, 0, 2, 2, 1 }, { 2, 1, 0, 0, 0 }, { 0, 0, 2, -3, 2 }, { 1, 2, 0, -2, 0 }, { 0, 3, 0, 0, 0 }, { 0, 0, 4, 0, 2 }, { 0, 0, 2, -4, 1 }, { 2, 0, 0, -2, -2 }, /* 171-180 */ { 1, 1, -2, -4, -2 }, { 0, 1, 0, -2, -1 }, { 0, 0, 0, 4, 1 }, { 3, 0, 2, -2, 1 }, { 1, 0, 2, 4, 2 }, { 1, 1, -2, 0, -2 }, { 0, 0, 4, -2, 1 }, { 2, -2, 0, -2, 0 }, { 2, 1, 0, -2, -1 }, { 0, 2, 0, -2, 0 }, /* 181-190 */ { 1, 0, 0, -1, 1 }, { 1, 1, 2, 2, 2 }, { 3, 0, 0, 0, -1 }, { 2, 0, 0, -4, -1 }, { 3, 0, 2, 2, 2 }, { 0, 0, 2, 4, 1 }, { 0, 2, -2, -2, -2 }, { 1, -1, 0, -2, -1 }, { 0, 0, 2, -1, 1 }, { 2, 0, 0, 2, 1 }, /* 191-200 */ { 1, -1, -2, 2, -1 }, { 0, 0, 0, 2, -2 }, { 2, 0, 0, -4, 1 }, { 1, 0, 0, -4, 1 }, { 2, 0, 2, -4, 1 }, { 4, 0, 2, -2, 2 }, { 2, 1, -2, 0, -1 }, { 2, 1, -2, -4, -2 }, { 3, 0, 0, -4, 0 }, { 1, -1, 2, 2, 1 }, /* 201-210 */ { 1, -1, -2, 0, -1 }, { 0, 2, 0, 0, 1 }, { 1, 2, -2, -2, -2 }, { 1, 1, 0, -4, 0 }, { 2, 0, 0, -2, 2 }, { 0, 2, 2, -2, 1 }, { 1, 0, 2, 0, -1 }, { 2, 1, 0, -2, 1 }, { 2, -1, -2, 0, -1 }, { 1, -1, -2, -2, -1 }, /* 211-220 */ { 0, 1, -2, 1, -2 }, { 1, 0, -4, 2, -2 }, { 0, 1, 2, 2, 1 }, { 3, 0, 0, 0, 1 }, { 2, -1, 2, 2, 2 }, { 0, 1, -2, -4, -2 }, { 1, 0, -2, -3, -2 }, { 2, 0, 0, 0, 2 }, { 1, -1, 0, -2, -2 }, { 2, 0, -2, 2, -1 }, /* 221-230 */ { 0, 2, -2, 0, -2 }, { 3, 0, -2, 0, -1 }, { 2, -1, 2, 0, 1 }, { 1, 0, -2, -1, -2 }, { 0, 0, 2, 0, 3 }, { 2, 0, -4, 0, -2 }, { 2, 1, 0, -4, 0 }, { 1, 1, -2, 1, -1 }, { 0, 2, 2, 0, 2 }, { 1, -1, 2, -2, 2 }, /* 231-240 */ { 1, -1, 0, -2, 1 }, { 2, 1, 2, 0, 1 }, { 1, 0, 2, -4, 2 }, { 1, 1, -2, 0, -1 }, { 1, 1, 0, 2, 0 }, { 1, 0, 0, -3, 0 }, { 2, 0, 2, -1, 2 }, { 0, 2, 0, 0, -1 }, { 2, -1, 0, -2, 0 }, { 4, 0, 0, 0, 0 }, /* 241-250 */ { 2, 1, -2, -2, -2 }, { 0, 2, -2, 2, 0 }, { 1, 0, 2, 1, 1 }, { 1, 0, -1, 0, -3 }, { 3, -1, 2, 0, 2 }, { 2, 0, 2, -2, 0 }, { 1, -2, 0, 0, 0 }, { 2, 0, 0, 0, -2 }, { 1, 0, 0, 4, 0 }, { 0, 1, 0, 1, 1 }, /* 251-260 */ { 1, 0, 2, 2, 0 }, { 0, 1, 0, 2, -1 }, { 0, 1, 0, 1, -1 }, { 0, 0, 2, -2, 3 }, { 3, 1, 2, 0, 2 }, { 1, 1, 2, 1, 2 }, { 1, 1, -2, 2, -1 }, { 2, -1, 2, -2, 2 }, { 1, -2, 2, 0, 2 }, { 1, 0, 2, -4, 0 }, /* 261-270 */ { 0, 0, 1, 0, 0 }, { 1, 0, 2, -3, 1 }, { 1, -2, 0, -2, 0 }, { 2, 0, 0, 2, -1 }, { 1, 1, 2, -4, 1 }, { 4, 0, 2, 0, 1 }, { 0, 1, 2, 1, 1 }, { 1, 2, 2, -2, 2 }, { 2, 0, 2, 1, 2 }, { 2, 1, 2, -2, 1 }, /* 271-280 */ { 1, 0, 2, -1, 1 }, { 1, 0, 4, -2, 1 }, { 1, -1, 2, -2, 1 }, { 0, 1, 0, -4, 0 }, { 3, 0, -2, -2, -2 }, { 0, 0, 4, -4, 2 }, { 2, 0, -4, -2, -2 }, { 2, -2, 0, -2, -1 }, { 1, 0, 2, -2, -1 }, { 2, 0, -2, -6, -2 }, /* 281-290 */ { 1, 0, -2, 1, -2 }, { 1, 0, -2, 2, 1 }, { 1, -1, 0, 2, -1 }, { 1, 0, -2, 1, 0 }, { 2, -1, 0, -2, 1 }, { 1, -1, 0, 2, 1 }, { 2, 0, -2, -2, 0 }, { 1, 0, 2, -3, 2 }, { 0, 0, 0, 4, -1 }, { 2, -1, 0, 0, 1 }, /* 291-300 */ { 2, 0, 4, -2, 2 }, { 0, 0, 2, 3, 2 }, { 0, 1, 4, -2, 2 }, { 0, 1, -2, 2, 1 }, { 1, 1, 0, 2, 1 }, { 1, 0, 0, 4, 1 }, { 0, 0, 4, 0, 1 }, { 2, 0, 0, -3, 0 }, { 1, 0, 0, -1, -2 }, { 1, -2, -2, -2, -2 }, /* 301-310 */ { 3, 0, 0, 2, 0 }, { 2, 0, 2, -4, 2 }, { 1, 1, -2, -4, -1 }, { 1, 0, -2, -6, -2 }, { 2, -1, 0, 0, -1 }, { 2, -1, 0, 2, 0 }, { 0, 1, 2, -2, -1 }, { 1, 1, 0, 1, 0 }, { 1, 2, 0, -2, -1 }, { 1, 0, 0, 1, -1 }, /* 311-320 */ { 0, 0, 1, 0, 2 }, { 3, 1, 2, -2, 2 }, { 1, 0, -4, -2, -2 }, { 1, 0, 2, 4, 1 }, { 1, -2, 2, 2, 2 }, { 1, -1, -2, -4, -2 }, { 0, 0, 2, -4, 2 }, { 0, 0, 2, -3, 1 }, { 2, 1, -2, 0, 0 }, { 3, 0, -2, -2, -1 }, /* 321-330 */ { 2, 0, 2, 4, 2 }, { 0, 0, 0, 0, 3 }, { 2, -1, -2, -2, -2 }, { 2, 0, 0, -1, 0 }, { 3, 0, 2, -4, 2 }, { 2, 1, 2, 2, 2 }, { 0, 0, 3, 0, 3 }, { 1, 1, 2, 2, 1 }, { 2, 1, 0, 0, -1 }, { 1, 2, 0, -2, 1 }, /* 331-340 */ { 3, 0, 2, 2, 1 }, { 1, -1, -2, 2, -2 }, { 1, 1, 0, -1, 0 }, { 1, 2, 0, 0, 0 }, { 1, 0, 4, 0, 2 }, { 1, -1, 2, 4, 2 }, { 2, 1, 0, 0, 1 }, { 1, 0, 0, 2, 2 }, { 1, -1, -2, 2, 0 }, { 0, 2, -2, -2, -1 }, /* 341-350 */ { 2, 0, -2, 0, 2 }, { 5, 0, 2, 0, 2 }, { 3, 0, -2, -6, -2 }, { 1, -1, 2, -1, 2 }, { 3, 0, 0, -4, -1 }, { 1, 0, 0, 1, 1 }, { 1, 0, -4, 2, -1 }, { 0, 1, 2, -4, 1 }, { 1, 2, 2, 0, 2 }, { 0, 1, 0, -2, -2 }, /* 351-360 */ { 0, 0, 2, -1, 0 }, { 1, 0, 1, 0, 1 }, { 0, 2, 0, -2, 1 }, { 3, 0, 2, 0, 0 }, { 1, 1, -2, 1, 0 }, { 2, 1, -2, -4, -1 }, { 3, -1, 0, 0, 0 }, { 2, -1, -2, 0, 0 }, { 4, 0, 2, -2, 1 }, { 2, 0, -2, 2, 0 }, /* 361-370 */ { 1, 1, 2, -2, 0 }, { 1, 0, -2, 4, -1 }, { 1, 0, -2, -2, 1 }, { 2, 0, 2, -4, 0 }, { 1, 1, 0, -2, -2 }, { 1, 1, -2, -2, 0 }, { 1, 0, 1, -2, 1 }, { 2, -1, -2, -4, -2 }, { 3, 0, -2, 0, -2 }, { 0, 1, -2, -2, 0 }, /* 371-380 */ { 3, 0, 0, -2, -1 }, { 1, 0, -2, -3, -1 }, { 0, 1, 0, -4, -1 }, { 1, -2, 2, -2, 1 }, { 0, 1, -2, 1, -1 }, { 1, -1, 0, 0, 2 }, { 2, 0, 0, 1, 0 }, { 1, -2, 0, 2, 0 }, { 1, 2, -2, -2, -1 }, { 0, 0, 4, -4, 1 }, /* 381-390 */ { 0, 1, 2, 4, 2 }, { 0, 1, -4, 2, -2 }, { 3, 0, -2, 0, 0 }, { 2, -1, 2, 2, 1 }, { 0, 1, -2, -4, -1 }, { 4, 0, 2, 2, 2 }, { 2, 0, -2, -3, -2 }, { 2, 0, 0, -6, 0 }, { 1, 0, 2, 0, 3 }, { 3, 1, 0, 0, 0 }, /* 391-400 */ { 3, 0, 0, -4, 1 }, { 1, -1, 2, 0, 0 }, { 1, -1, 0, -4, 0 }, { 2, 0, -2, 2, -2 }, { 1, 1, 0, -2, 2 }, { 4, 0, 0, -2, 0 }, { 2, 2, 0, -2, 0 }, { 0, 1, 2, 0, 0 }, { 1, 1, 0, -4, 1 }, { 1, 0, 0, -4, -2 }, /* 401-410 */ { 0, 0, 0, 1, 2 }, { 3, 0, 0, 2, 1 }, { 1, 1, 0, -4, -1 }, { 0, 0, 2, 2, -1 }, { 1, 1, 2, 0, 0 }, { 1, -1, 2, -4, 1 }, { 1, 1, 0, 0, 2 }, { 0, 0, 2, 6, 2 }, { 4, 0, -2, -2, -1 }, { 2, 1, 0, -4, -1 }, /* 411-420 */ { 0, 0, 0, 3, 1 }, { 1, -1, -2, 0, 0 }, { 0, 0, 2, 1, 0 }, { 1, 0, 0, 2, -2 }, { 3, -1, 2, 2, 2 }, { 3, -1, 2, -2, 2 }, { 1, 0, 0, -1, 2 }, { 1, -2, 2, -2, 2 }, { 0, 1, 0, 2, 2 }, { 0, 1, -2, -1, -2 }, /* 421-430 */ { 1, 1, -2, 0, 0 }, { 0, 2, 2, -2, 0 }, { 3, -1, -2, -1, -2 }, { 1, 0, 0, -6, 0 }, { 1, 0, -2, -4, 0 }, { 2, 1, 0, -4, 1 }, { 2, 0, 2, 0, -1 }, { 2, 0, -4, 0, -1 }, { 0, 0, 3, 0, 2 }, { 2, 1, -2, -2, -1 }, /* 431-440 */ { 1, -2, 0, 0, 1 }, { 2, -1, 0, -4, 0 }, { 0, 0, 0, 3, 0 }, { 5, 0, 2, -2, 2 }, { 1, 2, -2, -4, -2 }, { 1, 0, 4, -4, 2 }, { 0, 0, 4, -1, 2 }, { 3, 1, 0, -4, 0 }, { 3, 0, 0, -6, 0 }, { 2, 0, 0, 2, 2 }, /* 441-450 */ { 2, -2, 2, 0, 2 }, { 1, 0, 0, -3, 1 }, { 1, -2, -2, 0, -2 }, { 1, -1, -2, -3, -2 }, { 0, 0, 2, -2, -2 }, { 2, 0, -2, -4, 0 }, { 1, 0, -4, 0, 0 }, { 0, 1, 0, -1, 0 }, { 4, 0, 0, 0, -1 }, { 3, 0, 2, -1, 2 }, /* 451-460 */ { 3, -1, 2, 0, 1 }, { 2, 0, 2, -1, 1 }, { 1, 2, 2, -2, 1 }, { 1, 1, 0, 2, -1 }, { 0, 2, 2, 0, 1 }, { 3, 1, 2, 0, 1 }, { 1, 1, 2, 1, 1 }, { 1, 1, 0, -1, 1 }, { 1, -2, 0, -2, -1 }, { 4, 0, 0, -4, 0 }, /* 461-470 */ { 2, 1, 0, 2, 0 }, { 1, -1, 0, 4, 0 }, { 0, 1, 0, -2, 2 }, { 0, 0, 2, 0, -2 }, { 1, 0, -1, 0, 1 }, { 3, 0, 2, -2, 0 }, { 2, 0, 2, 2, 0 }, { 1, 2, 0, -4, 0 }, { 1, -1, 0, -3, 0 }, { 0, 1, 0, 4, 0 }, /* 471 - 480 */ { 0, 1, -2, 0, 0 }, { 2, 2, 2, -2, 2 }, { 0, 0, 0, 1, -2 }, { 0, 2, -2, 0, -1 }, { 4, 0, 2, -4, 2 }, { 2, 0, -4, 2, -2 }, { 2, -1, -2, 0, -2 }, { 1, 1, 4, -2, 2 }, { 1, 1, 2, -4, 2 }, { 1, 0, 2, 3, 2 }, /* 481-490 */ { 1, 0, 0, 4, -1 }, { 0, 0, 0, 4, 2 }, { 2, 0, 0, 4, 0 }, { 1, 1, -2, 2, 0 }, { 2, 1, 2, 1, 2 }, { 2, 1, 2, -4, 1 }, { 2, 0, 2, 1, 1 }, { 2, 0, -4, -2, -1 }, { 2, 0, -2, -6, -1 }, { 2, -1, 2, -1, 2 }, /* 491-500 */ { 1, -2, 2, 0, 1 }, { 1, -2, 0, -2, 1 }, { 1, -1, 0, -4, -1 }, { 0, 2, 2, 2, 2 }, { 0, 2, -2, -4, -2 }, { 0, 1, 2, 3, 2 }, { 0, 1, 0, -4, 1 }, { 3, 0, 0, -2, 1 }, { 2, 1, -2, 0, 1 }, { 2, 0, 4, -2, 1 }, /* 501-510 */ { 2, 0, 0, -3, -1 }, { 2, -2, 0, -2, 1 }, { 2, -1, 2, -2, 1 }, { 1, 0, 0, -6, -1 }, { 1, -2, 0, 0, -1 }, { 1, -2, -2, -2, -1 }, { 0, 1, 4, -2, 1 }, { 0, 0, 2, 3, 1 }, { 2, -1, 0, -1, 0 }, { 1, 3, 0, -2, 0 }, /* 511-520 */ { 0, 3, 0, -2, 0 }, { 2, -2, 2, -2, 2 }, { 0, 0, 4, -2, 0 }, { 4, -1, 2, 0, 2 }, { 2, 2, -2, -4, -2 }, { 4, 1, 2, 0, 2 }, { 4, -1, -2, -2, -2 }, { 2, 1, 0, -2, -2 }, { 2, 1, -2, -6, -2 }, { 2, 0, 0, -1, 1 }, /* 521-530 */ { 2, -1, -2, 2, -1 }, { 1, 1, -2, 2, -2 }, { 1, 1, -2, -3, -2 }, { 1, 0, 3, 0, 3 }, { 1, 0, -2, 1, 1 }, { 1, 0, -2, 0, 2 }, { 1, -1, 2, 1, 2 }, { 1, -1, 0, 0, -2 }, { 1, -1, -4, 2, -2 }, { 0, 3, -2, -2, -2 }, /* 531-540 */ { 0, 1, 0, 4, 1 }, { 0, 0, 4, 2, 2 }, { 3, 0, -2, -2, 0 }, { 2, -2, 0, 0, 0 }, { 1, 1, 2, -4, 0 }, { 1, 1, 0, -3, 0 }, { 1, 0, 2, -3, 0 }, { 1, -1, 2, -2, 0 }, { 0, 2, 0, 2, 0 }, { 0, 0, 2, 4, 0 }, /* 541-550 */ { 1, 0, 1, 0, 0 }, { 3, 1, 2, -2, 1 }, { 3, 0, 4, -2, 2 }, { 3, 0, 2, 1, 2 }, { 3, 0, 0, 2, -1 }, { 3, 0, 0, 0, 2 }, { 3, 0, -2, 2, -1 }, { 2, 0, 4, -4, 2 }, { 2, 0, 2, -3, 2 }, { 2, 0, 0, 4, 1 }, /* 551-560 */ { 2, 0, 0, -3, 1 }, { 2, 0, -4, 2, -1 }, { 2, 0, -2, -2, 1 }, { 2, -2, 2, 2, 2 }, { 2, -2, 0, -2, -2 }, { 2, -1, 0, 2, 1 }, { 2, -1, 0, 2, -1 }, { 1, 1, 2, 4, 2 }, { 1, 1, 0, 1, 1 }, { 1, 1, 0, 1, -1 }, /* 561-570 */ { 1, 1, -2, -6, -2 }, { 1, 0, 0, -3, -1 }, { 1, 0, -4, -2, -1 }, { 1, 0, -2, -6, -1 }, { 1, -2, 2, 2, 1 }, { 1, -2, -2, 2, -1 }, { 1, -1, -2, -4, -1 }, { 0, 2, 0, 0, 2 }, { 0, 1, 2, -4, 2 }, { 0, 1, -2, 4, -1 }, /* 571-580 */ { 5, 0, 0, 0, 0 }, { 3, 0, 0, -3, 0 }, { 2, 2, 0, -4, 0 }, { 1, -1, 2, 2, 0 }, { 0, 1, 0, 3, 0 }, { 4, 0, -2, 0, -1 }, { 3, 0, -2, -6, -1 }, { 3, 0, -2, -1, -1 }, { 2, 1, 2, 2, 1 }, { 2, 1, 0, 2, 1 }, /* 581-590 */ { 2, 0, 2, 4, 1 }, { 2, 0, 2, -6, 1 }, { 2, 0, 2, -2, -1 }, { 2, 0, 0, -6, -1 }, { 2, -1, -2, -2, -1 }, { 1, 2, 2, 0, 1 }, { 1, 2, 0, 0, 1 }, { 1, 0, 4, 0, 1 }, { 1, 0, 2, -6, 1 }, { 1, 0, 2, -4, -1 }, /* 591-600 */ { 1, 0, -1, -2, -1 }, { 1, -1, 2, 4, 1 }, { 1, -1, 2, -3, 1 }, { 1, -1, 0, 4, 1 }, { 1, -1, -2, 1, -1 }, { 0, 1, 2, -2, 3 }, { 3, 0, 0, -2, 0 }, { 1, 0, 1, -2, 0 }, { 0, 2, 0, -4, 0 }, { 0, 0, 2, -4, 0 }, /* 601-610 */ { 0, 0, 1, -1, 0 }, { 0, 0, 0, 6, 0 }, { 0, 2, 0, 0, -2 }, { 0, 1, -2, 2, -3 }, { 4, 0, 0, 2, 0 }, { 3, 0, 0, -1, 0 }, { 3, -1, 0, 2, 0 }, { 2, 1, 0, 1, 0 }, { 2, 1, 0, -6, 0 }, { 2, -1, 2, 0, 0 }, /* 611-620 */ { 1, 0, 2, -1, 0 }, { 1, -1, 0, 1, 0 }, { 1, -1, -2, -2, 0 }, { 0, 1, 2, 2, 0 }, { 0, 0, 2, -3, 0 }, { 2, 2, 0, -2, -1 }, { 2, -1, -2, 0, 1 }, { 1, 2, 2, -4, 1 }, { 0, 1, 4, -4, 2 }, { 0, 0, 0, 3, 2 }, /* 621-630 */ { 5, 0, 2, 0, 1 }, { 4, 1, 2, -2, 2 }, { 4, 0, -2, -2, 0 }, { 3, 1, 2, 2, 2 }, { 3, 1, 0, -2, 0 }, { 3, 1, -2, -6, -2 }, { 3, 0, 0, 0, -2 }, { 3, 0, -2, -4, -2 }, { 3, -1, 0, -3, 0 }, { 3, -1, 0, -2, 0 }, /* 631-640 */ { 2, 1, 2, 0, 0 }, { 2, 1, 2, -4, 2 }, { 2, 1, 2, -2, 0 }, { 2, 1, 0, -3, 0 }, { 2, 1, -2, 0, -2 }, { 2, 0, 0, -4, 2 }, { 2, 0, 0, -4, -2 }, { 2, 0, -2, -5, -2 }, { 2, -1, 2, 4, 2 }, { 2, -1, 0, -2, 2 }, /* 641-650 */ { 1, 3, -2, -2, -2 }, { 1, 1, 0, 0, -2 }, { 1, 1, 0, -6, 0 }, { 1, 1, -2, 1, -2 }, { 1, 1, -2, -1, -2 }, { 1, 0, 2, 1, 0 }, { 1, 0, 0, 3, 0 }, { 1, 0, 0, -4, 2 }, { 1, 0, -2, 4, -2 }, { 1, -2, 0, -1, 0 }, /* 651-NFLS */ { 0, 1, -4, 2, -1 }, { 1, 0, -2, 0, -3 }, { 0, 0, 4, -4, 4 } }; } /* Fundamental-argument multipliers: planetary terms */ private static final int mfapl[][] = { /* 1-10 */ { 0, 0, 1, -1, 1, 0, 0, -1, 0, -2, 5, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -5, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 3, -5, 0, 0, 0, 0, 0, -2 }, { 0, 0, 1, -1, 1, 0, -8, 12, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 4, -8, 3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 8,-16, 4, 5, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, -1, 2, 0, 0, 0, 0, 0 }, /* 11-20 */ { 0, 0, 0, 0, 0, 0, 8,-13, 0, 0, 0, 0, 0, -1 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, 2, -5, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, -5, 6, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 4, -6, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 3, 0, -1, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 2, -8, 3, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 2, -4, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 6, -8, 3, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 1, -2, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 2, -3, 0, 0, 0, 0, 0, 0 }, /* 21-30 */ { 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 1, 0, 0, -4, 8, -3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, 4, -8, 3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -5, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 2 }, { 0, 0, 1, -1, 1, 0, 0, 0, -2, 0, 0, 0, 0, 0 }, { 2, 0, 0, -2, -1, 0, 0, -2, 0, 2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1 }, { 2, 0, 0, -2, 0, 0, 0, -2, 0, 2, 0, 0, 0, 0 }, /* 31-40 */ { 0, 0, 0, 0, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 8,-13, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 5, -8, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -5, 0, 0, 1 }, { 2, 0, 0, -2, 0, 0, 0, -2, 0, 3, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, -1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 3, -4, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, 0, -1, 0, 0, 0 }, /* 41-50 */ { 0, 0, 0, 0, 0, 0, 0, 1, 0, -2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 5, -7, 0, 0, 0, 0, 0, -2 }, { 0, 0, 1, -1, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 4, 0, -2, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 8,-13, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 2, -1, 0, 0, 0, 0, 0, 2 }, { 1, 0, 0, 0, 0, 0,-18, 16, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, 2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 2 }, /* 51-60 */ { 0, 0, 1, -1, 1, 0, -5, 7, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0,-10, 3, 0, 0, 0, 0, 0, 0 }, { 0, 0, 2, -2, 0, 0, -5, 6, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, -1, 0, 0, 0, 2 }, { 1, 0, 2, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 4, -2, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1 }, { 1, 0, -2, 0, -2, 0, 0, 4, -8, 3, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, 0, 2, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, -3, 3, 0, 0, 0, 0, 0, 0 }, /* 61-70 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 8,-16, 4, 5, 0, 0, -2 }, { 0, 0, 1, -1, 1, 0, 0, 3, -8, 3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 8,-11, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 8,-16, 4, 5, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 4, -6, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, -3, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 2, -4, 0, 0, 0, 0, 0 }, /* 71-80 */ { 0, 0, 0, 0, 0, 0, 6, -8, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 3, -2, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 8,-15, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 2, -5, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 1, -3, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 3, 0, -2, 0, 0, 0, 2 }, { 0, 0, 1, -1, 1, 0, 0, -5, 8, -3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 3, -2, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 3, -5, 0, 0, 0, 0, 0, 0 }, /* 81-90 */ { 2, 0, 0, -2, 1, 0, 0, -2, 0, 3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 5, -8, 0, 0, 0, 0, 0, -1 }, { 2, 0, 0, -2, 0, 0, -3, 3, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 8,-13, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, 0, 0, -2, 5, 0, 0, 0 }, { 1, 0, 0, -1, 0, 0, -3, 4, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2 }, { 1, 0, 0, 0, -1, 0,-18, 16, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, -5, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, /* 91-100 */ { 1, 0, 0, -2, 0, 0, 19,-21, 3, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, -8, 13, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, 0, 1, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 7, -9, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2 }, { 1, 0, 0, 0, 1, 0,-18, 16, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 2, -4, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 6,-16, 4, 5, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 4, -7, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 3, -7, 0, 0, 0, 0, 0, -2 }, /* 101-110 */ { 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 }, { 2, 0, 0, -2, 1, 0, 0, -2, 0, 2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 3, -4, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 1, -2, 0, 0, 0, 0, 0, 0 }, { 2, 0, 0, -2, -1, 0, 0, -2, 0, 3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 3, -3, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 2 }, /* 111-120 */ { 0, 0, 0, 0, 1, 0, 0, 1, -2, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2 }, { 0, 0, 2, -2, 1, 0, 0, -2, 0, 2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, -3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 3, -5, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 3, -3, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 4, -4, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0 }, { 2, 0, 0, -2, 0, 0, -6, 8, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 0, -2, 2, 0, 0, 0, 0, 0 }, /* 121-130 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, 1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, -2, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 2, -3, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 2, -4, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 8,-10, 0, 0, 0, 0, 0, -2 }, { 0, 0, 1, -1, 1, 0, -3, 4, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 6, -9, 0, 0, 0, 0, 0, -2 }, { 1, 0, 0, -1, 1, 0, 0, -1, 0, 2, 0, 0, 0, 0 }, /* 131-140 */ { 0, 0, 0, 0, 0, 0, 5, -7, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 5, -5, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 3, -3, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 4, 0, -3, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 1 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1 }, { 0, 0, 0, 0, 1, 0, 2, -3, 0, 0, 0, 0, 0, 0 }, /* 141-150 */ { 1, 0, 0, -1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 1, -3, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 5, -4, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 4, -4, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 9,-11, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 2, -3, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 8,-15, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, -4, 5, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 4, -6, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 4, 0, -1, 0, 0, 0, 2 }, /* 151-160 */ { 1, 0, 0, -1, 1, 0, -3, 4, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, -4, 10, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 1, -1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, -3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 3, -1, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, -4, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -5, 0, 0, -2 }, { 0, 0, 2, -2, 1, 0, -4, 4, 0, 0, 0, 0, 0, 0 }, /* 161-170 */ { 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, -1, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 4, -3, 0, 0, 0, 0, 2 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, 0, 0, 0, 2, 0 }, { 0, 0, 0, 0, 0, 0, 4, -4, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 2, -4, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 5, -8, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, -2, 0, 0, 0, 0, 1 }, { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, 0, -9, 13, 0, 0, 0, 0, 0 }, { 2, 0, 2, 0, 2, 0, 0, 2, 0, -3, 0, 0, 0, 0 }, /* 171-180 */ { 0, 0, 0, 0, 0, 0, 3, -6, 0, 0, 0, 0, 0, -2 }, { 0, 0, 1, -1, 2, 0, 0, -1, 0, 0, 2, 0, 0, 0 }, { 1, 0, 0, -1, -1, 0, -3, 4, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 3, -6, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 6, -6, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1 }, { 1, 0, 2, 0, 1, 0, 0, -2, 0, 3, 0, 0, 0, 0 }, { 1, 0, -2, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, -2, 4, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 3, -5, 0, 0, 0, 0, 0 }, /* 181-190 */ { 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1 }, { 0, 0, 2, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, -8, 3, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 6,-10, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 7, -8, 3, 0, 0, 0, 2 }, { 0, 0, 0, 0, 1, 0, -3, 5, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 0, 0, -5, 7, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, -2, 0, 0, 0, 1 }, /* 191-200 */ { 0, 0, 0, 0, 0, 0, 0, 2, 0, -1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 7,-10, 0, 0, 0, 0, 0, -2 }, { 1, 0, 0, -2, 0, 0, 0, -2, 0, 2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, -5, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 6, -8, 0, 0, 0, 0, 0, -1 }, { 0, 0, 1, -1, 1, 0, 0, -9, 15, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, -2, 3, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, -1, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 3, -6, 0, 0, 0, 0, 0 }, /* 201-210 */ { 0, 0, 0, 0, 0, 0, 0, 1, -4, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, -1, 0, 0, 2 }, { 2, 0, 0, -2, 1, 0, -6, 8, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 5, -5, 0, 0, 0, 0, 0, -1 }, { 0, 0, 1, -1, 1, 0, 3, -6, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, -2, 2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 8,-14, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, /* 211-220 */ { 0, 0, 0, 0, 1, 0, 0, 8,-15, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 4, -6, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 7, -7, 0, 0, 0, 0, 0, 0 }, { 2, 0, 0, -2, 1, 0, -3, 3, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 3, -1, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 0, 2 }, { 2, 0, -1, -1, 0, 0, 0, 3, -7, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 4, -7, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 3, -3, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 0, -3, 4, 0, 0, 0, 0, 0 }, /* 221-230 */ { 2, 0, 0, -2, 0, 0, 0, -6, 8, 0, 0, 0, 0, 0 }, { 2, 0, 0, -2, 0, 0, 0, -5, 6, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1 }, { 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 1 }, { 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 1, 0, 0, 1, 0, -1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 3, -9, 4, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 3, -5, 0, 0, 0, 0, -2 }, /* 231-240 */ { 0, 0, 0, 0, 0, 0, 0, 2, 0, -4, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1 }, { 0, 0, 0, 0, 0, 0, 7,-11, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 3, -5, 4, 0, 0, 0, 0, 2 }, { 0, 0, 1, -1, 0, 0, 0, -1, 0, -1, 1, 0, 0, 0 }, { 2, 0, 0, 0, 0, 0, 0, -2, 0, 3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 8,-15, 0, 0, 0, 0, -2 }, { 0, 0, 1, -1, 2, 0, 0, -2, 2, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 6, -6, 0, 0, 0, 0, 0, -1 }, /* 241-250 */ { 0, 0, 1, -1, 1, 0, 0, -1, 0, -1, 1, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, 1 }, { 0, 0, 0, 0, 0, 0, 0, 4, -7, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 3, -8, 3, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 2, -4, 0, -3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 3, -5, 0, 2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 3, 0, -3, 0, 0, 0, 2 }, { 0, 0, 2, -2, 2, 0, -8, 11, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 5, -8, 3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -2, 0, 0, 0 }, /* 251-260 */ { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 5, -9, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 5, -5, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 7, -9, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 4, -7, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 2, -1, 0, 0, 0, 0, 0, 0 }, { 1, 0, -2, -2, -2, 0, 0, -2, 0, 2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, -2, 5, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 3, -3, 0, 0, 0, 0, 0, 1 }, /* 261-270 */ { 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, -5, 0, 0, 2 }, { 2, 0, 0, -2, -1, 0, 0, -2, 0, 0, 5, 0, 0, 0 }, { 2, 0, 0, -2, -1, 0, -6, 8, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, -2, 0, 0, -3, 3, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 8, -8, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, -5, 0, 0, 2 }, { 0, 0, 0, 0, 1, 0, 3, -7, 4, 0, 0, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, -2, 2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, -1, 0, 1, 0, 0, 0, 0 }, /* 271-280 */ { 0, 0, 1, -1, 0, 0, 0, -1, 0, -2, 5, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 3, 0, -3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 3, -1, 0, 0, 0, 0, 0, 1 }, { 0, 0, 0, 0, 0, 0, 2, -3, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 6,-15, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 2 }, { 1, 0, 0, -1, 0, 0, 0, -3, 4, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, -3, 7, -4, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 5, 0, -2, 0, 0, 0, 2 }, /* 281-290 */ { 0, 0, 0, 0, 0, 0, 3, -5, 0, 0, 0, 0, 0, 1 }, { 0, 0, 2, -2, 2, 0, -5, 6, 0, 0, 0, 0, 0, 0 }, { 0, 0, 2, -2, 2, 0, -3, 3, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 4, -4, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 4, -8, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 4, -5, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 5, -7, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 6,-11, 0, 0, 0, 0, -2 }, /* 291-300 */ { 0, 0, 0, 0, 0, 0, 0, 1, -3, 0, 0, 0, 0, -2 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, 3, 0, 0, 0, 0 }, { 0, 0, 1, -1, 0, 0, 0, -1, 0, 2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 1, -2, 0, 0, 0, 0, 0, 1 }, { 0, 0, 0, 0, 0, 0, 9,-12, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 4, -4, 0, 0, 0, 0, 0, 1 }, { 0, 0, 1, -1, 0, 0, -8, 12, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, -2, 3, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 7, -7, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 3, -6, 0, 0, 0, 0, -1 }, /* 301-310 */ { 0, 0, 0, 0, 0, 0, 0, 6, -6, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 1, 0, -4, 0, 0, 0, 0, 0, -2 }, { 0, 0, 1, -1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 6, -9, 0, 0, 0, 0, 0, -1 }, { 0, 0, 1, -1, -1, 0, 0, 0, -2, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, -5, 0, 0, 0, 0, -2 }, { 2, 0, 0, -2, 0, 0, 0, -2, 0, 3, -1, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, -2, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 5, -9, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 5, -6, 0, 0, 0, 0, 0, 2 }, /* 311-320 */ { 0, 0, 0, 0, 0, 0, 9, -9, 0, 0, 0, 0, 0, -1 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, 0, 3, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, 2, -4, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 5, -3, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1 }, { 0, 0, 1, -1, 2, 0, 0, -1, 0, 2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 5, -9, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 5, -3, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2 }, { 0, 0, 2, 0, 2, 0, 0, 4, -8, 3, 0, 0, 0, 0 }, /* 321-330 */ { 0, 0, 2, 0, 2, 0, 0, -4, 8, -3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 5, 0, -3, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0 }, { 2, 0, -1, -1, -1, 0, 0, -1, 0, 3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 4, -3, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 4, -2, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 5,-10, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 8,-13, 0, 0, 0, 0, 0, 1 }, { 0, 0, 2, -2, 1, -1, 0, 2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, 0, 0, 2, 0, 0 }, /* 331-340 */ { 0, 0, 0, 0, 1, 0, 3, -5, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, -2, 0, 0, 0, -2, 0, 3, 0, 0, 0, 0 }, { 0, 0, 2, -2, 0, 0, -3, 3, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 9, -9, 0, 0, 0, 0, 0, 0 }, { 0, 0, 2, 0, 2, 0, 1, -1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, 0, -8, 11, 0, 0, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, 0, -2, 0, 0, 2, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, -1, 2, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 5, -5, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 2, -6, 0, 0, 0, 0, 0, -2 }, /* 341-350 */ { 0, 0, 0, 0, 0, 0, 0, 8,-15, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 5, -2, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 7,-13, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 3, 0, -2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 2 }, { 0, 0, 2, -2, 1, 0, 0, -2, 0, 3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 8, -8, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 8,-10, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 4, -2, 0, 0, 0, 0, 0, 1 }, /* 351-360 */ { 0, 0, 0, 0, 0, 0, 3, -6, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 3, -4, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -5, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, -4, 0, 0, 0, 0 }, { 2, 0, 0, -2, -1, 0, 0, -5, 6, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 2, -5, 0, 0, 0, 0, -2 }, { 2, 0, -1, -1, -1, 0, 0, 3, -7, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 5, -8, 0, 0, 0, 0, 0 }, { 0, 0, 2, 0, 2, 0, -1, 1, 0, 0, 0, 0, 0, 0 }, /* 361-370 */ { 2, 0, 0, -2, 0, 0, 0, -2, 0, 4, -3, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 6,-11, 0, 0, 0, 0, 0 }, { 2, 0, 0, -2, 1, 0, 0, -6, 8, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 4, -8, 1, 5, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 6, -5, 0, 0, 0, 0, 2 }, { 1, 0, -2, -2, -2, 0, -3, 3, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 2, 0, 0, 0, -2, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 2, 0, 0, 4, -8, 3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 2, 0, 0, -4, 8, -3, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 1 }, /* 371-380 */ { 0, 0, 0, 0, 0, 0, 0, 6, -7, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, -2, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, -2, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 1 }, { 0, 0, 0, 0, 0, 0, 0, 1, -6, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, -5, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2 }, { 0, 0, 0, 0, 0, 0, 3, -5, 0, 2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 7,-13, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, -2, 0, 0, 0, 2 }, /* 381-390 */ { 0, 0, 1, -1, 0, 0, 0, -1, 0, 0, 2, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, -8, 15, 0, 0, 0, 0, 0 }, { 2, 0, 0, -2, -2, 0, -3, 3, 0, 0, 0, 0, 0, 0 }, { 2, 0, -1, -1, -1, 0, 0, -1, 0, 2, 0, 0, 0, 0 }, { 1, 0, 2, -2, 2, 0, 0, -2, 0, 2, 0, 0, 0, 0 }, { 1, 0, -1, 1, -1, 0,-18, 17, 0, 0, 0, 0, 0, 0 }, { 0, 0, 2, 0, 2, 0, 0, 1, 0, -1, 0, 0, 0, 0 }, { 0, 0, 2, 0, 2, 0, 0, -1, 0, 1, 0, 0, 0, 0 }, { 0, 0, 2, -2, -1, 0, -5, 6, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 2, 0, 0, -1, 0, 1, 0, 0, 0, 0 }, /* 391-400 */ { 0, 0, 0, 0, 1, 0, 2, -2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 8,-16, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2 }, { 0, 0, 0, 0, 2, 0, 0, -1, 2, 0, 0, 0, 0, 0 }, { 2, 0, -1, -1, -2, 0, 0, -1, 0, 2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 6,-10, 0, 0, 0, 0, 0, -1 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, -2, 4, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2 }, { 2, 0, 0, -2, -1, 0, 0, -2, 0, 4, -5, 0, 0, 0 }, /* 401-410 */ { 2, 0, 0, -2, -1, 0, -3, 3, 0, 0, 0, 0, 0, 0 }, { 2, 0, -1, -1, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0 }, { 1, 0, 1, -1, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, -1, -1, 0, 0, -2, 2, 0, 0, 0, 0, 0 }, { 1, 0, -1, -1, -1, 0, 20,-20, 0, 0, 0, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, 0, -1, 0, 1, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 1, -2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, -2, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 5, -8, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0 }, /* 411-420 */ { 0, 0, 0, 0, 0, 0, 9,-11, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 5, -3, 0, 0, 0, 0, 0, 1 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, -3, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1 }, { 0, 0, 0, 0, 0, 0, 6, -7, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 3, -2, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 1, -2, 0, 0, 0, 0, 0, -2 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, 0, -2, 0, 0, 0 }, { 0, 0, 1, -1, 2, 0, 0, -1, 0, -2, 5, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 5, -7, 0, 0, 0, 0, 0 }, /* 421-430 */ { 0, 0, 0, 0, 0, 0, 1, -3, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 5, -8, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 2, -6, 0, 0, 0, 0, -2 }, { 1, 0, 0, -2, 0, 0, 20,-21, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 8,-12, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 5, -6, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 4, -4, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 2, 0, 0, -1, 0, -1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 8,-12, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 9,-17, 0, 0, 0, 0, 0 }, /* 431-440 */ { 0, 0, 0, 0, 0, 0, 0, 5, -6, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 4, -8, 1, 5, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 4, -6, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 2, -7, 0, 0, 0, 0, -2 }, { 1, 0, 0, -1, 1, 0, 0, -3, 4, 0, 0, 0, 0, 0 }, { 1, 0, -2, 0, -2, 0,-10, 3, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, -9, 17, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 1, -4, 0, 0, 0, 0, 0, -2 }, { 1, 0, -2, -2, -2, 0, 0, -2, 0, 3, 0, 0, 0, 0 }, { 1, 0, -1, 1, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, /* 441-450 */ { 0, 0, 2, -2, 2, 0, 0, -2, 0, 2, 0, 0, 0, 0 }, { 0, 0, 1, -1, 2, 0, 0, -1, 0, 0, 1, 0, 0, 0 }, { 0, 0, 1, -1, 2, 0, -5, 7, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, 2, -2, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 4, -5, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 3, -4, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 2, -4, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 5,-10, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 4, 0, -4, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, -5, 0, 0, 0, -2 }, /* 451-460 */ { 0, 0, 0, 0, 0, 0, 0, 1, 0, -5, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, -2, 5, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, -2, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 2, -3, 0, 0, 0, 0, 0, 1 }, { 1, 0, 0, -2, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 3, -7, 4, 0, 0, 0, 0, 0 }, { 2, 0, 2, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, -1, 0, 0, -1, 0, -1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, 1, 0, -2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 6,-10, 0, 0, 0, 0, -2 }, /* 461-470 */ { 1, 0, 0, -1, 1, 0, 0, -1, 0, 1, 0, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, 0, 4, -8, 3, 0, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, 0, 1, 0, -1, 0, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, 0, -4, 8, -3, 0, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, 0, -3, 0, 3, 0, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, -5, 5, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 1, -3, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 0, -4, 6, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, 0, 0, -1, 0, 0 }, { 0, 0, 1, -1, 1, 0, -5, 6, 0, 0, 0, 0, 0, 0 }, /* 471-480 */ { 0, 0, 0, 0, 1, 0, 3, -4, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, -2, 2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 7,-10, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 5, -5, 0, 0, 0, 0, 0, 1 }, { 0, 0, 0, 0, 0, 0, 4, -5, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 3, -8, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 2, -5, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 1, -2, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 7, -9, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 7, -8, 0, 0, 0, 0, 2 }, /* 481-490 */ { 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 3, -8, 3, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, -2, 0, 0, 1 }, { 0, 0, 0, 0, 0, 0, 0, 2, -4, 0, 0, 0, 0, 1 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, -1 }, { 2, 0, 0, -2, -1, 0, 0, -6, 8, 0, 0, 0, 0, 0 }, { 2, 0, -1, -1, 1, 0, 0, 3, -7, 0, 0, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, 0, -7, 9, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 3, -5, 0, 0, 0, 0, -1 }, /* 491-500 */ { 0, 0, 1, -1, 2, 0, -8, 12, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 0, -2, 0, 2, 0, 0, 0, 0 }, { 1, 0, 0, -2, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 7, -8, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0 }, { 2, 0, 0, -2, 1, 0, 0, -5, 6, 0, 0, 0, 0, 0 }, { 2, 0, 0, -2, -1, 0, 0, -2, 0, 3, -1, 0, 0, 0 }, { 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, -2, 1, 0, 0, -2, 0, 2, 0, 0, 0, 0 }, { 1, 0, 0, -2, -1, 0, 0, -2, 0, 2, 0, 0, 0, 0 }, /* 501-510 */ { 1, 0, 0, -1, -1, 0, 0, -3, 4, 0, 0, 0, 0, 0 }, { 1, 0, -1, 0, -1, 0, -3, 5, 0, 0, 0, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, 0, -4, 4, 0, 0, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, 0, -2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, -8, 11, 0, 0, 0, 0, 0, 0 }, { 0, 0, 2, -2, 0, 0, 0, -9, 13, 0, 0, 0, 0, 0 }, { 0, 0, 1, 1, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 0, 1, -4, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, 0, -1, 0, 1, -3, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, 7,-13, 0, 0, 0, 0, 0 }, /* 511-520 */ { 0, 0, 0, 0, 1, 0, 0, 2, 0, -2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, -2, 2, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, -3, 4, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 1, 0, -4, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 7,-11, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 6, -6, 0, 0, 0, 0, 0, 1 }, { 0, 0, 0, 0, 0, 0, 6, -4, 0, 0, 0, 0, 0, 1 }, { 0, 0, 0, 0, 0, 0, 5, -6, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 4, -2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 3, -4, 0, 0, 0, 0, 0, 1 }, /* 521-530 */ { 0, 0, 0, 0, 0, 0, 1, -4, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 9,-17, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 7, -7, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 4, -8, 3, 0, 0, 0, 1 }, { 0, 0, 0, 0, 0, 0, 0, 4, -8, 3, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 4, -8, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 4, -7, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, -4, 0, 0, 0, 0 }, { 2, 0, 0, -2, 0, 0, 0, -4, 8, -3, 0, 0, 0, 0 }, /* 531-540 */ { 2, 0, 0, -2, 0, 0, -2, 2, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 0, 4, -8, 3, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 0, -4, 8, -3, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, -2, 0, 0, 17,-16, 0, -2, 0, 0, 0, 0 }, { 1, 0, 0, -1, 0, 0, 0, -2, 2, 0, 0, 0, 0, 0 }, { 0, 0, 2, -2, 0, 0, 0, -2, 0, 2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 6, -9, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 3, 0, -4, 0, 0, 0, 0 }, /* 541-550 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -2, -2 }, { 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 2 }, { 2, 0, 0, -2, 0, 0, 0, -4, 4, 0, 0, 0, 0, 0 }, { 2, 0, 0, -2, 0, 0, 0, -2, 0, 2, 2, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, -3, 3, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, -2, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, -2, 0, 0, 0, 4, -8, 3, 0, 0, 0, 0 }, { 1, 0, 0, -2, 0, 0, 0, -4, 8, -3, 0, 0, 0, 0 }, /* 551-560 */ { 1, 0, 0, -2, 0, 0, -2, 2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 2, -2, 0, 0, -4, 4, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 0, 0, 3, -6, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 0, 0, 0, -2, 2, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0 }, { 0, 0, 1, -1, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0 }, { 0, 0, 1, -1, 0, 0, -4, 5, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 0, 0, -3, 4, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 2, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0 }, /* 561-570 */ { 0, 0, 0, 0, 0, 0, 8, -9, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 3, -6, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, -5, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0 }, { 2, 0, -2, -2, -2, 0, 0, -2, 0, 2, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 0,-10, 3, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, -1, 0,-10, 3, 0, 0, 0, 0, 0, 0 }, { 0, 0, 2, 0, 2, 0, 2, -3, 0, 0, 0, 0, 0, 0 }, { 0, 0, 2, 0, 2, 0, 2, -2, 0, 0, 0, 0, 0, 0 }, /* 571-580 */ { 0, 0, 2, 0, 2, 0, -2, 3, 0, 0, 0, 0, 0, 0 }, { 0, 0, 2, 0, 2, 0, -2, 2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, -1, 0, 2, 0, 0, 0, 0 }, { 2, 0, 2, -2, 2, 0, 0, -2, 0, 3, 0, 0, 0, 0 }, { 2, 0, 1, -3, 1, 0, -6, 7, 0, 0, 0, 0, 0, 0 }, { 2, 0, 0, -2, 0, 0, 2, -5, 0, 0, 0, 0, 0, 0 }, { 2, 0, 0, -2, 0, 0, 0, -2, 0, 5, -5, 0, 0, 0 }, { 2, 0, 0, -2, 0, 0, 0, -2, 0, 1, 5, 0, 0, 0 }, { 2, 0, 0, -2, 0, 0, 0, -2, 0, 0, 5, 0, 0, 0 }, /* 581-590 */ { 2, 0, 0, -2, 0, 0, 0, -2, 0, 0, 2, 0, 0, 0 }, { 2, 0, 0, -2, 0, 0, -4, 4, 0, 0, 0, 0, 0, 0 }, { 2, 0, -2, 0, -2, 0, 0, 5, -9, 0, 0, 0, 0, 0 }, { 2, 0, -1, -1, 0, 0, 0, -1, 0, 3, 0, 0, 0, 0 }, { 1, 0, 2, 0, 2, 0, 1, -1, 0, 0, 0, 0, 0, 0 }, { 1, 0, 2, 0, 2, 0, 0, 4, -8, 3, 0, 0, 0, 0 }, { 1, 0, 2, 0, 2, 0, 0, -4, 8, -3, 0, 0, 0, 0 }, { 1, 0, 2, 0, 2, 0, -1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 0, 2, -2, 2, 0, -3, 3, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0 }, /* 591-600 */ { 1, 0, 0, 0, 0, 0, 0, -2, 0, 3, 0, 0, 0, 0 }, { 1, 0, 0, -2, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0 }, { 1, 0, -2, -2, -2, 0, 0, 1, 0, -1, 0, 0, 0, 0 }, { 1, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 1, 0, -1, -1, 0, 0, 0, 8,-15, 0, 0, 0, 0, 0 }, { 0, 0, 2, 2, 2, 0, 0, 2, 0, -2, 0, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, 1, -1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, 0, -2, 0, 1, 0, 0, 0, 0 }, { 0, 0, 2, -2, 1, 0, 0,-10, 15, 0, 0, 0, 0, 0 }, { 0, 0, 2, -2, 0, -1, 0, 2, 0, 0, 0, 0, 0, 0 }, /* 601-610 */ { 0, 0, 1, -1, 2, 0, 0, -1, 0, 0, -1, 0, 0, 0 }, { 0, 0, 1, -1, 2, 0, -3, 4, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, -4, 6, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 1, 0, -1, 2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 0, 0, 0, -1, 0, 0, -2, 0, 0, 0 }, { 0, 0, 1, -1, 0, 0, -2, 2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, -1, -1, 0, -5, 7, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 2, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0 }, /* 611-620 */ { 0, 0, 0, 2, 0, 0, -2, 2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 2, 0, -3, 5, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, -1, 2, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 9,-13, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 8,-14, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 8,-11, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 6, -9, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 6, -8, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 6, -7, 0, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 5, -6, 0, 0, 0, 0, 0, -2 }, /* 621-630 */ { 0, 0, 0, 0, 0, 0, 5, -6, -4, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 5, -4, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 4, -8, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 4, -5, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 3, -3, 0, 2, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 3, -1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 7,-12, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 6, -9, 0, 0, 0, 0, -2 }, /* 631-640 */ { 0, 0, 0, 0, 0, 0, 0, 6, -8, 1, 5, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 6, -4, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 6,-10, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 5, 0, -4, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 5, -9, 0, 0, 0, 0, -1 }, { 0, 0, 0, 0, 0, 0, 0, 5, -8, 3, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 5, -7, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 5, -6, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 5,-16, 4, 5, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 5,-13, 0, 0, 0, 0, -2 }, /* 641-650 */ { 0, 0, 0, 0, 0, 0, 0, 3, 0, -5, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 3, -9, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 3, -7, 0, 0, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, -3, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 2, -8, 1, 5, 0, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, -5, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -3, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 0, -3, 5, 0, 0, 0 }, /* 651-NFPL */ { 0, 0, 0, 0, 0, 0, 0, 1, -3, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -6, 3, 0, -2 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -2, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 }, { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 } }; /** * * Time scale transformation: Terrestrial Time, TT, to International * Atomic Time, TAI. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: canonical. * * * @param tt1 double TT as a 2-part Julian Date * @param tt2 double TT as a 2-part Julian Date * * * @return TAI as a 2-part Julian Date * * Returned (function value): * int status: 0 = OK * * Note: * * tt1+tt2 is Julian Date, apportioned in any convenient way between * the two arguments, for example where tt1 is the Julian Day Number * and tt2 is the fraction of a day. The returned tai1,tai2 follow * suit. * *

    References: * * McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992) * *@version 2010 May 13 * *@since SOFA release 2010-12-01 * * */ public static JulianDate jauTttai(double tt1, double tt2) { double tai1, tai2; /* TT minus TAI (days). */ final double dtat = TTMTAI / 86400.0; /* Result, safeguarding precision. */ if ( abs(tt1) > abs(tt2) ) { tai1 = tt1; tai2 = tt2 - dtat; } else { tai1 = tt1 - dtat; tai2 = tt2; } return new JulianDate(tai1, tai2); }; /** * * Time scale transformation: Terrestrial Time, TT, to Geocentric * Coordinate Time, TCG. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: canonical. * * * @param tt1 double TT as a 2-part Julian Date * @param tt2 double TT as a 2-part Julian Date * * * @return TCG as a 2-part Julian Date * * Returned (function value): * int status: 0 = OK * * Note: * * tt1+tt2 is Julian Date, apportioned in any convenient way between * the two arguments, for example where tt1 is the Julian Day Number * and tt2 is the fraction of a day. The returned tcg1,tcg2 follow * suit. * *

    References: * * McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * IAU 2000 Resolution B1.9 * *@version 2010 May 13 * *@since SOFA release 2010-12-01 * * */ public static JulianDate jauTttcg(double tt1, double tt2) { double tcg1, tcg2; /* 1977 Jan 1 00:00:32.184 TT, as MJD */ final double t77t = DJM77 + TTMTAI/DAYSEC; /* TT to TCG rate */ final double elgg = ELG/(1.0-ELG); /* Result, safeguarding precision. */ if ( abs(tt1) > abs(tt2) ) { tcg1 = tt1; tcg2 = tt2 + ( ( tt1 - DJM0 ) + ( tt2 - t77t ) ) * elgg; } else { tcg1 = tt1 + ( ( tt2 - DJM0 ) + ( tt1 - t77t ) ) * elgg; tcg2 = tt2; } return new JulianDate(tcg1, tcg2); }; /** * * Time scale transformation: Terrestrial Time, TT, to Barycentric * Dynamical Time, TDB. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: canonical. * * * @param tt1 double TT as a 2-part Julian Date * @param tt2 double TT as a 2-part Julian Date * @param dtr double TDB-TT in seconds * * * @return TDB as a 2-part Julian Date * * Returned (function value): * int status: 0 = OK * *

    Notes: * * 1 tt1+tt2 is Julian Date, apportioned in any convenient way between * the two arguments, for example where tt1 is the Julian Day Number * and tt2 is the fraction of a day. The returned tdb1,tdb2 follow * suit. * * 2 The argument dtr represents the quasi-periodic component of the * GR transformation between TT and TCB. It is dependent upon the * adopted solar-system ephemeris, and can be obtained by numerical * integration, by interrogating a precomputed time ephemeris or by * evaluating a model such as that implemented in the SOFA function * jauDtdb. The quantity is dominated by an annual term of 1.7 ms * amplitude. * * 3 TDB is essentially the same as Teph, the time argument for the JPL * solar system ephemerides. * *

    References: * * McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * IAU 2006 Resolution 3 * *@version 2010 May 13 * *@since SOFA release 2010-12-01 * * */ public static JulianDate jauTttdb(double tt1, double tt2, double dtr) { double tdb1, tdb2; double dtrd; /* Result, safeguarding precision. */ dtrd = dtr / DAYSEC; if ( abs(tt1) > abs(tt2) ) { tdb1 = tt1; tdb2 = tt2 + dtrd; } else { tdb1 = tt1 + dtrd; tdb2 = tt2; } return new JulianDate(tdb1, tdb2); }; /** * * Time scale transformation: Terrestrial Time, TT, to Universal Time, * UT1. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: canonical. * * * @param tt1 double TT as a 2-part Julian Date * @param tt2 double TT as a 2-part Julian Date * @param dt double TT-UT1 in seconds * * * @return UT1 as a 2-part Julian Date * * Returned (function value): * int status: 0 = OK * *

    Notes: * * 1 tt1+tt2 is Julian Date, apportioned in any convenient way between * the two arguments, for example where tt1 is the Julian Day Number * and tt2 is the fraction of a day. The returned ut11,ut12 follow * suit. * * 2 The argument dt is classical Delta T. * * Reference: * * Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992) * *@version 2010 May 16 * *@since SOFA release 2010-12-01 * * */ public static JulianDate jauTtut1(double tt1, double tt2, double dt) { double ut11, ut12; double dtd; /* Result, safeguarding precision. */ dtd = dt / DAYSEC; if ( abs(tt1) > abs(tt2) ) { ut11 = tt1; ut12 = tt2 - dtd; } else { ut11 = tt1 - dtd; ut12 = tt2; } return new JulianDate(ut11, ut12); }; /** * * Time scale transformation: Universal Time, UT1, to International * Atomic Time, TAI. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: canonical. * * * @param ut11 double UT1 as a 2-part Julian Date * @param ut12 double UT1 as a 2-part Julian Date * @param dta double UT1-TAI in seconds * * * @return TAI as a 2-part Julian Date * * Returned (function value): * int status: 0 = OK * *

    Notes: * * 1 ut11+ut12 is Julian Date, apportioned in any convenient way * between the two arguments, for example where ut11 is the Julian * Day Number and ut12 is the fraction of a day. The returned * TAI1,TAI2 follow suit. * * 2 The argument dta, i.e. UT1-TAI, is an observed quantity, and is * available from IERS tabulations. * * Reference: * * Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992) * *@version 2010 May 16 * *@since SOFA release 2010-12-01 * * */ public static JulianDate jauUt1tai(double ut11, double ut12, double dta ) { double tai1, tai2; double dtad; /* Result, safeguarding precision. */ dtad = dta / DAYSEC; if ( abs(ut11) > abs(ut12) ) { tai1 = ut11; tai2 = ut12 - dtad; } else { tai1 = ut11 - dtad; tai2 = ut12; } return new JulianDate(tai1, tai2); }; /** * * Time scale transformation: Universal Time, UT1, to Terrestrial * Time, TT. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: canonical. * * * @param ut11 double UT1 as a 2-part Julian Date * @param ut12 double UT1 as a 2-part Julian Date * @param dt double TT-UT1 in seconds * * * @return TAI as a 2-part Julian Date * * Returned (function value): * int status: 0 = OK * *

    Notes: * * 1 ut11+ut12 is Julian Date, apportioned in any convenient way * between the two arguments, for example where ut11 is the Julian * Day Number and ut12 is the fraction of a day. The returned * tt1,tt2 follow suit. * * 2 The argument dt is classical Delta T. * * Reference: * * Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992) * *@version 2010 May 16 * *@since SOFA release 2010-12-01 * * */ public static JulianDate jauUt1tt(double ut11, double ut12, double dt) { double tt1, tt2; double dtd; /* Result, safeguarding precision. */ dtd = dt / DAYSEC; if ( abs(ut11) > abs(ut12) ) { tt1 = ut11; tt2 = ut12 + dtd; } else { tt1 = ut11 + dtd; tt2 = ut12; } return new JulianDate(tt1, tt2); }; /** * * Time scale transformation: Universal Time, UT1, to Coordinated * Universal Time, UTC. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: canonical. * * * @param ut11 double UT1 as a 2-part Julian Date (Note 1) * @param ut12 double UT1 as a 2-part Julian Date (Note 1) * @param dut1 double Delta UT1: UT1-UTC in seconds (Note 2) * * * @return JulianDate UTC as a 2-part quasi Julian Date (Notes 3,4) * * Returned (function value): * int status: +1 = dubious year (Note 5) * 0 = OK * -1 = unacceptable date * *

    Notes: *

      *
    1. ut11+ut12 is Julian Date, apportioned in any convenient way * between the two arguments, for example where ut11 is the Julian * Day Number and ut12 is the fraction of a day. The returned utc1 * and utc2 form an analogous pair, except that a special convention * is used, to deal with the problem of leap seconds - see Note 3. * *
    2. Delta UT1 can be obtained from tabulations provided by the * International Earth Rotation and Reference Systems Service. The * value changes abruptly by 1s at a leap second; however, close to * a leap second the algorithm used here is tolerant of the "wrong" * choice of value being made. * *
    3. JD cannot unambiguously represent UTC during a leap second unless * special measures are taken. The convention in the present * function is that the returned quasi JD day UTC1+UTC2 represents * UTC days whether the length is 86399, 86400 or 86401 SI seconds. * *
    4. The function jauD2dtf can be used to transform the UTC quasi-JD * into calendar date and clock time, including UTC leap second * handling. * *
    5. The warning status "dubious year" flags UTCs that predate the * introduction of the time scale and that are too far in the future * to be trusted. See jauDat for further details. *
    * Called: *
      *
    • {@link #jauJd2cal} JD to Gregorian calendar *
    • {@link #jauDat} delta(AT) = TAI-UTC *
    • {@link #jauCal2jd} Gregorian calendar to JD *
    *

    References: * *

    McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *

    Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992) * *@version 2010 May 16 * *@since SOFA release 2010-12-01 * * * @throws JSOFAIllegalParameter unacceptable date * @throws JSOFAInternalError an internal error has occured */ public static JulianDate jauUt1utc(double ut11, double ut12, double dut1) throws JSOFAIllegalParameter, JSOFAInternalError { double utc1, utc2; boolean big1; int i; double duts, u1, u2, d1, dats1, d2, fd, dats2, ddats, us1, us2, du; /* UT1-UTC in seconds. */ duts = dut1; /* Put the two parts of the UT1 into big-first order. */ big1 = ( abs(ut11) >= abs(ut12) ); if ( big1 ) { u1 = ut11; u2 = ut12; } else { u1 = ut12; u2 = ut11; } /* See if the UT1 can possibly be in a leap-second day. */ d1 = u1; dats1 = 0; for ( i = -1; i <= 3; i++ ) { d2 = u2 + (double) i; Calendar dt = jauJd2cal(d1, d2 ); dats2 = jauDat(dt.iy, dt.im, dt.id, 0.0); if ( i == - 1 ) dats1 = dats2; ddats = dats2 - dats1; if ( abs(ddats) >= 0.5 ) { /* Yes, leap second nearby: ensure UT1-UTC is "before" value. */ if ( ddats * duts >= 0 ) duts -= ddats; /* UT1 for the start of the UTC day that ends in a leap. */ JulianDate jd = jauCal2jd(dt.iy, dt.im, dt.id ); d1 = jd.djm0; d2 = jd.djm1; us1 = d1; us2 = d2 - 1.0 + duts/DAYSEC; /* Is the UT1 after this point? */ du = u1 - us1; du += u2 - us2; if ( du > 0 ) { /* Yes: fraction of the current UTC day that has elapsed. */ fd = du * DAYSEC / ( DAYSEC + ddats ); /* Ramp UT1-UTC to bring about SOFA's JD(UTC) convention. */ duts += ddats * ( fd <= 1.0 ? fd : 1.0 ); } /* Done. */ break; } dats1 = dats2; } /* Subtract the (possibly adjusted) UT1-UTC from UT1 to give UTC. */ u2 -= duts / DAYSEC; /* Result, safeguarding precision. */ if ( big1 ) { utc1 = u1; utc2 = u2; } else { utc1 = u2; utc2 = u1; } /* FIXME Status. */ return new JulianDate(utc1, utc2); }; /** * * Time scale transformation: Coordinated Universal Time, UTC, to * International Atomic Time, TAI. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: canonical. * * * @param utc1 double UTC as a 2-part quasi Julian Date (Notes 1-4) * @param utc2 double UTC as a 2-part quasi Julian Date (Notes 1-4) * * * @return JulianDate TAI as a 2-part Julian Date (Note 5) * * Returned (function value): * int status: +1 = dubious year (Note 3) * 0 = OK * -1 = unacceptable date * *

    Notes: *

      *
    1. utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any * convenient way between the two arguments, for example where utc1 * is the Julian Day Number and utc2 is the fraction of a day. * *
    2. JD cannot unambiguously represent UTC during a leap second unless * special measures are taken. The convention in the present * function is that the JD day represents UTC days whether the * length is 86399, 86400 or 86401 SI seconds. * *
    3. The warning status "dubious year" flags UTCs that predate the * introduction of the time scale and that are too far in the future * to be trusted. See jauDat for further details. * *
    4. The function jauDtf2d converts from calendar date and time of day * into 2-part Julian Date, and in the case of UTC implements the * leap-second-ambiguity convention described above. * *
    5. The returned TAI1,TAI2 are such that their sum is the TAI Julian * Date. *
    * Called:
      *
    • {@link #jauJd2cal} JD to Gregorian calendar *
    • {@link #jauDat} delta(AT) = TAI-UTC *
    • {@link #jauCal2jd} Gregorian calendar to JD *
    *

    References: * * McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992) * *@version 2010 September 10 * *@since SOFA release 2010-12-01 * * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter unaccaptable date * */ public static JulianDate jauUtctai(double utc1, double utc2) throws JSOFAIllegalParameter, JSOFAInternalError { double tai1, tai2; boolean big1; double u1, u2, dats, datst, ddat, a2, fd; /* Put the two parts of the UTC into big-first order. */ big1 = ( abs(utc1) >= abs(utc2) ); if ( big1 ) { u1 = utc1; u2 = utc2; } else { u1 = utc2; u2 = utc1; } /* Get TAI-UTC now. */ Calendar dt = jauJd2cal(u1, u2 ); dats = jauDat(dt.iy, dt.im, dt.id, dt.fd); // if ( js < 0 ) return -1; fd = dt.fd; /* Get TAI-UTC tomorrow. */ Calendar dtt = jauJd2cal(u1+1.5, u2-fd ); datst = jauDat(dtt.iy, dtt.im, dtt.id, dtt.fd); // if ( js < 0 ) return -1; /* If today ends in a leap second, scale the fraction into SI days. */ ddat = datst - dats; if ( abs(ddat) > 0.5 ) fd += fd * ddat / DAYSEC; /* Today's calendar date to 2-part JD. */ JulianDate jd = jauCal2jd(dt.iy, dt.im, dt.id ) ; /* Assemble the TAI result, preserving the UTC split and order. */ a2 = jd.djm0 - u1; a2 += jd.djm1; a2 += fd + dats / DAYSEC; if ( big1 ) { tai1 = u1; tai2 = a2; } else { tai1 = a2; tai2 = u1; } /* FIXME Status. */ return new JulianDate(tai1, tai2); }; /** * * Time scale transformation: Coordinated Universal Time, UTC, to * Universal Time, UT1. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: canonical. * * * @param utc1 double UTC as a 2-part quasi Julian Date (Notes 1-4) * @param utc2 double UTC as a 2-part quasi Julian Date (Notes 1-4) * @param dut1 double Delta UT1 = UT1-UTC in seconds (Note 5) * * * @return UT1 as a 2-part Julian Date (Note 6) * * Returned (function value): * int status: +1 = dubious year (Note 7) * 0 = OK * -1 = unacceptable date * *

    Notes: *

      *
    1. utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any * convenient way between the two arguments, for example where utc1 * is the Julian Day Number and utc2 is the fraction of a day. * *
    2. JD cannot unambiguously represent UTC during a leap second unless * special measures are taken. The convention in the present * function is that the JD day represents UTC days whether the * length is 86399, 86400 or 86401 SI seconds. * *
    3. The warning status "dubious year" flags UTCs that predate the * introduction of the time scale and that are too far in the future * to be trusted. See jauDat for further details. * *
    4. The function jauDtf2d converts from calendar date and time of * day into 2-part Julian Date, and in the case of UTC implements * the leap-second-ambiguity convention described above. * *
    5. Delta UT1 can be obtained from tabulations provided by the * International Earth Rotation and Reference Systems Service. It * It is the caller's responsibility to supply a DUT argument * containing the UT1-UTC value that matches the given UTC. * *
    6. The returned ut11,ut12 are such that their sum is the UT1 Julian * Date. * *
    7. The warning status "dubious year" flags UTCs that predate the * introduction of the time scale and that are too far in the future * to be trusted. See jauDat for further details. *
    *

    References: * * McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * * Explanatory Supplement to the Astronomical Almanac, * P. Kenneth Seidelmann (ed), University Science Books (1992) * * Called:

      *
    • {@link #jauJd2cal} JD to Gregorian calendar *
    • {@link #jauDat} delta(AT) = TAI-UTC *
    • {@link #jauUtctai} UTC to TAI *
    • {@link #jauTaiut1} TAI to UT1 *
    *@version 2010 May 16 * *@since SOFA release 2010-12-01 * * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter unaccepatble date */ public static JulianDate jauUtcut1(double utc1, double utc2, double dut1) throws JSOFAIllegalParameter, JSOFAInternalError { double dta; /* Look up TAI-UTC. */ Calendar dt = jauJd2cal(utc1, utc2) ; double dat = jauDat ( dt.iy, dt.im, dt.id, 0.0 ); /* Form UT1-TAI. */ dta = dut1 - dat; /* UTC to TAI to UT1. */ JulianDate tai = jauUtctai(utc1, utc2); return jauTaiut1(tai.djm0, tai.djm1, dta) ; }; public static CelestialIntermediatePole jauXy06(double date1, double date2) /** * X,Y coordinates of celestial intermediate pole from series based * on IAU 2006 precession and IAU 2000A nutation. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: canonical model. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return CIP X,Y coordinates (Note 2) * *

    Notes: *

      * *
    1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
          *            date1          date2
          *
          *         2450123.7           0.0       (JD method)
          *         2451545.0       -1421.3       (J2000 method)
          *         2400000.5       50123.2       (MJD method)
          *         2450123.5           0.2       (date & time method)
          *
      * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
    2. The X,Y coordinates are those of the unit vector towards the * celestial intermediate pole. They represent the combined effects * of frame bias, precession and nutation. * *
    3. The fundamental arguments used are as adopted in IERS Conventions * (2003) and are from Simon et al. (1994) and Souchay et al. * (1999). * *
    4. This is an alternative to the angles-based method, via the JSOFA * function jauFw2xy and as used in jauXys06a for example. The two * methods agree at the 1 microarcsecond level (at present), a * negligible amount compared with the intrinsic accuracy of the * models. However, it would be unwise to mix the two methods * (angles-based and series-based) in a single application. *
    *

    Called:

      *
    • {@link #jauFal03} mean anomaly of the Moon *
    • {@link #jauFalp03} mean anomaly of the Sun *
    • {@link #jauFaf03} mean argument of the latitude of the Moon *
    • {@link #jauFad03} mean elongation of the Moon from the Sun *
    • {@link #jauFaom03} mean longitude of the Moon's ascending node *
    • {@link #jauFame03} mean longitude of Mercury *
    • {@link #jauFave03} mean longitude of Venus *
    • {@link #jauFae03} mean longitude of Earth *
    • {@link #jauFama03} mean longitude of Mars *
    • {@link #jauFaju03} mean longitude of Jupiter *
    • {@link #jauFasa03} mean longitude of Saturn *
    • {@link #jauFaur03} mean longitude of Uranus *
    • {@link #jauFane03} mean longitude of Neptune *
    • {@link #jauFapa03} general accumulated precession in longitude *
    *

    References: * *

    Capitaine, N., Wallace, P.T. & Chapront, J., 2003, * Astron.Astrophys., 412, 567 * *

    Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 * *

    McCarthy, D. D., Petit, G. (eds.), 2004, IERS Conventions (2003), * IERS Technical Note No. 32, BKG * * Simon, J.L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G. & Laskar, J., Astron.Astrophys., 1994, 282, 663 * * Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M., 1999, * Astron.Astrophys.Supp.Ser. 135, 111 * *

    Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 * *@version 2009 October 16 * * @since Release 20101201 * * */ { /* Maximum power of T in the polynomials for X and Y */ final int MAXPT = (5); /* Polynomial coefficients (arcsec, X then Y). */ final double xyp[][] = { { -0.016617, 2004.191898, -0.4297829, -0.19861834, 0.000007578, 0.0000059285 }, { -0.006951, -0.025896, -22.4072747, 0.00190059, 0.001112526, 0.0000001358 } }; /* N.B mfals defined as class static (outside this method) to avoid problems with 65535 byte limit for methods */ /* Number of frequencies: luni-solar */ final int NFLS = mfals.length; /* Number of frequencies: planetary */ final int NFPL =mfapl.length ; /* Pointers into amplitudes array, one pointer per frequency */ final int nc[] = { /* 1-100 */ 1, 21, 37, 51, 65, 79, 91, 103, 115, 127, 139, 151, 163, 172, 184, 196, 207, 219, 231, 240, 252, 261, 273, 285, 297, 309, 318, 327, 339, 351, 363, 372, 384, 396, 405, 415, 423, 435, 444, 452, 460, 467, 474, 482, 490, 498, 506, 513, 521, 528, 536, 543, 551, 559, 566, 574, 582, 590, 597, 605, 613, 620, 628, 636, 644, 651, 658, 666, 674, 680, 687, 695, 702, 710, 717, 725, 732, 739, 746, 753, 760, 767, 774, 782, 790, 798, 805, 812, 819, 826, 833, 840, 846, 853, 860, 867, 874, 881, 888, 895, /* 101-200 */ 901, 908, 914, 921, 928, 934, 941, 948, 955, 962, 969, 976, 982, 989, 996, 1003, 1010, 1017, 1024, 1031, 1037, 1043, 1050, 1057, 1064, 1071, 1078, 1084, 1091, 1098, 1104, 1112, 1118, 1124, 1131, 1138, 1145, 1151, 1157, 1164, 1171, 1178, 1185, 1192, 1199, 1205, 1212, 1218, 1226, 1232, 1239, 1245, 1252, 1259, 1266, 1272, 1278, 1284, 1292, 1298, 1304, 1310, 1316, 1323, 1329, 1335, 1341, 1347, 1353, 1359, 1365, 1371, 1377, 1383, 1389, 1396, 1402, 1408, 1414, 1420, 1426, 1434, 1440, 1446, 1452, 1459, 1465, 1471, 1477, 1482, 1488, 1493, 1499, 1504, 1509, 1514, 1520, 1527, 1532, 1538, /* 201-300 */ 1543, 1548, 1553, 1558, 1564, 1569, 1574, 1579, 1584, 1589, 1594, 1596, 1598, 1600, 1602, 1605, 1608, 1610, 1612, 1617, 1619, 1623, 1625, 1627, 1629, 1632, 1634, 1640, 1642, 1644, 1646, 1648, 1650, 1652, 1654, 1658, 1660, 1662, 1664, 1668, 1670, 1672, 1673, 1675, 1679, 1681, 1683, 1684, 1686, 1688, 1690, 1693, 1695, 1697, 1701, 1703, 1705, 1707, 1709, 1711, 1712, 1715, 1717, 1721, 1723, 1725, 1727, 1729, 1731, 1733, 1735, 1737, 1739, 1741, 1743, 1745, 1747, 1749, 1751, 1753, 1755, 1757, 1759, 1761, 1762, 1764, 1766, 1768, 1769, 1771, 1773, 1775, 1777, 1779, 1781, 1783, 1785, 1787, 1788, 1790, /* 301-400 */ 1792, 1794, 1796, 1798, 1800, 1802, 1804, 1806, 1807, 1809, 1811, 1815, 1817, 1819, 1821, 1823, 1825, 1827, 1829, 1831, 1833, 1835, 1837, 1839, 1840, 1842, 1844, 1848, 1850, 1852, 1854, 1856, 1858, 1859, 1860, 1862, 1864, 1866, 1868, 1869, 1871, 1873, 1875, 1877, 1879, 1881, 1883, 1885, 1887, 1889, 1891, 1892, 1896, 1898, 1900, 1901, 1903, 1905, 1907, 1909, 1910, 1911, 1913, 1915, 1919, 1921, 1923, 1927, 1929, 1931, 1933, 1935, 1937, 1939, 1943, 1945, 1947, 1948, 1949, 1951, 1953, 1955, 1957, 1958, 1960, 1962, 1964, 1966, 1968, 1970, 1971, 1973, 1974, 1975, 1977, 1979, 1980, 1981, 1982, 1984, /* 401-500 */ 1986, 1988, 1990, 1992, 1994, 1995, 1997, 1999, 2001, 2003, 2005, 2007, 2008, 2009, 2011, 2013, 2015, 2017, 2019, 2021, 2023, 2024, 2025, 2027, 2029, 2031, 2033, 2035, 2037, 2041, 2043, 2045, 2046, 2047, 2049, 2051, 2053, 2055, 2056, 2057, 2059, 2061, 2063, 2065, 2067, 2069, 2070, 2071, 2072, 2074, 2076, 2078, 2080, 2082, 2084, 2086, 2088, 2090, 2092, 2094, 2095, 2096, 2097, 2099, 2101, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2113, 2115, 2119, 2121, 2123, 2125, 2127, 2129, 2131, 2133, 2135, 2136, 2137, 2139, 2141, 2143, 2145, 2147, 2149, 2151, 2153, 2155, 2157, 2159, 2161, 2163, 2165, 2167, /* 501-600 */ 2169, 2171, 2173, 2175, 2177, 2179, 2181, 2183, 2185, 2186, 2187, 2188, 2192, 2193, 2195, 2197, 2199, 2201, 2203, 2205, 2207, 2209, 2211, 2213, 2217, 2219, 2221, 2223, 2225, 2227, 2229, 2231, 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, 2244, 2246, 2248, 2250, 2252, 2254, 2256, 2258, 2260, 2262, 2264, 2266, 2268, 2270, 2272, 2274, 2276, 2278, 2280, 2282, 2284, 2286, 2288, 2290, 2292, 2294, 2296, 2298, 2300, 2302, 2303, 2304, 2305, 2306, 2307, 2309, 2311, 2313, 2315, 2317, 2319, 2321, 2323, 2325, 2327, 2329, 2331, 2333, 2335, 2337, 2341, 2343, 2345, 2347, 2349, 2351, 2352, 2355, 2356, /* 601-700 */ 2357, 2358, 2359, 2361, 2363, 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2376, 2378, 2380, 2382, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2417, 2418, 2430, 2438, 2445, 2453, 2460, 2468, 2474, 2480, 2488, 2496, 2504, 2512, 2520, 2527, 2535, 2543, 2550, 2558, 2566, 2574, 2580, 2588, 2596, 2604, 2612, 2619, 2627, 2634, 2642, 2648, 2656, 2664, 2671, 2679, 2685, 2693, 2701, 2709, 2717, 2725, 2733, 2739, 2747, 2753, 2761, 2769, /* 701-800 */ 2777, 2785, 2793, 2801, 2809, 2817, 2825, 2833, 2841, 2848, 2856, 2864, 2872, 2878, 2884, 2892, 2898, 2906, 2914, 2922, 2930, 2938, 2944, 2952, 2958, 2966, 2974, 2982, 2988, 2996, 3001, 3009, 3017, 3025, 3032, 3039, 3045, 3052, 3059, 3067, 3069, 3076, 3083, 3090, 3098, 3105, 3109, 3111, 3113, 3120, 3124, 3128, 3132, 3136, 3140, 3144, 3146, 3150, 3158, 3161, 3165, 3166, 3168, 3172, 3176, 3180, 3182, 3185, 3189, 3193, 3194, 3197, 3200, 3204, 3208, 3212, 3216, 3219, 3221, 3222, 3226, 3230, 3234, 3238, 3242, 3243, 3247, 3251, 3254, 3258, 3262, 3266, 3270, 3274, 3275, 3279, 3283, 3287, 3289, 3293, /* 801-900 */ 3296, 3300, 3303, 3307, 3311, 3315, 3319, 3321, 3324, 3327, 3330, 3334, 3338, 3340, 3342, 3346, 3350, 3354, 3358, 3361, 3365, 3369, 3373, 3377, 3381, 3385, 3389, 3393, 3394, 3398, 3402, 3406, 3410, 3413, 3417, 3421, 3425, 3429, 3433, 3435, 3439, 3443, 3446, 3450, 3453, 3457, 3458, 3461, 3464, 3468, 3472, 3476, 3478, 3481, 3485, 3489, 3493, 3497, 3501, 3505, 3507, 3511, 3514, 3517, 3521, 3524, 3525, 3527, 3529, 3533, 3536, 3540, 3541, 3545, 3548, 3551, 3555, 3559, 3563, 3567, 3569, 3570, 3574, 3576, 3578, 3582, 3586, 3590, 3593, 3596, 3600, 3604, 3608, 3612, 3616, 3620, 3623, 3626, 3630, 3632, /* 901-1000 */ 3636, 3640, 3643, 3646, 3648, 3652, 3656, 3660, 3664, 3667, 3669, 3671, 3675, 3679, 3683, 3687, 3689, 3693, 3694, 3695, 3699, 3703, 3705, 3707, 3710, 3713, 3717, 3721, 3725, 3729, 3733, 3736, 3740, 3744, 3748, 3752, 3754, 3757, 3759, 3763, 3767, 3770, 3773, 3777, 3779, 3783, 3786, 3790, 3794, 3798, 3801, 3805, 3809, 3813, 3817, 3821, 3825, 3827, 3831, 3835, 3836, 3837, 3840, 3844, 3848, 3852, 3856, 3859, 3863, 3867, 3869, 3871, 3875, 3879, 3883, 3887, 3890, 3894, 3898, 3901, 3905, 3909, 3913, 3917, 3921, 3922, 3923, 3924, 3926, 3930, 3932, 3936, 3938, 3940, 3944, 3948, 3952, 3956, 3959, 3963, /* 1001-1100 */ 3965, 3969, 3973, 3977, 3979, 3981, 3982, 3986, 3989, 3993, 3997, 4001, 4004, 4006, 4009, 4012, 4016, 4020, 4024, 4026, 4028, 4032, 4036, 4040, 4044, 4046, 4050, 4054, 4058, 4060, 4062, 4063, 4064, 4068, 4071, 4075, 4077, 4081, 4083, 4087, 4089, 4091, 4095, 4099, 4101, 4103, 4105, 4107, 4111, 4115, 4119, 4123, 4127, 4129, 4131, 4135, 4139, 4141, 4143, 4145, 4149, 4153, 4157, 4161, 4165, 4169, 4173, 4177, 4180, 4183, 4187, 4191, 4195, 4198, 4201, 4205, 4209, 4212, 4213, 4216, 4217, 4221, 4223, 4226, 4230, 4234, 4236, 4240, 4244, 4248, 4252, 4256, 4258, 4262, 4264, 4266, 4268, 4270, 4272, 4276, /* 1101-1200 */ 4279, 4283, 4285, 4287, 4289, 4293, 4295, 4299, 4300, 4301, 4305, 4309, 4313, 4317, 4319, 4323, 4325, 4329, 4331, 4333, 4335, 4337, 4341, 4345, 4349, 4351, 4353, 4357, 4361, 4365, 4367, 4369, 4373, 4377, 4381, 4383, 4387, 4389, 4391, 4395, 4399, 4403, 4407, 4411, 4413, 4414, 4415, 4418, 4419, 4421, 4423, 4427, 4429, 4431, 4433, 4435, 4437, 4439, 4443, 4446, 4450, 4452, 4456, 4458, 4460, 4462, 4466, 4469, 4473, 4477, 4481, 4483, 4487, 4489, 4491, 4493, 4497, 4499, 4501, 4504, 4506, 4510, 4513, 4514, 4515, 4518, 4521, 4522, 4525, 4526, 4527, 4530, 4533, 4534, 4537, 4541, 4542, 4543, 4544, 4545, /* 1201-1300 */ 4546, 4547, 4550, 4553, 4554, 4555, 4558, 4561, 4564, 4567, 4568, 4571, 4574, 4575, 4578, 4581, 4582, 4585, 4586, 4588, 4590, 4592, 4596, 4598, 4602, 4604, 4608, 4612, 4613, 4616, 4619, 4622, 4623, 4624, 4625, 4626, 4629, 4632, 4633, 4636, 4639, 4640, 4641, 4642, 4643, 4644, 4645, 4648, 4649, 4650, 4651, 4652, 4653, 4656, 4657, 4660, 4661, 4664, 4667, 4670, 4671, 4674, 4675, 4676, 4677, 4678, 4681, 4682, 4683, 4684, 4687, 4688, 4689, 4692, 4693, 4696, 4697, 4700, 4701, 4702, 4703, 4704, 4707, 4708, 4711, 4712, 4715, 4716, 4717, 4718, 4719, 4720, 4721, 4722, 4723, 4726, 4729, 4730, 4733, 4736, /* 1301-(NFLS+NFPL) */ 4737, 4740, 4741, 4742, 4745, 4746, 4749, 4752, 4753 }; /* Amplitude coefficients (microarcsec); indexed using the nc array. */ final double a[] = { /* 1-105 */ -6844318.44, 9205236.26,1328.67,1538.18, 205833.11, 153041.79, -3309.73, 853.32,2037.98, -2301.27, 81.46, 120.56, -20.39, -15.22, 1.73, -1.61, -0.10, 0.11, -0.02, -0.02, -523908.04, 573033.42,-544.75,-458.66, 12814.01, 11714.49, 198.97,-290.91, 155.74,-143.27, -2.75, -1.03, -1.27, -1.16, 0.00, -0.01, -90552.22, 97846.69, 111.23, 137.41,2187.91,2024.68, 41.44, -51.26, 26.92, -24.46, -0.46, -0.28, -0.22, -0.20, 82168.76, -89618.24, -27.64, -29.05, -2004.36, -1837.32, -36.07, 48.00, -24.43, 22.41, 0.47, 0.24, 0.20, 0.18, 58707.02,7387.02, 470.05,-192.40, 164.33, -1312.21, -179.73, -28.93, -17.36, -1.83, -0.50, 3.57, 0.00, 0.13, -20557.78, 22438.42, -20.84, -17.40, 501.82, 459.68, 59.20, -67.30, 6.08, -5.61, -1.36, -1.19, 28288.28, -674.99, -34.69, 35.80, -15.07,-632.54, -11.19, 0.78, -8.41, 0.17, 0.01, 0.07, -15406.85, 20069.50, 15.12, /* 106-219 */ 31.80, 448.76, 344.50, -5.77, 1.41, 4.59, -5.02, 0.17, 0.24, -11991.74, 12902.66, 32.46, 36.70, 288.49, 268.14, 5.70, -7.06, 3.57, -3.23, -0.06, -0.04, -8584.95, -9592.72, 4.42, -13.20,-214.50, 192.06, 23.87, 29.83, 2.54, 2.40, 0.60, -0.48,5095.50, -6918.22, 7.19, 3.92,-154.91,-113.94, 2.86, -1.04, -1.52, 1.73, -0.07, -0.10, -4910.93, -5331.13, 0.76, 0.40,-119.21, 109.81, 2.16, 3.20, 1.46, 1.33, 0.04, -0.02, -6245.02,-123.48, -6.68, -8.20, -2.76, 139.64, 2.71, 0.15, 1.86,2511.85, -3323.89, 1.07, -0.90, -74.33, -56.17, 1.16, -0.01, -0.75, 0.83, -0.02, -0.04,2307.58,3143.98, -7.52, 7.50, 70.31, -51.60, 1.46, 0.16, -0.69, -0.79, 0.02, -0.05,2372.58,2554.51, 5.93, -6.60, 57.12, -53.05, -0.96, -1.24, -0.71, -0.64, -0.01, -2053.16,2636.13, 5.13, 7.80, 58.94, 45.91, -0.42, -0.12, 0.61, -0.66, 0.02, 0.03, -1825.49, /* 220-339 */ -2423.59, 1.23, -2.00, -54.19, 40.82, -1.07, -1.02, 0.54, 0.61, -0.04, 0.04,2521.07,-122.28, -5.97, 2.90, -2.73, -56.37, -0.82, 0.13, -0.75, -1534.09,1645.01, 6.29, 6.80, 36.78, 34.30, 0.92, -1.25, 0.46, -0.41, -0.02, -0.01,1898.27, 47.70, -0.72, 2.50, 1.07, -42.45, -0.94, 0.02, -0.56, -1292.02, -1387.00, 0.00, 0.00, -31.01, 28.89, 0.68, 0.00, 0.38, 0.35, -0.01, -0.01, -1234.96,1323.81, 5.21, 5.90, 29.60, 27.61, 0.74, -1.22, 0.37, -0.33, -0.02, -0.01,1137.48, -1233.89, -0.04, -0.30, -27.59, -25.43, -0.61, 1.00, -0.34, 0.31, 0.01, 0.01,-813.13, -1075.60, 0.40, 0.30, -24.05, 18.18, -0.40, -0.01, 0.24, 0.27, -0.01, 0.01,1163.22, -60.90, -2.94, 1.30, -1.36, -26.01, -0.58, 0.07, -0.35,1029.70, -55.55, -2.63, 1.10, -1.25, -23.02, -0.52, 0.06, -0.31,-556.26, 852.85, 3.16, -4.48, 19.06, 12.44, -0.81, -0.27, 0.17, -0.21, 0.00, 0.02,-603.52, /* 340-467 */ -800.34, 0.44, 0.10, -17.90, 13.49, -0.08, -0.01, 0.18, 0.20, -0.01, 0.01,-628.24, 684.99, -0.64, -0.50, 15.32, 14.05, 3.18, -4.19, 0.19, -0.17, -0.09, -0.07,-866.48, -16.26, 0.52, -1.30, -0.36, 19.37, 0.43, -0.01, 0.26, -512.37, 695.54, -1.47, -1.40, 15.55, 11.46, -0.16, 0.03, 0.15, -0.17, 0.01, 0.01, 506.65, 643.75, 2.54, -2.62, 14.40, -11.33, -0.77, -0.06, -0.15, -0.16, 0.00, 0.01, 664.57, 16.81, -0.40, 1.00, 0.38, -14.86, -3.71, -0.09, -0.20, 405.91, 522.11, 0.99, -1.50, 11.67, -9.08, -0.25, -0.02, -0.12, -0.13,-305.78, 326.60, 1.75, 1.90, 7.30, 6.84, 0.20, -0.04, 300.99,-325.03, -0.44, -0.50, -7.27, -6.73, -1.01, 0.01, 0.00, 0.08, 0.00, 0.02, 438.51, 10.47, -0.56, -0.20, 0.24, -9.81, -0.24, 0.01, -0.13, -264.02, 335.24, 0.99, 1.40, 7.49, 5.90, -0.27, -0.02, 284.09, 307.03, 0.32, -0.40, 6.87, -6.35, -0.99, -0.01, -250.54, 327.11, 0.08, 0.40, 7.31, 5.60, -0.30, 230.72, /* 468-595 */ -304.46, 0.08, -0.10, -6.81, -5.16, 0.27, 229.78, 304.17, -0.60, 0.50, 6.80, -5.14, 0.33, 0.01, 256.30,-276.81, -0.28, -0.40, -6.19, -5.73, -0.14, 0.01,-212.82, 269.45, 0.84, 1.20, 6.02, 4.76, 0.14, -0.02, 196.64, 272.05, -0.84, 0.90, 6.08, -4.40, 0.35, 0.02, 188.95, 272.22, -0.12, 0.30, 6.09, -4.22, 0.34,-292.37, -5.10, -0.32, -0.40, -0.11, 6.54, 0.14, 0.01, 161.79,-220.67, 0.24, 0.10, -4.93, -3.62, -0.08, 261.54, -19.94, -0.95, 0.20, -0.45, -5.85, -0.13, 0.02, 142.16,-190.79, 0.20, 0.10, -4.27, -3.18, -0.07, 187.95, -4.11, -0.24, 0.30, -0.09, -4.20, -0.09, 0.01, 0.00, 0.00, -79.08, 167.90, 0.04, 0.00, 3.75, 1.77, 121.98, 131.04, -0.08, 0.10, 2.93, -2.73, -0.06,-172.95, -8.11, -0.40, -0.20, -0.18, 3.87, 0.09, 0.01,-160.15, -55.30, -14.04, 13.90, -1.23, 3.58, 0.40, 0.31,-115.40, 123.20, 0.60, 0.70, 2.75, 2.58, 0.08, -0.01,-168.26, -2.00, 0.20, -0.20, -0.04, 3.76, /* 596-723 */ 0.08,-114.49, 123.20, 0.32, 0.40, 2.75, 2.56, 0.07, -0.01, 112.14, 120.70, 0.28, -0.30, 2.70, -2.51, -0.07, -0.01, 161.34, 4.03, 0.20, 0.20, 0.09, -3.61, -0.08, 91.31, 126.64, -0.40, 0.40, 2.83, -2.04, -0.04, 0.01, 105.29, 112.90, 0.44, -0.50, 2.52, -2.35, -0.07, -0.01, 98.69,-106.20, -0.28, -0.30, -2.37, -2.21, -0.06, 0.01, 86.74,-112.94, -0.08, -0.20, -2.53, -1.94, -0.05,-134.81, 3.51, 0.20, -0.20, 0.08, 3.01, 0.07, 79.03, 107.31, -0.24, 0.20, 2.40, -1.77, -0.04, 0.01, 132.81, -10.77, -0.52, 0.10, -0.24, -2.97, -0.07, 0.01,-130.31, -0.90, 0.04, 0.00, 0.00, 2.91, -78.56, 85.32, 0.00, 0.00, 1.91, 1.76, 0.04, 0.00, 0.00, -41.53, 89.10, 0.02, 0.00, 1.99, 0.93, 66.03, -71.00, -0.20, -0.20, -1.59, -1.48, -0.04, 60.50, 64.70, 0.36, -0.40, 1.45, -1.35, -0.04, -0.01, -52.27, -70.01, 0.00, 0.00, -1.57, 1.17, 0.03, -52.95, 66.29, 0.32, 0.40, 1.48, 1.18, 0.04, /* 724-851 */ -0.01, 51.02, 67.25, 0.00, 0.00, 1.50, -1.14, -0.03, -55.66, -60.92, 0.16, -0.20, -1.36, 1.24, 0.03, -54.81, -59.20, -0.08, 0.20, -1.32, 1.23, 0.03, 51.32, -55.60, 0.00, 0.00, -1.24, -1.15, -0.03, 48.29, 51.80, 0.20, -0.20, 1.16, -1.08, -0.03, -45.59, -49.00, -0.12, 0.10, -1.10, 1.02, 0.03, 40.54, -52.69, -0.04, -0.10, -1.18, -0.91, -0.02, -40.58, -49.51, -1.00, 1.00, -1.11, 0.91, 0.04, 0.02, -43.76, 46.50, 0.36, 0.40, 1.04, 0.98, 0.03, -0.01, 62.65, -5.00, -0.24, 0.00, -0.11, -1.40, -0.03, 0.01, -38.57, 49.59, 0.08, 0.10, 1.11, 0.86, 0.02, -33.22, -44.04, 0.08, -0.10, -0.98, 0.74, 0.02, 37.15, -39.90, -0.12, -0.10, -0.89, -0.83, -0.02, 36.68, -39.50, -0.04, -0.10, -0.88, -0.82, -0.02, -53.22, -3.91, -0.20, 0.00, -0.09, 1.19, 0.03, 32.43, -42.19, -0.04, -0.10, -0.94, -0.73, -0.02, -51.00, -2.30, -0.12, -0.10, 0.00, 1.14, -29.53, -39.11, 0.04, 0.00, -0.87, 0.66, /* 852-979 */ 0.02, 28.50, -38.92, -0.08, -0.10, -0.87, -0.64, -0.02, 26.54, 36.95, -0.12, 0.10, 0.83, -0.59, -0.01, 26.54, 34.59, 0.04, -0.10, 0.77, -0.59, -0.02, 28.35, -32.55, -0.16, 0.20, -0.73, -0.63, -0.01, -28.00, 30.40, 0.00, 0.00, 0.68, 0.63, 0.01, -27.61, 29.40, 0.20, 0.20, 0.66, 0.62, 0.02, 40.33, 0.40, -0.04, 0.10, 0.00, -0.90, -23.28, 31.61, -0.08, -0.10, 0.71, 0.52, 0.01, 37.75, 0.80, 0.04, 0.10, 0.00, -0.84, 23.66, 25.80, 0.00, 0.00, 0.58, -0.53, -0.01, 21.01, -27.91, 0.00, 0.00, -0.62, -0.47, -0.01, -34.81, 2.89, 0.04, 0.00, 0.00, 0.78, -23.49, -25.31, 0.00, 0.00, -0.57, 0.53, 0.01, -23.47, 25.20, 0.16, 0.20, 0.56, 0.52, 0.02, 19.58, 27.50, -0.12, 0.10, 0.62, -0.44, -0.01, -22.67, -24.40, -0.08, 0.10, -0.55, 0.51, 0.01, -19.97, 25.00, 0.12, 0.20, 0.56, 0.45, 0.01, 21.28, -22.80, -0.08, -0.10, -0.51, -0.48, -0.01, -30.47, 0.91, 0.04, 0.00, /* 980-1107 */ 0.00, 0.68, 18.58, 24.00, 0.04, -0.10, 0.54, -0.42, -0.01, -18.02, 24.40, -0.04, -0.10, 0.55, 0.40, 0.01, 17.74, 22.50, 0.08, -0.10, 0.50, -0.40, -0.01, -19.41, 20.70, 0.08, 0.10, 0.46, 0.43, 0.01, -18.64, 20.11, 0.00, 0.00, 0.45, 0.42, 0.01, -16.75, 21.60, 0.04, 0.10, 0.48, 0.37, 0.01, -18.42, -20.00, 0.00, 0.00, -0.45, 0.41, 0.01, -26.77, 1.41, 0.08, 0.00, 0.00, 0.60, -26.17, -0.19, 0.00, 0.00, 0.00, 0.59, -15.52, 20.51, 0.00, 0.00, 0.46, 0.35, 0.01, -25.42, -1.91, -0.08, 0.00, -0.04, 0.57, 0.45, -17.42, 18.10, 0.00, 0.00, 0.40, 0.39, 0.01, 16.39, -17.60, -0.08, -0.10, -0.39, -0.37, -0.01, -14.37, 18.91, 0.00, 0.00, 0.42, 0.32, 0.01, 23.39, -2.40, -0.12, 0.00, 0.00, -0.52, 14.32, -18.50, -0.04, -0.10, -0.41, -0.32, -0.01, 15.69, 17.08, 0.00, 0.00, 0.38, -0.35, -0.01, -22.99, 0.50, 0.04, 0.00, 0.00, 0.51, 0.00, 0.00, 14.47, -17.60, /* 1108-1235 */ -0.01, 0.00, -0.39, -0.32, -13.33, 18.40, -0.04, -0.10, 0.41, 0.30, 22.47, -0.60, -0.04, 0.00, 0.00, -0.50, -12.78, -17.41, 0.04, 0.00, -0.39, 0.29, 0.01, -14.10, -15.31, 0.04, 0.00, -0.34, 0.32, 0.01, 11.98, 16.21, -0.04, 0.00, 0.36, -0.27, -0.01, 19.65, -1.90, -0.08, 0.00, 0.00, -0.44, 19.61, -1.50, -0.08, 0.00, 0.00, -0.44, 13.41, -14.30, -0.04, -0.10, -0.32, -0.30, -0.01, -13.29, 14.40, 0.00, 0.00, 0.32, 0.30, 0.01, 11.14, -14.40, -0.04, 0.00, -0.32, -0.25, -0.01, 12.24, -13.38, 0.04, 0.00, -0.30, -0.27, -0.01, 10.07, -13.81, 0.04, 0.00, -0.31, -0.23, -0.01, 10.46, 13.10, 0.08, -0.10, 0.29, -0.23, -0.01, 16.55, -1.71, -0.08, 0.00, 0.00, -0.37, 9.75, -12.80, 0.00, 0.00, -0.29, -0.22, -0.01, 9.11, 12.80, 0.00, 0.00, 0.29, -0.20, 0.00, 0.00, -6.44, -13.80, 0.00, 0.00, -0.31, 0.14, -9.19, -12.00, 0.00, 0.00, -0.27, 0.21, -10.30, 10.90, 0.08, 0.10, /* 1236-1363 */ 0.24, 0.23, 0.01, 14.92, -0.80, -0.04, 0.00, 0.00, -0.33, 10.02, -10.80, 0.00, 0.00, -0.24, -0.22, -0.01, -9.75, 10.40, 0.04, 0.00, 0.23, 0.22, 0.01, 9.67, -10.40, -0.04, 0.00, -0.23, -0.22, -0.01, -8.28, -11.20, 0.04, 0.00, -0.25, 0.19, 13.32, -1.41, -0.08, 0.00, 0.00, -0.30, 8.27, 10.50, 0.04, 0.00, 0.23, -0.19, 0.00, 0.00, 13.13, 0.00, 0.00, 0.00, 0.00, -0.29, -12.93, 0.70, 0.04, 0.00, 0.00, 0.29, 7.91, -10.20, 0.00, 0.00, -0.23, -0.18, -7.84, -10.00, -0.04, 0.00, -0.22, 0.18, 7.44, 9.60, 0.00, 0.00, 0.21, -0.17, -7.64, 9.40, 0.08, 0.10, 0.21, 0.17, 0.01, -11.38, 0.60, 0.04, 0.00, 0.00, 0.25, -7.48, 8.30, 0.00, 0.00, 0.19, 0.17, -10.98, -0.20, 0.00, 0.00, 0.00, 0.25, 10.98, 0.20, 0.00, 0.00, 0.00, -0.25, 7.40, -7.90, -0.04, 0.00, -0.18, -0.17, -6.09, 8.40, -0.04, 0.00, 0.19, 0.14, -6.94, -7.49, 0.00, 0.00, -0.17, /* 1364-1491 */ 0.16, 6.92, 7.50, 0.04, 0.00, 0.17, -0.15, 6.20, 8.09, 0.00, 0.00, 0.18, -0.14, -6.12, 7.80, 0.04, 0.00, 0.17, 0.14, 5.85, -7.50, 0.00, 0.00, -0.17, -0.13, -6.48, 6.90, 0.08, 0.10, 0.15, 0.14, 0.01, 6.32, 6.90, 0.00, 0.00, 0.15, -0.14, 5.61, -7.20, 0.00, 0.00, -0.16, -0.13, 9.07, 0.00, 0.00, 0.00, 0.00, -0.20, 5.25, 6.90, 0.00, 0.00, 0.15, -0.12, -8.47, -0.40, 0.00, 0.00, 0.00, 0.19, 6.32, -5.39, -1.11, 1.10, -0.12, -0.14, 0.02, 0.02, 5.73, -6.10, -0.04, 0.00, -0.14, -0.13, 4.70, 6.60, -0.04, 0.00, 0.15, -0.11, -4.90, -6.40, 0.00, 0.00, -0.14, 0.11, -5.33, 5.60, 0.04, 0.10, 0.13, 0.12, 0.01, -4.81, 6.00, 0.04, 0.00, 0.13, 0.11, 5.13, 5.50, 0.04, 0.00, 0.12, -0.11, 4.50, 5.90, 0.00, 0.00, 0.13, -0.10, -4.22, 6.10, 0.00, 0.00, 0.14, -4.53, 5.70, 0.00, 0.00, 0.13, 0.10, 4.18, 5.70, 0.00, 0.00, /* 1492-1619 */ 0.13, -4.75, -5.19, 0.00, 0.00, -0.12, 0.11, -4.06, 5.60, 0.00, 0.00, 0.13, -3.98, 5.60, -0.04, 0.00, 0.13, 4.02, -5.40, 0.00, 0.00, -0.12, 4.49, -4.90, -0.04, 0.00, -0.11, -0.10, -3.62, -5.40, -0.16, 0.20, -0.12, 0.00, 0.01, 4.38, 4.80, 0.00, 0.00, 0.11, -6.40, -0.10, 0.00, 0.00, 0.00, 0.14, -3.98, 5.00, 0.04, 0.00, 0.11, -3.82, -5.00, 0.00, 0.00, -0.11, -3.71, 5.07, 0.00, 0.00, 0.11, 4.14, 4.40, 0.00, 0.00, 0.10, -6.01, -0.50, -0.04, 0.00, 0.00, 0.13, -4.04, 4.39, 0.00, 0.00, 0.10, 3.45, -4.72, 0.00, 0.00, -0.11, 3.31, 4.71, 0.00, 0.00, 0.11, 3.26, -4.50, 0.00, 0.00, -0.10, -3.26, -4.50, 0.00, 0.00, -0.10, -3.34, -4.40, 0.00, 0.00, -0.10, -3.74, -4.00, 3.70, 4.00, 3.34, -4.30, 3.30, -4.30, -3.66, 3.90, 0.04, 3.66, 3.90, 0.04, -3.62, -3.90, -3.61, 3.90, -0.20, 5.30, 0.00, 0.00, 0.12, 3.06, 4.30, 3.30, /* 1620-1747 */ 4.00, 0.40, 0.20, 3.10, 4.10, -3.06, 3.90, -3.30, -3.60, -3.30, 3.36, 0.01, 3.14, 3.40, -4.57, -0.20, 0.00, 0.00, 0.00, 0.10, -2.70, -3.60, 2.94, -3.20, -2.90, 3.20, 2.47, -3.40, 2.55, -3.30, 2.80, -3.08, 2.51, 3.30, -4.10, 0.30, -0.12, -0.10, 4.10, 0.20, -2.74, 3.00, 2.46, 3.23, -3.66, 1.20, -0.20, 0.20, 3.74, -0.40, -2.51, -2.80, -3.74, 2.27, -2.90, 0.00, 0.00, -2.50, 2.70, -2.51, 2.60, -3.50, 0.20, 3.38, -2.22, -2.50, 3.26, -0.40, 1.95, -2.60, 3.22, -0.40, -0.04, -1.79, -2.60, 1.91, 2.50, 0.74, 3.05, -0.04, 0.08, 2.11, -2.30, -2.11, 2.20, -1.87, -2.40, 2.03, -2.20, -2.03, 2.20, 2.98, 0.00, 0.00, 2.98, -1.71, 2.40, 2.94, -0.10, -0.12, 0.10, 1.67, 2.40, -1.79, 2.30, -1.79, 2.20, -1.67, 2.20, 1.79, -2.00, 1.87, -1.90, 1.63, -2.10, -1.59, 2.10, 1.55, -2.10, -1.55, 2.10, -2.59, -0.20, -1.75, -1.90, -1.75, 1.90, -1.83, /* 1748-1875 */ -1.80, 1.51, 2.00, -1.51, -2.00, 1.71, 1.80, 1.31, 2.10, -1.43, 2.00, 1.43, 2.00, -2.43, -1.51, 1.90, -1.47, 1.90, 2.39, 0.20, -2.39, 1.39, 1.90, 1.39, -1.80, 1.47, -1.60, 1.47, -1.60, 1.43, -1.50, -1.31, 1.60, 1.27, -1.60, -1.27, 1.60, 1.27, -1.60, 2.03, 1.35, 1.50, -1.39, -1.40, 1.95, -0.20, -1.27, 1.49, 1.19, 1.50, 1.27, 1.40, 1.15, 1.50, 1.87, -0.10, -1.12, -1.50, 1.87, -1.11, -1.50, -1.11, -1.50, 0.00, 0.00, 1.19, 1.40, 1.27, -1.30, -1.27, -1.30, -1.15, 1.40, -1.23, 1.30, -1.23, -1.30, 1.22, -1.29, 1.07, -1.40, 1.75, -0.20, -1.03, -1.40, -1.07, 1.20, -1.03, 1.15, 1.07, 1.10, 1.51, -1.03, 1.10, 1.03, -1.10, 0.00, 0.00, -1.03, -1.10, 0.91, -1.20, -0.88, -1.20, -0.88, 1.20, -0.95, 1.10, -0.95, -1.10, 1.43, -1.39, 0.95, -1.00, -0.95, 1.00, -0.80, 1.10, 0.91, -1.00, -1.35, 0.88, 1.00, -0.83, 1.00, -0.91, 0.90, 0.91, /* 1876-2003 */ 0.90, 0.88, -0.90, -0.76, -1.00, -0.76, 1.00, 0.76, 1.00, -0.72, 1.00, 0.84, -0.90, 0.84, 0.90, 1.23, 0.00, 0.00, -0.52, -1.10, -0.68, 1.00, 1.19, -0.20, 1.19, 0.76, 0.90, 1.15, -0.10, 1.15, -0.10, 0.72, -0.90, -1.15, -1.15, 0.68, 0.90, -0.68, 0.90, -1.11, 0.00, 0.00, 0.20, 0.79, 0.80, -1.11, -0.10, 0.00, 0.00, -0.48, -1.00, -0.76, -0.80, -0.72, -0.80, -1.07, -0.10, 0.64, 0.80, -0.64, -0.80, 0.64, 0.80, 0.40, 0.60, 0.52, -0.50, -0.60, -0.80, -0.71, 0.70, -0.99, 0.99, 0.56, 0.80, -0.56, 0.80, 0.68, -0.70, 0.68, 0.70, -0.95, -0.64, 0.70, 0.64, 0.70, -0.60, 0.70, -0.60, -0.70, -0.91, -0.10, -0.51, 0.76, -0.91, -0.56, 0.70, 0.88, 0.88, -0.63, -0.60, 0.55, -0.60, -0.80, 0.80, -0.80, -0.52, 0.60, 0.52, 0.60, 0.52, -0.60, -0.48, 0.60, 0.48, 0.60, 0.48, 0.60, -0.76, 0.44, -0.60, 0.52, -0.50, -0.52, 0.50, 0.40, 0.60, -0.40, /* 2004-2131 */ -0.60, 0.40, -0.60, 0.72, -0.72, -0.51, -0.50, -0.48, 0.50, 0.48, -0.50, -0.48, 0.50, -0.48, 0.50, 0.48, -0.50, -0.48, -0.50, -0.68, -0.68, 0.44, 0.50, -0.64, -0.10, -0.64, -0.10, -0.40, 0.50, 0.40, 0.50, 0.40, 0.50, 0.00, 0.00, -0.40, -0.50, -0.36, -0.50, 0.36, -0.50, 0.60, -0.60, 0.40, -0.40, 0.40, 0.40, -0.40, 0.40, -0.40, 0.40, -0.56, -0.56, 0.36, -0.40, -0.36, 0.40, 0.36, -0.40, -0.36, -0.40, 0.36, 0.40, 0.36, 0.40, -0.52, 0.52, 0.52, 0.32, 0.40, -0.32, 0.40, -0.32, 0.40, -0.32, 0.40, 0.32, -0.40, -0.32, -0.40, 0.32, -0.40, 0.28, -0.40, -0.28, 0.40, 0.28, -0.40, 0.28, 0.40, 0.48, -0.48, 0.48, 0.36, -0.30, -0.36, -0.30, 0.00, 0.00, 0.20, 0.40, -0.44, 0.44, -0.44, -0.44, -0.44, -0.44, 0.32, -0.30, 0.32, 0.30, 0.24, 0.30, -0.12, -0.10, -0.28, 0.30, 0.28, 0.30, 0.28, 0.30, 0.28, -0.30, 0.28, -0.30, 0.28, -0.30, 0.28, /* 2132-2259 */ 0.30, -0.28, 0.30, 0.40, 0.40, -0.24, 0.30, 0.24, -0.30, 0.24, -0.30, -0.24, -0.30, 0.24, 0.30, 0.24, -0.30, -0.24, 0.30, 0.24, -0.30, -0.24, -0.30, 0.24, -0.30, 0.24, 0.30, -0.24, 0.30, -0.24, 0.30, 0.20, -0.30, 0.20, -0.30, 0.20, -0.30, 0.20, 0.30, 0.20, -0.30, 0.20, -0.30, 0.20, 0.30, 0.20, 0.30, -0.20, -0.30, 0.20, -0.30, 0.20, -0.30, -0.36, -0.36, -0.36, -0.04, 0.30, 0.12, -0.10, -0.32, -0.24, 0.20, 0.24, 0.20, 0.20, -0.20, -0.20, -0.20, -0.20, -0.20, 0.20, 0.20, 0.20, -0.20, 0.20, 0.20, 0.20, 0.20, -0.20, -0.20, 0.00, 0.00, -0.20, -0.20, -0.20, 0.20, -0.20, 0.20, 0.20, -0.20, -0.20, -0.20, 0.20, 0.20, 0.20, 0.20, 0.20, -0.20, 0.20, -0.20, 0.28, 0.28, 0.28, 0.28, 0.28, 0.28, -0.28, 0.28, 0.12, 0.00, 0.24, 0.16, -0.20, 0.16, -0.20, 0.16, -0.20, 0.16, 0.20, -0.16, 0.20, 0.16, 0.20, -0.16, 0.20, -0.16, 0.20, /* 2260-2387 */ -0.16, 0.20, 0.16, -0.20, 0.16, 0.20, 0.16, -0.20, -0.16, 0.20, -0.16, -0.20, -0.16, 0.20, 0.16, 0.20, 0.16, -0.20, 0.16, -0.20, 0.16, 0.20, 0.16, 0.20, 0.16, 0.20, -0.16, -0.20, 0.16, 0.20, -0.16, 0.20, 0.16, 0.20, -0.16, -0.20, 0.16, -0.20, 0.16, -0.20, -0.16, -0.20, 0.24, -0.24, -0.24, 0.24, 0.24, 0.12, 0.20, 0.12, 0.20, -0.12, -0.20, 0.12, -0.20, 0.12, -0.20, -0.12, 0.20, -0.12, 0.20, -0.12, -0.20, 0.12, 0.20, 0.12, 0.20, 0.12, -0.20, -0.12, 0.20, 0.12, -0.20, -0.12, 0.20, 0.12, 0.20, 0.00, 0.00, -0.12, 0.20, -0.12, 0.20, 0.12, -0.20, -0.12, 0.20, 0.12, 0.20, 0.00, -0.21, -0.20, 0.00, 0.00, 0.20, -0.20, -0.20, -0.20, 0.20, -0.16, -0.10, 0.00, 0.17, 0.16, 0.16, 0.16, 0.16, -0.16, 0.16, 0.16, -0.16, 0.16, -0.16, 0.16, 0.12, 0.10, 0.12, -0.10, -0.12, 0.10, -0.12, 0.10, 0.12, -0.10, -0.12, 0.12, -0.12, 0.12, /* 2388-2515 */ -0.12, 0.12, -0.12, -0.12, -0.12, -0.12, -0.12, -0.12, -0.12, 0.12, 0.12, 0.12, 0.12, -0.12, -0.12, 0.12, 0.12, 0.12, -0.12, 0.12, -0.12, -0.12, -0.12, 0.12, -0.12, -0.12, 0.12, 0.00, 0.11, 0.11,-122.67, 164.70, 203.78, 273.50, 3.58, 2.74, 6.18, -4.56, 0.00, -0.04, 0.00, -0.07, 57.44, -77.10, 95.82, 128.60, -1.77, -1.28, 2.85, -2.14, 82.14, 89.50, 0.00, 0.00, 2.00, -1.84, -0.04, 47.73, -64.10, 23.79, 31.90, -1.45, -1.07, 0.69, -0.53, -46.38, 50.50, 0.00, 0.00, 1.13, 1.04, 0.02, -18.38, 0.00, 63.80, 0.00, 0.00, 0.41, 0.00, -1.43, 59.07, 0.00, 0.00, 0.00, 0.00, -1.32, 57.28, 0.00, 0.00, 0.00, 0.00, -1.28, -48.65, 0.00, -1.15, 0.00, 0.00, 1.09, 0.00, 0.03, -18.30, 24.60, -17.30, -23.20, 0.56, 0.41, -0.51, 0.39, -16.91, 26.90, 8.43, 13.30, 0.60, 0.38, 0.31, -0.19, 1.23, -1.70, -19.13, -25.70, -0.03, -0.03, -0.58, 0.43, -0.72, 0.90, -17.34, -23.30, /* 2516-2643 */ 0.03, 0.02, -0.52, 0.39, -19.49, -21.30, 0.00, 0.00, -0.48, 0.44, 0.01, 20.57, -20.10, 0.64, 0.70, -0.45, -0.46, 0.00, -0.01, 4.89, 5.90, -16.55, 19.90, 0.14, -0.11, 0.44, 0.37, 18.22, 19.80, 0.00, 0.00, 0.44, -0.41, -0.01, 4.89, -5.30, -16.51, -18.00, -0.11, -0.11, -0.41, 0.37, -17.86, 0.00, 17.10, 0.00, 0.00, 0.40, 0.00, -0.38, 0.32, 0.00, 24.42, 0.00, 0.00, -0.01, 0.00, -0.55, -23.79, 0.00, 0.00, 0.00, 0.00, 0.53, 14.72, -16.00, -0.32, 0.00, -0.36, -0.33, -0.01, 0.01, 3.34, -4.50, 11.86, 15.90, -0.11, -0.07, 0.35, -0.27, -3.26, 4.40, 11.62, 15.60, 0.09, 0.07, 0.35, -0.26, -19.53, 0.00, 5.09, 0.00, 0.00, 0.44, 0.00, -0.11, -13.48, 14.70, 0.00, 0.00, 0.33, 0.30, 0.01, 10.86, -14.60, 3.18, 4.30, -0.33, -0.24, 0.09, -0.07, -11.30, -15.10, 0.00, 0.00, -0.34, 0.25, 0.01, 2.03, -2.70, 10.82, 14.50, -0.07, -0.05, 0.32, -0.24, 17.46, 0.00, /* 2644-2771 */ 0.00, 0.00, 0.00, -0.39, 16.43, 0.00, 0.52, 0.00, 0.00, -0.37, 0.00, -0.01, 9.35, 0.00, 13.29, 0.00, 0.00, -0.21, 0.00, -0.30, -10.42, 11.40, 0.00, 0.00, 0.25, 0.23, 0.01, 0.44, 0.50, -10.38, 11.30, 0.02, -0.01, 0.25, 0.23, -14.64, 0.00, 0.00, 0.00, 0.00, 0.33, 0.56, 0.80, -8.67, 11.70, 0.02, -0.01, 0.26, 0.19, 13.88, 0.00, -2.47, 0.00, 0.00, -0.31, 0.00, 0.06, -1.99, 2.70, 7.72, 10.30, 0.06, 0.04, 0.23, -0.17, -0.20, 0.00, 13.05, 0.00, 0.00, 0.00, 0.00, -0.29, 6.92, -9.30, 3.34, 4.50, -0.21, -0.15, 0.10, -0.07, -6.60, 0.00, 10.70, 0.00, 0.00, 0.15, 0.00, -0.24, -8.04, -8.70, 0.00, 0.00, -0.19, 0.18, -10.58, 0.00, -3.10, 0.00, 0.00, 0.24, 0.00, 0.07, -7.32, 8.00, -0.12, -0.10, 0.18, 0.16, 1.63, 1.70, 6.96, -7.60, 0.03, -0.04, -0.17, -0.16, -3.62, 0.00, 9.86, 0.00, 0.00, 0.08, 0.00, -0.22, 0.20, -0.20, -6.88, /* 2772-2899 */ -7.50, 0.00, 0.00, -0.17, 0.15, -8.99, 0.00, 4.02, 0.00, 0.00, 0.20, 0.00, -0.09, -1.07, 1.40, -5.69, -7.70, 0.03, 0.02, -0.17, 0.13, 6.48, -7.20, -0.48, -0.50, -0.16, -0.14, -0.01, 0.01, 5.57, -7.50, 1.07, 1.40, -0.17, -0.12, 0.03, -0.02, 8.71, 0.00, 3.54, 0.00, 0.00, -0.19, 0.00, -0.08, 0.40, 0.00, 9.27, 0.00, 0.00, -0.01, 0.00, -0.21, -6.13, 6.70, -1.19, -1.30, 0.15, 0.14, -0.03, 0.03, 5.21, -5.70, -2.51, -2.60, -0.13, -0.12, -0.06, 0.06, 5.69, -6.20, -0.12, -0.10, -0.14, -0.13, -0.01, 2.03, -2.70, 4.53, 6.10, -0.06, -0.05, 0.14, -0.10, 5.01, 5.50, -2.51, 2.70, 0.12, -0.11, 0.06, 0.06, -1.91, 2.60, -4.38, -5.90, 0.06, 0.04, -0.13, 0.10, 4.65, -6.30, 0.00, 0.00, -0.14, -0.10, -5.29, 5.70, 0.00, 0.00, 0.13, 0.12, -2.23, -4.00, -4.65, 4.20, -0.09, 0.05, 0.10, 0.10, -4.53, 6.10, 0.00, 0.00, 0.14, 0.10, 2.47, 2.70, /* 2900-3027 */ -4.46, 4.90, 0.06, -0.06, 0.11, 0.10, -5.05, 5.50, 0.84, 0.90, 0.12, 0.11, 0.02, -0.02, 4.97, -5.40, -1.71, 0.00, -0.12, -0.11, 0.00, 0.04, -0.99, -1.30, 4.22, -5.70, -0.03, 0.02, -0.13, -0.09, 0.99, 1.40, 4.22, -5.60, 0.03, -0.02, -0.13, -0.09, -4.69, -5.20, 0.00, 0.00, -0.12, 0.10, -3.42, 0.00, 6.09, 0.00, 0.00, 0.08, 0.00, -0.14, -4.65, -5.10, 0.00, 0.00, -0.11, 0.10, 0.00, 0.00, -4.53, -5.00, 0.00, 0.00, -0.11, 0.10, -2.43, -2.70, -3.82, 4.20, -0.06, 0.05, 0.10, 0.09, 0.00, 0.00, -4.53, 4.90, 0.00, 0.00, 0.11, 0.10, -4.49, -4.90, 0.00, 0.00, -0.11, 0.10, 2.67, -2.90, -3.62, -3.90, -0.06, -0.06, -0.09, 0.08, 3.94, -5.30, 0.00, 0.00, -0.12, -3.38, 3.70, -2.78, -3.10, 0.08, 0.08, -0.07, 0.06, 3.18, -3.50, -2.82, -3.10, -0.08, -0.07, -0.07, 0.06, -5.77, 0.00, 1.87, 0.00, 0.00, 0.13, 0.00, -0.04, 3.54, -4.80, -0.64, /* 3028-3155 */ -0.90, -0.11, 0.00, -0.02, -3.50, -4.70, 0.68, -0.90, -0.11, 0.00, -0.02, 5.49, 0.00, 0.00, 0.00, 0.00, -0.12, 1.83, -2.50, 2.63, 3.50, -0.06, 0.00, 0.08, 3.02, -4.10, 0.68, 0.90, -0.09, 0.00, 0.02, 0.00, 0.00, 5.21, 0.00, 0.00, 0.00, 0.00, -0.12, -3.54, 3.80, 2.70, 3.60, -1.35, 1.80, 0.08, 0.00, 0.04, -2.90, 3.90, 0.68, 0.90, 0.09, 0.00, 0.02, 0.80, -1.10, -2.78, -3.70, -0.02, 0.00, -0.08, 4.10, 0.00, -2.39, 0.00, 0.00, -0.09, 0.00, 0.05, -1.59, 2.10, 2.27, 3.00, 0.05, 0.00, 0.07, -2.63, 3.50, -0.48, -0.60, -2.94, -3.20, -2.94, 3.20, 2.27, -3.00, -1.11, -1.50, -0.07, 0.00, -0.03, -0.56, -0.80, -2.35, 3.10, 0.00, -0.60, -3.42, 1.90, -0.12, -0.10, 2.63, -2.90, 2.51, 2.80, -0.64, 0.70, -0.48, -0.60, 2.19, -2.90, 0.24, -0.30, 2.15, 2.90, 2.15, -2.90, 0.52, 0.70, 2.07, -2.80, -3.10, 0.00, 1.79, 0.00, 0.00, 0.07, /* 3156-3283 */ 0.00, -0.04, 0.88, 0.00, -3.46, 2.11, 2.80, -0.36, 0.50, 3.54, -0.20, -3.50, -1.39, 1.50, -1.91, -2.10, -1.47, 2.00, 1.39, 1.90, 2.07, -2.30, 0.91, 1.00, 1.99, -2.70, 3.30, 0.00, 0.60, -0.44, -0.70, -1.95, 2.60, 2.15, -2.40, -0.60, -0.70, 3.30, 0.84, 0.00, -3.10, -3.10, 0.00, -0.72, -0.32, 0.40, -1.87, -2.50, 1.87, -2.50, 0.32, 0.40, -0.24, 0.30, -1.87, -2.50, -0.24, -0.30, 1.87, -2.50, -2.70, 0.00, 1.55, 2.03, 2.20, -2.98, -1.99, -2.20, 0.12, -0.10, -0.40, 0.50, 1.59, 2.10, 0.00, 0.00, -1.79, 2.00, -1.03, 1.40, -1.15, -1.60, 0.32, 0.50, 1.39, -1.90, 2.35, -1.27, 1.70, 0.60, 0.80, -0.32, -0.40, 1.35, -1.80, 0.44, 0.00, 2.23, -0.84, 0.90, -1.27, -1.40, -1.47, 1.60, -0.28, -0.30, -0.28, 0.40, -1.27, -1.70, 0.28, -0.40, -1.43, -1.50, 0.00, 0.00, -1.27, -1.70, 2.11, -0.32, -0.40, -1.23, 1.60, 1.19, -1.30, -0.72, -0.80, 0.72, /* 3284-3411 */ -0.80, -1.15, -1.30, -1.35, -1.50, -1.19, -1.60, -0.12, 0.20, 1.79, 0.00, -0.88, -0.28, 0.40, 1.11, 1.50, -1.83, 0.00, 0.56, -0.12, 0.10, -1.27, -1.40, 0.00, 0.00, 1.15, 1.50, -0.12, 0.20, 1.11, 1.50, 0.36, -0.50, -1.07, -1.40, -1.11, 1.50, 1.67, 0.00, 0.80, -1.11, 0.00, 1.43, 1.23, -1.30, -0.24, -1.19, -1.30, -0.24, 0.20, -0.44, -0.90, -0.95, 1.10, 1.07, -1.40, 1.15, -1.30, 1.03, -1.10, -0.56, -0.60, -0.68, 0.90, -0.76, -1.00, -0.24, -0.30, 0.95, -1.30, 0.56, 0.70, 0.84, -1.10, -0.56, 0.00, -1.55, 0.91, -1.30, 0.28, 0.30, 0.16, -0.20, 0.95, 1.30, 0.40, -0.50, -0.88, -1.20, 0.95, -1.10, -0.48, -0.50, 0.00, 0.00, -1.07, 1.20, 0.44, -0.50, 0.95, 1.10, 0.00, 0.00, 0.92, -1.30, 0.95, 1.00, -0.52, 0.60, 1.59, 0.24, -0.40, 0.91, 1.20, 0.84, -1.10, -0.44, -0.60, 0.84, 1.10, -0.44, 0.60, -0.44, 0.60, -0.84, -1.10, -0.80, 0.00, /* 3412-3539 */ 1.35, 0.76, 0.20, -0.91, -1.00, 0.20, -0.30, -0.91, -1.20, -0.95, 1.00, -0.48, -0.50, 0.88, 1.00, 0.48, -0.50, -0.95, -1.10, 0.20, -0.20, -0.99, 1.10, -0.84, 1.10, -0.24, -0.30, 0.20, -0.30, 0.84, 1.10, -1.39, 0.00, -0.28, -0.16, 0.20, 0.84, 1.10, 0.00, 0.00, 1.39, 0.00, 0.00, -0.95, 1.00, 1.35, -0.99, 0.00, 0.88, -0.52, 0.00, -1.19, 0.20, 0.20, 0.76, -1.00, 0.00, 0.00, 0.76, 1.00, 0.00, 0.00, 0.76, 1.00, -0.76, 1.00, 0.00, 0.00, 1.23, 0.76, 0.80, -0.32, 0.40, -0.72, 0.80, -0.40, -0.40, 0.00, 0.00, -0.80, -0.90, -0.68, 0.90, -0.16, -0.20, -0.16, -0.20, 0.68, -0.90, -0.36, 0.50, -0.56, -0.80, 0.72, -0.90, 0.44, -0.60, -0.48, -0.70, -0.16, 0.00, -1.11, 0.32, 0.00, -1.07, 0.60, -0.80, -0.28, -0.40, -0.64, 0.00, 0.91, 1.11, 0.64, -0.90, 0.76, -0.80, 0.00, 0.00, -0.76, -0.80, 1.03, 0.00, -0.36, -0.64, -0.70, 0.36, -0.40, /* 3540-3667 */ 1.07, 0.36, -0.50, -0.52, -0.70, 0.60, 0.00, 0.88, 0.95, 0.00, 0.48, 0.16, -0.20, 0.60, 0.80, 0.16, -0.20, -0.60, -0.80, 0.00, -1.00, 0.12, 0.20, 0.16, -0.20, 0.68, 0.70, 0.59, -0.80, -0.99, -0.56, -0.60, 0.36, -0.40, -0.68, -0.70, -0.68, -0.70, -0.36, -0.50, -0.44, 0.60, 0.64, 0.70, -0.12, 0.10, -0.52, 0.60, 0.36, 0.40, 0.00, 0.00, 0.95, -0.84, 0.00, 0.44, 0.56, 0.60, 0.32, -0.30, 0.00, 0.00, 0.60, 0.70, 0.00, 0.00, 0.60, 0.70, -0.12, -0.20, 0.52, -0.70, 0.00, 0.00, 0.56, 0.70, -0.12, 0.10, -0.52, -0.70, 0.00, 0.00, 0.88, -0.76, 0.00, -0.44, 0.00, 0.00, -0.52, -0.70, 0.52, -0.70, 0.36, -0.40, -0.44, -0.50, 0.00, 0.00, 0.60, 0.60, 0.84, 0.00, 0.12, -0.24, 0.00, 0.80, -0.56, 0.60, -0.32, -0.30, 0.48, -0.50, 0.28, -0.30, -0.48, -0.50, 0.12, 0.20, 0.48, -0.60, 0.48, 0.60, -0.12, 0.20, 0.24, 0.00, 0.76, -0.52, /* 3668-3795 */ -0.60, -0.52, 0.60, 0.48, -0.50, -0.24, -0.30, 0.12, -0.10, 0.48, 0.60, 0.52, -0.20, 0.36, 0.40, -0.44, 0.50, -0.24, -0.30, -0.48, -0.60, -0.44, -0.60, -0.12, 0.10, 0.76, 0.76, 0.20, -0.20, 0.48, 0.50, 0.40, -0.50, -0.24, -0.30, 0.44, -0.60, 0.44, -0.60, 0.36, 0.00, -0.64, 0.72, 0.00, -0.12, 0.00, -0.10, -0.40, -0.60, -0.20, -0.20, -0.44, 0.50, -0.44, 0.50, 0.20, 0.20, -0.44, -0.50, 0.20, -0.20, -0.20, 0.20, -0.44, -0.50, 0.64, 0.00, 0.32, -0.36, 0.50, -0.20, -0.30, 0.12, -0.10, 0.48, 0.50, -0.12, 0.30, -0.36, -0.50, 0.00, 0.00, 0.48, 0.50, -0.48, 0.50, 0.68, 0.00, -0.12, 0.56, -0.40, 0.44, -0.50, -0.12, -0.10, 0.24, 0.30, -0.40, 0.40, 0.64, 0.00, -0.24, 0.64, 0.00, -0.20, 0.00, 0.00, 0.44, -0.50, 0.44, 0.50, -0.12, 0.20, -0.36, -0.50, 0.12, 0.00, 0.64, -0.40, 0.50, 0.00, 0.10, 0.00, 0.00, -0.40, 0.50, 0.00, 0.00, /* 3796-3923 */ -0.40, -0.50, 0.56, 0.00, 0.28, 0.00, 0.10, 0.36, 0.50, 0.00, -0.10, 0.36, -0.50, 0.36, 0.50, 0.00, -0.10, 0.24, -0.20, -0.36, -0.40, 0.16, 0.20, 0.40, -0.40, 0.00, 0.00, -0.36, -0.50, -0.36, -0.50, -0.32, -0.50, -0.12, 0.10, 0.20, 0.20, -0.36, 0.40, -0.60, 0.60, 0.28, 0.00, 0.52, 0.12, -0.10, 0.40, 0.40, 0.00, -0.50, 0.20, -0.20, -0.32, 0.40, 0.16, 0.20, -0.16, 0.20, 0.32, 0.40, 0.56, 0.00, -0.12, 0.32, -0.40, -0.16, -0.20, 0.00, 0.00, 0.40, 0.40, -0.40, -0.40, -0.40, 0.40, -0.36, 0.40, 0.12, 0.10, 0.00, 0.10, 0.36, 0.40, 0.00, -0.10, 0.36, 0.40, -0.36, 0.40, 0.00, 0.10, 0.32, 0.00, 0.44, 0.12, 0.20, 0.28, -0.40, 0.00, 0.00, 0.36, 0.40, 0.32, -0.40, -0.16, 0.12, 0.10, 0.32, -0.40, 0.20, 0.30, -0.24, 0.30, 0.00, 0.10, 0.32, 0.40, 0.00, -0.10, -0.32, -0.40, -0.32, 0.40, 0.00, 0.10, -0.52, -0.52, 0.52, /* 3924-4051 */ 0.32, -0.40, 0.00, 0.00, 0.32, 0.40, 0.32, -0.40, 0.00, 0.00, -0.32, -0.40, -0.32, 0.40, 0.32, 0.40, 0.00, 0.00, 0.32, 0.40, 0.00, 0.00, -0.32, -0.40, 0.00, 0.00, 0.32, 0.40, 0.16, 0.20, 0.32, -0.30, -0.16, 0.00, -0.48, -0.20, 0.20, -0.28, -0.30, 0.28, -0.40, 0.00, 0.00, 0.28, -0.40, 0.00, 0.00, 0.28, -0.40, 0.00, 0.00, -0.28, -0.40, 0.28, 0.40, -0.28, -0.40, -0.48, -0.20, 0.20, 0.24, 0.30, 0.44, 0.00, 0.16, 0.24, 0.30, 0.16, -0.20, 0.24, 0.30, -0.12, 0.20, 0.20, 0.30, -0.16, 0.20, 0.00, 0.00, 0.44, -0.32, 0.30, 0.24, 0.00, -0.36, 0.36, 0.00, 0.24, 0.12, -0.20, 0.20, 0.30, -0.12, 0.00, -0.28, 0.30, -0.24, 0.30, 0.12, 0.10, -0.28, -0.30, -0.28, 0.30, 0.00, 0.00, -0.28, -0.30, 0.00, 0.00, -0.28, -0.30, 0.00, 0.00, 0.28, 0.30, 0.00, 0.00, -0.28, -0.30, -0.28, 0.30, 0.00, 0.00, -0.28, -0.30, 0.00, 0.00, /* 4052-4179 */ 0.28, 0.30, 0.00, 0.00, -0.28, 0.30, 0.28, -0.30, -0.28, 0.30, 0.40, 0.40, -0.24, 0.30, 0.00, -0.10, 0.16, 0.00, 0.36, -0.20, 0.30, -0.12, -0.10, -0.24, -0.30, 0.00, 0.00, -0.24, 0.30, -0.24, 0.30, 0.00, 0.00, -0.24, 0.30, -0.24, 0.30, 0.24, -0.30, 0.00, 0.00, 0.24, -0.30, 0.00, 0.00, 0.24, 0.30, 0.24, -0.30, 0.24, 0.30, -0.24, 0.30, -0.24, 0.30, -0.20, 0.20, -0.16, -0.20, 0.00, 0.00, -0.32, 0.20, 0.00, 0.10, 0.20, -0.30, 0.20, -0.20, 0.12, 0.20, -0.16, 0.20, 0.16, 0.20, 0.20, 0.30, 0.20, 0.30, 0.00, 0.00, -0.20, 0.30, 0.00, 0.00, 0.20, 0.30, -0.20, -0.30, -0.20, -0.30, 0.20, -0.30, 0.00, 0.00, 0.20, 0.30, 0.00, 0.00, 0.20, 0.30, 0.00, 0.00, 0.20, 0.30, 0.00, 0.00, 0.20, 0.30, 0.00, 0.00, 0.20, -0.30, 0.00, 0.00, -0.20, -0.30, 0.00, 0.00, -0.20, 0.30, 0.00, 0.00, -0.20, 0.30, 0.00, 0.00, 0.36, /* 4180-4307 */ 0.00, 0.00, 0.36, 0.12, 0.10, -0.24, 0.20, 0.12, -0.20, -0.16, -0.20, -0.13, 0.10, 0.22, 0.21, 0.20, 0.00, -0.28, 0.32, 0.00, -0.12, -0.20, -0.20, 0.12, -0.10, 0.12, 0.10, -0.20, 0.20, 0.00, 0.00, -0.32, 0.32, 0.00, 0.00, 0.32, 0.32, 0.00, 0.00, -0.24, -0.20, 0.24, 0.20, 0.20, 0.00, -0.24, 0.00, 0.00, -0.24, -0.20, 0.00, 0.00, 0.24, 0.20, -0.24, -0.20, 0.00, 0.00, -0.24, 0.20, 0.16, -0.20, 0.12, 0.10, 0.20, 0.20, 0.00, -0.10, -0.12, 0.10, -0.16, -0.20, -0.12, -0.10, -0.16, 0.20, 0.20, 0.20, 0.00, 0.00, -0.20, 0.20, -0.20, 0.20, -0.20, 0.20, -0.20, 0.20, 0.20, -0.20, -0.20, -0.20, 0.00, 0.00, -0.20, 0.20, 0.20, 0.00, -0.20, 0.00, 0.00, -0.20, 0.20, -0.20, 0.20, -0.20, -0.20, -0.20, -0.20, 0.00, 0.00, 0.20, 0.20, 0.20, 0.20, 0.12, -0.20, -0.12, -0.10, 0.28, -0.28, 0.16, -0.20, 0.00, -0.10, 0.00, 0.10, -0.16, /* 4308-4435 */ 0.20, 0.00, -0.10, -0.16, -0.20, 0.00, -0.10, 0.16, -0.20, 0.16, -0.20, 0.00, 0.00, 0.16, 0.20, -0.16, 0.20, 0.00, 0.00, 0.16, 0.20, 0.16, -0.20, 0.16, -0.20, -0.16, 0.20, 0.16, -0.20, 0.00, 0.00, 0.16, 0.20, 0.00, 0.00, 0.16, 0.20, 0.00, 0.00, -0.16, -0.20, 0.16, -0.20, -0.16, -0.20, 0.00, 0.00, -0.16, -0.20, 0.00, 0.00, -0.16, 0.20, 0.00, 0.00, 0.16, -0.20, 0.16, 0.20, 0.16, 0.20, 0.00, 0.00, -0.16, -0.20, 0.00, 0.00, -0.16, -0.20, 0.00, 0.00, 0.16, 0.20, 0.16, 0.20, 0.00, 0.00, 0.16, 0.20, 0.16, -0.20, 0.16, 0.20, 0.00, 0.00, -0.16, 0.20, 0.00, 0.10, 0.12, -0.20, 0.12, -0.20, 0.00, -0.10, 0.00, -0.10, 0.12, 0.20, 0.00, -0.10, -0.12, 0.20, -0.15, 0.20, -0.24, 0.24, 0.00, 0.00, 0.24, 0.24, 0.12, -0.20, -0.12, -0.20, 0.00, 0.00, 0.12, 0.20, 0.12, -0.20, 0.12, 0.20, 0.12, 0.20, 0.12, 0.20, 0.12, /* 4436-4563 */ -0.20, -0.12, 0.20, 0.00, 0.00, 0.12, 0.20, 0.12, 0.00, -0.20, 0.00, 0.00, -0.12, -0.20, 0.12, -0.20, 0.00, 0.00, 0.12, 0.20, -0.12, 0.20, -0.12, 0.20, 0.12, -0.20, 0.00, 0.00, 0.12, 0.20, 0.20, 0.00, 0.12, 0.00, 0.00, -0.12, 0.20, 0.00, 0.00, -0.12, -0.20, 0.00, 0.00, -0.12, -0.20, -0.12, -0.20, 0.00, 0.00, 0.12, -0.20, 0.12, -0.20, 0.12, 0.20, -0.12, -0.20, 0.00, 0.00, 0.12, -0.20, 0.12, -0.20, 0.12, 0.20, 0.12, 0.00, 0.20, -0.12, -0.20, 0.00, 0.00, 0.12, 0.20, -0.16, 0.00, 0.16, -0.20, 0.20, 0.00, 0.00, -0.20, 0.00, 0.00, -0.20, 0.20, 0.00, 0.00, 0.20, 0.20, -0.20, 0.00, 0.00, -0.20, 0.12, 0.00, -0.16, 0.20, 0.00, 0.00, 0.20, 0.12, -0.10, 0.00, 0.10, 0.16, -0.16, -0.16, -0.16, -0.16, -0.16, 0.00, 0.00, -0.16, 0.00, 0.00, -0.16, -0.16, -0.16, 0.00, 0.00, -0.16, 0.00, 0.00, 0.16, 0.00, 0.00, 0.16, /* 4564-4691 */ 0.00, 0.00, 0.16, 0.16, 0.00, 0.00, -0.16, 0.00, 0.00, -0.16, -0.16, 0.00, 0.00, 0.16, 0.00, 0.00, -0.16, -0.16, 0.00, 0.00, -0.16, -0.16, 0.12, 0.10, 0.12, -0.10, 0.12, 0.10, 0.00, 0.00, 0.12, 0.10, -0.12, 0.10, 0.00, 0.00, 0.12, 0.10, 0.12, -0.10, 0.00, 0.00, -0.12, -0.10, 0.00, 0.00, 0.12, 0.10, 0.12, 0.00, 0.00, 0.12, 0.00, 0.00, -0.12, 0.00, 0.00, 0.12, 0.12, 0.12, 0.12, 0.12, 0.00, 0.00, 0.12, 0.00, 0.00, 0.12, 0.12, 0.00, 0.00, 0.12, 0.00, 0.00, 0.12, -0.12, -0.12, 0.12, 0.12, -0.12, -0.12, 0.00, 0.00, 0.12, -0.12, 0.12, 0.12, -0.12, -0.12, 0.00, 0.00, -0.12, -0.12, 0.00, 0.00, -0.12, 0.12, 0.00, 0.00, 0.12, 0.00, 0.00, 0.12, 0.00, 0.00, 0.12, -0.12, 0.00, 0.00, -0.12, 0.12, -0.12, -0.12, 0.12, 0.00, 0.00, 0.12, 0.12, 0.12, -0.12, 0.00, 0.00, -0.12, -0.12, -0.12, 0.00, 0.00, -0.12, /* 4692-NA */ -0.12, 0.00, 0.00, 0.12, 0.12, 0.00, 0.00, -0.12, -0.12, -0.12, -0.12, 0.12, 0.00, 0.00, 0.12, -0.12, 0.00, 0.00, -0.12, -0.12, 0.00, 0.00, 0.12, -0.12, -0.12, -0.12, -0.12, 0.12, 0.12, -0.12, -0.12, 0.00, 0.00, -0.12, 0.00, 0.00, -0.12, 0.12, 0.00, 0.00, 0.12, 0.00, 0.00, -0.12, -0.12, 0.00, 0.00, -0.12, -0.12, 0.12, 0.00, 0.00, 0.12, 0.12, 0.00, 0.00, 0.12, 0.00, 0.00, 0.12, 0.12, 0.08, 0.00, 0.04 }; /* Number of amplitude coefficients */ final int NA = a.length; /* Amplitude usage: X or Y, sin or cos, power of T. */ final int jaxy[] = {0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1}; final int jasc[] = {0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0}; final int japt[] = {0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4}; /* Miscellaneous */ double t, w, pt[] = new double[MAXPT+1], fa[] = new double[14], xypr[] = new double[2], xypl[] = new double[2], xyls[] = new double[2], arg, sc[] = new double[2]; int jpt, i, j, jxy, ialast, ifreq, m, ia, jsc; /*--------------------------------------------------------------------*/ /* Interval between fundamental date J2000.0 and given date (JC). */ t = ((date1 - DJ00) + date2) / DJC; /* Powers of T. */ w = 1.0; for (jpt = 0; jpt <= MAXPT; jpt++) { pt[jpt] = w; w *= t; } /* Initialize totals in X and Y: polynomial, luni-solar, planetary. */ for (jxy = 0; jxy < 2; jxy++) { xypr[jxy] = 0.0; xyls[jxy] = 0.0; xypl[jxy] = 0.0; } /* --------------------------------- */ /* Fundamental arguments (IERS 2003) */ /* --------------------------------- */ /* Mean anomaly of the Moon. */ fa[0] = jauFal03(t); /* Mean anomaly of the Sun. */ fa[1] = jauFalp03(t); /* Mean argument of the latitude of the Moon. */ fa[2] = jauFaf03(t); /* Mean elongation of the Moon from the Sun. */ fa[3] = jauFad03(t); /* Mean longitude of the ascending node of the Moon. */ fa[4] = jauFaom03(t); /* Planetary longitudes, Mercury through Neptune. */ fa[5] = jauFame03(t); fa[6] = jauFave03(t); fa[7] = jauFae03(t); fa[8] = jauFama03(t); fa[9] = jauFaju03(t); fa[10] = jauFasa03(t); fa[11] = jauFaur03(t); fa[12] = jauFane03(t); /* General accumulated precession in longitude. */ fa[13] = jauFapa03(t); /* -------------------------------------- */ /* Polynomial part of precession-nutation */ /* -------------------------------------- */ for (jxy = 0; jxy < 2; jxy++) { for (j = MAXPT; j >= 0; j--) { xypr[jxy] += xyp[jxy][j] * pt[j]; } } /* ---------------------------------- */ /* Nutation periodic terms, planetary */ /* ---------------------------------- */ /* Work backwards through the coefficients per frequency list. */ ialast = NA; for (ifreq = NFPL-1; ifreq >= 0; ifreq--) { /* Obtain the argument functions. */ arg = 0.0; for (i = 0; i < 14; i++) { m = mfapl[ifreq][i]; if (m != 0) arg += (double)m * fa[i]; } sc[0] = sin(arg); sc[1] = cos(arg); /* Work backwards through the amplitudes at this frequency. */ ia = nc[ifreq+NFLS]; for (i = ialast; i >= ia; i--) { /* Coefficient number (0 = 1st). */ j = i-ia; /* X or Y. */ jxy = jaxy[j]; /* Sin or cos. */ jsc = jasc[j]; /* Power of T. */ jpt = japt[j]; /* Accumulate the component. */ xypl[jxy] += a[i-1] * sc[jsc] * pt[jpt]; } ialast = ia-1; } /* ----------------------------------- */ /* Nutation periodic terms, luni-solar */ /* ----------------------------------- */ /* Continue working backwards through the number of coefficients list. */ for (ifreq = NFLS-1; ifreq >= 0; ifreq--) { /* Obtain the argument functions. */ arg = 0.0; for (i = 0; i < 5; i++) { m = mfals[ifreq][i]; if (m != 0) arg += (double)m * fa[i]; } sc[0] = sin(arg); sc[1] = cos(arg); /* Work backwards through the amplitudes at this frequency. */ ia = nc[ifreq]; for (i = ialast; i >= ia; i--) { /* Coefficient number (0 = 1st). */ j = i-ia; /* X or Y. */ jxy = jaxy[j]; /* Sin or cos. */ jsc = jasc[j]; /* Power of T. */ jpt = japt[j]; /* Accumulate the component. */ xyls[jxy] += a[i-1] * sc[jsc] * pt[jpt]; } ialast = ia-1; } /* ------------------------------------ */ /* Results: CIP unit vector components */ /* ------------------------------------ */ double x = DAS2R * (xypr[0] + (xyls[0] + xypl[0]) / 1e6); double y = DAS2R * (xypr[1] + (xyls[1] + xypl[1]) / 1e6); return new CelestialIntermediatePole(x, y); } /** * For a given TT date, compute the X,Y coordinates of the Celestial * Intermediate Pole and the CIO locator s, using the IAU 2000A * precession-nutation model. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return x double returned Celestial Intermediate Pole (Note 2) * y double returned Celestial Intermediate Pole (Note 2) * s double returned the CIO locator s (Note 2) * *

    Notes: *

      * *
    1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
          *            date1          date2
          *
          *         2450123.7           0.0       (JD method)
          *         2451545.0       -1421.3       (J2000 method)
          *         2400000.5       50123.2       (MJD method)
          *         2450123.5           0.2       (date & time method)
          *
      * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
    2. The Celestial Intermediate Pole coordinates are the x,y * components of the unit vector in the Geocentric Celestial * Reference System. * *
    3. The CIO locator s (in radians) positions the Celestial * Intermediate Origin on the equator of the CIP. * *
    4. A faster, but slightly less accurate, result (about 1 mas for * X,Y), can be obtained by using instead the jauXys00b function. *
    *

    Called:

      *
    • {@link #jauPnm00a} classical NPB matrix, IAU 2000A *
    • {@link #jauBpn2xy} extract CIP X,Y coordinates from NPB matrix *
    • {@link #jauS00} the CIO locator s, given X,Y, IAU 2000A *
    *

    Reference: * *

    McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2008 May 12 * * @since Release 20101201 * * */ public static ICRFrame jauXys00a(double date1, double date2) { /* Form the bias-precession-nutation matrix, IAU 2000A. */ double rbpn[][] = jauPnm00a(date1, date2); /* Extract X,Y. */ CelestialIntermediatePole cip = jauBpn2xy(rbpn); /* Obtain s. */ double s = jauS00(date1, date2, cip.x, cip.y); return new ICRFrame(cip, s); } /** * The Celestial Intermediate Pole coordinates are the x,y * components of the unit vector in the Geocentric Celestial * Reference System. * * The CIO locator s (in radians) positions the Celestial * Intermediate Origin on the equator of the CIP. * @author Paul Harrison (paul.harrison@manchester.ac.uk) 1 Feb 2010 * * @since AIDA Stage 1 */ public static class ICRFrame { public CelestialIntermediatePole cip; public double s; public ICRFrame(CelestialIntermediatePole cip, double s) { this.cip = cip; this.s = s; } } /** * For a given TT date, compute the X,Y coordinates of the Celestial * Intermediate Pole and the CIO locator s, using the IAU 2000B * precession-nutation model. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return x double returned Celestial Intermediate Pole (Note 2) * y double returned Celestial Intermediate Pole (Note 2) * s double returned the CIO locator s (Note 2) * *

    Notes: *

      * *
    1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
          *            date1          date2
          *
          *         2450123.7           0.0       (JD method)
          *         2451545.0       -1421.3       (J2000 method)
          *         2400000.5       50123.2       (MJD method)
          *         2450123.5           0.2       (date & time method)
          *
      * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
    2. The Celestial Intermediate Pole coordinates are the x,y * components of the unit vector in the Geocentric Celestial * Reference System. * *
    3. The CIO locator s (in radians) positions the Celestial * Intermediate Origin on the equator of the CIP. * *
    4. The present function is faster, but slightly less accurate (about * 1 mas in X,Y), than the jauXys00a function. *
    *

    Called:

      *
    • {@link #jauPnm00b} classical NPB matrix, IAU 2000B *
    • {@link #jauBpn2xy} extract CIP X,Y coordinates from NPB matrix *
    • {@link #jauS00} the CIO locator s, given X,Y, IAU 2000A *
    *

    Reference: * *

    McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *@version 2008 May 12 * * @since Release 20101201 * * */ public static ICRFrame jauXys00b(double date1, double date2) { double rbpn[][] = new double[3][3]; /* Form the bias-precession-nutation matrix, IAU 2000A. */ rbpn = jauPnm00b(date1, date2); /* Extract X,Y. */ CelestialIntermediatePole cip = jauBpn2xy(rbpn); /* Obtain s. */ double s = jauS00(date1, date2, cip.x, cip.y); return new ICRFrame(cip, s); } /** * For a given TT date, compute the X,Y coordinates of the Celestial * Intermediate Pole and the CIO locator s, using the IAU 2006 * precession and IAU 2000A nutation models. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param date1 double TT as a 2-part Julian Date (Note 1) * @param date2 double TT as a 2-part Julian Date (Note 1) * * * @return x double returned Celestial Intermediate Pole (Note 2) * y double returned Celestial Intermediate Pole (Note 2) * s double returned the CIO locator s (Note 2) * *

    Notes: *

      * *
    1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: *
          *            date1          date2
          *
          *         2450123.7           0.0       (JD method)
          *         2451545.0       -1421.3       (J2000 method)
          *         2400000.5       50123.2       (MJD method)
          *         2450123.5           0.2       (date & time method)
          *
      * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
    2. The Celestial Intermediate Pole coordinates are the x,y components * of the unit vector in the Geocentric Celestial Reference System. * *
    3. The CIO locator s (in radians) positions the Celestial * Intermediate Origin on the equator of the CIP. * *
    4. Series-based solutions for generating X and Y are also available: * see Capitaine & Wallace (2006) and jauXy06. *
    *

    Called:

      *
    • {@link #jauPnm06a} classical NPB matrix, IAU 2006/2000A *
    • {@link #jauBpn2xy} extract CIP X,Y coordinates from NPB matrix *
    • {@link #jauS06} the CIO locator s, given X,Y, IAU 2006 *
    *

    References: * *

    Capitaine, N. & Wallace, P.T., 2006, Astron.Astrophys. 450, 855 * *

    Wallace, P.T. & Capitaine, N., 2006, Astron.Astrophys. 459, 981 * *@version 2008 May 11 * * @since Release 20101201 * * */ public static ICRFrame jauXys06a(double date1, double date2) { double rbpn[][] = new double[3][3]; /* Form the bias-precession-nutation matrix, IAU 2000A. */ rbpn = jauPnm06a(date1, date2); /* Extract X,Y. */ CelestialIntermediatePole cip = jauBpn2xy(rbpn); /* Obtain s. */ double s = jauS06(date1, date2, cip.x, cip.y); return new ICRFrame(cip, s); } /** * Zero a p-vector. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param p double[3] returned p-vector * *@version 2008 May 11 * * @since Release 20101201 * * */ public static void jauZp(double p[] ) { p[0] = 0.0; p[1] = 0.0; p[2] = 0.0; return; } /** * Return Zero p-vector. This is a convenience method that is an * overload of the official SOFA API {@link #jauZp(double[])} that does not require * the vector to be passed in. * * @return double[3] a zero vector. * */ public static double[] jauZp() { double p[] = new double[3]; jauZp(p); return p; } /** * Zero a pv-vector. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param pv double[2][3] returned pv-vector * *

    Called:

      *
    • {@link #jauZp} zero p-vector *
    *@version 2008 May 11 * * @since Release 20101201 * * */ public static void jauZpv(double pv[][]) { jauZp(pv[0]); jauZp(pv[1]); return; } /** * A Zero pv-vector. * * This is a convenience method that is an * overload of the official SOFA API {@link #jauZpv(double[][])} that does not require * the vector to be passed in. * * @return pv double[2][3] pv-vector */ public static double[][] jauZpv() { double pv[][] = new double[2][3]; jauZpv(pv); return pv; } /** * Initialize an r-matrix to the null matrix. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: vector/matrix support function. * * * @param r double[3][3] returned r-matrix * *@version 2008 May 11 * * @since Release 20101201 * * */ public static void jauZr(double r[][]) { int i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { r[i][j] = 0.0; } } return; } /** * Initialize an r-matrix to the null matrix. * * This is a convenience method that is an * overload of the official SOFA API {@link #jauZr(double[][])} that does not require * the vector to be passed in. * @return null r matrix. */ public static double[][] jauZr() { double r[][] = new double[2][3]; jauZr(r); return r; } /** * returns the first argument modulo the second. * Utility function to retain C use of fmod. * @param d * @param d2 * @author Paul Harrison (paul.harrison@manchester.ac.uk) 27 Jan 2010 * @return */ private static double fmod(double d, double d2) { return d % d2; } //IMPL new 20131202 routines after here /** * Star-independent astrometry parameters. * * (Vectors eb, eh, em and v are all with respect to BCRS axes.) * * @author Paul Harrison (paul.harrison@manchester.ac.uk) 26 Mar 2014 * @since 20131202 */ public static class Astrom { /** PM time interval (SSB, Julian years) */ public double pmt; /** SSB to observer (vector, au) [3]*/ public double eb[] = new double[3]; /** Sun to observer (unit vector)[3] */ public double eh[] = new double[3]; /** distance from Sun to observer (au) */ public double em; /** barycentric observer velocity (vector, c)[3] */ public double v[] = new double[3]; /** sqrt(1-|v|^2): reciprocal of Lorenz factor */ public double bm1; /** bias-precession-nutation matrix [3][3] */ public double bpn[][] = new double[3][3]; /** adjusted longitude (radians) */ public double along; /** geodetic latitude (radians) */ public double phi; /** polar motion xp wrt local meridian (radians) */ public double xpl; /** polar motion yp wrt local meridian (radians) */ public double ypl; /** sine of geodetic latitude */ public double sphi; /** cosine of geodetic latitude */ public double cphi; /** magnitude of diurnal aberration vector */ public double diurab; /** "local" Earth rotation angle (radians) */ public double eral; /** refraction constant A (radians) */ public double refa; /** refraction constant B (radians) */ public double refb; /** * */ public Astrom(){} } ; /** * Body parameters for light deflection. * @author Paul Harrison (paul.harrison@manchester.ac.uk) 26 Mar 2014 * @since 20131202 */ public static class Ldbody { /** mass of the body (solar masses) */ public double bm; /** deflection limiter (radians^2/2) */ public double dl; /** barycentric PV of the body (au, au/day)[2][3] */ public double pv[][] = new double [2][3]; } ; /** * Apply aberration to transform natural direction into proper * direction. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param pnat double[3] natural direction to the source (unit vector) * @param v double[3] observer barycentric velocity in units of c * @param s double distance between the Sun and the observer (au) * @param bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor * * * @return ppr double[3] Returned proper direction to source (unit vector) * *

    Notes: *

      * *
    1. The algorithm is based on Expr. (7.40) in the Explanatory * Supplement (Urban & Seidelmann 2013), but with the following * changes: * *

      o Rigorous rather than approximate normalization is applied. * *

      o The gravitational potential term from Expr. (7) in * Klioner (2003) is added, taking into account only the Sun's * contribution. This has a maximum effect of about * 0.4 microarcsecond. * *

    2. In almost all cases, the maximum accuracy will be limited by the * supplied velocity. For example, if the SOFA iauEpv00 function is * used, errors of up to 5 microarcseconds could occur. * *
    *

    References: *

      * *
    • Urban, S. & Seidelmann, P. K. (eds), Explanatory Supplement to * the Astronomical Almanac, 3rd ed., University Science Books * (2013). * *
    • Klioner, Sergei A., "A practical relativistic model for micro- * arcsecond astrometry in space", Astr. J. 125, 1580-1597 (2003). * *
    * Called: *
      *
    • {@link #jauPdp} scalar product of two p-vectors * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * * */ public static double[] jauAb(double pnat[], double v[], double s, double bm1 ) { int i; double pdv, w1, w2, r2, w, p[] = new double[3], r; double ppr[] = new double[3]; pdv = jauPdp(pnat, v); w1 = 1.0 + pdv/(1.0 + bm1); w2 = SRS/s; r2 = 0.0; for (i = 0; i < 3; i++) { w = pnat[i]*bm1 + w1*v[i] + w2*(v[i] - pdv*pnat[i]); p[i] = w; r2 = r2 + w*w; } r = sqrt(r2); for (i = 0; i < 3; i++) { ppr[i] = p[i]/r; } return ppr; /* Finished. */ } /** * For a geocentric observer, prepare star-independent astrometry * parameters for transformations between ICRS and GCRS coordinates. * The Earth ephemeris is supplied by the caller. * * The parameters produced by this function are required in the * parallax, light deflection and aberration parts of the astrometric * transformation chain. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param date1 double TDB as a 2-part... * @param date2 double ...Julian Date (Note 1) * @param ebpv double[2][3] Earth barycentric pos/vel (au, au/day) * @param ehp double[3] Earth heliocentric position (au) * * * @param astrom jauASTROM Returned star-independent astrometry parameters: * *

    Notes: *

      * *
    1. The TDB date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TDB)=2450123.7 could be expressed in any of these ways, among * others: *
           *           date1          date2
           *
           *         2450123.7           0.0       (JD method)
           *         2451545.0       -1421.3       (J2000 method)
           *         2400000.5       50123.2       (MJD method)
           *         2450123.5           0.2       (date & time method)
           *     
      *

      The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 method is best matched to the way the * argument is handled internally and will deliver the optimum * resolution. The MJD method and the date & time methods are both * good compromises between resolution and convenience. For most * applications of this function the choice will not be at all * critical. * *

      TT can be used instead of TDB without any significant impact on * accuracy. * *

    2. All the vectors are with respect to BCRS axes. * *
    3. This is one of several functions that inserts into the astrom * structure star-independent parameters needed for the chain of * astrometric transformations {@code ICRS <-> GCRS <-> CIRS <-> observed}. * *

      The various functions support different classes of observer and * portions of the transformation chain: *

      {@code
           *          functions         observer        transformation
           *
           *       iauApcg iauApcg13    geocentric      ICRS <-> GCRS
           *       iauApci iauApci13    terrestrial     ICRS <-> CIRS
           *       iauApco iauApco13    terrestrial     ICRS <-> observed
           *       iauApcs iauApcs13    space           ICRS <-> GCRS
           *       iauAper iauAper13    terrestrial     update Earth rotation
           *       iauApio iauApio13    terrestrial     CIRS <-> observed
           *     }
      * *

      Those with names ending in "13" use contemporary SOFA models to * compute the various ephemerides. The others accept ephemerides * supplied by the caller. * *

      The transformation from ICRS to GCRS covers space motion, * parallax, light deflection, and aberration. From GCRS to CIRS * comprises frame bias and precession-nutation. From CIRS to * observed takes account of Earth rotation, polar motion, diurnal * aberration and parallax (unless subsumed into the {@code ICRS <-> GCRS} * transformation), and atmospheric refraction. * *

    4. The context structure astrom produced by this function is used by * iauAtciq* and iauAticq*. * *
    * Called: *
      *
    • {@link #jauApcs} astrometry parameters, ICRS-GCRS, space observer * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static void jauApcg(double date1, double date2, double ebpv[][], double ehp[], Astrom astrom) { /* Geocentric observer */ double pv[][] = { { 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0 } }; /* Compute the star-independent astrometry parameters. */ jauApcs(date1, date2, pv, ebpv, ehp, astrom); /* Finished. */ } /** * For a geocentric observer, prepare star-independent astrometry * parameters for transformations between ICRS and GCRS coordinates. * The caller supplies the date, and SOFA models are used to predict * the Earth ephemeris. * * The parameters produced by this function are required in the * parallax, light deflection and aberration parts of the astrometric * transformation chain. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param date1 double TDB as a 2-part... * @param date2 double ...Julian Date (Note 1) * * * @param astrom Returned star-independent astrometry parameters: * *

    Notes: *

      * *
    1. The TDB date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TDB)=2450123.7 could be expressed in any of these ways, among * others: *
           *            date1          date2
           *
           *         2450123.7           0.0       (JD method)
           *         2451545.0       -1421.3       (J2000 method)
           *         2400000.5       50123.2       (MJD method)
           *         2450123.5           0.2       (date & time method)
           *     
      *

      The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 method is best matched to the way the * argument is handled internally and will deliver the optimum * resolution. The MJD method and the date & time methods are both * good compromises between resolution and convenience. For most * applications of this function the choice will not be at all * critical. * *

      TT can be used instead of TDB without any significant impact on * accuracy. * *

    2. All the vectors are with respect to BCRS axes. * *
    3. In cases where the caller wishes to supply his own Earth * ephemeris, the function iauApcg can be used instead of the present * function. * *
    4. This is one of several functions that inserts into the astrom * structure star-independent parameters needed for the chain of * astrometric transformations {@code ICRS <-> GCRS <-> CIRS <-> observed}. * *

      The various functions support different classes of observer and * portions of the transformation chain: *

           *     {@code
           *          functions         observer        transformation
           *
           *       iauApcg iauApcg13    geocentric      ICRS <-> GCRS
           *       iauApci iauApci13    terrestrial     ICRS <-> CIRS
           *       iauApco iauApco13    terrestrial     ICRS <-> observed
           *       iauApcs iauApcs13    space           ICRS <-> GCRS
           *       iauAper iauAper13    terrestrial     update Earth rotation
           *       iauApio iauApio13    terrestrial     CIRS <-> observed
           *     }
           *     
      *

      Those with names ending in "13" use contemporary SOFA models to * compute the various ephemerides. The others accept ephemerides * supplied by the caller. * *

      The transformation from ICRS to GCRS covers space motion, * parallax, light deflection, and aberration. From GCRS to CIRS * comprises frame bias and precession-nutation. From CIRS to * observed takes account of Earth rotation, polar motion, diurnal * aberration and parallax (unless subsumed into the {@code ICRS <-> GCRS} * transformation), and atmospheric refraction. * *

    5. The context structure astrom produced by this function is used by * iauAtciq* and iauAticq*. * *
    * Called: *
      *
    • {@link #jauEpv00} Earth position and velocity *
    • {@link #jauApcg} astrometry parameters, ICRS-GCRS, geocenter * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static void jauApcg13(double date1, double date2, Astrom astrom) { double ehpv[][] = new double[2][3], ebpv[][] = new double[2][3]; /* Earth barycentric & heliocentric position/velocity (au, au/d). */ jauEpv00(date1, date2, ehpv, ebpv); /* Compute the star-independent astrometry parameters. */ jauApcg(date1, date2, ebpv, ehpv[0], astrom); /* Finished. */ } /** * For a terrestrial observer, prepare star-independent astrometry * parameters for transformations between ICRS and geocentric CIRS * coordinates. The Earth ephemeris and CIP/CIO are supplied by the * caller. * * The parameters produced by this function are required in the * parallax, light deflection, aberration, and bias-precession-nutation * parts of the astrometric transformation chain. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param date1 double TDB as a 2-part... * @param date2 double ...Julian Date (Note 1) * @param ebpv double[2][3] Earth barycentric position/velocity (au, au/day) * @param ehp double[3] Earth heliocentric position (au) * @param x double CIP X,Y (components of unit vector) * @param y double CIP X,Y (components of unit vector) * @param s double the CIO locator s (radians) * * * @param astrom Returned star-independent astrometry parameters: * *

    Notes: *

      * *
    1. The TDB date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TDB)=2450123.7 could be expressed in any of these ways, among * others: *
           *            date1          date2
           *
           *         2450123.7           0.0       (JD method)
           *         2451545.0       -1421.3       (J2000 method)
           *         2400000.5       50123.2       (MJD method)
           *         2450123.5           0.2       (date & time method)
           *     
      *

      The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 method is best matched to the way the * argument is handled internally and will deliver the optimum * resolution. The MJD method and the date & time methods are both * good compromises between resolution and convenience. For most * applications of this function the choice will not be at all * critical. * *

      TT can be used instead of TDB without any significant impact on * accuracy. * *

    2. All the vectors are with respect to BCRS axes. * *
    3. In cases where the caller does not wish to provide the Earth * ephemeris and CIP/CIO, the function iauApci13 can be used instead * of the present function. This computes the required quantities * using other SOFA functions. * *
    4. This is one of several functions that inserts into the astrom * structure star-independent parameters needed for the chain of * astrometric transformations {@code ICRS <-> GCRS <-> CIRS <-> observed.} * *

      The various functions support different classes of observer and * portions of the transformation chain: *

      {@code
           *          functions         observer        transformation
           *
           *       iauApcg iauApcg13    geocentric      ICRS <-> GCRS
           *       iauApci iauApci13    terrestrial     ICRS <-> CIRS
           *       iauApco iauApco13    terrestrial     ICRS <-> observed
           *       iauApcs iauApcs13    space           ICRS <-> GCRS
           *       iauAper iauAper13    terrestrial     update Earth rotation
           *       iauApio iauApio13    terrestrial     CIRS <-> observed
           *     }
      *

      Those with names ending in "13" use contemporary SOFA models to * compute the various ephemerides. The others accept ephemerides * supplied by the caller. * *

      The transformation from ICRS to GCRS covers space motion, * parallax, light deflection, and aberration. From GCRS to CIRS * comprises frame bias and precession-nutation. From CIRS to * observed takes account of Earth rotation, polar motion, diurnal * aberration and parallax (unless subsumed into the {@code ICRS <-> GCRS} * transformation), and atmospheric refraction. * *

    5. The context structure astrom produced by this function is used by * iauAtciq* and iauAticq*. * *
    * Called: *
      *
    • {@link #jauApcg} astrometry parameters, ICRS-GCRS, geocenter *
    • {@link #jauC2ixys} celestial-to-intermediate matrix, given X,Y and s * *
    *@version 2013 September 25 * *@since JSOFA release 20131202 * * */ public static void jauApci(double date1, double date2, double ebpv[][], double ehp[], double x, double y, double s, Astrom astrom) { /* Star-independent astrometry parameters for geocenter. */ jauApcg(date1, date2, ebpv, ehp, astrom); /* CIO based BPN matrix. */ astrom.bpn = jauC2ixys(x, y, s); /* Finished. */ } /** * For a terrestrial observer, prepare star-independent astrometry * parameters for transformations between ICRS and geocentric CIRS * coordinates. The caller supplies the date, and SOFA models are used * to predict the Earth ephemeris and CIP/CIO. * * The parameters produced by this function are required in the * parallax, light deflection, aberration, and bias-precession-nutation * parts of the astrometric transformation chain. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param date1 double TDB as a 2-part... * @param date2 double ...Julian Date (Note 1) * * * @param astrom jauASTROM Returned star-independent astrometry parameters: * pmt double Returned PM time interval (SSB, Julian years) * eb double[3] Returned SSB to observer (vector, au) * eh double[3] Returned Sun to observer (unit vector) * em double Returned distance from Sun to observer (au) * v double[3] Returned barycentric observer velocity (vector, c) * bm1 double Returned sqrt(1-|v|^2): reciprocal of Lorenz factor * bpn double[3][3] Returned bias-precession-nutation matrix * along double Returned unchanged * xpl double Returned unchanged * ypl double Returned unchanged * sphi double Returned unchanged * cphi double Returned unchanged * diurab double Returned unchanged * eral double Returned unchanged * refa double Returned unchanged * refb double Returned unchanged * @return double* Returned equation of the origins (ERA-GST) * *

    Notes: *

      * *
    1. The TDB date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TDB)=2450123.7 could be expressed in any of these ways, among * others: *
           *            date1          date2
           *
           *         2450123.7           0.0       (JD method)
           *         2451545.0       -1421.3       (J2000 method)
           *         2400000.5       50123.2       (MJD method)
           *         2450123.5           0.2       (date & time method)
           *     
      *

      The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 method is best matched to the way the * argument is handled internally and will deliver the optimum * resolution. The MJD method and the date & time methods are both * good compromises between resolution and convenience. For most * applications of this function the choice will not be at all * critical. * *

      TT can be used instead of TDB without any significant impact on * accuracy. * *

    2. All the vectors are with respect to BCRS axes. * *
    3. In cases where the caller wishes to supply his own Earth * ephemeris and CIP/CIO, the function iauApci can be used instead * of the present function. * *
    4. This is one of several functions that inserts into the astrom * structure star-independent parameters needed for the chain of * astrometric transformations {@code ICRS <-> GCRS <-> CIRS <-> observed.} * *

      The various functions support different classes of observer and * portions of the transformation chain: *

      {@code
           *          functions         observer        transformation
           *
           *       iauApcg iauApcg13    geocentric      ICRS <-> GCRS
           *       iauApci iauApci13    terrestrial     ICRS <-> CIRS
           *       iauApco iauApco13    terrestrial     ICRS <-> observed
           *       iauApcs iauApcs13    space           ICRS <-> GCRS
           *       iauAper iauAper13    terrestrial     update Earth rotation
           *       iauApio iauApio13    terrestrial     CIRS <-> observed
           *     }
      *

      Those with names ending in "13" use contemporary SOFA models to * compute the various ephemerides. The others accept ephemerides * supplied by the caller. * *

      The transformation from ICRS to GCRS covers space motion, * parallax, light deflection, and aberration. From GCRS to CIRS * comprises frame bias and precession-nutation. From CIRS to * observed takes account of Earth rotation, polar motion, diurnal * aberration and parallax (unless subsumed into the {@code ICRS <-> GCRS} * transformation), and atmospheric refraction. * *

    5. The context structure astrom produced by this function is used by * iauAtciq* and iauAticq*. * *
    * Called: *
      *
    • {@link #jauEpv00} Earth position and velocity *
    • {@link #jauPnm06a} classical NPB matrix, IAU 2006/2000A *
    • {@link #jauBpn2xy} extract CIP X,Y coordinates from NPB matrix *
    • {@link #jauS06} the CIO locator s, given X,Y, IAU 2006 *
    • {@link #jauApci} astrometry parameters, ICRS-CIRS *
    • {@link #jauEors} equation of the origins, given NPB matrix and s * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static double jauApci13(double date1, double date2, Astrom astrom) { double ehpv[][] = new double[2][3], ebpv[][] = new double[2][3], r[][], s; /* Earth barycentric & heliocentric position/velocity (au, au/d). */ jauEpv00(date1, date2, ehpv, ebpv); /* Form the equinox based BPN matrix, IAU 2006/2000A. */ r = jauPnm06a(date1, date2); /* Extract CIP X,Y. */ CelestialIntermediatePole cip = jauBpn2xy(r); /* Obtain CIO locator s. */ s = jauS06(date1, date2, cip.x, cip.y); /* Compute the star-independent astrometry parameters. */ jauApci(date1, date2, ebpv, ehpv[0], cip.x, cip.y, s, astrom); /* Equation of the origins. */ return jauEors(r, s); /* Finished. */ } /** * For a terrestrial observer, prepare star-independent astrometry * parameters for transformations between ICRS and observed * coordinates. The caller supplies the Earth ephemeris, the Earth * rotation information and the refraction constants as well as the * site coordinates. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param date1 double TDB as a 2-part... * @param date2 double ...Julian Date (Note 1) * @param ebpv double[2][3] Earth barycentric PV (au, au/day, Note 2) * @param ehp double[3] Earth heliocentric P (au, Note 2) * @param x double CIP X,Y (components of unit vector) * @param y double CIP X,Y (components of unit vector) * @param s double the CIO locator s (radians) * @param theta double Earth rotation angle (radians) * @param elong double longitude (radians, east +ve, Note 3) * @param phi double latitude (geodetic, radians, Note 3) * @param hm double height above ellipsoid (m, geodetic, Note 3) * @param xp double polar motion coordinates (radians, Note 4) * @param yp double polar motion coordinates (radians, Note 4) * @param sp double the TIO locator s' (radians, Note 4) * @param refa double refraction constant A (radians, Note 5) * @param refb double refraction constant B (radians, Note 5) * * * @param astrom Returned star-independent astrometry parameters: * *

    Notes: *

      * *
    1. The TDB date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TDB)=2450123.7 could be expressed in any of these ways, among * others: *
           *            date1          date2
           *
           *         2450123.7           0.0       (JD method)
           *         2451545.0       -1421.3       (J2000 method)
           *         2400000.5       50123.2       (MJD method)
           *         2450123.5           0.2       (date & time method)
           *     
      *

      The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 method is best matched to the way the * argument is handled internally and will deliver the optimum * resolution. The MJD method and the date & time methods are both * good compromises between resolution and convenience. For most * applications of this function the choice will not be at all * critical. * *

      TT can be used instead of TDB without any significant impact on * accuracy. * *

    2. The vectors eb, eh, and all the astrom vectors, are with respect * to BCRS axes. * *
    3. The geographical coordinates are with respect to the WGS84 * reference ellipsoid. TAKE CARE WITH THE LONGITUDE SIGN * CONVENTION: the longitude required by the present function is * right-handed, i.e. east-positive, in accordance with geographical * convention. * * The adjusted longitude stored in the astrom array takes into * account the TIO locator and polar motion. * *
    4. xp and yp are the coordinates (in radians) of the Celestial * Intermediate Pole with respect to the International Terrestrial * Reference System (see IERS Conventions), measured along the * meridians 0 and 90 deg west respectively. sp is the TIO locator * s', in radians, which positions the Terrestrial Intermediate * Origin on the equator. For many applications, xp, yp and * (especially) sp can be set to zero. * *

      Internally, the polar motion is stored in a form rotated onto the * local meridian. * *

    5. The refraction constants refa and refb are for use in a * dZ = A*tan(Z)+B*tan^3(Z) model, where Z is the observed * (i.e. refracted) zenith distance and dZ is the amount of * refraction. * *
    6. It is advisable to take great care with units, as even unlikely * values of the input parameters are accepted and processed in * accordance with the models used. * *
    7. In cases where the caller does not wish to provide the Earth * Ephemeris, the Earth rotation information and refraction * constants, the function iauApco13 can be used instead of the * present function. This starts from UTC and weather readings etc. * and computes suitable values using other SOFA functions. * *
    8. This is one of several functions that inserts into the astrom * structure star-independent parameters needed for the chain of * astrometric transformations {@code ICRS <-> GCRS <-> CIRS <-> observed.} * *

      The various functions support different classes of observer and * portions of the transformation chain: *

      {@code
           *          functions         observer        transformation
           *
           *       iauApcg iauApcg13    geocentric      ICRS <-> GCRS
           *       iauApci iauApci13    terrestrial     ICRS <-> CIRS
           *       iauApco iauApco13    terrestrial     ICRS <-> observed
           *       iauApcs iauApcs13    space           ICRS <-> GCRS
           *       iauAper iauAper13    terrestrial     update Earth rotation
           *       iauApio iauApio13    terrestrial     CIRS <-> observed
           *     }
      *

      Those with names ending in "13" use contemporary SOFA models to * compute the various ephemerides. The others accept ephemerides * supplied by the caller. * *

      The transformation from ICRS to GCRS covers space motion, * parallax, light deflection, and aberration. From GCRS to CIRS * comprises frame bias and precession-nutation. From CIRS to * observed takes account of Earth rotation, polar motion, diurnal * aberration and parallax (unless subsumed into the {@code ICRS <-> GCRS} * transformation), and atmospheric refraction. * *

    9. The context structure astrom produced by this function is used by * iauAtioq, iauAtoiq, iauAtciq* and iauAticq*. * *
    * Called: *
      *
    • {@link #jauAper} astrometry parameters: update ERA *
    • {@link #jauC2ixys} celestial-to-intermediate matrix, given X,Y and s *
    • {@link #jauPvtob} position/velocity of terrestrial station *
    • {@link #jauTrxpv} product of transpose of r-matrix and pv-vector *
    • {@link #jauApcs} astrometry parameters, ICRS-GCRS, space observer *
    • {@link #jauCr} copy r-matrix * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter unacceptable date */ public static void jauApco(double date1, double date2, double ebpv[][], double ehp[], double x, double y, double s, double theta, double elong, double phi, double hm, double xp, double yp, double sp, double refa, double refb, Astrom astrom) throws JSOFAIllegalParameter, JSOFAInternalError { double a, b, eral, c, r[][] = new double[3][3], pvc[][], pv[][]; /* Form the rotation matrix, CIRS to apparent [HA,Dec]. */ jauIr(r); jauRz(theta+sp, r); jauRy(-xp, r); jauRx(-yp, r); jauRz(elong, r); /* Solve for local Earth rotation angle. */ a = r[0][0]; b = r[0][1]; eral = ( a != 0.0 || b != 0.0 ) ? atan2(b, a) : 0.0; astrom.eral = eral; /* Solve for polar motion [X,Y] with respect to local meridian. */ a = r[0][0]; c = r[0][2]; astrom.xpl = atan2(c, sqrt(a*a+b*b)); a = r[1][2]; b = r[2][2]; astrom.ypl = ( a != 0.0 || b != 0.0 ) ? -atan2(a, b) : 0.0; /* Adjusted longitude. */ astrom.along = jauAnpm(eral - theta); /* Functions of latitude. */ astrom.sphi = sin(phi); astrom.cphi = cos(phi); /* Refraction constants. */ astrom.refa = refa; astrom.refb = refb; /* Disable the (redundant) diurnal aberration step. */ astrom.diurab = 0.0; /* CIO based BPN matrix. */ r = jauC2ixys(x, y, s); /* Observer's geocentric position and velocity (m, m/s, CIRS). */ pvc = jauPvtob(elong, phi, hm, xp, yp, sp, theta); /* Rotate into GCRS. */ pv = jauTrxpv(r, pvc); /* ICRS <-> GCRS parameters. */ jauApcs(date1, date2, pv, ebpv, ehp, astrom); /* Store the CIO based BPN matrix. */ jauCr(r, astrom.bpn ); /* Finished. */ } /** * For a terrestrial observer, prepare star-independent astrometry * parameters for transformations between ICRS and observed * coordinates. The caller supplies UTC, site coordinates, ambient air * conditions and observing wavelength, and SOFA models are used to * obtain the Earth ephemeris, CIP/CIO and refraction constants. * * The parameters produced by this function are required in the * parallax, light deflection, aberration, and bias-precession-nutation * parts of the ICRS/CIRS transformations. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param utc1 double UTC as a 2-part... * @param utc2 double ...quasi Julian Date (Notes 1,2) * @param dut1 double UT1-UTC (seconds, Note 3) * @param elong double longitude (radians, east +ve, Note 4) * @param phi double latitude (geodetic, radians, Note 4) * @param hm double height above ellipsoid (m, geodetic, Notes 4,6) * @param xp double polar motion coordinates (radians, Note 5) * @param yp double polar motion coordinates (radians, Note 5) * @param phpa double pressure at the observer (hPa = mB, Note 6) * @param tc double ambient temperature at the observer (deg C) * @param rh double relative humidity at the observer (range 0-1) * @param wl double wavelength (micrometers, Note 7) * * * @param astrom Returned star-independent astrometry parameters: * * * @return double Returned equation of the origins (ERA-GST) * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter int status: Returned +1 = dubious year (Note 2) * 0 = Returned OK * -1 = Returned unacceptable date * *

    Notes: *

      * *
    1. utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any * convenient way between the two arguments, for example where utc1 * is the Julian Day Number and utc2 is the fraction of a day. * *

      However, JD cannot unambiguously represent UTC during a leap * second unless special measures are taken. The convention in the * present function is that the JD day represents UTC days whether * the length is 86399, 86400 or 86401 SI seconds. * *

      Applications should use the function iauDtf2d to convert from * calendar date and time of day into 2-part quasi Julian Date, as * it implements the leap-second-ambiguity convention just * described. * *

    2. The warning status "dubious year" flags UTCs that predate the * introduction of the time scale or that are too far in the * future to be trusted. See iauDat for further details. * *
    3. UT1-UTC is tabulated in IERS bulletins. It increases by exactly * one second at the end of each positive UTC leap second, * introduced in order to keep UT1-UTC within +/- 0.9s. n.b. This * practice is under review, and in the future UT1-UTC may grow * essentially without limit. * *
    4. The geographical coordinates are with respect to the WGS84 * reference ellipsoid. TAKE CARE WITH THE LONGITUDE SIGN: the * longitude required by the present function is east-positive * (i.e. right-handed), in accordance with geographical convention. * *
    5. The polar motion xp,yp can be obtained from IERS bulletins. The * values are the coordinates (in radians) of the Celestial * Intermediate Pole with respect to the International Terrestrial * Reference System (see IERS Conventions 2003), measured along the * meridians 0 and 90 deg west respectively. For many * applications, xp and yp can be set to zero. * *

      Internally, the polar motion is stored in a form rotated onto * the local meridian. * *

    6. If hm, the height above the ellipsoid of the observing station * in meters, is not known but phpa, the pressure in hPa (=mB), is * available, an adequate estimate of hm can be obtained from the * expression * *

      hm = -29.3 * tsl * log ( phpa / 1013.25 ); * *

      where tsl is the approximate sea-level air temperature in K * (See Astrophysical Quantities, C.W.Allen, 3rd edition, section * 52). Similarly, if the pressure phpa is not known, it can be * estimated from the height of the observing station, hm, as * follows: * *

      phpa = 1013.25 * exp ( -hm / ( 29.3 * tsl ) ); * *

      Note, however, that the refraction is nearly proportional to * the pressure and that an accurate phpa value is important for * precise work. * *

    7. The argument wl specifies the observing wavelength in * micrometers. The transition from optical to radio is assumed to * occur at 100 micrometers (about 3000 GHz). * *
    8. It is advisable to take great care with units, as even unlikely * values of the input parameters are accepted and processed in * accordance with the models used. * *
    9. In cases where the caller wishes to supply his own Earth * ephemeris, Earth rotation information and refraction constants, * the function iauApco can be used instead of the present function. * *
    10. This is one of several functions that inserts into the astrom * structure star-independent parameters needed for the chain of * astrometric transformations {@code ICRS <-> GCRS <-> CIRS <-> observed.} * *

      The various functions support different classes of observer and * portions of the transformation chain: *

      {@code
           *          functions         observer        transformation
           *
           *       iauApcg iauApcg13    geocentric      ICRS <-> GCRS
           *       iauApci iauApci13    terrestrial     ICRS <-> CIRS
           *       iauApco iauApco13    terrestrial     ICRS <-> observed
           *       iauApcs iauApcs13    space           ICRS <-> GCRS
           *       iauAper iauAper13    terrestrial     update Earth rotation
           *       iauApio iauApio13    terrestrial     CIRS <-> observed
           *      }
      *

      Those with names ending in "13" use contemporary SOFA models to * compute the various ephemerides. The others accept ephemerides * supplied by the caller. * *

      The transformation from ICRS to GCRS covers space motion, * parallax, light deflection, and aberration. From GCRS to CIRS * comprises frame bias and precession-nutation. From CIRS to * observed takes account of Earth rotation, polar motion, diurnal * aberration and parallax (unless subsumed into the {@code ICRS <-> GCRS} * transformation), and atmospheric refraction. * *

    11. The context structure astrom produced by this function is used * by iauAtioq, iauAtoiq, iauAtciq* and iauAticq*. * *
    * Called: *
      *
    • {@link #jauUtctai} UTC to TAI *
    • {@link #jauTaitt} TAI to TT *
    • {@link #jauUtcut1} UTC to UT1 *
    • {@link #jauEpv00} Earth position and velocity *
    • {@link #jauPnm06a} classical NPB matrix, IAU 2006/2000A *
    • {@link #jauBpn2xy} extract CIP X,Y coordinates from NPB matrix *
    • {@link #jauS06} the CIO locator s, given X,Y, IAU 2006 *
    • {@link #jauEra00} Earth rotation angle, IAU 2000 *
    • {@link #jauSp00} the TIO locator s', IERS 2000 *
    • {@link #jauRefco} refraction constants for given ambient conditions *
    • {@link #jauApco} astrometry parameters, ICRS-observed *
    • {@link #jauEors} equation of the origins, given NPB matrix and s * *
    *@version 2013 December 5 * *@since JSOFA release 20131202 * * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter unacceptable date. */ public static double jauApco13(double utc1, double utc2, double dut1, double elong, double phi, double hm, double xp, double yp, double phpa, double tc, double rh, double wl, Astrom astrom ) throws JSOFAIllegalParameter, JSOFAInternalError { double ehpv[][] = new double[2][3], ebpv[][] = new double[2][3], r[][], s, theta, sp; double eo; /* UTC to other time scales. */ JulianDate tai = jauUtctai(utc1, utc2); JulianDate tt = jauTaitt(tai.djm0, tai.djm1); JulianDate ut1 = jauUtcut1(utc1, utc2, dut1); /* Earth barycentric & heliocentric position/velocity (au, au/d). */ jauEpv00(tt.djm0, tt.djm1, ehpv, ebpv); /* Form the equinox based BPN matrix, IAU 2006/2000A. */ r = jauPnm06a(tt.djm0, tt.djm1); /* Extract CIP X,Y. */ CelestialIntermediatePole cip = jauBpn2xy(r); /* Obtain CIO locator s. */ s = jauS06(tt.djm0, tt.djm1, cip.x, cip.y); /* Earth rotation angle. */ theta = jauEra00(ut1.djm0, ut1.djm1); /* TIO locator s'. */ sp = jauSp00(tt.djm0, tt.djm1); /* Refraction constants A and B. */ RefCos ref = jauRefco(phpa, tc, rh, wl); /* Compute the star-independent astrometry parameters. */ jauApco(tt.djm0, tt.djm1, ebpv, ehpv[0], cip.x, cip.y, s, theta, elong, phi, hm, xp, yp, sp, ref.a, ref.b, astrom); /* Equation of the origins. */ eo = jauEors(r, s); return eo; /* Finished. */ } /** * For an observer whose geocentric position and velocity are known, * prepare star-independent astrometry parameters for transformations * between ICRS and GCRS. The Earth ephemeris is supplied by the * caller. * * The parameters produced by this function are required in the space * motion, parallax, light deflection and aberration parts of the * astrometric transformation chain. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param date1 double TDB as a 2-part... * @param date2 double ...Julian Date (Note 1) * @param pv double[2][3] observer's geocentric pos/vel (m, m/s) * @param ebpv double[2][3] Earth barycentric PV (au, au/day) * @param ehp double[3] Earth heliocentric P (au) * * * @param astrom Returned star-independent astrometry parameters: *

    Notes: *

      * *
    1. The TDB date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TDB)=2450123.7 could be expressed in any of these ways, among * others: *
           *         date1          date2
           *
           *         2450123.7           0.0       (JD method)
           *         2451545.0       -1421.3       (J2000 method)
           *         2400000.5       50123.2       (MJD method)
           *         2450123.5           0.2       (date & time method)
           *     
      *

      The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 method is best matched to the way the * argument is handled internally and will deliver the optimum * resolution. The MJD method and the date & time methods are both * good compromises between resolution and convenience. For most * applications of this function the choice will not be at all * critical. * *

      TT can be used instead of TDB without any significant impact on * accuracy. * *

    2. All the vectors are with respect to BCRS axes. * *
    3. Providing separate arguments for (i) the observer's geocentric * position and velocity and (ii) the Earth ephemeris is done for * convenience in the geocentric, terrestrial and Earth orbit cases. * For deep space applications it maybe more convenient to specify * zero geocentric position and velocity and to supply the * observer's position and velocity information directly instead of * with respect to the Earth. However, note the different units: * m and m/s for the geocentric vectors, au and au/day for the * heliocentric and barycentric vectors. * *
    4. In cases where the caller does not wish to provide the Earth * ephemeris, the function iauApcs13 can be used instead of the * present function. This computes the Earth ephemeris using the * SOFA function iauEpv00. * *
    5. This is one of several functions that inserts into the astrom * structure star-independent parameters needed for the chain of * astrometric transformations {@code ICRS <-> GCRS <-> CIRS <-> observed.} * *

      The various functions support different classes of observer and * portions of the transformation chain: * *

      {@code
           *          functions         observer        transformation
           *
           *       iauApcg iauApcg13    geocentric      ICRS <-> GCRS
           *       iauApci iauApci13    terrestrial     ICRS <-> CIRS
           *       iauApco iauApco13    terrestrial     ICRS <-> observed
           *       iauApcs iauApcs13    space           ICRS <-> GCRS
           *       iauAper iauAper13    terrestrial     update Earth rotation
           *       iauApio iauApio13    terrestrial     CIRS <-> observed
           *     }
      *

      Those with names ending in "13" use contemporary SOFA models to * compute the various ephemerides. The others accept ephemerides * supplied by the caller. * *

      The transformation from ICRS to GCRS covers space motion, * parallax, light deflection, and aberration. From GCRS to CIRS * comprises frame bias and precession-nutation. From CIRS to * observed takes account of Earth rotation, polar motion, diurnal * aberration and parallax (unless subsumed into the {@code ICRS <-> GCRS} * transformation), and atmospheric refraction. * *

    6. The context structure astrom produced by this function is used by * iauAtciq* and iauAticq*. * *
    * Called: *
      *
    • {@link #jauCp} copy p-vector *
    • {@link #jauPm} modulus of p-vector *
    • {@link #jauPn} decompose p-vector into modulus and direction *
    • {@link #jauIr} initialize r-matrix to identity * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static void jauApcs(double date1, double date2, double pv[][], double ebpv[][], double ehp[], Astrom astrom) { /* au/d to m/s */ final double AUDMS = DAU/DAYSEC; /* Light time for 1 au (day) */ final double CR = AULT/DAYSEC; int i; double dp, dv, pb[] = new double[3], vb[] = new double[3], ph[] = new double[3], v2, w; /* Time since reference epoch, years (for proper motion calculation). */ astrom.pmt = ( (date1 - DJ00) + date2 ) / DJY; /* Adjust Earth ephemeris to observer. */ for (i = 0; i < 3; i++) { dp = pv[0][i] / DAU; dv = pv[1][i] / AUDMS; pb[i] = ebpv[0][i] + dp; vb[i] = ebpv[1][i] + dv; ph[i] = ehp[i] + dp; } /* Barycentric position of observer (au). */ jauCp(pb, astrom.eb); /* Heliocentric direction and distance (unit vector and au). */ NormalizedVector nv = jauPn(ph); astrom.em = nv.r; astrom.eh = nv.u; /* Barycentric vel. in units of c, and reciprocal of Lorenz factor. */ v2 = 0.0; for (i = 0; i < 3; i++) { w = vb[i] * CR; astrom.v[i] = w; v2 += w*w; } astrom.bm1 = sqrt(1.0 - v2); /* Reset the NPB matrix. */ jauIr(astrom.bpn); /* Finished. */ } /** * For an observer whose geocentric position and velocity are known, * prepare star-independent astrometry parameters for transformations * between ICRS and GCRS. The Earth ephemeris is from SOFA models. * * The parameters produced by this function are required in the space * motion, parallax, light deflection and aberration parts of the * astrometric transformation chain. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param date1 double TDB as a 2-part... * @param date2 double ...Julian Date (Note 1) * @param pv double[2][3] observer's geocentric pos/vel (Note 3) * * * @param astrom Returned star-independent astrometry parameters: * *

    Notes: *

      * *
    1. The TDB date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TDB)=2450123.7 could be expressed in any of these ways, among * others: *
           *           date1          date2
           *
           *         2450123.7           0.0       (JD method)
           *         2451545.0       -1421.3       (J2000 method)
           *         2400000.5       50123.2       (MJD method)
           *         2450123.5           0.2       (date & time method)
           *     
      *

      The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 method is best matched to the way the * argument is handled internally and will deliver the optimum * resolution. The MJD method and the date & time methods are both * good compromises between resolution and convenience. For most * applications of this function the choice will not be at all * critical. * *

      TT can be used instead of TDB without any significant impact on * accuracy. * *

    2. All the vectors are with respect to BCRS axes. * *
    3. The observer's position and velocity pv are geocentric but with * respect to BCRS axes, and in units of m and m/s. No assumptions * are made about proximity to the Earth, and the function can be * used for deep space applications as well as Earth orbit and * terrestrial. * *
    4. In cases where the caller wishes to supply his own Earth * ephemeris, the function iauApcs can be used instead of the present * function. * *
    5. This is one of several functions that inserts into the astrom * structure star-independent parameters needed for the chain of * astrometric transformations {@code ICRS <-> GCRS <-> CIRS <-> observed.} * *

      The various functions support different classes of observer and * portions of the transformation chain: *

      {@code
           *          functions         observer        transformation
           *
           *       iauApcg iauApcg13    geocentric      ICRS <-> GCRS
           *       iauApci iauApci13    terrestrial     ICRS <-> CIRS
           *       iauApco iauApco13    terrestrial     ICRS <-> observed
           *       iauApcs iauApcs13    space           ICRS <-> GCRS
           *       iauAper iauAper13    terrestrial     update Earth rotation
           *       iauApio iauApio13    terrestrial     CIRS <-> observed
           *     }
      *

      Those with names ending in "13" use contemporary SOFA models to * compute the various ephemerides. The others accept ephemerides * supplied by the caller. * *

      The transformation from ICRS to GCRS covers space motion, * parallax, light deflection, and aberration. From GCRS to CIRS * comprises frame bias and precession-nutation. From CIRS to * observed takes account of Earth rotation, polar motion, diurnal * aberration and parallax (unless subsumed into the {@code ICRS <-> GCRS} * transformation), and atmospheric refraction. * *

    6. The context structure astrom produced by this function is used by * iauAtciq* and iauAticq*. * *
    * Called: *
      *
    • {@link #jauEpv00} Earth position and velocity *
    • {@link #jauApcs} astrometry parameters, ICRS-GCRS, space observer * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static void jauApcs13(double date1, double date2, double pv[][], Astrom astrom) { double ehpv[][] = new double[2][3], ebpv[][] = new double[2][3]; /* Earth barycentric & heliocentric position/velocity (au, au/d). */ jauEpv00(date1, date2, ehpv, ebpv); /* Compute the star-independent astrometry parameters. */ jauApcs(date1, date2, pv, ebpv, ehpv[0], astrom); /* Finished. */ } /** * In the star-independent astrometry parameters, update only the * Earth rotation angle, supplied by the caller explicitly. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param theta double Earth rotation angle (radians, Note 2) * @param astrom Astrom star-independent astrometry parameters:{@code * pmt double not used * eb double[3] not used * eh double[3] not used * em double not used * v double[3] not used * bm1 double not used * bpn double[3][3] not used * along double longitude + s' (radians) * xpl double not used * ypl double not used * sphi double not used * cphi double not used * diurab double not used * eral double not used * refa double not used * refb double not used} * * * astrom Returned star-independent astrometry parameters: * *

    Notes: *

      * *
    1. This function exists to enable sidereal-tracking applications to * avoid wasteful recomputation of the bulk of the astrometry * parameters: only the Earth rotation is updated. * *
    2. For targets expressed as equinox based positions, such as * classical geocentric apparent (RA,Dec), the supplied theta can be * Greenwich apparent sidereal time rather than Earth rotation * angle. * *
    3. The function iauAper13 can be used instead of the present * function, and starts from UT1 rather than ERA itself. * *
    4. This is one of several functions that inserts into the astrom * structure star-independent parameters needed for the chain of * astrometric transformations {@code ICRS <-> GCRS <-> CIRS <-> observed.} * *

      The various functions support different classes of observer and * portions of the transformation chain: *

      {@code
           *          functions         observer        transformation
           *
           *       iauApcg iauApcg13    geocentric      ICRS <-> GCRS
           *       iauApci iauApci13    terrestrial     ICRS <-> CIRS
           *       iauApco iauApco13    terrestrial     ICRS <-> observed
           *       iauApcs iauApcs13    space           ICRS <-> GCRS
           *       iauAper iauAper13    terrestrial     update Earth rotation
           *       iauApio iauApio13    terrestrial     CIRS <-> observed
           *     }
      *

      Those with names ending in "13" use contemporary SOFA models to * compute the various ephemerides. The others accept ephemerides * supplied by the caller. * *

      The transformation from ICRS to GCRS covers space motion, * parallax, light deflection, and aberration. From GCRS to CIRS * comprises frame bias and precession-nutation. From CIRS to * observed takes account of Earth rotation, polar motion, diurnal * aberration and parallax (unless subsumed into the {@code ICRS <-> GCRS} * transformation), and atmospheric refraction. * *

    *@version 2013 September 25 * *@since JSOFA release 20131202 * * */ public static void jauAper(double theta, Astrom astrom) { astrom.eral = theta + astrom.along; /* Finished. */ } /** * In the star-independent astrometry parameters, update only the * Earth rotation angle. The caller provides UT1, (n.b. not UTC). * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param ut11 double UT1 as a 2-part... * @param ut12 double ...Julian Date (Note 1) * @param astrom star-independent astrometry parameters: * pmt double not used * eb double[3] not used * eh double[3] not used * em double not used * v double[3] not used * bm1 double not used * bpn double[3][3] not used * along double longitude + s' (radians) * xpl double not used * ypl double not used * sphi double not used * cphi double not used * diurab double not used * eral double not used * refa double not used * refb double not used * * * @param astrom Returned star-independent astrometry parameters: * *

    Notes: *

      * *
    1. The UT1 date (n.b. not UTC) ut11+ut12 is a Julian Date, * apportioned in any convenient way between the arguments ut11 and * ut12. For example, JD(UT1)=2450123.7 could be expressed in any * of these ways, among others: * *

      ut11 ut12 * * 2450123.7 0.0 (JD method) * 2451545.0 -1421.3 (J2000 method) * 2400000.5 50123.2 (MJD method) * 2450123.5 0.2 (date & time method) * *

      The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 and MJD methods are good compromises * between resolution and convenience. The date & time method is * best matched to the algorithm used: maximum precision is * delivered when the ut11 argument is for 0hrs UT1 on the day in * question and the ut12 argument lies in the range 0 to 1, or vice * versa. * *

    2. If the caller wishes to provide the Earth rotation angle itself, * the function iauAper can be used instead. One use of this * technique is to substitute Greenwich apparent sidereal time and * thereby to support equinox based transformations directly. * *
    3. This is one of several functions that inserts into the astrom * structure star-independent parameters needed for the chain of * astrometric transformations {@code ICRS <-> GCRS <-> CIRS <-> observed.} * *

      The various functions support different classes of observer and * portions of the transformation chain: *

      {@code
           *          functions         observer        transformation
           *
           *       

      iauApcg iauApcg13 geocentric ICRS <-> GCRS * iauApci iauApci13 terrestrial ICRS <-> CIRS * iauApco iauApco13 terrestrial ICRS <-> observed * iauApcs iauApcs13 space ICRS <-> GCRS * iauAper iauAper13 terrestrial update Earth rotation * iauApio iauApio13 terrestrial CIRS <-> observed * }

      *

      Those with names ending in "13" use contemporary SOFA models to * compute the various ephemerides. The others accept ephemerides * supplied by the caller. * *

      The transformation from ICRS to GCRS covers space motion, * parallax, light deflection, and aberration. From GCRS to CIRS * comprises frame bias and precession-nutation. From CIRS to * observed takes account of Earth rotation, polar motion, diurnal * aberration and parallax (unless subsumed into the {@code ICRS <-> GCRS} * transformation), and atmospheric refraction. * *

    * Called: *
      *
    • {@link #jauAper} astrometry parameters: update ERA *
    • {@link #jauEra00} Earth rotation angle, IAU 2000 * *
    *@version 2013 September 25 * *@since JSOFA release 20131202 * * */ public static void jauAper13(double ut11, double ut12, Astrom astrom) { jauAper(jauEra00(ut11,ut12), astrom); /* Finished. */ } /** * For a terrestrial observer, prepare star-independent astrometry * parameters for transformations between CIRS and observed * coordinates. The caller supplies the Earth orientation information * and the refraction constants as well as the site coordinates. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param sp double the TIO locator s' (radians, Note 1) * @param theta double Earth rotation angle (radians) * @param elong double longitude (radians, east +ve, Note 2) * @param phi double geodetic latitude (radians, Note 2) * @param hm double height above ellipsoid (m, geodetic Note 2) * @param xp double polar motion coordinates (radians, Note 3) * @param yp double polar motion coordinates (radians, Note 3) * @param refa double refraction constant A (radians, Note 4) * @param refb double refraction constant B (radians, Note 4) * * * @param astrom {@link Astrom} Returned star-independent astrometry parameters: * *

    Notes: *

      * *
    1. sp, the TIO locator s', is a tiny quantity needed only by the * most precise applications. It can either be set to zero or * predicted using the SOFA function iauSp00. * *
    2. The geographical coordinates are with respect to the WGS84 * reference ellipsoid. TAKE CARE WITH THE LONGITUDE SIGN: the * longitude required by the present function is east-positive * (i.e. right-handed), in accordance with geographical convention. * *
    3. The polar motion xp,yp can be obtained from IERS bulletins. The * values are the coordinates (in radians) of the Celestial * Intermediate Pole with respect to the International Terrestrial * Reference System (see IERS Conventions 2003), measured along the * meridians 0 and 90 deg west respectively. For many applications, * xp and yp can be set to zero. * *

      Internally, the polar motion is stored in a form rotated onto the * local meridian. * *

    4. The refraction constants refa and refb are for use in a * dZ = A*tan(Z)+B*tan^3(Z) model, where Z is the observed * (i.e. refracted) zenith distance and dZ is the amount of * refraction. * *
    5. It is advisable to take great care with units, as even unlikely * values of the input parameters are accepted and processed in * accordance with the models used. * *
    6. In cases where the caller does not wish to provide the Earth * rotation information and refraction constants, the function * iauApio13 can be used instead of the present function. This * starts from UTC and weather readings etc. and computes suitable * values using other SOFA functions. * *
    7. This is one of several functions that inserts into the astrom * structure star-independent parameters needed for the chain of * astrometric transformations {@code ICRS <-> GCRS <-> CIRS <-> observed.} * *

      The various functions support different classes of observer and * portions of the transformation chain: *

      {@code
           *          functions         observer        transformation
           *
           *       iauApcg iauApcg13    geocentric      ICRS <-> GCRS
           *       iauApci iauApci13    terrestrial     ICRS <-> CIRS
           *       iauApco iauApco13    terrestrial     ICRS <-> observed
           *       iauApcs iauApcs13    space           ICRS <-> GCRS
           *       iauAper iauAper13    terrestrial     update Earth rotation
           *       iauApio iauApio13    terrestrial     CIRS <-> observed
           *}
      *

      Those with names ending in "13" use contemporary SOFA models to * compute the various ephemerides. The others accept ephemerides * supplied by the caller. * *

      The transformation from ICRS to GCRS covers space motion, * parallax, light deflection, and aberration. From GCRS to CIRS * comprises frame bias and precession-nutation. From CIRS to * observed takes account of Earth rotation, polar motion, diurnal * aberration and parallax (unless subsumed into the {@code ICRS <-> GCRS} * transformation), and atmospheric refraction. * *

    8. The context structure astrom produced by this function is used by * iauAtioq and iauAtoiq. * *
    * Called: *
      *
    • {@link #jauPvtob} position/velocity of terrestrial station *
    • {@link #jauAper} astrometry parameters: update ERA * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter unacceptable date. */ public static void jauApio(double sp, double theta, double elong, double phi, double hm, double xp, double yp, double refa, double refb, Astrom astrom) throws JSOFAIllegalParameter, JSOFAInternalError { double r[][]=new double[3][3], a, b, eral, c, pv[][]; /* Form the rotation matrix, CIRS to apparent [HA,Dec]. */ jauIr(r); jauRz(theta+sp, r); jauRy(-xp, r); jauRx(-yp, r); jauRz(elong, r); /* Solve for local Earth rotation angle. */ a = r[0][0]; b = r[0][1]; eral = ( a != 0.0 || b != 0.0 ) ? atan2(b, a) : 0.0; astrom.eral = eral; /* Solve for polar motion [X,Y] with respect to local meridian. */ a = r[0][0]; c = r[0][2]; astrom.xpl = atan2(c, sqrt(a*a+b*b)); a = r[1][2]; b = r[2][2]; astrom.ypl = ( a != 0.0 || b != 0.0 ) ? -atan2(a, b) : 0.0; /* Adjusted longitude. */ astrom.along = jauAnpm(eral - theta); /* Functions of latitude. */ astrom.sphi = sin(phi); astrom.cphi = cos(phi); /* Observer's geocentric position and velocity (m, m/s, CIRS). */ pv = jauPvtob(elong, phi, hm, xp, yp, sp, theta); /* Magnitude of diurnal aberration vector. */ astrom.diurab = sqrt(pv[1][0]*pv[1][0]+pv[1][1]*pv[1][1]) / CMPS; /* Refraction constants. */ astrom.refa = refa; astrom.refb = refb; /* Finished. */ } /** * For a terrestrial observer, prepare star-independent astrometry * parameters for transformations between CIRS and observed * coordinates. The caller supplies UTC, site coordinates, ambient air * conditions and observing wavelength. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param utc1 double UTC as a 2-part... * @param utc2 double ...quasi Julian Date (Notes 1,2) * @param dut1 double UT1-UTC (seconds) * @param elong double longitude (radians, east +ve, Note 3) * @param phi double geodetic latitude (radians, Note 3) * @param hm double height above ellipsoid (m, geodetic Notes 4,6) * @param xp double polar motion coordinates (radians, Note 5) * @param yp double polar motion coordinates (radians, Note 5) * @param phpa double pressure at the observer (hPa = mB, Note 6) * @param tc double ambient temperature at the observer (deg C) * @param rh double relative humidity at the observer (range 0-1) * @param wl double wavelength (micrometers, Note 7) * * * @param astrom Returned star-independent astrometry parameters: * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter int status: Returned +1 = dubious year (Note 2) * 0 = Returned OK * -1 = Returned unacceptable date * *

    Notes: *

      * *
    1. utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any * convenient way between the two arguments, for example where utc1 * is the Julian Day Number and utc2 is the fraction of a day. * *

      However, JD cannot unambiguously represent UTC during a leap * second unless special measures are taken. The convention in the * present function is that the JD day represents UTC days whether * the length is 86399, 86400 or 86401 SI seconds. * *

      Applications should use the function iauDtf2d to convert from * calendar date and time of day into 2-part quasi Julian Date, as * it implements the leap-second-ambiguity convention just * described. * *

    2. The warning status "dubious year" flags UTCs that predate the * introduction of the time scale or that are too far in the future * to be trusted. See iauDat for further details. * *
    3. UT1-UTC is tabulated in IERS bulletins. It increases by exactly * one second at the end of each positive UTC leap second, * introduced in order to keep UT1-UTC within +/- 0.9s. n.b. This * practice is under review, and in the future UT1-UTC may grow * essentially without limit. * *
    4. The geographical coordinates are with respect to the WGS84 * reference ellipsoid. TAKE CARE WITH THE LONGITUDE SIGN: the * longitude required by the present function is east-positive * (i.e. right-handed), in accordance with geographical convention. * *
    5. The polar motion xp,yp can be obtained from IERS bulletins. The * values are the coordinates (in radians) of the Celestial * Intermediate Pole with respect to the International Terrestrial * Reference System (see IERS Conventions 2003), measured along the * meridians 0 and 90 deg west respectively. For many applications, * xp and yp can be set to zero. * *

      Internally, the polar motion is stored in a form rotated onto * the local meridian. * *

    6. If hm, the height above the ellipsoid of the observing station * in meters, is not known but phpa, the pressure in hPa (=mB), is * available, an adequate estimate of hm can be obtained from the * expression * *

      hm = -29.3 * tsl * log ( phpa / 1013.25 ); * *

      where tsl is the approximate sea-level air temperature in K * (See Astrophysical Quantities, C.W.Allen, 3rd edition, section * 52). Similarly, if the pressure phpa is not known, it can be * estimated from the height of the observing station, hm, as * follows: * *

      phpa = 1013.25 * exp ( -hm / ( 29.3 * tsl ) ); * *

      Note, however, that the refraction is nearly proportional to the * pressure and that an accurate phpa value is important for * precise work. * *

    7. The argument wl specifies the observing wavelength in * micrometers. The transition from optical to radio is assumed to * occur at 100 micrometers (about 3000 GHz). * *
    8. It is advisable to take great care with units, as even unlikely * values of the input parameters are accepted and processed in * accordance with the models used. * *
    9. In cases where the caller wishes to supply his own Earth * rotation information and refraction constants, the function * iauApc can be used instead of the present function. * *
    10. This is one of several functions that inserts into the astrom * structure star-independent parameters needed for the chain of * astrometric transformations {@code ICRS <-> GCRS <-> CIRS <-> observed.} * *

      The various functions support different classes of observer and * portions of the transformation chain: *

      {@code
           *          functions         observer        transformation
           *
           *       iauApcg iauApcg13    geocentric      ICRS <-> GCRS
           *       iauApci iauApci13    terrestrial     ICRS <-> CIRS
           *       iauApco iauApco13    terrestrial     ICRS <-> observed
           *       iauApcs iauApcs13    space           ICRS <-> GCRS
           *       iauAper iauAper13    terrestrial     update Earth rotation
           *       iauApio iauApio13    terrestrial     CIRS <-> observed
           *      }
      *

      Those with names ending in "13" use contemporary SOFA models to * compute the various ephemerides. The others accept ephemerides * supplied by the caller. * *

      The transformation from ICRS to GCRS covers space motion, * parallax, light deflection, and aberration. From GCRS to CIRS * comprises frame bias and precession-nutation. From CIRS to * observed takes account of Earth rotation, polar motion, diurnal * aberration and parallax (unless subsumed into the {@code ICRS <-> GCRS} * transformation), and atmospheric refraction. * *

    11. The context structure astrom produced by this function is used * by iauAtioq and iauAtoiq. * *
    * Called: *
      *
    • {@link #jauUtctai} UTC to TAI *
    • {@link #jauTaitt} TAI to TT *
    • {@link #jauUtcut1} UTC to UT1 *
    • {@link #jauSp00} the TIO locator s', IERS 2000 *
    • {@link #jauEra00} Earth rotation angle, IAU 2000 *
    • {@link #jauRefco} refraction constants for given ambient conditions *
    • {@link #jauApio} astrometry parameters, CIRS-observed * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter unacceptable date. */ public static void jauApio13(double utc1, double utc2, double dut1, double elong, double phi, double hm, double xp, double yp, double phpa, double tc, double rh, double wl, Astrom astrom) throws JSOFAIllegalParameter, JSOFAInternalError { double sp, theta; /* UTC to other time scales. */ JulianDate tai = jauUtctai(utc1, utc2); JulianDate tt = jauTaitt(tai.djm0, tai.djm1); JulianDate ut1 = jauUtcut1(utc1, utc2, dut1); /* TIO locator s'. */ sp = jauSp00(tt.djm0, tt.djm1); /* Earth rotation angle. */ theta = jauEra00(ut1.djm0, ut1.djm1); /* Refraction constants A and B. */ RefCos refco = jauRefco(phpa, tc, rh, wl); /* CIRS <-> observed astrometry parameters. */ jauApio(sp, theta, elong, phi, hm, xp, yp, refco.a, refco.b, astrom); /* Finished. */ } /** * Transform ICRS star data, epoch J2000.0, to CIRS. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param rc double ICRS right ascension at J2000.0 (radians, Note 1) * @param dc double ICRS declination at J2000.0 (radians, Note 1) * @param pr double RA proper motion (radians/year; Note 2) * @param pd double Dec proper motion (radians/year) * @param px double parallax (arcsec) * @param rv double radial velocity (km/s, +ve if receding) * @param date1 double TDB as a 2-part... * @param date2 double ...Julian Date (Note 3) * * * @return double* Returned CIRS geocentric RA,Dec (radians) * eo double* Returned equation of the origins (ERA-GST, Note 5) * *

    Notes: *

      * *
    1. Star data for an epoch other than J2000.0 (for example from the * Hipparcos catalog, which has an epoch of J1991.25) will require a * preliminary call to iauPmsafe before use. * *
    2. The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. * *
    3. The TDB date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TDB)=2450123.8g could be expressed in any of these ways, among * others: * * date1 date2 * * 2450123.8g 0.0 (JD method) * 2451545.0 -1421.3 (J2000 method) * 2400000.5 50123.2 (MJD method) * 2450123.5 0.2 (date & time method) * *

      The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 method is best matched to the way the * argument is handled internally and will deliver the optimum * resolution. The MJD method and the date & time methods are both * good compromises between resolution and convenience. For most * applications of this function the choice will not be at all * critical. * *

      TT can be used instead of TDB without any significant impact on * accuracy. * *

    4. The available accuracy is better than 1 milliarcsecond, limited * mainly by the precession-nutation model that is used, namely * IAU 2000A/2006. Very close to solar system bodies, additional * errors of up to several milliarcseconds can occur because of * unmodeled light deflection; however, the Sun's contribution is * taken into account, to first order. The accuracy limitations of * the SOFA function iauEpv00 (used to compute Earth position and * velocity) can contribute aberration errors of up to * 5 microarcseconds. Light deflection at the Sun's limb is * uncertain at the 0.4 mas level. * *
    5. Should the transformation to (equinox based) apparent place be * required rather than (CIO based) intermediate place, subtract the * equation of the origins from the returned right ascension: * RA = RI - EO. (The iauAnp function can then be applied, as * required, to keep the result in the conventional 0-2pi range.) * *
    * Called: *
      *
    • {@link #jauApci13} astrometry parameters, ICRS-CIRS, 2013 *
    • {@link #jauAtciq} quick ICRS to CIRS * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static SphericalCoordinateEO jauAtci13(double rc, double dc, double pr, double pd, double px, double rv, double date1, double date2) { /* Star-independent astrometry parameters */ Astrom astrom = new Astrom(); /* The transformation parameters. */ double eo = jauApci13(date1, date2, astrom); /* ICRS (epoch J2000.0) to CIRS. */ SphericalCoordinate co = jauAtciq(rc, dc, pr, pd, px, rv, astrom); return new SphericalCoordinateEO(co, eo); /* Finished. */ } /** * Quick ICRS, epoch J2000.0, to CIRS transformation, given precomputed * star-independent astrometry parameters. * * Use of this function is appropriate when efficiency is important and * where many star positions are to be transformed for one date. The * star-independent parameters can be obtained by calling one of the * functions iauApci[13], iauApcg[13], iauApco[13] or iauApcs[13]. * * If the parallax and proper motions are zero the iauAtciqz function * can be used instead. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param rc double ICRS RA,Dec at J2000.0 (radians) * @param dc double ICRS RA,Dec at J2000.0 (radians) * @param pr double RA proper motion (radians/year; Note 3) * @param pd double Dec proper motion (radians/year) * @param px double parallax (arcsec) * @param rv double radial velocity (km/s, +ve if receding) * @param astrom star-independent astrometry parameters: * * * @return double Returned CIRS RA,Dec (radians) * *

    Notes: *

      * *
    1. All the vectors are with respect to BCRS axes. * *
    2. Star data for an epoch other than J2000.0 (for example from the * Hipparcos catalog, which has an epoch of J1991.25) will require a * preliminary call to iauPmsafe before use. * *
    3. The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. * *
    * Called: *
      *
    • {@link #jauPmpx} proper motion and parallax *
    • {@link #jauLdsun} light deflection by the Sun *
    • {@link #jauAb} stellar aberration *
    • {@link #jauRxp} product of r-matrix and pv-vector *
    • {@link #jauC2s} p-vector to spherical *
    • {@link #jauAnp} normalize angle into range 0 to 2pi * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static SphericalCoordinate jauAtciq(double rc, double dc, double pr, double pd, double px, double rv, Astrom astrom) { double pco[], pnat[], ppr[], pi[]; /* Proper motion and parallax, giving BCRS coordinate direction. */ pco = jauPmpx(rc, dc, pr, pd, px, rv, astrom.pmt, astrom.eb); /* Light deflection by the Sun, giving BCRS natural direction. */ pnat = jauLdsun(pco, astrom.eh, astrom.em); /* Aberration, giving GCRS proper direction. */ ppr = jauAb(pnat, astrom.v, astrom.em, astrom.bm1); /* Bias-precession-nutation, giving CIRS proper direction. */ pi = jauRxp(astrom.bpn, ppr); /* CIRS RA,Dec. */ SphericalCoordinate co = jauC2s(pi); co.alpha = jauAnp(co.alpha); return co; /* Finished. */ } /** * Quick ICRS, epoch J2000.0, to CIRS transformation, given precomputed * star-independent astrometry parameters plus a list of light- * deflecting bodies. * * Use of this function is appropriate when efficiency is important and * where many star positions are to be transformed for one date. The * star-independent parameters can be obtained by calling one of the * functions iauApci[13], iauApcg[13], iauApco[13] or iauApcs[13]. * * * If the only light-deflecting body to be taken into account is the * Sun, the iauAtciq function can be used instead. If in addition the * parallax and proper motions are zero, the iauAtciqz function can be * used. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param rc double ICRS RA,Dec at J2000.0 (radians) * @param dc double ICRS RA,Dec at J2000.0 (radians) * @param pr double RA proper motion (radians/year; Note 3) * @param pd double Dec proper motion (radians/year) * @param px double parallax (arcsec) * @param rv double radial velocity (km/s, +ve if receding) * @param astrom star-independent astrometry parameters: * @param n int number of bodies (Note 3) * @param b jauLDBODY[n] data for each of the n bodies (Notes 3,4): * * * @return ri,di double Returned CIRS RA,Dec (radians) * *

    Notes: *

      * *
    1. Star data for an epoch other than J2000.0 (for example from the * Hipparcos catalog, which has an epoch of J1991.25) will require a * preliminary call to iauPmsafe before use. * *
    2. The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. * *
    3. The struct b contains n entries, one for each body to be * considered. If n = 0, no gravitational light deflection will be * applied, not even for the Sun. * *
    4. The struct b should include an entry for the Sun as well as for * any planet or other body to be taken into account. The entries * should be in the order in which the light passes the body. * *
    5. In the entry in the b struct for body i, the mass parameter * b[i].bm can, as required, be adjusted in order to allow for such * effects as quadrupole field. * *
    6. The deflection limiter parameter b[i].dl is phi^2/2, where phi is * the angular separation (in radians) between star and body at * which limiting is applied. As phi shrinks below the chosen * threshold, the deflection is artificially reduced, reaching zero * for phi = 0. Example values suitable for a terrestrial * observer, together with masses, are as follows: *
           *        body i     b[i].bm        b[i].dl
           *
           *        Sun        1.0            6e-6
           *        Jupiter    0.00095435     3e-9
           *        Saturn     0.00028574     3e-10
           *     
      *
    7. For efficiency, validation of the contents of the b array is * omitted. The supplied masses must be greater than zero, the * position and velocity vectors must be right, and the deflection * limiter greater than zero. * *
    * Called: *
      *
    • {@link #jauPmpx} proper motion and parallax *
    • {@link #jauLdn} light deflection by n bodies *
    • {@link #jauAb} stellar aberration *
    • {@link #jauRxp} product of r-matrix and pv-vector *
    • {@link #jauC2s} p-vector to spherical *
    • {@link #jauAnp} normalize angle into range 0 to 2pi * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static SphericalCoordinate jauAtciqn(double rc, double dc, double pr, double pd, double px, double rv, Astrom astrom, int n, Ldbody b[]) { double pco[], pnat[], ppr[] = new double[3], pi[] = new double[3]; /* Proper motion and parallax, giving BCRS coordinate direction. */ pco = jauPmpx(rc, dc, pr, pd, px, rv, astrom.pmt, astrom.eb); /* Light deflection, giving BCRS natural direction. */ pnat = jauLdn(n, b, astrom.eb, pco); /* Aberration, giving GCRS proper direction. */ ppr = jauAb(pnat, astrom.v, astrom.em, astrom.bm1); /* Bias-precession-nutation, giving CIRS proper direction. */ pi = jauRxp(astrom.bpn, ppr); /* CIRS RA,Dec. */ SphericalCoordinate co = jauC2s(pi); co.alpha = jauAnp(co.alpha); return co; /* Finished. */ } /** * Quick ICRS to CIRS transformation, given precomputed star- * independent astrometry parameters, and assuming zero parallax and * proper motion. * * Use of this function is appropriate when efficiency is important and * where many star positions are to be transformed for one date. The * star-independent parameters can be obtained by calling one of the * functions iauApci[13], iauApcg[13], iauApco[13] or iauApcs[13]. * * The corresponding function for the case of non-zero parallax and * proper motion is iauAtciq. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param rc double ICRS astrometric RA,Dec (radians) * @param dc double ICRS astrometric RA,Dec (radians) * @param astrom star-independent astrometry parameters: * * * @return ri,di double Returned CIRS RA,Dec (radians) * * Note: * * @return All the Returned vectors are with respect to BCRS axes. * *

    References: *

      * *
    • Urban, S. & Seidelmann, P. K. (eds), Explanatory Supplement to * the Astronomical Almanac, 3rd ed., University Science Books * (2013). * *
    • Klioner, Sergei A., "A practical relativistic model for micro- * arcsecond astrometry in space", Astr. J. 125, 1580-1597 (2003). * *
    * Called: *
      *
    • {@link #jauS2c} spherical coordinates to unit vector *
    • {@link #jauLdsun} light deflection due to Sun *
    • {@link #jauAb} stellar aberration *
    • {@link #jauRxp} product of r-matrix and p-vector *
    • {@link #jauC2s} p-vector to spherical *
    • {@link #jauAnp} normalize angle into range +/- pi * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static SphericalCoordinate jauAtciqz(double rc, double dc, Astrom astrom) { double pco[], pnat[], ppr[] = new double[3], pi[]; /* BCRS coordinate direction (unit vector). */ pco = jauS2c(rc, dc); /* Light deflection by the Sun, giving BCRS natural direction. */ pnat = jauLdsun(pco, astrom.eh, astrom.em); /* Aberration, giving GCRS proper direction. */ ppr = jauAb(pnat, astrom.v, astrom.em, astrom.bm1); /* Bias-precession-nutation, giving CIRS proper direction. */ pi = jauRxp(astrom.bpn, ppr); /* CIRS RA,Dec. */ SphericalCoordinate co = jauC2s(pi); co.alpha = jauAnp(co.alpha); return co; /* Finished. */ } /** * ICRS RA,Dec to observed place. The caller supplies UTC, site * coordinates, ambient air conditions and observing wavelength. * * SOFA models are used for the Earth ephemeris, bias-precession- * nutation, Earth orientation and refraction. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param rc double ICRS right ascension at J2000.0 (radians, Note 1) * @param dc double ICRS right ascension at J2000.0 (radians, Note 1) * @param pr double RA proper motion (radians/year; Note 2) * @param pd double Dec proper motion (radians/year) * @param px double parallax (arcsec) * @param rv double radial velocity (km/s, +ve if receding) * @param utc1 double UTC as a 2-part... * @param utc2 double ...quasi Julian Date (Notes 3-4) * @param dut1 double UT1-UTC (seconds, Note 5) * @param elong double longitude (radians, east +ve, Note 6) * @param phi double latitude (geodetic, radians, Note 6) * @param hm double height above ellipsoid (m, geodetic, Notes 6,8) * @param xp double polar motion coordinates (radians, Note 7) * @param yp double polar motion coordinates (radians, Note 7) * @param phpa double pressure at the observer (hPa = mB, Note 8) * @param tc double ambient temperature at the observer (deg C) * @param rh double relative humidity at the observer (range 0-1) * @param wl double wavelength (micrometers, Note 9) * * * @return aob double* Returned observed azimuth (radians: N=0,E=90) * zob double* Returned observed zenith distance (radians) * hob double* Returned observed hour angle (radians) * dob double* Returned observed declination (radians) * rob double* Returned observed right ascension (CIO-based, radians) * eo double* Returned equation of the origins (ERA-GST) * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter int status: Returned +1 = dubious year (Note 4) * 0 = Returned OK * -1 = Returned unacceptable date * *

    Notes: *

      * *
    1. Star data for an epoch other than J2000.0 (for example from the * Hipparcos catalog, which has an epoch of J1991.25) will require * a preliminary call to iauPmsafe before use. * *
    2. The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. * *
    3. utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any * convenient way between the two arguments, for example where utc1 * is the Julian Day Number and utc2 is the fraction of a day. * *

      However, JD cannot unambiguously represent UTC during a leap * second unless special measures are taken. The convention in the * present function is that the JD day represents UTC days whether * the length is 86399, 86400 or 86401 SI seconds. * *

      Applications should use the function iauDtf2d to convert from * calendar date and time of day into 2-part quasi Julian Date, as * it implements the leap-second-ambiguity convention just * described. * *

    4. The warning status "dubious year" flags UTCs that predate the * introduction of the time scale or that are too far in the * future to be trusted. See iauDat for further details. * *
    5. UT1-UTC is tabulated in IERS bulletins. It increases by exactly * one second at the end of each positive UTC leap second, * introduced in order to keep UT1-UTC within +/- 0.9s. n.b. This * practice is under review, and in the future UT1-UTC may grow * essentially without limit. * *
    6. The geographical coordinates are with respect to the WGS84 * reference ellipsoid. TAKE CARE WITH THE LONGITUDE SIGN: the * longitude required by the present function is east-positive * (i.e. right-handed), in accordance with geographical convention. * *
    7. The polar motion xp,yp can be obtained from IERS bulletins. The * values are the coordinates (in radians) of the Celestial * Intermediate Pole with respect to the International Terrestrial * Reference System (see IERS Conventions 2003), measured along the * meridians 0 and 90 deg west respectively. For many * applications, xp and yp can be set to zero. * *
    8. If hm, the height above the ellipsoid of the observing station * in meters, is not known but phpa, the pressure in hPa (=mB), * is available, an adequate estimate of hm can be obtained from * the expression * *

      hm = -29.3 * tsl * log ( phpa / 1013.25 ); * *

      where tsl is the approximate sea-level air temperature in K * (See Astrophysical Quantities, C.W.Allen, 3rd edition, section * 52). Similarly, if the pressure phpa is not known, it can be * estimated from the height of the observing station, hm, as * follows: * *

      phpa = 1013.25 * exp ( -hm / ( 29.3 * tsl ) ); * *

      Note, however, that the refraction is nearly proportional to * the pressure and that an accurate phpa value is important for * precise work. * *

    9. The argument wl specifies the observing wavelength in * micrometers. The transition from optical to radio is assumed to * occur at 100 micrometers (about 3000 GHz). * *
    10. The accuracy of the result is limited by the corrections for * refraction, which use a simple A*tan(z) + B*tan^3(z) model. * Providing the meteorological parameters are known accurately and * there are no gross local effects, the predicted observed * coordinates should be within 0.05 arcsec (optical) or 1 arcsec * (radio) for a zenith distance of less than 70 degrees, better * than 30 arcsec (optical or radio) at 85 degrees and better * than 20 arcmin (optical) or 30 arcmin (radio) at the horizon. * *

      Without refraction, the complementary functions iauAtco13 and * iauAtoc13 are self-consistent to better than 1 microarcsecond * all over the celestial sphere. With refraction included, * consistency falls off at high zenith distances, but is still * better than 0.05 arcsec at 85 degrees. * *

    11. "Observed" Az,ZD means the position that would be seen by a * perfect geodetically aligned theodolite. (Zenith distance is * used rather than altitude in order to reflect the fact that no * allowance is made for depression of the horizon.) This is * related to the observed HA,Dec via the standard rotation, using * the geodetic latitude (corrected for polar motion), while the * observed HA and RA are related simply through the Earth rotation * angle and the site longitude. "Observed" RA,Dec or HA,Dec thus * means the position that would be seen by a perfect equatorial * with its polar axis aligned to the Earth's axis of rotation. * *
    12. It is advisable to take great care with units, as even unlikely * values of the input parameters are accepted and processed in * accordance with the models used. * *
    * Called: *
      *
    • {@link #jauApco13} astrometry parameters, ICRS-observed, 2013 *
    • {@link #jauAtciq} quick ICRS to CIRS *
    • {@link #jauAtioq} quick ICRS to observed * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter unacceptable date. */ public static ObservedPositionEO jauAtco13(double rc, double dc, double pr, double pd, double px, double rv, double utc1, double utc2, double dut1, double elong, double phi, double hm, double xp, double yp, double phpa, double tc, double rh, double wl) throws JSOFAIllegalParameter, JSOFAInternalError { Astrom astrom = new Astrom(); /* Star-independent astrometry parameters. */ double eo = jauApco13(utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl, astrom); /* Transform ICRS to CIRS. */ SphericalCoordinate co = jauAtciq(rc, dc, pr, pd, px, rv, astrom); /* Transform CIRS to observed. */ ObservedPosition obs = jauAtioq(co.alpha, co.delta, astrom); return new ObservedPositionEO(obs, eo); /* Finished. */ } /** * Transform star RA,Dec from geocentric CIRS to ICRS astrometric. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param ri double CIRS geocentric RA,Dec (radians) * @param di double CIRS geocentric RA,Dec (radians) * @param date1 double TDB as a 2-part... * @param date2 double ...Julian Date (Note 1) * * * @return rc,dc double Returned ICRS astrometric RA,Dec (radians) * eo double Returned equation of the origins (ERA-GST, Note 4) * *

    Notes: *

      * *
    1. The TDB date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TDB)=2450123.7 could be expressed in any of these ways, among * others: * * date1 date2 * * 2450123.7 0.0 (JD method) * 2451545.0 -1421.3 (J2000 method) * 2400000.5 50123.2 (MJD method) * 2450123.5 0.2 (date & time method) * *

      The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 method is best matched to the way the * argument is handled internally and will deliver the optimum * resolution. The MJD method and the date & time methods are both * good compromises between resolution and convenience. For most * applications of this function the choice will not be at all * critical. * *

      TT can be used instead of TDB without any significant impact on * accuracy. * *

    2. Iterative techniques are used for the aberration and light * deflection corrections so that the functions iauAtic13 (or * iauAticq) and iauAtci13 (or iauAtciq) are accurate inverses; * even at the edge of the Sun's disk the discrepancy is only about * 1 nanoarcsecond. * *
    3. The available accuracy is better than 1 milliarcsecond, limited * mainly by the precession-nutation model that is used, namely * IAU 2000A/2006. Very close to solar system bodies, additional * errors of up to several milliarcseconds can occur because of * unmodeled light deflection; however, the Sun's contribution is * taken into account, to first order. The accuracy limitations of * the SOFA function iauEpv00 (used to compute Earth position and * velocity) can contribute aberration errors of up to * 5 microarcseconds. Light deflection at the Sun's limb is * uncertain at the 0.4 mas level. * *
    4. Should the transformation to (equinox based) J2000.0 mean place * be required rather than (CIO based) ICRS coordinates, subtract the * equation of the origins from the returned right ascension: * RA = RI - EO. (The iauAnp function can then be applied, as * required, to keep the result in the conventional 0-2pi range.) * *
    * Called: *
      *
    • {@link #jauApci13} astrometry parameters, ICRS-CIRS, 2013 *
    • {@link #jauAticq} quick CIRS to ICRS astrometric * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static SphericalCoordinateEO jauAtic13(double ri, double di, double date1, double date2) { /* Star-independent astrometry parameters */ Astrom astrom = new Astrom(); /* Star-independent astrometry parameters. */ double eo = jauApci13(date1, date2, astrom); /* CIRS to ICRS astrometric. */ SphericalCoordinate co = jauAticq(ri, di, astrom); return new SphericalCoordinateEO(co,eo); /* Finished. */ } /** * Quick CIRS RA,Dec to ICRS astrometric place, given the star- * independent astrometry parameters. * * Use of this function is appropriate when efficiency is important and * where many star positions are all to be transformed for one date. * The star-independent astrometry parameters can be obtained by * calling one of the functions iauApci[13], iauApcg[13], iauApco[13] * or iauApcs[13]. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param ri double CIRS RA,Dec (radians) * @param di double CIRS RA,Dec (radians) * @param astrom star-independent astrometry parameters: * * * @return rc,dc double Returned ICRS astrometric RA,Dec (radians) * *

    Notes: *

      * *
    1. Only the Sun is taken into account in the light deflection * correction. * *
    2. Iterative techniques are used for the aberration and light * deflection corrections so that the functions iauAtic13 (or * iauAticq) and iauAtci13 (or iauAtciq) are accurate inverses; * even at the edge of the Sun's disk the discrepancy is only about * 1 nanoarcsecond. * *
    * Called: *
      *
    • {@link #jauS2c} spherical coordinates to unit vector *
    • {@link #jauTrxp} product of transpose of r-matrix and p-vector *
    • {@link #jauZp} zero p-vector *
    • {@link #jauAb} stellar aberration *
    • {@link #jauLdsun} light deflection by the Sun *
    • {@link #jauC2s} p-vector to spherical *
    • {@link #jauAnp} normalize angle into range +/- pi * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static SphericalCoordinate jauAticq(double ri, double di, Astrom astrom ) { int j, i; double pi[] , ppr[], pnat[] = new double[3], pco[] = new double[3], w, d[] = new double[3], before[] = new double[3], r2, r, after[]; /* CIRS RA,Dec to Cartesian. */ pi = jauS2c(ri, di); /* Bias-precession-nutation, giving GCRS proper direction. */ ppr = jauTrxp(astrom.bpn, pi); /* Aberration, giving GCRS natural direction. */ jauZp(d); for (j = 0; j < 2; j++) { r2 = 0.0; for (i = 0; i < 3; i++) { w = ppr[i] - d[i]; before[i] = w; r2 += w*w; } r = sqrt(r2); for (i = 0; i < 3; i++) { before[i] /= r; } after = jauAb(before, astrom.v, astrom.em, astrom.bm1); r2 = 0.0; for (i = 0; i < 3; i++) { d[i] = after[i] - before[i]; w = ppr[i] - d[i]; pnat[i] = w; r2 += w*w; } r = sqrt(r2); for (i = 0; i < 3; i++) { pnat[i] /= r; } } /* Light deflection by the Sun, giving BCRS coordinate direction. */ jauZp(d); for (j = 0; j < 5; j++) { r2 = 0.0; for (i = 0; i < 3; i++) { w = pnat[i] - d[i]; before[i] = w; r2 += w*w; } r = sqrt(r2); for (i = 0; i < 3; i++) { before[i] /= r; } after = jauLdsun(before, astrom.eh, astrom.em); r2 = 0.0; for (i = 0; i < 3; i++) { d[i] = after[i] - before[i]; w = pnat[i] - d[i]; pco[i] = w; r2 += w*w; } r = sqrt(r2); for (i = 0; i < 3; i++) { pco[i] /= r; } } /* ICRS astrometric RA,Dec. */ SphericalCoordinate co = jauC2s(pco); co.alpha = jauAnp(co.alpha); return co; /* Finished. */ } /** * Quick CIRS to ICRS astrometric place transformation, given the star- * independent astrometry parameters plus a list of light-deflecting * bodies. * * Use of this function is appropriate when efficiency is important and * where many star positions are all to be transformed for one date. * The star-independent astrometry parameters can be obtained by * calling one of the functions iauApci[13], iauApcg[13], iauApco[13] * or iauApcs[13]. * * If the only light-deflecting body to be taken into account is the * Sun, the iauAticq function can be used instead. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param ri double CIRS RA,Dec (radians) * @param di double CIRS RA,Dec (radians) * @param astrom star-independent astrometry parameters: * @param n number of bodies. * @param b[] data for each of the n bodies. * * * @return ICRS astrometric RA,Dec (radians) * *

    Notes: *

      * *
    1. Iterative techniques are used for the aberration and light * deflection corrections so that the functions iauAticqn and * iauAtciqn are accurate inverses; even at the edge of the Sun's * disk the discrepancy is only about 1 nanoarcsecond. * *
    2. If the only light-deflecting body to be taken into account is the * Sun, the iauAticq function can be used instead. * *
    3. The struct b contains n entries, one for each body to be * considered. If n = 0, no gravitational light deflection will be * applied, not even for the Sun. * *
    4. The struct b should include an entry for the Sun as well as for * any planet or other body to be taken into account. The entries * should be in the order in which the light passes the body. * *
    5. In the entry in the b struct for body i, the mass parameter * b[i].bm can, as required, be adjusted in order to allow for such * effects as quadrupole field. * *
    6. The deflection limiter parameter b[i].dl is phi^2/2, where phi is * the angular separation (in radians) between star and body at * which limiting is applied. As phi shrinks below the chosen * threshold, the deflection is artificially reduced, reaching zero * for phi = 0. Example values suitable for a terrestrial * observer, together with masses, are as follows: * *

      body i b[i].bm b[i].dl * *

      Sun 1.0 6e-6 * Jupiter 0.00095435 3e-9 * Saturn 0.00028574 3e-10 * *

    7. For efficiency, validation of the contents of the b array is * omitted. The supplied masses must be greater than zero, the * position and velocity vectors must be right, and the deflection * limiter greater than zero. * *
    * Called: *
      *
    • {@link #jauS2c} spherical coordinates to unit vector *
    • {@link #jauTrxp} product of transpose of r-matrix and p-vector *
    • {@link #jauZp} zero p-vector *
    • {@link #jauAb} stellar aberration *
    • {@link #jauLdn} light deflection by n bodies *
    • {@link #jauC2s} p-vector to spherical *
    • {@link #jauAnp} normalize angle into range +/- pi * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static SphericalCoordinate jauAticqn(double ri, double di, Astrom astrom, int n, Ldbody b[]) { int j, i; double pi[], ppr[], pnat[] = new double[3], pco[] = new double[3], w, d[] = new double[3], before[] = new double[3], r2, r, after[]; /* CIRS RA,Dec to Cartesian. */ pi = jauS2c(ri, di); /* Bias-precession-nutation, giving GCRS proper direction. */ ppr = jauTrxp(astrom.bpn, pi); /* Aberration, giving GCRS natural direction. */ jauZp(d); for (j = 0; j < 2; j++) { r2 = 0.0; for (i = 0; i < 3; i++) { w = ppr[i] - d[i]; before[i] = w; r2 += w*w; } r = sqrt(r2); for (i = 0; i < 3; i++) { before[i] /= r; } after = jauAb(before, astrom.v, astrom.em, astrom.bm1); r2 = 0.0; for (i = 0; i < 3; i++) { d[i] = after[i] - before[i]; w = ppr[i] - d[i]; pnat[i] = w; r2 += w*w; } r = sqrt(r2); for (i = 0; i < 3; i++) { pnat[i] /= r; } } /* Light deflection, giving BCRS coordinate direction. */ jauZp(d); for (j = 0; j < 5; j++) { r2 = 0.0; for (i = 0; i < 3; i++) { w = pnat[i] - d[i]; before[i] = w; r2 += w*w; } r = sqrt(r2); for (i = 0; i < 3; i++) { before[i] /= r; } after = jauLdn(n, b, astrom.eb, before); r2 = 0.0; for (i = 0; i < 3; i++) { d[i] = after[i] - before[i]; w = pnat[i] - d[i]; pco[i] = w; r2 += w*w; } r = sqrt(r2); for (i = 0; i < 3; i++) { pco[i] /= r; } } /* ICRS astrometric RA,Dec. */ SphericalCoordinate co = jauC2s(pco); co.alpha = jauAnp(co.alpha); return co; /* Finished. */ } /** * Observed Position. * "Observed" Az,ZD means the position that would be seen by a * perfect geodetically aligned theodolite. (Zenith distance is * used rather than altitude in order to reflect the fact that no * allowance is made for depression of the horizon.) This is * related to the observed HA,Dec via the standard rotation, using * the geodetic latitude (corrected for polar motion), while the * observed HA and RA are related simply through the Earth rotation * angle and the site longitude. "Observed" RA,Dec or HA,Dec thus * means the position that would be seen by a perfect equatorial * with its polar axis aligned to the Earth's axis of rotation.. * @author Paul Harrison (paul.harrison@manchester.ac.uk) 28 Mar 2014 * @version $Revision$ $date$ */ public static class ObservedPosition{ /** observed azimuth (radians: N=0,E=90) */ public double aob; /** observed zenith distance (radians) */ public double zob; /** observed Hour Angle (radians) */ public double hob; /** observed Declination (radians) */ public double dob; /** observed Right Ascension (radians) */ public double rob; public ObservedPosition(double aob, double zob, double hob, double dob, double rob ) { this.aob = aob; this.zob = zob; this.hob = hob; this.dob = dob; this.rob = rob; } } /** * Observed position with the equation of the origins. * @author Paul Harrison (paul.harrison@manchester.ac.uk) 29 Mar 2014 * @version $Revision$ $date$ */ public static class ObservedPositionEO { /** * observed position. */ public ObservedPosition op; /** * The equation of the origins. The equation of the origins is the distance between the true * equinox and the celestial intermediate origin and, equivalently, * the difference between Earth rotation angle and Greenwich * apparent sidereal time (ERA-GST). It comprises the precession * (since J2000.0) in right ascension plus the equation of the * equinoxes (including the small correction terms). */ public double eo; /** * @param op the observed position. * @param eo the equation of the origins. */ public ObservedPositionEO(ObservedPosition op, double eo) { this.op = op; this.eo = eo; } } /** * CIRS RA,Dec to observed place. The caller supplies UTC, site * coordinates, ambient air conditions and observing wavelength. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param ri double CIRS right ascension (CIO-based, radians) * @param di double CIRS declination (radians) * @param utc1 double UTC as a 2-part... * @param utc2 double ...quasi Julian Date (Notes 1,2) * @param dut1 double UT1-UTC (seconds, Note 3) * @param elong double longitude (radians, east +ve, Note 4) * @param phi double geodetic latitude (radians, Note 4) * @param hm double height above ellipsoid (m, geodetic Notes 4,6) * @param xp double polar motion coordinates (radians, Note 5) * @param yp double polar motion coordinates (radians, Note 5) * @param phpa double pressure at the observer (hPa = mB, Note 6) * @param tc double ambient temperature at the observer (deg C) * @param rh double relative humidity at the observer (range 0-1) * @param wl double wavelength (micrometers, Note 7) * * * @return aob double* Returned observed azimuth (radians: N=0,E=90) * zob double* Returned observed zenith distance (radians) * hob double* Returned observed hour angle (radians) * dob double* Returned observed declination (radians) * rob double* Returned observed right ascension (CIO-based, radians) * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter int status: Returned +1 = dubious year (Note 2) * 0 = Returned OK * -1 = Returned unacceptable date * *

    Notes: *

      * *
    1. utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any * convenient way between the two arguments, for example where utc1 * is the Julian Day Number and utc2 is the fraction of a day. * *

      However, JD cannot unambiguously represent UTC during a leap * second unless special measures are taken. The convention in the * present function is that the JD day represents UTC days whether * the length is 86399, 86400 or 86401 SI seconds. * *

      Applications should use the function iauDtf2d to convert from * calendar date and time of day into 2-part quasi Julian Date, as * it implements the leap-second-ambiguity convention just * described. * *

    2. The warning status "dubious year" flags UTCs that predate the * introduction of the time scale or that are too far in the * future to be trusted. See iauDat for further details. * *
    3. UT1-UTC is tabulated in IERS bulletins. It increases by exactly * one second at the end of each positive UTC leap second, * introduced in order to keep UT1-UTC within +/- 0.9s. n.b. This * practice is under review, and in the future UT1-UTC may grow * essentially without limit. * *
    4. The geographical coordinates are with respect to the WGS84 * reference ellipsoid. TAKE CARE WITH THE LONGITUDE SIGN: the * longitude required by the present function is east-positive * (i.e. right-handed), in accordance with geographical convention. * *
    5. The polar motion xp,yp can be obtained from IERS bulletins. The * values are the coordinates (in radians) of the Celestial * Intermediate Pole with respect to the International Terrestrial * Reference System (see IERS Conventions 2003), measured along the * meridians 0 and 90 deg west respectively. For many * applications, xp and yp can be set to zero. * *
    6. If hm, the height above the ellipsoid of the observing station * in meters, is not known but phpa, the pressure in hPa (=mB), is * available, an adequate estimate of hm can be obtained from the * expression * *

      hm = -29.3 * tsl * log ( phpa / 1013.25 ); * *

      where tsl is the approximate sea-level air temperature in K * (See Astrophysical Quantities, C.W.Allen, 3rd edition, section * 52). Similarly, if the pressure phpa is not known, it can be * estimated from the height of the observing station, hm, as * follows: * *

      phpa = 1013.25 * exp ( -hm / ( 29.3 * tsl ) ); * *

      Note, however, that the refraction is nearly proportional to * the pressure and that an accurate phpa value is important for * precise work. * *

    7. The argument wl specifies the observing wavelength in * micrometers. The transition from optical to radio is assumed to * occur at 100 micrometers (about 3000 GHz). * *
    8. "Observed" Az,ZD means the position that would be seen by a * perfect geodetically aligned theodolite. (Zenith distance is * used rather than altitude in order to reflect the fact that no * allowance is made for depression of the horizon.) This is * related to the observed HA,Dec via the standard rotation, using * the geodetic latitude (corrected for polar motion), while the * observed HA and RA are related simply through the Earth rotation * angle and the site longitude. "Observed" RA,Dec or HA,Dec thus * means the position that would be seen by a perfect equatorial * with its polar axis aligned to the Earth's axis of rotation. * *
    9. The accuracy of the result is limited by the corrections for * refraction, which use a simple A*tan(z) + B*tan^3(z) model. * Providing the meteorological parameters are known accurately and * there are no gross local effects, the predicted astrometric * coordinates should be within 0.05 arcsec (optical) or 1 arcsec * (radio) for a zenith distance of less than 70 degrees, better * than 30 arcsec (optical or radio) at 85 degrees and better * than 20 arcmin (optical) or 30 arcmin (radio) at the horizon. * *
    10. The complementary functions iauAtio13 and iauAtoi13 are self- * consistent to better than 1 microarcsecond all over the * celestial sphere. * *
    11. It is advisable to take great care with units, as even unlikely * values of the input parameters are accepted and processed in * accordance with the models used. * *
    * Called: *
      *
    • {@link #jauApio13} astrometry parameters, CIRS-observed, 2013 *
    • {@link #jauAtioq} quick CIRS to observed * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter unacceptable date. */ public static ObservedPosition jauAtio13(double ri, double di, double utc1, double utc2, double dut1, double elong, double phi, double hm, double xp, double yp, double phpa, double tc, double rh, double wl) throws JSOFAIllegalParameter, JSOFAInternalError { Astrom astrom = new Astrom(); /* Star-independent astrometry parameters for CIRS->observed. */ jauApio13(utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl, astrom); /* Transform CIRS to observed. */ return jauAtioq(ri, di, astrom); /* Finished. */ } /** * Quick CIRS to observed place transformation. * * Use of this function is appropriate when efficiency is important and * where many star positions are all to be transformed for one date. * The star-independent astrometry parameters can be obtained by * calling iauApio[13] or iauApco[13]. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param ri double CIRS right ascension * @param di double CIRS declination * @param astrom star-independent astrometry parameters: * * * @return aob double* Returned observed azimuth (radians: N=0,E=90) * zob double* Returned observed zenith distance (radians) * hob double* Returned observed hour angle (radians) * dob double* Returned observed declination (radians) * rob double* Returned observed right ascension (CIO-based, radians) * *

    Notes: *

      * *
    1. This function returns zenith distance rather than altitude in * order to reflect the fact that no allowance is made for * depression of the horizon. * *
    2. The accuracy of the result is limited by the corrections for * refraction, which use a simple A*tan(z) + B*tan^3(z) model. * Providing the meteorological parameters are known accurately and * there are no gross local effects, the predicted observed * coordinates should be within 0.05 arcsec (optical) or 1 arcsec * (radio) for a zenith distance of less than 70 degrees, better * than 30 arcsec (optical or radio) at 85 degrees and better * than 20 arcmin (optical) or 30 arcmin (radio) at the horizon. * *

      Without refraction, the complementary functions iauAtioq and * iauAtoiq are self-consistent to better than 1 microarcsecond all * over the celestial sphere. With refraction included, consistency * falls off at high zenith distances, but is still better than * 0.05 arcsec at 85 degrees. * *

    3. It is advisable to take great care with units, as even unlikely * values of the input parameters are accepted and processed in * accordance with the models used. * *
    4. The CIRS RA,Dec is obtained from a star catalog mean place by * allowing for space motion, parallax, the Sun's gravitational lens * effect, annual aberration and precession-nutation. For star * positions in the ICRS, these effects can be applied by means of * the iauAtci13 (etc.) functions. Starting from classical "mean * place" systems, additional transformations will be needed first. * *
    5. "Observed" Az,El means the position that would be seen by a * perfect geodetically aligned theodolite. This is obtained from * the CIRS RA,Dec by allowing for Earth orientation and diurnal * aberration, rotating from equator to horizon coordinates, and * then adjusting for refraction. The HA,Dec is obtained by * rotating back into equatorial coordinates, and is the position * that would be seen by a perfect equatorial with its polar axis * aligned to the Earth's axis of rotation. Finally, the RA is * obtained by subtracting the HA from the local ERA. * *
    6. The star-independent CIRS-to-observed-place parameters in ASTROM * may be computed with iauApio[13] or iauApco[13]. If nothing has * changed significantly except the time, iauAper[13] may be used to * perform the requisite adjustment to the astrom structure. * *
    * Called: *
      *
    • {@link #jauS2c} spherical coordinates to unit vector *
    • {@link #jauC2s} p-vector to spherical *
    • {@link #jauAnp} normalize angle into range 0 to 2pi * *
    *@version 2013 December 5 * *@since JSOFA release 20131202 * * */ public static ObservedPosition jauAtioq(double ri, double di, Astrom astrom) { /* Minimum cos(alt) and sin(alt) for refraction purposes */ final double CELMIN = 1e-6; final double SELMIN = 0.05; double v[] = new double[3], x, y, z, sx, cx, sy, cy, xhd, yhd, zhd, f, xhdt, yhdt, zhdt, xaet, yaet, zaet, azobs, r, tz, w, del, cosdel, xaeo, yaeo, zaeo, zdobs, hmobs, dcobs, raobs; /*--------------------------------------------------------------------*/ /* CIRS RA,Dec to Cartesian -HA,Dec. */ v = jauS2c(ri-astrom.eral, di); x = v[0]; y = v[1]; z = v[2]; /* Polar motion. */ sx = sin(astrom.xpl); cx = cos(astrom.xpl); sy = sin(astrom.ypl); cy = cos(astrom.ypl); xhd = cx*x + sx*z; yhd = sx*sy*x + cy*y - cx*sy*z; zhd = -sx*cy*x + sy*y + cx*cy*z; /* Diurnal aberration. */ f = ( 1.0 - astrom.diurab*yhd ); xhdt = f * xhd; yhdt = f * ( yhd + astrom.diurab ); zhdt = f * zhd; /* Cartesian -HA,Dec to Cartesian Az,El (S=0,E=90). */ xaet = astrom.sphi*xhdt - astrom.cphi*zhdt; yaet = yhdt; zaet = astrom.cphi*xhdt + astrom.sphi*zhdt; /* Azimuth (N=0,E=90). */ azobs = ( xaet != 0.0 || yaet != 0.0 ) ? atan2(yaet,-xaet) : 0.0; /* ---------- */ /* Refraction */ /* ---------- */ /* Cosine and sine of altitude, with precautions. */ r = sqrt(xaet*xaet + yaet*yaet); r = r > CELMIN ? r : CELMIN; z = zaet > SELMIN ? zaet : SELMIN; /* A*tan(z)+B*tan^3(z) model, with Newton-Raphson correction. */ tz = r/z; w = astrom.refb*tz*tz; del = ( astrom.refa + w ) * tz / ( 1.0 + ( astrom.refa + 3.0*w ) / ( z*z ) ); /* Apply the change, giving observed vector. */ cosdel = 1.0 - del*del/2.0; f = cosdel - del*z/r; xaeo = xaet*f; yaeo = yaet*f; zaeo = cosdel*zaet + del*r; /* Observed ZD. */ zdobs = atan2(sqrt(xaeo*xaeo+yaeo*yaeo), zaeo); /* Az/El vector to HA,Dec vector (both right-handed). */ v[0] = astrom.sphi*xaeo + astrom.cphi*zaeo; v[1] = yaeo; v[2] = - astrom.cphi*xaeo + astrom.sphi*zaeo; /* To spherical -HA,Dec. */ SphericalCoordinate co = jauC2s ( v); hmobs = co.alpha; dcobs = co.delta; /* Right ascension (with respect to CIO). */ raobs = astrom.eral + hmobs; /* Return the results. */ return new ObservedPosition( jauAnp(azobs), zdobs, -hmobs, dcobs, jauAnp(raobs)); /* Finished. */ } /** * Observed place at a groundbased site to to ICRS astrometric RA,Dec. * The caller supplies UTC, site coordinates, ambient air conditions * and observing wavelength. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param type char[] type of coordinates - "R", "H" or "A" (Notes 1,2) * @param ob1 double observed Az, HA or RA (radians; Az is N=0,E=90) * @param ob2 double observed ZD or Dec (radians) * @param utc1 double UTC as a 2-part... * @param utc2 double ...quasi Julian Date (Notes 3,4) * @param dut1 double UT1-UTC (seconds, Note 5) * @param elong double longitude (radians, east +ve, Note 6) * @param phi double geodetic latitude (radians, Note 6) * @param hm double height above ellipsoid (m, geodetic Notes 6,8) * @param xp double polar motion coordinates (radians, Note 7) * @param yp double polar motion coordinates (radians, Note 7) * @param phpa double pressure at the observer (hPa = mB, Note 8) * @param tc double ambient temperature at the observer (deg C) * @param rh double relative humidity at the observer (range 0-1) * @param wl double wavelength (micrometers, Note 9) * * * @return rc,dc double Returned ICRS astrometric RA,Dec (radians) * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter int status: Returned +1 = dubious year (Note 4) * 0 = Returned OK * -1 = Returned unacceptable date * *

    Notes: *

      * *
    1. "Observed" Az,ZD means the position that would be seen by a * perfect geodetically aligned theodolite. (Zenith distance is * used rather than altitude in order to reflect the fact that no * allowance is made for depression of the horizon.) This is * related to the observed HA,Dec via the standard rotation, using * the geodetic latitude (corrected for polar motion), while the * observed HA and RA are related simply through the Earth rotation * angle and the site longitude. "Observed" RA,Dec or HA,Dec thus * means the position that would be seen by a perfect equatorial * with its polar axis aligned to the Earth's axis of rotation. * *
    2. Only the first character of the type argument is significant. * "R" or "r" indicates that ob1 and ob2 are the observed right * ascension and declination; "H" or "h" indicates that they are * hour angle (west +ve) and declination; anything else ("A" or * "a" is recommended) indicates that ob1 and ob2 are azimuth * (north zero, east 90 deg) and zenith distance. * *
    3. utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any * convenient way between the two arguments, for example where utc1 * is the Julian Day Number and utc2 is the fraction of a day. * *

      However, JD cannot unambiguously represent UTC during a leap * second unless special measures are taken. The convention in the * present function is that the JD day represents UTC days whether * the length is 86399, 86400 or 86401 SI seconds. * *

      Applications should use the function iauDtf2d to convert from * calendar date and time of day into 2-part quasi Julian Date, as * it implements the leap-second-ambiguity convention just * described. * *

    4. The warning status "dubious year" flags UTCs that predate the * introduction of the time scale or that are too far in the * future to be trusted. See iauDat for further details. * *
    5. UT1-UTC is tabulated in IERS bulletins. It increases by exactly * one second at the end of each positive UTC leap second, * introduced in order to keep UT1-UTC within +/- 0.9s. n.b. This * practice is under review, and in the future UT1-UTC may grow * essentially without limit. * *
    6. The geographical coordinates are with respect to the WGS84 * reference ellipsoid. TAKE CARE WITH THE LONGITUDE SIGN: the * longitude required by the present function is east-positive * (i.e. right-handed), in accordance with geographical convention. * *
    7. The polar motion xp,yp can be obtained from IERS bulletins. The * values are the coordinates (in radians) of the Celestial * Intermediate Pole with respect to the International Terrestrial * Reference System (see IERS Conventions 2003), measured along the * meridians 0 and 90 deg west respectively. For many * applications, xp and yp can be set to zero. * *
    8. If hm, the height above the ellipsoid of the observing station * in meters, is not known but phpa, the pressure in hPa (=mB), is * available, an adequate estimate of hm can be obtained from the * expression * *

      hm = -29.3 * tsl * log ( phpa / 1013.25 ); * *

      where tsl is the approximate sea-level air temperature in K * (See Astrophysical Quantities, C.W.Allen, 3rd edition, section * 52). Similarly, if the pressure phpa is not known, it can be * estimated from the height of the observing station, hm, as * follows: * *

      phpa = 1013.25 * exp ( -hm / ( 29.3 * tsl ) ); * *

      Note, however, that the refraction is nearly proportional to * the pressure and that an accurate phpa value is important for * precise work. * *

    9. The argument wl specifies the observing wavelength in * micrometers. The transition from optical to radio is assumed to * occur at 100 micrometers (about 3000 GHz). * *
    10. The accuracy of the result is limited by the corrections for * refraction, which use a simple A*tan(z) + B*tan^3(z) model. * Providing the meteorological parameters are known accurately and * there are no gross local effects, the predicted astrometric * coordinates should be within 0.05 arcsec (optical) or 1 arcsec * (radio) for a zenith distance of less than 70 degrees, better * than 30 arcsec (optical or radio) at 85 degrees and better * than 20 arcmin (optical) or 30 arcmin (radio) at the horizon. * *

      Without refraction, the complementary functions iauAtco13 and * iauAtoc13 are self-consistent to better than 1 microarcsecond * all over the celestial sphere. With refraction included, * consistency falls off at high zenith distances, but is still * better than 0.05 arcsec at 85 degrees. * *

    11. It is advisable to take great care with units, as even unlikely * values of the input parameters are accepted and processed in * accordance with the models used. * *
    * Called: *
      *
    • {@link #jauApco13} astrometry parameters, ICRS-observed *
    • {@link #jauAtoiq} quick observed to CIRS *
    • {@link #jauAticq} quick CIRS to ICRS * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter unacceptable date. */ public static SphericalCoordinate jauAtoc13(String type, double ob1, double ob2, double utc1, double utc2, double dut1, double elong, double phi, double hm, double xp, double yp, double phpa, double tc, double rh, double wl ) throws JSOFAIllegalParameter, JSOFAInternalError { Astrom astrom = new Astrom(); jauApco13(utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl, astrom); /* Transform observed to CIRS. */ SphericalCoordinate co = jauAtoiq(type, ob1, ob2, astrom); /* Transform CIRS to ICRS. */ SphericalCoordinate icrs = jauAticq(co.alpha, co.delta, astrom); return icrs; /* Finished. */ } /** * Observed place to CIRS. The caller supplies UTC, site coordinates, * ambient air conditions and observing wavelength. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param type char[] type of coordinates - "R", "H" or "A" (Notes 1,2) * @param ob1 double observed Az, HA or RA (radians; Az is N=0,E=90) * @param ob2 double observed ZD or Dec (radians) * @param utc1 double UTC as a 2-part... * @param utc2 double ...quasi Julian Date (Notes 3,4) * @param dut1 double UT1-UTC (seconds, Note 5) * @param elong double longitude (radians, east +ve, Note 6) * @param phi double geodetic latitude (radians, Note 6) * @param hm double height above the ellipsoid (meters, Notes 6,8) * @param xp double polar motion coordinates (radians, Note 7) * @param yp double polar motion coordinates (radians, Note 7) * @param phpa double pressure at the observer (hPa = mB, Note 8) * @param tc double ambient temperature at the observer (deg C) * @param rh double relative humidity at the observer (range 0-1) * @param wl double wavelength (micrometers, Note 9) * * * @return ri double* Returned CIRS right ascension (CIO-based, radians) * di double* Returned CIRS declination (radians) * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter int status: Returned +1 = dubious year (Note 2) * 0 = Returned OK * -1 = Returned unacceptable date * *

    Notes: *

      * *
    1. "Observed" Az,ZD means the position that would be seen by a * perfect geodetically aligned theodolite. (Zenith distance is * used rather than altitude in order to reflect the fact that no * allowance is made for depression of the horizon.) This is * related to the observed HA,Dec via the standard rotation, using * the geodetic latitude (corrected for polar motion), while the * observed HA and RA are related simply through the Earth rotation * angle and the site longitude. "Observed" RA,Dec or HA,Dec thus * means the position that would be seen by a perfect equatorial * with its polar axis aligned to the Earth's axis of rotation. * *
    2. Only the first character of the type argument is significant. * "R" or "r" indicates that ob1 and ob2 are the observed right * ascension and declination; "H" or "h" indicates that they are * hour angle (west +ve) and declination; anything else ("A" or * "a" is recommended) indicates that ob1 and ob2 are azimuth * (north zero, east 90 deg) and zenith distance. * *
    3. utc1+utc2 is quasi Julian Date (see Note 2), apportioned in any * convenient way between the two arguments, for example where utc1 * is the Julian Day Number and utc2 is the fraction of a day. * *

      However, JD cannot unambiguously represent UTC during a leap * second unless special measures are taken. The convention in the * present function is that the JD day represents UTC days whether * the length is 86399, 86400 or 86401 SI seconds. * *

      Applications should use the function iauDtf2d to convert from * calendar date and time of day into 2-part quasi Julian Date, as * it implements the leap-second-ambiguity convention just * described. * *

    4. The warning status "dubious year" flags UTCs that predate the * introduction of the time scale or that are too far in the * future to be trusted. See iauDat for further details. * *
    5. UT1-UTC is tabulated in IERS bulletins. It increases by exactly * one second at the end of each positive UTC leap second, * introduced in order to keep UT1-UTC within +/- 0.9s. n.b. This * practice is under review, and in the future UT1-UTC may grow * essentially without limit. * *
    6. The geographical coordinates are with respect to the WGS84 * reference ellipsoid. TAKE CARE WITH THE LONGITUDE SIGN: the * longitude required by the present function is east-positive * (i.e. right-handed), in accordance with geographical convention. * *
    7. The polar motion xp,yp can be obtained from IERS bulletins. The * values are the coordinates (in radians) of the Celestial * Intermediate Pole with respect to the International Terrestrial * Reference System (see IERS Conventions 2003), measured along the * meridians 0 and 90 deg west respectively. For many * applications, xp and yp can be set to zero. * *
    8. If hm, the height above the ellipsoid of the observing station * in meters, is not known but phpa, the pressure in hPa (=mB), is * available, an adequate estimate of hm can be obtained from the * expression * *

      hm = -29.3 * tsl * log ( phpa / 1013.25 ); * *

      where tsl is the approximate sea-level air temperature in K * (See Astrophysical Quantities, C.W.Allen, 3rd edition, section * 52). Similarly, if the pressure phpa is not known, it can be * estimated from the height of the observing station, hm, as * follows: * *

      phpa = 1013.25 * exp ( -hm / ( 29.3 * tsl ) ); * *

      Note, however, that the refraction is nearly proportional to * the pressure and that an accurate phpa value is important for * precise work. * *

    9. The argument wl specifies the observing wavelength in * micrometers. The transition from optical to radio is assumed to * occur at 100 micrometers (about 3000 GHz). * *
    10. The accuracy of the result is limited by the corrections for * refraction, which use a simple A*tan(z) + B*tan^3(z) model. * Providing the meteorological parameters are known accurately and * there are no gross local effects, the predicted astrometric * coordinates should be within 0.05 arcsec (optical) or 1 arcsec * (radio) for a zenith distance of less than 70 degrees, better * than 30 arcsec (optical or radio) at 85 degrees and better * than 20 arcmin (optical) or 30 arcmin (radio) at the horizon. * *

      Without refraction, the complementary functions iauAtio13 and * iauAtoi13 are self-consistent to better than 1 microarcsecond * all over the celestial sphere. With refraction included, * consistency falls off at high zenith distances, but is still * better than 0.05 arcsec at 85 degrees. * *

    11. It is advisable to take great care with units, as even unlikely * values of the input parameters are accepted and processed in * accordance with the models used. * *
    * Called: *
      *
    • {@link #jauApio13} astrometry parameters, CIRS-observed, 2013 *
    • {@link #jauAtoiq} quick observed to CIRS * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter unacceptable date. */ public static SphericalCoordinate jauAtoi13(String type, double ob1, double ob2, double utc1, double utc2, double dut1, double elong, double phi, double hm, double xp, double yp, double phpa, double tc, double rh, double wl ) throws JSOFAIllegalParameter, JSOFAInternalError { Astrom astrom = new Astrom(); /* Star-independent astrometry parameters for CIRS->observed. */ jauApio13(utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl, astrom); /* Transform observed to CIRS. */ SphericalCoordinate co = jauAtoiq(type, ob1, ob2, astrom); return co; /* Finished. */ } /** * Quick observed place to CIRS, given the star-independent astrometry * parameters. * * Use of this function is appropriate when efficiency is important and * where many star positions are all to be transformed for one date. * The star-independent astrometry parameters can be obtained by * calling iauApio[13] or iauApco[13]. * *

    Status: support function. * * * @param type char[] type of coordinates: "R", "H" or "A" (Note 1) * @param ob1 double observed Az, HA or RA (radians; Az is N=0,E=90) * @param ob2 double observed ZD or Dec (radians) * @param astrom star-independent astrometry parameters: * * * @return ri double* Returned CIRS right ascension (CIO-based, radians) * di double* Returned CIRS declination (radians) * *

    Notes: *

      * *
    1. "Observed" Az,El means the position that would be seen by a * perfect geodetically aligned theodolite. This is related to * the observed HA,Dec via the standard rotation, using the geodetic * latitude (corrected for polar motion), while the observed HA and * RA are related simply through the Earth rotation angle and the * site longitude. "Observed" RA,Dec or HA,Dec thus means the * position that would be seen by a perfect equatorial with its * polar axis aligned to the Earth's axis of rotation. By removing * from the observed place the effects of atmospheric refraction and * diurnal aberration, the CIRS RA,Dec is obtained. * *
    2. Only the first character of the type argument is significant. * "R" or "r" indicates that ob1 and ob2 are the observed right * ascension and declination; "H" or "h" indicates that they are * hour angle (west +ve) and declination; anything else ("A" or * "a" is recommended) indicates that ob1 and ob2 are azimuth (north * zero, east 90 deg) and zenith distance. (Zenith distance is used * rather than altitude in order to reflect the fact that no * allowance is made for depression of the horizon.) * *
    3. The accuracy of the result is limited by the corrections for * refraction, which use a simple A*tan(z) + B*tan^3(z) model. * Providing the meteorological parameters are known accurately and * there are no gross local effects, the predicted intermediate * coordinates should be within 0.05 arcsec (optical) or 1 arcsec * (radio) for a zenith distance of less than 70 degrees, better * than 30 arcsec (optical or radio) at 85 degrees and better than * 20 arcmin (optical) or 25 arcmin (radio) at the horizon. * *

      Without refraction, the complementary functions iauAtioq and * iauAtoiq are self-consistent to better than 1 microarcsecond all * over the celestial sphere. With refraction included, consistency * falls off at high zenith distances, but is still better than * 0.05 arcsec at 85 degrees. * *

    4. It is advisable to take great care with units, as even unlikely * values of the input parameters are accepted and processed in * accordance with the models used. * *
    * Called: *
      *
    • {@link #jauS2c} spherical coordinates to unit vector *
    • {@link #jauC2s} p-vector to spherical *
    • {@link #jauAnp} normalize angle into range 0 to 2pi * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static SphericalCoordinate jauAtoiq(String type, double ob1, double ob2, Astrom astrom ) { /** Minimum sin(alt) for refraction purposes */ final double SELMIN = 0.05; char c; double c1, c2, sphi, cphi, ce, xaeo, yaeo, zaeo, v[] = new double[3], xmhdo, ymhdo, zmhdo, az, sz, zdo, refa, refb, tz, dref, zdt, xaet, yaet, zaet, xmhda, ymhda, zmhda, f, xhd, yhd, zhd, sx, cx, sy, cy, hma; /* Coordinate type. */ c = type.charAt(0); /* Coordinates. */ c1 = ob1; c2 = ob2; /* Sin, cos of latitude. */ sphi = astrom.sphi; cphi = astrom.cphi; /* Standardize coordinate type. */ if ( c == 'r' || c == 'R' ) { c = 'R'; } else if ( c == 'h' || c == 'H' ) { c = 'H'; } else { c = 'A'; } /* If Az,ZD, convert to Cartesian (S=0,E=90). */ if ( c == 'A' ) { ce = sin(c2); xaeo = - cos(c1) * ce; yaeo = sin(c1) * ce; zaeo = cos(c2); } else { /* If RA,Dec, convert to HA,Dec. */ if ( c == 'R' ) c1 = astrom.eral - c1; /* To Cartesian -HA,Dec. */ v = jauS2c ( -c1, c2 ); xmhdo = v[0]; ymhdo = v[1]; zmhdo = v[2]; /* To Cartesian Az,El (S=0,E=90). */ xaeo = sphi*xmhdo - cphi*zmhdo; yaeo = ymhdo; zaeo = cphi*xmhdo + sphi*zmhdo; } /* Azimuth (S=0,E=90). */ az = ( xaeo != 0.0 || yaeo != 0.0 ) ? atan2(yaeo,xaeo) : 0.0; /* Sine of observed ZD, and observed ZD. */ sz = sqrt ( xaeo*xaeo + yaeo*yaeo ); zdo = atan2 ( sz, zaeo ); /* * Refraction * ---------- */ /* Fast algorithm using two constant model. */ refa = astrom.refa; refb = astrom.refb; tz = sz / ( zaeo > SELMIN ? zaeo : SELMIN ); dref = ( refa + refb*tz*tz ) * tz; zdt = zdo + dref; /* To Cartesian Az,ZD. */ ce = sin(zdt); xaet = cos(az) * ce; yaet = sin(az) * ce; zaet = cos(zdt); /* Cartesian Az,ZD to Cartesian -HA,Dec. */ xmhda = sphi*xaet + cphi*zaet; ymhda = yaet; zmhda = - cphi*xaet + sphi*zaet; /* Diurnal aberration. */ f = ( 1.0 + astrom.diurab*ymhda ); xhd = f * xmhda; yhd = f * ( ymhda - astrom.diurab ); zhd = f * zmhda; /* Polar motion. */ sx = sin(astrom.xpl); cx = cos(astrom.xpl); sy = sin(astrom.ypl); cy = cos(astrom.ypl); v[0] = cx*xhd + sx*sy*yhd - sx*cy*zhd; v[1] = cy*yhd + sy*zhd; v[2] = sx*xhd - cx*sy*yhd + cx*cy*zhd; /* To spherical -HA,Dec. */ SphericalCoordinate co = jauC2s(v); /* Right ascension. */ co.alpha = jauAnp(astrom.eral + co.alpha); return co; /* Finished. */ } /** * Apply light deflection by a solar-system body, as part of * transforming coordinate direction into natural direction. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param bm double mass of the gravitating body (solar masses) * @param p double[3] direction from observer to source (unit vector) * @param q double[3] direction from body to source (unit vector) * @param e double[3] direction from body to observer (unit vector) * @param em double distance from body to observer (au) * @param dlim double deflection limiter (Note 4) * * * @return p1 double[3] Returned observer to deflected source (unit vector) * *

    Notes: *

      * *
    1. The algorithm is based on Expr. (70) in Klioner (2003) and * Expr. (7.63) in the Explanatory Supplement (Urban & Seidelmann * 2013), with some rearrangement to minimize the effects of machine * precision. * *
    2. The mass parameter bm can, as required, be adjusted in order to * allow for such effects as quadrupole field. * *
    3. The barycentric position of the deflecting body should ideally * correspond to the time of closest approach of the light ray to * the body. * *
    4. The deflection limiter parameter dlim is phi^2/2, where phi is * the angular separation (in radians) between source and body at * which limiting is applied. As phi shrinks below the chosen * threshold, the deflection is artificially reduced, reaching zero * for phi = 0. * *
    5. The returned vector p1 is not normalized, but the consequential * departure from unit magnitude is always negligible. * *
    6. The arguments p and p1 can be the same array. * *
    7. To accumulate total light deflection taking into account the * contributions from several bodies, call the present function for * each body in succession, in decreasing order of distance from the * observer. * *
    8. For efficiency, validation is omitted. The supplied vectors must * be of unit magnitude, and the deflection limiter non-zero and * positive. * *
    *

    References: *

      * *
    • Urban, S. & Seidelmann, P. K. (eds), Explanatory Supplement to * the Astronomical Almanac, 3rd ed., University Science Books * (2013). * *
    • Klioner, Sergei A., "A practical relativistic model for micro- * arcsecond astrometry in space", Astr. J. 125, 1580-1597 (2003). * *
    * Called: *
      *
    • {@link #jauPdp} scalar product of two p-vectors *
    • {@link #jauPxp} vector product of two p-vectors * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static double[] jauLd(double bm, double p[], double q[], double e[], double em, double dlim) { int i; double qpe[] = new double[3], qdqpe, w, eq[], peq[] ; double p1[] = new double[3]; /* q . (q + e). */ for (i = 0; i < 3; i++) { qpe[i] = q[i] + e[i]; } qdqpe = jauPdp(q, qpe); /* 2 x G x bm / ( em x c^2 x ( q . (q + e) ) ). */ w = bm * SRS / em / max(qdqpe,dlim); /* p x (e x q). */ eq = jauPxp(e, q); peq = jauPxp(p, eq); /* Apply the deflection. */ for (i = 0; i < 3; i++) { p1[i] = p[i] + w*peq[i]; } return p1; /* Finished. */ } /*+ * - - - - - - - * i a u L d n * - - - - - - - * * For a star, apply light deflection by multiple solar-system bodies, * as part of transforming coordinate direction into natural direction. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * n int number of bodies (note 1) * b jauLDBODY[n] data for each of the n bodies (Notes 1,2): * bm double mass of the body (solar masses, Note 3) * dl double deflection limiter (Note 4) * pv [2][3] barycentric PV of the body (au, au/day) * ob double[3] barycentric position of the observer (au) * sc double[3] observer to star coord direction (unit vector) * * * sn double[3] observer to deflected star (unit vector) * *

  • The array b contains n entries, one for each body to be * considered. If n = 0, no gravitational light deflection will be * applied, not even for the Sun. * *
  • The array b should include an entry for the Sun as well as for * any planet or other body to be taken into account. The entries * should be in the order in which the light passes the body. * *
  • In the entry in the b array for body i, the mass parameter * b[i].bm can, as required, be adjusted in order to allow for such * effects as quadrupole field. * *
  • The deflection limiter parameter b[i].dl is phi^2/2, where phi is * the angular separation (in radians) between star and body at * which limiting is applied. As phi shrinks below the chosen * threshold, the deflection is artificially reduced, reaching zero * for phi = 0. Example values suitable for a terrestrial * observer, together with masses, are as follows: * * body i b[i].bm b[i].dl * * Sun 1.0 6e-6 * Jupiter 0.00095435 3e-9 * Saturn 0.00028574 3e-10 * *
  • For cases where the starlight passes the body before reaching the * observer, the body is placed back along its barycentric track by * the light time from that point to the observer. For cases where * the body is "behind" the observer no such shift is applied. If * a different treatment is preferred, the user has the option of * instead using the iauLd function. Similarly, iauLd can be used * for cases where the source is nearby, not a star. * *
  • The returned vector sn is not normalized, but the consequential * departure from unit magnitude is always negligible. * *
  • The arguments sc and sn can be the same array. * *
  • For efficiency, validation is omitted. The supplied masses must * be greater than zero, the position and velocity vectors must be * right, and the deflection limiter greater than zero. * * Reference: * * Urban, S. & Seidelmann, P. K. (eds), Explanatory Supplement to * the Astronomical Almanac, 3rd ed., University Science Books * (2013), Section 7.2.4. * * Called: * iauCp copy p-vector * iauPdp scalar product of two p-vectors * iauPmp p-vector minus p-vector * iauPpsp p-vector plus scaled p-vector * iauPn decompose p-vector into modulus and direction * iauLd light deflection by a solar-system body * *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static double[] jauLdn(int n, Ldbody b[], double ob[], double sc[]) { /* Light time for 1 au (days) */ final double CR = AULT/DAYSEC; int i; double v[] , dt, ev[], sn[] = new double[3]; /* Star direction prior to deflection. */ jauCp(sc, sn); /* Body by body. */ for ( i = 0; i < n; i++ ) { /* Body to observer vector at epoch of observation (au). */ v = jauPmp( ob, b[i].pv[0]); /* Minus the time since the light passed the body (days). */ dt = jauPdp(sn,v) * CR; /* Neutralize if the star is "behind" the observer. */ dt = min(dt, 0.0); /* Backtrack the body to the time the light was passing the body. */ ev = jauPpsp(v, -dt, b[i].pv[1]); /* Body to observer vector as magnitude and direction. */ NormalizedVector nv = jauPn(ev); /* Apply light deflection for this body. */ sn = jauLd( b[i].bm, sn, sn, nv.u, nv.r, b[i].dl ); /* Next body. */ } return sn; /* Finished. */ } /** * Deflection of starlight by the Sun. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param p double[3] direction from observer to star (unit vector) * @param e double[3] direction from Sun to observer (unit vector) * @param em double distance from Sun to observer (au) * * * @return p1 double[3] Returned observer to deflected start (unit vector) * *

    Notes: *

      * *
    1. The source is presumed to be sufficiently distant that its * directions seen from the Sun and the observer are essentially * the same. * *
    2. The deflection is restrained when the angle between the star and * the center of the Sun is less than a threshold value, falling to * zero deflection for zero separation. The chosen threshold value * is within the solar limb for all solar-system applications, and * is about 5 arcminutes for the case of a terrestrial observer. * *
    3. The arguments p and p1 can be the same array. * *
    * Called: *
      *
    • {@link #jauLd} light deflection by a solar-system body * *
    *@version 2016 July 29 * *@since JSOFA release 20131202 * * */ public static double[] jauLdsun(double p[], double e[], double em) { double em2, dlim; /* Deflection limiter (smaller for distant observers). */ em2 = em*em; if ( em2 < 1.0 ) em2 = 1.0; dlim = 1e-6 / (em2 > 1.0 ? em2 : 1.0); /* Apply the deflection. */ return jauLd(1.0, p, p, e, em, dlim); } /** * Proper motion and parallax. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param rc double ICRS RA,Dec at catalog epoch (radians) * @param dc double ICRS RA,Dec at catalog epoch (radians) * @param pr double RA proper motion (radians/year; Note 1) * @param pd double Dec proper motion (radians/year) * @param px double parallax (arcsec) * @param rv double radial velocity (km/s, +ve if receding) * @param pmt double proper motion time interval (SSB, Julian years) * @param pob double[3] SSB to observer vector (au) * * * @return pco double[3] Returned coordinate direction (BCRS unit vector) * *

    Notes: *

      * *
    1. The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. * *
    2. The proper motion time interval is for when the starlight * reaches the solar system barycenter. * *
    3. To avoid the need for iteration, the Roemer effect (i.e. the * small annual modulation of the proper motion coming from the * changing light time) is applied approximately, using the * direction of the star at the catalog epoch. * *
    *

    References: *

      * *
    • 1984 Astronomical Almanac, pp B39-B41. * *
    • Urban, S. & Seidelmann, P. K. (eds), Explanatory Supplement to * the Astronomical Almanac, 3rd ed., University Science Books * (2013), Section 7.2. * *
    * Called: *
      *
    • {@link #jauPdp} scalar product of two p-vectors *
    • {@link #jauPn} decompose p-vector into modulus and direction * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static double[] jauPmpx(double rc, double dc, double pr, double pd, double px, double rv, double pmt, double pob[] ) { /* Km/s to au/year */ final double VF = DAYSEC*DJM/DAU; /* Light time for 1 au, Julian years */ final double AULTY = AULT/DAYSEC/DJY; int i; double sr, cr, sd, cd, x, y, z, p[] = new double[3], dt, pxr, w, pdz, pm[] = new double[3]; /* Spherical coordinates to unit vector (and useful functions). */ sr = sin(rc); cr = cos(rc); sd = sin(dc); cd = cos(dc); p[0] = x = cr*cd; p[1] = y = sr*cd; p[2] = z = sd; /* Proper motion time interval (y) including Roemer effect. */ dt = pmt + jauPdp(p,pob)*AULTY; /* Space motion (radians per year). */ pxr = px * DAS2R; w = VF * rv * pxr; pdz = pd * z; pm[0] = - pr*y - pdz*cr + w*x; pm[1] = pr*x - pdz*sr + w*y; pm[2] = pd*cd + w*z; /* Coordinate direction of star (unit vector, BCRS). */ for (i = 0; i < 3; i++) { p[i] += dt*pm[i] - pxr*pob[i]; } NormalizedVector pco = jauPn(p); return pco.u; /* Finished. */ } /** * Star proper motion: update star catalog data for space motion, with * special handling to handle the zero parallax case. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param ra1 double right ascension (radians), before * @param dec1 double declination (radians), before * @param pmr1 double RA proper motion (radians/year), before * @param pmd1 double Dec proper motion (radians/year), before * @param px1 double parallax (arcseconds), before * @param rv1 double radial velocity (km/s, +ve = receding), before * @param ep1a double "before" epoch, part A (Note 1) * @param ep1b double "before" epoch, part B (Note 1) * @param ep2a double "after" epoch, part A (Note 1) * @param ep2b double "after" epoch, part B (Note 1) * * * @return ra2 double Returned right ascension (radians), after * dec2 double Returned declination (radians), after * pmr2 double Returned RA proper motion (radians/year), after * pmd2 double Returned Dec proper motion (radians/year), after * px2 double Returned parallax (arcseconds), after * rv2 double Returned radial velocity (km/s, +ve = receding), after * * * @throws JSOFAInternalError int status: * -1 = Returned system error (should not occur) * 0 = Returned no warnings or errors * 1 = Returned distance overridden (Note 6) * 2 = Returned excessive velocity (Note 7) * 4 = Returned solution didn't converge (Note 8) * else = Returned binary logical OR of the above warnings * *

    Notes: *

      * *
    1. The starting and ending TDB epochs ep1a+ep1b and ep2a+ep2b are * Julian Dates, apportioned in any convenient way between the two * parts (A and B). For example, JD(TDB)=2450123.7 could be * expressed in any of these ways, among others: * *

      epNa epNb * * 2450123.7 0.0 (JD method) * 2451545.0 -1421.3 (J2000 method) * 2400000.5 50123.2 (MJD method) * 2450123.5 0.2 (date & time method) * *

      The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 method is best matched to the way the * argument is handled internally and will deliver the optimum * resolution. The MJD method and the date & time methods are both * good compromises between resolution and convenience. * *

    2. In accordance with normal star-catalog conventions, the object's * right ascension and declination are freed from the effects of * secular aberration. The frame, which is aligned to the catalog * equator and equinox, is Lorentzian and centered on the SSB. * *

      The proper motions are the rate of change of the right ascension * and declination at the catalog epoch and are in radians per TDB * Julian year. * *

      The parallax and radial velocity are in the same frame. * *

    3. Care is needed with units. The star coordinates are in radians * and the proper motions in radians per Julian year, but the * parallax is in arcseconds. * *
    4. The RA proper motion is in terms of coordinate angle, not true * angle. If the catalog uses arcseconds for both RA and Dec proper * motions, the RA proper motion will need to be divided by cos(Dec) * before use. * *
    5. Straight-line motion at constant speed, in the inertial frame, is * assumed. * *
    6. An extremely small (or zero or negative) parallax is overridden * to ensure that the object is at a finite but very large distance, * but not so large that the proper motion is equivalent to a large * but safe speed (about 0.1c using the chosen constant). A warning * status of 1 is added to the status if this action has been taken. * *
    7. If the space velocity is a significant fraction of c (see the * constant VMAX in the function iauStarpv), it is arbitrarily set * to zero. When this action occurs, 2 is added to the status. * *
    8. The relativistic adjustment carried out in the iauStarpv function * involves an iterative calculation. If the process fails to * converge within a set number of iterations, 4 is added to the * status. * *
    * Called: *
      *
    • {@link #jauSeps} angle between two points *
    • {@link #jauStarpm} update star catalog data for space motion * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * * @throws JSOFAInternalError an internal error has occured */ public static CatalogCoords jauPmsafe(double ra1, double dec1, double pmr1, double pmd1, double px1, double rv1, double ep1a, double ep1b, double ep2a, double ep2b) throws JSOFAInternalError { /* Minimum allowed parallax (arcsec) */ final double PXMIN = 5e-7; /* Factor giving maximum allowed transverse speed of about 1% c */ final double F = 326.0; double pm, px1a; /* Proper motion in one year (radians). */ pm = jauSeps(ra1, dec1, ra1+pmr1, dec1+pmd1); px1a = px1; pm *= F; if (px1a < pm) {px1a = pm;} if (px1a < PXMIN) {px1a = PXMIN;} /* Carry out the transformation using the modified parallax. */ return jauStarpm(ra1, dec1, pmr1, pmd1, px1a, rv1, ep1a, ep1b, ep2a, ep2b); /* Finished. */ } /** * Position and velocity of a terrestrial observing station. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param elong double longitude (radians, east +ve, Note 1) * @param phi double latitude (geodetic, radians, Note 1) * @param hm double height above ref. ellipsoid (geodetic, m) * @param xp double coordinates of the pole (radians, Note 2) * @param yp double coordinates of the pole (radians, Note 2) * @param sp double the TIO locator s' (radians, Note 2) * @param theta double Earth rotation angle (radians, Note 3) * * * @return pv double[2][3] Returned position/velocity vector (m, m/s, CIRS) * *

    Notes: *

      * *
    1. The terrestrial coordinates are with respect to the WGS84 * reference ellipsoid. * *
    2. xp and yp are the coordinates (in radians) of the Celestial * Intermediate Pole with respect to the International Terrestrial * Reference System (see IERS Conventions), measured along the * meridians 0 and 90 deg west respectively. sp is the TIO locator * s', in radians, which positions the Terrestrial Intermediate * Origin on the equator. For many applications, xp, yp and * (especially) sp can be set to zero. * *
    3. If theta is Greenwich apparent sidereal time instead of Earth * rotation angle, the result is with respect to the true equator * and equinox of date, i.e. with the x-axis at the equinox rather * than the celestial intermediate origin. * *
    4. The velocity units are meters per UT1 second, not per SI second. * This is unlikely to have any practical consequences in the modern * era. * *
    5. No validation is performed on the arguments. Error cases that * could lead to arithmetic exceptions are trapped by the iauGd2gc * function, and the result set to zeros. * *
    *

    References: *

      * *
    • McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), * IERS Technical Note No. 32, BKG (2004) * *
    • Urban, S. & Seidelmann, P. K. (eds), Explanatory Supplement to * the Astronomical Almanac, 3rd ed., University Science Books * (2013), Section 7.4.3.3. * *
    * Called: *
      *
    • {@link #jauGd2gc} geodetic to geocentric transformation *
    • {@link #jauPom00} polar motion matrix *
    • {@link #jauTrxp} product of transpose of r-matrix and p-vector * *
    *@version 2013 October 9 * * @since JSOFA release 20131202 * * * @throws JSOFAInternalError an internal error has occured * @throws JSOFAIllegalParameter unacceptable date. */ public static double [][] jauPvtob(double elong, double phi, double hm, double xp, double yp, double sp, double theta ) throws JSOFAIllegalParameter, JSOFAInternalError { double xyzm[]; /* Geodetic to geocentric transformation (WGS84). */ xyzm = jauGd2gc(1, elong, phi, hm); return jauPvtob(xyzm, xp, yp, sp, theta ); /* Finished. */ } /** * Alternative Position and velocity of a terrestrial observing station with observatory position already in cartesian. * @see JSOFA#jauPvtob(double, double, double, double, double, double, double) for more detail. * @param xyzm observatory geocentric position in metres. * @param xp double coordinates of the pole (radians, Note 2) * @param yp double coordinates of the pole (radians, Note 2) * @param sp double the TIO locator s' (radians, Note 2) * @param theta double Earth rotation angle (radians, Note 3) * @return pv double[2][3] Returned position/velocity vector (m, m/s, CIRS) * @throws JSOFAIllegalParameter unacceptable date. * @throws JSOFAInternalError an internal error has occured */ public static double [][] jauPvtob(double xyzm[], double xp, double yp, double sp, double theta ) throws JSOFAIllegalParameter, JSOFAInternalError { /* Earth rotation rate in radians per UT1 second */ final double OM = 1.00273781191135448 * D2PI / DAYSEC; double rpm[][], xyz[], x, y, z, s, c; double pv[][] = new double[2][3]; /* Polar motion and TIO position. */ rpm = jauPom00(xp, yp, sp); xyz = jauTrxp(rpm, xyzm); x = xyz[0]; y = xyz[1]; z = xyz[2]; /* Functions of ERA. */ s = sin(theta); c = cos(theta); /* Position. */ pv[0][0] = c*x - s*y; pv[0][1] = s*x + c*y; pv[0][2] = z; /* Velocity. */ pv[1][0] = OM * ( -s*x - c*y ); pv[1][1] = OM * ( c*x - s*y ); pv[1][2] = 0.0; return pv; /* Finished. */ } /** * constants A and B in the atmospheric refraction model * dZ = A tan Z + B tan^3 Z. * . * @author Paul Harrison (paul.harrison@manchester.ac.uk) 28 Mar 2014 * @version $Revision$ $date$ */ public static class RefCos { /** refraction coefficient A */ public double a ; /** refraction coefficient B */ public double b ; public RefCos(double a, double b) { this.a = a; this.b = b; } } /** * Determine the constants A and B in the atmospheric refraction model * dZ = A tan Z + B tan^3 Z. * * Z is the "observed" zenith distance (i.e. affected by refraction) * and dZ is what to add to Z to give the "topocentric" (i.e. in vacuo) * zenith distance. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param phpa double pressure at the observer (hPa = millibar) * @param tc double ambient temperature at the observer (deg C) * @param rh double relative humidity at the observer (range 0-1) * @param wl double wavelength (micrometers) * * * @return Returned tan Z coefficient (radians) * Returned tan^3 Z coefficient (radians) * *

    Notes: *

      * *
    1. The model balances speed and accuracy to give good results in * applications where performance at low altitudes is not paramount. * Performance is maintained across a range of conditions, and * applies to both optical/IR and radio. * *
    2. The model omits the effects of (i) height above sea level (apart * from the reduced pressure itself), (ii) latitude (i.e. the * flattening of the Earth), (iii) variations in tropospheric lapse * rate and (iv) dispersive effects in the radio. * *

      The model was tested using the following range of conditions: * *

      lapse rates 0.0055, 0.0065, 0.0075 deg/meter * latitudes 0, 25, 50, 75 degrees * heights 0, 2500, 5000 meters ASL * pressures mean for height -10% to +5% in steps of 5% * temperatures -10 deg to +20 deg with respect to 280 deg at SL * relative humidity 0, 0.5, 1 * wavelengths 0.4, 0.6, ... 2 micron, + radio * zenith distances 15, 45, 75 degrees * *

      The accuracy with respect to raytracing through a model * atmosphere was as follows: * *

      worst RMS * *

      optical/IR 62 mas 8 mas * radio 319 mas 49 mas * *

      For this particular set of conditions: * *

      lapse rate 0.0065 K/meter * latitude 50 degrees * sea level * pressure 1005 mb * temperature 280.15 K * humidity 80% * wavelength 5740 Angstroms * *

      the results were as follows: * *

      ZD raytrace iauRefco Saastamoinen * * 10 10.27 10.27 10.27 * 20 21.19 21.20 21.19 * 30 33.61 33.61 33.60 * 40 48.82 48.83 48.81 * 45 58.16 58.18 58.16 * 50 69.28 69.30 69.27 * 55 82.97 82.99 82.95 * 60 100.51 100.54 100.50 * 65 124.23 124.26 124.20 * 70 158.63 158.68 158.61 * 72 177.32 177.37 177.31 * 74 200.35 200.38 200.32 * 76 229.45 229.43 229.42 * 78 267.44 267.29 267.41 * 80 319.13 318.55 319.10 * *

      deg arcsec arcsec arcsec * *

      The values for Saastamoinen's formula (which includes terms * up to tan^5) are taken from Hohenkerk and Sinclair (1985). * *

    3. A wl value in the range 0-100 selects the optical/IR case and is * wavelength in micrometers. Any value outside this range selects * the radio case. * *
    4. Outlandish input parameters are silently limited to * mathematically safe values. Zero pressure is permissible, and * causes zeroes to be returned. * *
    5. The algorithm draws on several sources, as follows: * *

      a) The formula for the saturation vapour pressure of water as * a function of temperature and temperature is taken from * Equations (A4.5-A4.7) of Gill (1982). * *

      b) The formula for the water vapour pressure, given the * saturation pressure and the relative humidity, is from * Crane (1976), Equation (2.5.5). * *

      c) The refractivity of air is a function of temperature, * total pressure, water-vapour pressure and, in the case * of optical/IR, wavelength. The formulae for the two cases are * developed from Hohenkerk & Sinclair (1985) and Rueger (2002). * The IAG (1999) optical refractivity for dry air is used. * *

      d) The formula for beta, the ratio of the scale height of the * atmosphere to the geocentric distance of the observer, is * an adaption of Equation (9) from Stone (1996). The * adaptations, arrived at empirically, consist of (i) a small * adjustment to the coefficient and (ii) a humidity term for the * radio case only. * *

      e) The formulae for the refraction constants as a function of * n-1 and beta are from Green (1987), Equation (4.31). * *

    *

    References: *

      * *
    • Crane, R.K., Meeks, M.L. (ed), "Refraction Effects in the Neutral * Atmosphere", Methods of Experimental Physics: Astrophysics 12B, * Academic Press, 1976. * *
    • Gill, Adrian E., "Atmosphere-Ocean Dynamics", Academic Press, * 1982. * *
    • Green, R.M., "Spherical Astronomy", Cambridge University Press, * 1987. * *
    • Hohenkerk, C.Y., & Sinclair, A.T., NAO Technical Note No. 63, * 1985. * *
    • IAG Resolutions adopted at the XXIIth General Assembly in * Birmingham, 1999, Resolution 3. * *
    • Rueger, J.M., "Refractive Index Formulae for Electronic Distance * Measurement with Radio and Millimetre Waves", in Unisurv Report * S-68, School of Surveying and Spatial Information Systems, * University of New South Wales, Sydney, Australia, 2002. * *
    • Stone, Ronald C., P.A.S.P. 108, 1051-1058, 1996. * *
    *@version 2013 October 9 * *@since JSOFA release 20131202 * * */ public static RefCos jauRefco(double phpa, double tc, double rh, double wl ) { boolean optic; double p, t, r, w, ps, pw, tk, wlsq, gamma, beta; /* Decide whether optical/IR or radio case: switch at 100 microns. */ optic = ( wl <= 100.0 ); /* Restrict parameters to safe values. */ t = max ( tc, -150.0 ); t = min ( t, 200.0 ); p = max ( phpa, 0.0 ); p = min ( p, 10000.0 ); r = max ( rh, 0.0 ); r = min ( r, 1.0 ); w = max ( wl, 0.1 ); w = min ( w, 1e6 ); /* Water vapour pressure at the observer. */ if ( p > 0.0 ) { ps = pow ( 10.0, ( 0.7859 + 0.03477*t ) / ( 1.0 + 0.00412*t ) ) * ( 1.0 + p * ( 4.5e-6 + 6e-10*t*t ) ); pw = r * ps / ( 1.0 - (1.0-r)*ps/p ); } else { pw = 0.0; } /* Refractive index minus 1 at the observer. */ tk = t + 273.15; if ( optic ) { wlsq = w * w; gamma = ( ( 77.53484e-6 + ( 4.39108e-7 + 3.666e-9/wlsq ) / wlsq ) * p - 11.2684e-6*pw ) / tk; } else { gamma = ( 77.6890e-6*p - ( 6.3938e-6 - 0.375463/tk ) * pw ) / tk; } /* Formula for beta from Stone, with empirical adjustments. */ beta = 4.4474e-6 * tk; if ( ! optic ) beta -= 0.0074 * pw * beta; /* Refraction constants from Green. */ return new RefCos( gamma * ( 1.0 - beta ), - gamma * ( beta - gamma / 2.0 )); /* Finished. */ } /** * Transformation from Galactic Coordinates to ICRS. * * This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support routine. * * @param dl double galactic longitude (radians) * @param db double galactic latitude (radians) * * @return co ICRS right ascension, declination. * *

    Notes:

      * *
    1. The IAU 1958 system of Galactic coordinates was defined with * respect to the now obsolete reference system FK4 B1950.0. When * interpreting the system in a modern context, several factors have * to be taken into account:
        * *
      • The inclusion in FK4 positions of the E-terms of aberration. * *
      • The distortion of the FK4 proper motion system by differential * Galactic rotation. * *
      • The use of the B1950.0 equinox rather than the now-standard * J2000.0. * *
      • The frame bias between ICRS and the J2000.0 mean place system. *
      * The Hipparcos Catalogue (Perryman & ESA 1997) provides a rotation * matrix that transforms directly between ICRS and Galactic * coordinates with the above factors taken into account. The * matrix is derived from three angles, namely the ICRS coordinates * of the Galactic pole and the longitude of the ascending node of * the galactic equator on the ICRS equator. They are given in * degrees to five decimal places and for canonical purposes are * regarded as exact. In the Hipparcos Catalogue the matrix * elements are given to 10 decimal places (about 20 microarcsec). * In the present SOFA function the matrix elements have been * recomputed from the canonical three angles and are given to 30 * decimal places. * *
    2. The inverse transformation is performed by the function jauIcrs2g. *
    * * Reference: * Perryman M.A.C. & ESA, 1997, ESA SP-1200, The Hipparcos and Tycho * catalogues. Astrometric and photometric star catalogues * derived from the ESA Hipparcos Space Astrometry Mission. ESA * Publications Division, Noordwijk, Netherlands. * * @version 2015 March 02 * * * @since JSOFA release 20150209 * */ public static SphericalCoordinate jauG2icrs ( double dl, double db) { double v1[], v2[]; /* * L2,B2 system of galactic coordinates in the form presented in the * Hipparcos Catalogue. In degrees: * * P = 192.85948 right ascension of the Galactic north pole in ICRS * Q = 27.12825 declination of the Galactic north pole in ICRS * R = 32.93192 Galactic longitude of the ascending node of * the Galactic equator on the ICRS equator * * ICRS to galactic rotation matrix, obtained by computing * R_3(-R) R_1(pi/2-Q) R_3(pi/2+P) to the full precision shown: */ double r[][] = new double[][]{ { -0.054875560416215368492398900454, -0.873437090234885048760383168409, -0.483835015548713226831774175116 }, { +0.494109427875583673525222371358, -0.444829629960011178146614061616, +0.746982244497218890527388004556 }, { -0.867666149019004701181616534570, -0.198076373431201528180486091412, +0.455983776175066922272100478348 } }; /* Spherical to Cartesian. */ v1 = jauS2c(dl, db); /* Galactic to ICRS. */ v2 = jauTrxp(r, v1); /* Cartesian to spherical. */ SphericalCoordinate co = jauC2s(v2); /* Express in conventional ranges. */ co.alpha = jauAnp(co.alpha); co.delta = jauAnpm(co.delta); /* Finished. */ return co; } /** * Transformation from ICRS to Galactic Coordinates. * * This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support routine. * * @param dr double ICRS right ascension (radians) * @param dd double ICRS declination (radians) * * @return co galactic longitude (radians), galactic latitude (radians) * *

    Notes:

      * *
    1. The IAU 1958 system of Galactic coordinates was defined with * respect to the now obsolete reference system FK4 B1950.0. When * interpreting the system in a modern context, several factors have * to be taken into account:
        * *
      • The inclusion in FK4 positions of the E-terms of aberration. * *
      • The distortion of the FK4 proper motion system by differential * Galactic rotation. * *
      • The use of the B1950.0 equinox rather than the now-standard * J2000.0. * *
      • The frame bias between ICRS and the J2000.0 mean place system. *
      * The Hipparcos Catalogue (Perryman & ESA 1997) provides a rotation * matrix that transforms directly between ICRS and Galactic * coordinates with the above factors taken into account. The * matrix is derived from three angles, namely the ICRS coordinates * of the Galactic pole and the longitude of the ascending node of * the galactic equator on the ICRS equator. They are given in * degrees to five decimal places and for canonical purposes are * regarded as exact. In the Hipparcos Catalogue the matrix * elements are given to 10 decimal places (about 20 microarcsec). * In the present SOFA function the matrix elements have been * recomputed from the canonical three angles and are given to 30 * decimal places. * *
    2. The inverse transformation is performed by the function iauG2icrs. *
    * Reference: * Perryman M.A.C. & ESA, 1997, ESA SP-1200, The Hipparcos and Tycho * catalogues. Astrometric and photometric star catalogues * derived from the ESA Hipparcos Space Astrometry Mission. ESA * Publications Division, Noordwijk, Netherlands. * * @version 2015 January 20 * * @since JSOFA release 20150209 * */ public static SphericalCoordinate jauIcrs2g ( double dr, double dd ) { double v1[], v2[]; /* * L2,B2 system of galactic coordinates in the form presented in the * Hipparcos Catalogue. In degrees: * * P = 192.85948 right ascension of the Galactic north pole in ICRS * Q = 27.12825 declination of the Galactic north pole in ICRS * R = 32.93192 longitude of the ascending node of the Galactic * plane on the ICRS equator * * ICRS to galactic rotation matrix, obtained by computing * R_3(-R) R_1(pi/2-Q) R_3(pi/2+P) to the full precision shown: */ double r[][] = new double[][] { { -0.054875560416215368492398900454, -0.873437090234885048760383168409, -0.483835015548713226831774175116 }, { +0.494109427875583673525222371358, -0.444829629960011178146614061616, +0.746982244497218890527388004556 }, { -0.867666149019004701181616534570, -0.198076373431201528180486091412, +0.455983776175066922272100478348 } }; /* Spherical to Cartesian. */ v1 = jauS2c(dr, dd); /* ICRS to Galactic. */ v2 = jauRxp(r, v1); /* Cartesian to spherical. */ SphericalCoordinate co = jauC2s(v2); /* Express in conventional ranges. */ co.alpha = jauAnp(co.alpha); co.delta = jauAnpm(co.delta); return co; } // 2016-05-03 additions below /** * * Transformation from ecliptic coordinates (mean equinox and ecliptic * of date) to ICRS RA,Dec, using the IAU 2006 precession model. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param date1 double TT as a 2-part Julian date (Note 1) * @param date2 double TT as a 2-part Julian date (Note 1) * @param dl double ecliptic longitude and latitude (radians) * @param db double ecliptic longitude and latitude (radians) * * * @return double ICRS right ascension and declination (radians) * *

      *
    1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: * * date1 date2 * * 2450123.7 0.0 (JD method) * 2451545.0 -1421.3 (J2000 method) * 2400000.5 50123.2 (MJD method) * 2450123.5 0.2 (date & time method) * * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
    2. No assumptions are made about whether the coordinates represent * starlight and embody astrometric effects such as parallax or * aberration. * *
    3. The transformation is approximately that from ecliptic longitude * and latitude (mean equinox and ecliptic of date) to mean J2000.0 * right ascension and declination, with only frame bias (always * less than 25 mas) to disturb this classical picture. *
    * Called:
      *
    • {@link #jauS2c} spherical coordinates to unit vector *
    • {@link #jauEcm06} J2000.0 to ecliptic rotation matrix, IAU 2006 *
    • {@link #jauTrxp} product of transpose of r-matrix and p-vector *
    • {@link #jauC2s} unit vector to spherical coordinates *
    • {@link #jauAnp} normalize angle into range 0 to 2pi *
    • {@link #jauAnpm} normalize angle into range +/- pi *
    * * @version 2016 February 9 * * @since JSOFA release 20160503 * * */ public static SphericalCoordinate jauEceq06(double date1, double date2, double dl, double db) { /* Spherical to Cartesian. */ double v1[] = jauS2c(dl, db); /* Rotation matrix, ICRS equatorial to ecliptic. */ double rm[][] = jauEcm06(date1, date2); /* The transformation from ecliptic to ICRS. */ double v2[] = jauTrxp(rm, v1); /* Cartesian to spherical. */ SphericalCoordinate co = jauC2s(v2); /* Express in conventional ranges. */ co.alpha = jauAnp(co.alpha); co.delta = jauAnpm(co.delta); return co; } /** * * ICRS equatorial to ecliptic rotation matrix, IAU 2006. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param date1 double TT as a 2-part Julian date (Note 1) * @param date2 double TT as a 2-part Julian date (Note 1) * * * @return double[3][3] ICRS to ecliptic rotation matrix * *

    Notes:

      * *
    1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: * * date1 date2 * * 2450123.7 0.0 (JD method) * 2451545.0 -1421.3 (J2000 method) * 2400000.5 50123.2 (MJD method) * 2450123.5 0.2 (date & time method) * * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
    2. The matrix is in the sense * * E_ep = rm x P_ICRS, * * where P_ICRS is a vector with respect to ICRS right ascension * and declination axes and E_ep is the same vector with respect to * the (inertial) ecliptic and equinox of date. * *
    3. P_ICRS is a free vector, merely a direction, typically of unit * magnitude, and not bound to any particular spatial origin, such * as the Earth, Sun or SSB. No assumptions are made about whether * it represents starlight and embodies astrometric effects such as * parallax or aberration. The transformation is approximately that * between mean J2000.0 right ascension and declination and ecliptic * longitude and latitude, with only frame bias (always less than * 25 mas) to disturb this classical picture. *
    * Called:
      *
    • {@link #jauObl06} mean obliquity, IAU 2006 *
    • {@link #jauPmat06} PB matrix, IAU 2006 *
    • {@link #jauIr} initialize r-matrix to identity *
    • {@link #jauRx} rotate around X-axis *
    • {@link #jauRxr} product of two r-matrices *
    * * @version 2015 December 11 * * @since JSOFA release 20160503 * * */ public static double[][] jauEcm06(double date1, double date2) { double ob, e[][] = new double[3][3]; /* Obliquity, IAU 2006. */ ob = jauObl06(date1, date2); /* Precession-bias matrix, IAU 2006. */ double bp[][] = jauPmat06(date1, date2); /* Equatorial of date to ecliptic matrix. */ jauIr(e); jauRx(ob, e); /* ICRS to ecliptic coordinates rotation matrix, IAU 2006. */ return jauRxr(e, bp); } /** * * Transformation from ICRS equatorial coordinates to ecliptic * coordinates (mean equinox and ecliptic of date) using IAU 2006 * precession model. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param date1 double TT as a 2-part Julian date (Note 1) * @param date2 double TT as a 2-part Julian date (Note 1) * @param dr double ICRS right ascension and declination (radians) * @param dd double ICRS right ascension and declination (radians) * * * @return double ecliptic longitude and latitude (radians) *

      *
    1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, * among others: * * date1 date2 * * 2450123.7 0.0 (JD method) * 2451545.0 -1421.3 (J2000 method) * 2400000.5 50123.2 (MJD method) * 2450123.5 0.2 (date & time method) * * The JD method is the most natural and convenient to use in * cases where the loss of several decimal digits of resolution * is acceptable. The J2000 method is best matched to the way * the argument is handled internally and will deliver the * optimum resolution. The MJD method and the date & time methods * are both good compromises between resolution and convenience. * *
    2. No assumptions are made about whether the coordinates represent * starlight and embody astrometric effects such as parallax or * aberration. * *
    3. The transformation is approximately that from mean J2000.0 right * ascension and declination to ecliptic longitude and latitude * (mean equinox and ecliptic of date), with only frame bias (always * less than 25 mas) to disturb this classical picture. *
    * Called:
      *
    • {@link #jauS2c} spherical coordinates to unit vector *
    • {@link #jauEcm06} J2000.0 to ecliptic rotation matrix, IAU 2006 *
    • {@link #jauRxp} product of r-matrix and p-vector *
    • {@link #jauC2s} unit vector to spherical coordinates *
    • {@link #jauAnp} normalize angle into range 0 to 2pi *
    • {@link #jauAnpm} normalize angle into range +/- pi *
    * @version 2016 February 9 * * @since JSOFA release 20160503 * * */ public static SphericalCoordinate jauEqec06(double date1, double date2, double dr, double dd) { /* Spherical to Cartesian. */ double v1[] = jauS2c(dr, dd); /* Rotation matrix, ICRS equatorial to ecliptic. */ double rm[][] = jauEcm06(date1, date2); /* The transformation from ICRS to ecliptic. */ double v2[] = jauRxp(rm, v1); /* Cartesian to spherical. */ SphericalCoordinate co = jauC2s(v2); /* Express in conventional ranges. */ co.alpha = jauAnp(co.alpha); co.delta = jauAnpm(co.delta); return co; } /** * * Transformation from ecliptic coordinates (mean equinox and ecliptic * of date) to ICRS RA,Dec, using a long-term precession model. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param epj double Julian epoch (TT) * @param dl double ecliptic longitude and latitude (radians) * @param db double ecliptic longitude and latitude (radians) * * * @return double ICRS right ascension and declination (radians) *

      *
    1. No assumptions are made about whether the coordinates represent * starlight and embody astrometric effects such as parallax or * aberration. * *
    2. The transformation is approximately that from ecliptic longitude * and latitude (mean equinox and ecliptic of date) to mean J2000.0 * right ascension and declination, with only frame bias (always * less than 25 mas) to disturb this classical picture. * *
    3. The Vondrak et al. (2011, 2012) 400 millennia precession model * agrees with the IAU 2006 precession at J2000.0 and stays within * 100 microarcseconds during the 20th and 21st centuries. It is * accurate to a few arcseconds throughout the historical period, * worsening to a few tenths of a degree at the end of the * +/- 200,000 year time span. *
    * Called:
      *
    • {@link #jauS2c} spherical coordinates to unit vector *
    • {@link #jauLtecm} J2000.0 to ecliptic rotation matrix, long term *
    • {@link #jauTrxp} product of transpose of r-matrix and p-vector *
    • {@link #jauC2s} unit vector to spherical coordinates *
    • {@link #jauAnp} normalize angle into range 0 to 2pi *
    • {@link #jauAnpm} normalize angle into range +/- pi *
    * References:
      * *
    • Vondrak, J., Capitaine, N. and Wallace, P., 2011, New precession * expressions, valid for long time intervals, Astron.Astrophys. 534, * A22 * *
    • Vondrak, J., Capitaine, N. and Wallace, P., 2012, New precession * expressions, valid for long time intervals (Corrigendum), * Astron.Astrophys. 541, C1 *
    * @version 2016 February 9 * * @since JSOFA release 20160503 * * */ public static SphericalCoordinate jauLteceq(double epj, double dl, double db) { /* Spherical to Cartesian. */ double v1[] = jauS2c(dl, db); /* Rotation matrix, ICRS equatorial to ecliptic. */ double rm[][] = jauLtecm(epj); /* The transformation from ecliptic to ICRS. */ double v2[] = jauTrxp(rm, v1); /* Cartesian to spherical. */ SphericalCoordinate co = jauC2s(v2); /* Express in conventional ranges. */ co.alpha = jauAnp(co.alpha); co.delta = jauAnpm(co.delta); return co; } /** * * ICRS equatorial to ecliptic rotation matrix, long-term. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param epj double Julian epoch (TT) * * * @return double[3][3] ICRS to ecliptic rotation matrix * *

    Notes:

      * *
    1. The matrix is in the sense * * E_ep = rm x P_ICRS, * * where P_ICRS is a vector with respect to ICRS right ascension * and declination axes and E_ep is the same vector with respect to * the (inertial) ecliptic and equinox of epoch epj. * *
    2. P_ICRS is a free vector, merely a direction, typically of unit * magnitude, and not bound to any particular spatial origin, such * as the Earth, Sun or SSB. No assumptions are made about whether * it represents starlight and embodies astrometric effects such as * parallax or aberration. The transformation is approximately that * between mean J2000.0 right ascension and declination and ecliptic * longitude and latitude, with only frame bias (always less than * 25 mas) to disturb this classical picture. * *
    3. The Vondrak et al. (2011, 2012) 400 millennia precession model * agrees with the IAU 2006 precession at J2000.0 and stays within * 100 microarcseconds during the 20th and 21st centuries. It is * accurate to a few arcseconds throughout the historical period, * worsening to a few tenths of a degree at the end of the * +/- 200,000 year time span. *
    * Called:
      *
    • {@link #jauLtpequ} equator pole, long term *
    • {@link #jauLtpecl} ecliptic pole, long term *
    • {@link #jauPxp} vector product *
    • {@link #jauPn} normalize vector *
    * References:
      * *
    • Vondrak, J., Capitaine, N. and Wallace, P., 2011, New precession * expressions, valid for long time intervals, Astron.Astrophys. 534, * A22 * *
    • Vondrak, J., Capitaine, N. and Wallace, P., 2012, New precession * expressions, valid for long time intervals (Corrigendum), * Astron.Astrophys. 541, C1 *
    * @version 2015 December 6 * * @since JSOFA release 20160503 * * */ public static double[][] jauLtecm(double epj) { double rm[][] = new double[3][3]; /* Frame bias (IERS Conventions 2010, Eqs. 5.21 and 5.33) */ final double dx = -0.016617 * DAS2R, de = -0.0068192 * DAS2R, dr = -0.0146 * DAS2R; /* Equator pole. */ double p[] = jauLtpequ(epj); /* Ecliptic pole (bottom row of equatorial to ecliptic matrix). */ double z[] = jauLtpecl(epj); /* Equinox (top row of matrix). */ double w[] = jauPxp(p, z); NormalizedVector nv = jauPn(w); double x[] = nv.u; /* Middle row of matrix. */ double y[] = jauPxp(z, x); /* Combine with frame bias. */ rm[0][0] = x[0] - x[1]*dr + x[2]*dx; rm[0][1] = x[0]*dr + x[1] + x[2]*de; rm[0][2] = - x[0]*dx - x[1]*de + x[2]; rm[1][0] = y[0] - y[1]*dr + y[2]*dx; rm[1][1] = y[0]*dr + y[1] + y[2]*de; rm[1][2] = - y[0]*dx - y[1]*de + y[2]; rm[2][0] = z[0] - z[1]*dr + z[2]*dx; rm[2][1] = z[0]*dr + z[1] + z[2]*de; rm[2][2] = - z[0]*dx - z[1]*de + z[2]; return rm; } /** * * Transformation from ICRS equatorial coordinates to ecliptic * coordinates (mean equinox and ecliptic of date) using a long-term * precession model. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param epj double Julian epoch (TT) * @param dr double ICRS right ascension and declination (radians) * @param dd double ICRS right ascension and declination (radians) * * * @return ecliptic longitude and latitude (radians) *

      *
    1. No assumptions are made about whether the coordinates represent * starlight and embody astrometric effects such as parallax or * aberration. * *
    2. The transformation is approximately that from mean J2000.0 right * ascension and declination to ecliptic longitude and latitude * (mean equinox and ecliptic of date), with only frame bias (always * less than 25 mas) to disturb this classical picture. * *
    3. The Vondrak et al. (2011, 2012) 400 millennia precession model * agrees with the IAU 2006 precession at J2000.0 and stays within * 100 microarcseconds during the 20th and 21st centuries. It is * accurate to a few arcseconds throughout the historical period, * worsening to a few tenths of a degree at the end of the * +/- 200,000 year time span. *
    * Called:
      *
    • {@link #jauS2c} spherical coordinates to unit vector *
    • {@link #jauLtecm} J2000.0 to ecliptic rotation matrix, long term *
    • {@link #jauRxp} product of r-matrix and p-vector *
    • {@link #jauC2s} unit vector to spherical coordinates *
    • {@link #jauAnp} normalize angle into range 0 to 2pi *
    • {@link #jauAnpm} normalize angle into range +/- pi *
    * References: * * Vondrak, J., Capitaine, N. and Wallace, P., 2011, New precession * expressions, valid for long time intervals, Astron.Astrophys. 534, * A22 * * Vondrak, J., Capitaine, N. and Wallace, P., 2012, New precession * expressions, valid for long time intervals (Corrigendum), * Astron.Astrophys. 541, C1 * * @version 2016 February 9 * * @since JSOFA release 20160503 * * */ public static SphericalCoordinate jauLteqec(double epj, double dr, double dd) { /* Spherical to Cartesian. */ double v1[] = jauS2c(dr, dd); /* Rotation matrix, ICRS equatorial to ecliptic. */ double rm[][] = jauLtecm(epj); /* The transformation from ICRS to ecliptic. */ double v2[] = jauRxp(rm, v1); /* Cartesian to spherical. */ SphericalCoordinate co = jauC2s(v2); /* Express in conventional ranges. */ co.alpha = jauAnp(co.alpha); co.delta = jauAnpm(co.delta); return co; } /** * * Long-term precession matrix. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param epj double Julian epoch (TT) * * * @return double[3][3] precession matrix, J2000.0 to date * *

    Notes:

      * *
    1. The matrix is in the sense * * P_date = rp x P_J2000, * * where P_J2000 is a vector with respect to the J2000.0 mean * equator and equinox and P_date is the same vector with respect to * the equator and equinox of epoch epj. * *
    2. The Vondrak et al. (2011, 2012) 400 millennia precession model * agrees with the IAU 2006 precession at J2000.0 and stays within * 100 microarcseconds during the 20th and 21st centuries. It is * accurate to a few arcseconds throughout the historical period, * worsening to a few tenths of a degree at the end of the * +/- 200,000 year time span. *
    * Called:
      *
    • {@link #jauLtpequ} equator pole, long term *
    • {@link #jauLtpecl} ecliptic pole, long term *
    • {@link #jauPxp} vector product *
    • {@link #jauPn} normalize vector *
    * References: * *

    Vondrak, J., Capitaine, N. and Wallace, P., 2011, New precession * expressions, valid for long time intervals, Astron.Astrophys. 534, * A22 * *

    Vondrak, J., Capitaine, N. and Wallace, P., 2012, New precession * expressions, valid for long time intervals (Corrigendum), * Astron.Astrophys. 541, C1 * * @version 2015 December 6 * * @since JSOFA release 20160503 * * */ public static double[][] jauLtp(double epj ) { double rp[][] = new double[3][3]; int i; /* Equator pole (bottom row of matrix). */ double peqr[] = jauLtpequ(epj); /* Ecliptic pole. */ double pecl[] = jauLtpecl(epj); /* Equinox (top row of matrix). */ double v[] = jauPxp(peqr, pecl); NormalizedVector nv = jauPn(v); /* Middle row of matrix. */ v = jauPxp(peqr, nv.u); /* Assemble the matrix. */ for ( i = 0; i < 3; i++ ) { rp[0][i] = nv.u[i]; rp[1][i] = v[i]; rp[2][i] = peqr[i]; } return rp; } /** * * Long-term precession matrix, including ICRS frame bias. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param epj double Julian epoch (TT) * * * @return double[3][3] precession-bias matrix, J2000.0 to date * *

    Notes:

      * *
    1. The matrix is in the sense * * P_date = rpb x P_ICRS, * * where P_ICRS is a vector in the Geocentric Celestial Reference * System, and P_date is the vector with respect to the Celestial * Intermediate Reference System at that date but with nutation * neglected. * *
    2. A first order frame bias formulation is used, of sub- * microarcsecond accuracy compared with a full 3D rotation. * *
    3. The Vondrak et al. (2011, 2012) 400 millennia precession model * agrees with the IAU 2006 precession at J2000.0 and stays within * 100 microarcseconds during the 20th and 21st centuries. It is * accurate to a few arcseconds throughout the historical period, * worsening to a few tenths of a degree at the end of the * +/- 200,000 year time span. *
    * References: * * Vondrak, J., Capitaine, N. and Wallace, P., 2011, New precession * expressions, valid for long time intervals, Astron.Astrophys. 534, * A22 * * Vondrak, J., Capitaine, N. and Wallace, P., 2012, New precession * expressions, valid for long time intervals (Corrigendum), * Astron.Astrophys. 541, C1 * * @version 2015 December 6 * * @since JSOFA release 20160503 * * */ public static double[][] jauLtpb(double epj) { double rpb[][] = new double[3][3]; /* Frame bias (IERS Conventions 2010, Eqs. 5.21 and 5.33) */ final double dx = -0.016617 * DAS2R, de = -0.0068192 * DAS2R, dr = -0.0146 * DAS2R; int i; /* Precession matrix. */ double rp[][] = jauLtp(epj); /* Apply the bias. */ for ( i = 0; i < 3; i++ ) { rpb[i][0] = rp[i][0] - rp[i][1]*dr + rp[i][2]*dx; rpb[i][1] = rp[i][0]*dr + rp[i][1] + rp[i][2]*de; rpb[i][2] = -rp[i][0]*dx - rp[i][1]*de + rp[i][2]; } return rpb; } /** * * Long-term precession of the ecliptic. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param epj double Julian epoch (TT) * * * @return double[3] ecliptic pole unit vector * *

    Notes:

      * *
    1. The returned vector is with respect to the J2000.0 mean equator * and equinox. * *
    2. The Vondrak et al. (2011, 2012) 400 millennia precession model * agrees with the IAU 2006 precession at J2000.0 and stays within * 100 microarcseconds during the 20th and 21st centuries. It is * accurate to a few arcseconds throughout the historical period, * worsening to a few tenths of a degree at the end of the * +/- 200,000 year time span. *
    * References: * * Vondrak, J., Capitaine, N. and Wallace, P., 2011, New precession * expressions, valid for long time intervals, Astron.Astrophys. 534, * A22 * * Vondrak, J., Capitaine, N. and Wallace, P., 2012, New precession * expressions, valid for long time intervals (Corrigendum), * Astron.Astrophys. 541, C1 * * @version 2016 February 9 * * @since JSOFA release 20160503 * * */ public static double[] jauLtpecl(double epj) { double vec[] = new double[3]; /* Obliquity at J2000.0 (radians). */ final double eps0 = 84381.406 * DAS2R; /* Polynomial coefficients */ final int NPOL = 4 ; final double pqpol[][] = { { 5851.607687, -0.1189000, -0.00028913, 0.000000101}, {-1600.886300, 1.1689818, -0.00000020, -0.000000437} }; /* Periodic coefficients */ final double pqper[][] = { { 708.15,-5486.751211,-684.661560, 667.666730,-5523.863691}, {2309.00, -17.127623,2446.283880,-2354.886252, -549.747450}, {1620.00, -617.517403, 399.671049, -428.152441, -310.998056}, { 492.20, 413.442940,-356.652376, 376.202861, 421.535876}, {1183.00, 78.614193,-186.387003, 184.778874, -36.776172}, { 622.00, -180.732815,-316.800070, 335.321713, -145.278396}, { 882.00, -87.676083, 198.296701, -185.138669, -34.744450}, { 547.00, 46.140315, 101.135679, -120.972830, 22.885731} }; final int NPER = pqper.length; /* Miscellaneous */ int i; double t, p, q, w, a, s, c; /* Centuries since J2000. */ t = ( epj - 2000.0 ) / 100.0; /* Initialize P_A and Q_A accumulators. */ p = 0.0; q = 0.0; /* Periodic terms. */ w = D2PI*t; for ( i = 0; i < NPER; i++ ) { a = w/pqper[i][0]; s = sin(a); c = cos(a); p += c*pqper[i][1] + s*pqper[i][3]; q += c*pqper[i][2] + s*pqper[i][4]; } /* Polynomial terms. */ w = 1.0; for ( i = 0; i < NPOL; i++ ) { p += pqpol[0][i]*w; q += pqpol[1][i]*w; w *= t; } /* P_A and Q_A (radians). */ p *= DAS2R; q *= DAS2R; /* Form the ecliptic pole vector. */ w = 1.0 - p*p - q*q; w = w < 0.0 ? 0.0 : sqrt(w); s = sin(eps0); c = cos(eps0); vec[0] = p; vec[1] = - q*c - w*s; vec[2] = - q*s + w*c; return vec; } /** * * Long-term precession of the equator. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param epj double Julian epoch (TT) * * * @return double[3] equator pole unit vector * *

    Notes:

      * *
    1. The returned vector is with respect to the J2000.0 mean equator * and equinox. * *
    2. The Vondrak et al. (2011, 2012) 400 millennia precession model * agrees with the IAU 2006 precession at J2000.0 and stays within * 100 microarcseconds during the 20th and 21st centuries. It is * accurate to a few arcseconds throughout the historical period, * worsening to a few tenths of a degree at the end of the * +/- 200,000 year time span. *
    * References: * * Vondrak, J., Capitaine, N. and Wallace, P., 2011, New precession * expressions, valid for long time intervals, Astron.Astrophys. 534, * A22 * * Vondrak, J., Capitaine, N. and Wallace, P., 2012, New precession * expressions, valid for long time intervals (Corrigendum), * Astron.Astrophys. 541, C1 * * @version 2016 February 9 * * @since JSOFA release 20160503 * * */ public static double[] jauLtpequ(double epj) { double veq[] = new double[3]; /* Polynomial coefficients */ final int NPOL = 4; final double xypol[][] = { { 5453.282155, 0.4252841, -0.00037173, -0.000000152}, {-73750.930350, -0.7675452, -0.00018725, 0.000000231} }; /* Periodic coefficients */ final double xyper[][] = { { 256.75, -819.940624,75004.344875,81491.287984, 1558.515853}, { 708.15,-8444.676815, 624.033993, 787.163481, 7774.939698}, { 274.20, 2600.009459, 1251.136893, 1251.296102,-2219.534038}, { 241.45, 2755.175630,-1102.212834,-1257.950837,-2523.969396}, {2309.00, -167.659835,-2660.664980,-2966.799730, 247.850422}, { 492.20, 871.855056, 699.291817, 639.744522, -846.485643}, { 396.10, 44.769698, 153.167220, 131.600209,-1393.124055}, { 288.90, -512.313065, -950.865637, -445.040117, 368.526116}, { 231.10, -819.415595, 499.754645, 584.522874, 749.045012}, {1610.00, -538.071099, -145.188210, -89.756563, 444.704518}, { 620.00, -189.793622, 558.116553, 524.429630, 235.934465}, { 157.87, -402.922932, -23.923029, -13.549067, 374.049623}, { 220.30, 179.516345, -165.405086, -210.157124, -171.330180}, {1200.00, -9.814756, 9.344131, -44.919798, -22.899655} }; final int NPER = xyper.length; /* Miscellaneous */ int i; double t, x, y, w, a, s, c; /* Centuries since J2000. */ t = ( epj - 2000.0 ) / 100.0; /* Initialize X and Y accumulators. */ x = 0.0; y = 0.0; /* Periodic terms. */ w = D2PI * t; for ( i = 0; i < NPER; i++ ) { a = w / xyper[i][0]; s = sin(a); c = cos(a); x += c*xyper[i][1] + s*xyper[i][3]; y += c*xyper[i][2] + s*xyper[i][4]; } /* Polynomial terms. */ w = 1.0; for ( i = 0; i < NPOL; i++ ) { x += xypol[0][i]*w; y += xypol[1][i]*w; w *= t; } /* X and Y (direction cosines). */ x *= DAS2R; y *= DAS2R; /* Form the equator pole vector. */ veq[0] = x; veq[1] = y; w = 1.0 - x*x - y*y; veq[2] = w < 0.0 ? 0.0 : sqrt(w); return veq; } /** * Position consisting of (ha, declination) pairs in radians. Where ha is hour angle and dec is declination . * @author Paul Harrison (paul.harrison@manchester.ac.uk) 1 Feb 2010 * * @since JSOFA release 20180130 */ public static class EquatorialCoordinate { public double ha; public double dec; public EquatorialCoordinate(double ha, double dec){ this.ha = ha; this.dec = dec; } } /** * * Horizon to equatorial coordinates: transform azimuth and altitude * to hour angle and declination. * * * @param az double azimuth * @param el double altitude (informally, elevation) * @param phi double site latitude * * * @return ha double hour angle (local) * dec double declination * *

    Notes:

      * *
    1. All the arguments are angles in radians. * *
    2. The sign convention for azimuth is north zero, east +pi/2. * *
    3. HA is returned in the range +/-pi. Declination is returned in * the range +/-pi/2. * *
    4. The latitude phi is pi/2 minus the angle between the Earth's * rotation axis and the adopted zenith. In many applications it * will be sufficient to use the published geodetic latitude of the * site. In very precise (sub-arcsecond) applications, phi can be * corrected for polar motion. * *
    5. The azimuth az must be with respect to the rotational north pole, * as opposed to the ITRS pole, and an azimuth with respect to north * on a map of the Earth's surface will need to be adjusted for * polar motion if sub-arcsecond accuracy is required. * *
    6. Should the user wish to work with respect to the astronomical * zenith rather than the geodetic zenith, phi will need to be * adjusted for deflection of the vertical (often tens of * arcseconds), and the zero point of ha will also be affected. * *
    7. The transformation is the same as Ve = Ry(phi-pi/2)*Rz(pi)*Vh, * where Ve and Vh are lefthanded unit vectors in the (ha,dec) and * (az,el) systems respectively and Rz and Ry are rotations about * first the z-axis and then the y-axis. (n.b. Rz(pi) simply * reverses the signs of the x and y components.) For efficiency, * the algorithm is written out rather than calling other utility * functions. For applications that require even greater * efficiency, additional savings are possible if constant terms * such as functions of latitude are computed once and for all. * *
    8. Again for efficiency, no range checking of arguments is carried * out. *
    * Last revision: 2017 September 12 * * @since JSOFA release 20180130 * */ public static EquatorialCoordinate jauAe2hd (double az, double el, double phi) { double sa, ca, se, ce, sp, cp, x, y, z, r; /* Useful trig functions. */ sa = sin(az); ca = cos(az); se = sin(el); ce = cos(el); sp = sin(phi); cp = cos(phi); /* HA,Dec unit vector. */ x = - ca*ce*sp + se*cp; y = - sa*ce; z = ca*ce*cp + se*sp; /* To spherical. */ r = sqrt(x*x + y*y); return new EquatorialCoordinate( (r != 0.0) ? atan2(y,x) : 0.0, atan2(z,r)); /* Finished. */ } /** * Position consisting of (az, el) pairs in radians. Where az is the azimuth and el is elevation . * @author Paul Harrison (paul.harrison@manchester.ac.uk) * * @since JSOFA release 20180130 */ public static class HorizonCoordinate { public double az; public double el; public HorizonCoordinate(double az, double el){ this.az = az; this.el = el; } } /** * * Equatorial to horizon coordinates: transform hour angle and * declination to azimuth and altitude. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param ha double hour angle (local) * @param dec double declination * @param phi double site latitude * * * @return az double azimuth * el double altitude (informally, elevation) * *

    Notes:

      * *
    1. All the arguments are angles in radians. * *
    2. Azimuth is returned in the range 0-2pi; north is zero, and east * is +pi/2. Altitude is returned in the range +/- pi/2. * *
    3. The latitude phi is pi/2 minus the angle between the Earth's * rotation axis and the adopted zenith. In many applications it * will be sufficient to use the published geodetic latitude of the * site. In very precise (sub-arcsecond) applications, phi can be * corrected for polar motion. * *
    4. The returned azimuth az is with respect to the rotational north * pole, as opposed to the ITRS pole, and for sub-arcsecond * accuracy will need to be adjusted for polar motion if it is to * be with respect to north on a map of the Earth's surface. * *
    5. Should the user wish to work with respect to the astronomical * zenith rather than the geodetic zenith, phi will need to be * adjusted for deflection of the vertical (often tens of * arcseconds), and the zero point of the hour angle ha will also * be affected. * *
    6. The transformation is the same as Vh = Rz(pi)*Ry(pi/2-phi)*Ve, * where Vh and Ve are lefthanded unit vectors in the (az,el) and * (ha,dec) systems respectively and Ry and Rz are rotations about * first the y-axis and then the z-axis. (n.b. Rz(pi) simply * reverses the signs of the x and y components.) For efficiency, * the algorithm is written out rather than calling other utility * functions. For applications that require even greater * efficiency, additional savings are possible if constant terms * such as functions of latitude are computed once and for all. * *
    7. Again for efficiency, no range checking of arguments is carried * out. *
    * Last revision: 2017 September 12 * * @since JSOFA release 20180130 * */ public static HorizonCoordinate jauHd2ae (double ha, double dec, double phi) { double sh, ch, sd, cd, sp, cp, x, y, z, r, a; /* Useful trig functions. */ sh = sin(ha); ch = cos(ha); sd = sin(dec); cd = cos(dec); sp = sin(phi); cp = cos(phi); /* Az,Alt unit vector. */ x = - ch*cd*sp + sd*cp; y = - sh*cd; z = ch*cd*cp + sd*sp; /* To spherical. */ r = sqrt(x*x + y*y); a = (r != 0.0) ? atan2(y,x) : 0.0; return new HorizonCoordinate((a < 0.0) ? a+D2PI : a, atan2(z,r)); /* Finished. */ } /** * * Parallactic angle for a given hour angle and declination. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param ha double hour angle * @param dec double declination * @param phi double site latitude * * @return double parallactic angle * *

    Notes:

      * *
    1. All the arguments are angles in radians. * *
    2. The parallactic angle at a point in the sky is the position * angle of the vertical, i.e. the angle between the directions to * the north celestial pole and to the zenith respectively. * *
    3. The result is returned in the range -pi to +pi. * *
    4. At the pole itself a zero result is returned. * *
    5. The latitude phi is pi/2 minus the angle between the Earth's * rotation axis and the adopted zenith. In many applications it * will be sufficient to use the published geodetic latitude of the * site. In very precise (sub-arcsecond) applications, phi can be * corrected for polar motion. * *
    6. Should the user wish to work with respect to the astronomical * zenith rather than the geodetic zenith, phi will need to be * adjusted for deflection of the vertical (often tens of * arcseconds), and the zero point of the hour angle ha will also * be affected. *
    * Reference: * Smart, W.M., "Spherical Astronomy", Cambridge University Press, * 6th edition (Green, 1977), p49. * * Last revision: 2017 September 12 * * @since JSOFA release 20180130 * */ public static double jauHd2pa (double ha, double dec, double phi) { double cp, cqsz, sqsz; cp = cos(phi); sqsz = cp*sin(ha); cqsz = sin(phi)*cos(dec) - cp*sin(dec)*cos(ha); return ( ( sqsz != 0.0 || cqsz != 0.0 ) ? atan2(sqsz,cqsz) : 0.0 ); /* Finished. */ } /** * Tangent point soulutions. A class to contain tangent point soutions and an indication as to how many of the solutions are valid * @author Paul Harrison (paul.harrison@manchester.ac.uk) * @since JSOFA release 20180130 */ public static class TangentPointSolution { public SphericalCoordinate sol1; public SphericalCoordinate sol2; /** nsolutions. The number of useful solutions */ public int nsolutions; /** * @param sol1 * @param sol2 * @param flag */ public TangentPointSolution(SphericalCoordinate sol1, SphericalCoordinate sol2, int flag) { this.sol1 = sol1; this.sol2 = sol2; this.nsolutions = flag; } public TangentPointSolution() { this.sol1 = null; this.sol2 = null; this.nsolutions = 0; } } /** * * In the tangent plane projection, given the rectangular coordinates * of a star and its spherical coordinates, determine the spherical * coordinates of the tangent point. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param xi double rectangular coordinates of star image (Note 2) * @param eta double rectangular coordinates of star image (Note 2) * @param a double star's spherical coordinates (Note 3) * @param b double star's spherical coordinates (Note 3) * * * @return tangent point's spherical coordinate solutions * * Returned (function value): * int number of solutions: * 0 = no solutions returned (Note 5) * 1 = only the first solution is useful (Note 6) * 2 = both solutions are useful (Note 6) * *

    Notes:

      * *
    1. The tangent plane projection is also called the "gnomonic * projection" and the "central projection". * *
    2. The eta axis points due north in the adopted coordinate system. * If the spherical coordinates are observed (RA,Dec), the tangent * plane coordinates (xi,eta) are conventionally called the * "standard coordinates". If the spherical coordinates are with * respect to a right-handed triad, (xi,eta) are also right-handed. * The units of (xi,eta) are, effectively, radians at the tangent * point. * *
    3. All angular arguments are in radians. * *
    4. The angles a01 and a02 are returned in the range 0-2pi. The * angles b01 and b02 are returned in the range +/-pi, but in the * usual, non-pole-crossing, case, the range is +/-pi/2. * *
    5. Cases where there is no solution can arise only near the poles. * For example, it is clearly impossible for a star at the pole * itself to have a non-zero xi value, and hence it is meaningless * to ask where the tangent point would have to be to bring about * this combination of xi and dec. * *
    6. Also near the poles, cases can arise where there are two useful * solutions. The return value indicates whether the second of the * two solutions returned is useful; 1 indicates only one useful * solution, the usual case. * *
    7. The basis of the algorithm is to solve the spherical triangle PSC, * where P is the north celestial pole, S is the star and C is the * tangent point. The spherical coordinates of the tangent point are * [a0,b0]; writing rho^2 = (xi^2+eta^2) and r^2 = (1+rho^2), side c * is then (pi/2-b), side p is sqrt(xi^2+eta^2) and side s (to be * found) is (pi/2-b0). Angle C is given by sin(C) = xi/rho and * cos(C) = eta/rho. Angle P (to be found) is the longitude * difference between star and tangent point (a-a0). * *
    8. This function is a member of the following set: * *{@code * spherical vector solve for * * iauTpxes iauTpxev xi,eta * iauTpsts iauTpstv star * > iauTpors < iauTporv origin *} *
    * Called: * iauAnp normalize angle into range 0 to 2pi * * References: * * Calabretta M.R. & Greisen, E.W., 2002, "Representations of * celestial coordinates in FITS", Astron.Astrophys. 395, 1077 * * Green, R.M., "Spherical Astronomy", Cambridge University Press, * 1987, Chapter 13. * * @version 2018 January 2 * * @since JSOFA release 20180130 * */ public static TangentPointSolution jauTpors(double xi, double eta, double a, double b) { double xi2, r, sb, cb, rsb, rcb, w2, w, s, c; double a01, b01, a02, b02; xi2 = xi*xi; r = sqrt(1.0 + xi2 + eta*eta); sb = sin(b); cb = cos(b); rsb = r*sb; rcb = r*cb; w2 = rcb*rcb - xi2; if ( w2 >= 0.0 ) { w = sqrt(w2); s = rsb - eta*w; c = rsb*eta + w; if ( xi == 0.0 && w == 0.0 ) w = 1.0; a01 = jauAnp(a - atan2(xi,w)); b01 = atan2(s,c); w = -w; s = rsb - eta*w; c = rsb*eta + w; a02 = jauAnp(a - atan2(xi,w)); b02 = atan2(s,c); return new TangentPointSolution(new SphericalCoordinate(a01, b01), new SphericalCoordinate(a02, b02), (abs(rsb) < 1.0) ? 1 : 2); } else { return new TangentPointSolution(); } /* Finished. */ } /** * Tangent point soutions as direction cosines. A container class for two possible solutiuons as well as an indication of the number of valid solutions. * @author Paul Harrison (paul.harrison@manchester.ac.uk) * @since 27 Mar 2018 */ public static class TangentPointDirectionCosines { public double dc1[]; public double dc2[]; /** nsolution. number of valid solutions. */ public int nsolution; /** * @param dc1 direction cosines * @param dc2 direction cosines * @param nsolution number of valid solutions */ public TangentPointDirectionCosines(double[] dc1, double[] dc2, int nsolution) { this.dc1 = dc1; this.dc2 = dc2; this.nsolution = nsolution; } /** * */ public TangentPointDirectionCosines() { this.nsolution = 0; } } /** * * In the tangent plane projection, given the rectangular coordinates * of a star and its direction cosines, determine the direction * cosines of the tangent point. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param xi double rectangular coordinates of star image (Note 2) * @param eta double rectangular coordinates of star image (Note 2) * @param v double[3] star's direction cosines (Note 3) * * * @return tangent point's direction cosines, Solutions 1 & 2 * int number of solutions: * 0 = no solutions returned (Note 4) * 1 = only the first solution is useful (Note 5) * 2 = both solutions are useful (Note 5) * *

    Notes:

      * *
    1. The tangent plane projection is also called the "gnomonic * projection" and the "central projection". * *
    2. The eta axis points due north in the adopted coordinate system. * If the direction cosines represent observed (RA,Dec), the tangent * plane coordinates (xi,eta) are conventionally called the * "standard coordinates". If the direction cosines are with * respect to a right-handed triad, (xi,eta) are also right-handed. * The units of (xi,eta) are, effectively, radians at the tangent * point. * *
    3. The vector v must be of unit length or the result will be wrong. * *
    4. Cases where there is no solution can arise only near the poles. * For example, it is clearly impossible for a star at the pole * itself to have a non-zero xi value, and hence it is meaningless * to ask where the tangent point would have to be. * *
    5. Also near the poles, cases can arise where there are two useful * solutions. The return value indicates whether the second of the * two solutions returned is useful; 1 indicates only one useful * solution, the usual case. * *
    6. The basis of the algorithm is to solve the spherical triangle * PSC, where P is the north celestial pole, S is the star and C is * the tangent point. Calling the celestial spherical coordinates * of the star and tangent point (a,b) and (a0,b0) respectively, and * writing rho^2 = (xi^2+eta^2) and r^2 = (1+rho^2), and * transforming the vector v into (a,b) in the normal way, side c is * then (pi/2-b), side p is sqrt(xi^2+eta^2) and side s (to be * found) is (pi/2-b0), while angle C is given by sin(C) = xi/rho * and cos(C) = eta/rho; angle P (to be found) is (a-a0). After * solving the spherical triangle, the result (a0,b0) can be * expressed in vector form as v0. * *
    7. This function is a member of the following set: * {@code * spherical vector solve for * * iauTpxes iauTpxev xi,eta * iauTpsts iauTpstv star * iauTpors > iauTporv < origin * } *
    * References: * * Calabretta M.R. & Greisen, E.W., 2002, "Representations of * celestial coordinates in FITS", Astron.Astrophys. 395, 1077 * * Green, R.M., "Spherical Astronomy", Cambridge University Press, * 1987, Chapter 13. * * @version 2018 January 2 * * @since JSOFA release 20180130 * */ public static TangentPointDirectionCosines jauTporv(double xi, double eta, double v[]) { double x, y, z, rxy2, xi2, eta2p1, r, rsb, rcb, w2, w, c; double v01[] = new double[3]; double v02[] = new double[3]; x = v[0]; y = v[1]; z = v[2]; rxy2 = x*x + y*y; xi2 = xi*xi; eta2p1 = eta*eta + 1.0; r = sqrt(xi2 + eta2p1); rsb = r*z; rcb = r*sqrt(x*x + y*y); w2 = rcb*rcb - xi2; if ( w2 > 0.0 ) { w = sqrt(w2); c = (rsb*eta + w) / (eta2p1*sqrt(rxy2*(w2+xi2))); v01[0] = c * (x*w + y*xi); v01[1] = c * (y*w - x*xi); v01[2] = (rsb - eta*w) / eta2p1; w = - w; c = (rsb*eta + w) / (eta2p1*sqrt(rxy2*(w2+xi2))); v02[0] = c * (x*w + y*xi); v02[1] = c * (y*w - x*xi); v02[2] = (rsb - eta*w) / eta2p1; return new TangentPointDirectionCosines(v01,v02,(abs(rsb) < 1.0) ? 1 : 2); } else { return new TangentPointDirectionCosines(); } /* Finished. */ } /** * * In the tangent plane projection, given the star's rectangular * coordinates and the spherical coordinates of the tangent point, * solve for the spherical coordinates of the star. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param xi double rectangular coordinates of star image (Note 2) * @param eta double rectangular coordinates of star image (Note 2) * @param a0 double tangent point's spherical coordinates * @param b0 double tangent point's spherical coordinates * * * @return star's spherical coordinates *

      *
    1. The tangent plane projection is also called the "gnomonic * projection" and the "central projection". * *
    2. The eta axis points due north in the adopted coordinate system. * If the spherical coordinates are observed (RA,Dec), the tangent * plane coordinates (xi,eta) are conventionally called the * "standard coordinates". If the spherical coordinates are with * respect to a right-handed triad, (xi,eta) are also right-handed. * The units of (xi,eta) are, effectively, radians at the tangent * point. * *
    3. All angular arguments are in radians. * *
    4. This function is a member of the following set: *{@code * spherical vector solve for * * iauTpxes iauTpxev xi,eta * > iauTpsts < iauTpstv star * iauTpors iauTporv origin * } *
    * Called: * iauAnp normalize angle into range 0 to 2pi * * References: * * Calabretta M.R. & Greisen, E.W., 2002, "Representations of * celestial coordinates in FITS", Astron.Astrophys. 395, 1077 * * Green, R.M., "Spherical Astronomy", Cambridge University Press, * 1987, Chapter 13. * * @version 2018 January 2 * * @since JSOFA release 20180130 * */ public static SphericalCoordinate jauTpsts(double xi, double eta, double a0, double b0) { double sb0, cb0, d; sb0 = sin(b0); cb0 = cos(b0); d = cb0 - eta*sb0; return new SphericalCoordinate( jauAnp(atan2(xi,d) + a0), atan2(sb0+eta*cb0, sqrt(xi*xi+d*d))); /* Finished. */ } /** * Tangent Plane Position consisting of (xi, eta) pairs in radians. * * *

    Notes:

      * *
    1. The tangent plane projection is also called the "gnomonic * projection" and the "central projection". * *
    2. The eta axis points due north in the adopted coordinate system. * If the spherical coordinates are observed (RA,Dec), the tangent * plane coordinates (xi,eta) are conventionally called the * "standard coordinates". For right-handed spherical coordinates, * (xi,eta) are also right-handed. The units of (xi,eta) are, * effectively, radians at the tangent point. *
    * @author Paul Harrison (paul.harrison@manchester.ac.uk) * * @since JSOFA release 20180130 */ public static class TangentPlaneCoordinate { public double xi; public double eta; /** status. * 0 = OK * 1 = star too far from axis * 2 = antistar on tangent plane * 3 = antistar too far from axis */ public int status; public TangentPlaneCoordinate(double xi, double eta, int j){ this.xi = xi; this.eta = eta; this.status = j; } } /** * * In the tangent plane projection, given the star's rectangular * coordinates and the direction cosines of the tangent point, solve * for the direction cosines of the star. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param xi double rectangular coordinates of star image (Note 2) * @param eta double rectangular coordinates of star image (Note 2) * @param v0 double[3] tangent point's direction cosines * * * @return double[3] star's direction cosines *

      *
    1. The tangent plane projection is also called the "gnomonic * projection" and the "central projection". * *
    2. The eta axis points due north in the adopted coordinate system. * If the direction cosines represent observed (RA,Dec), the tangent * plane coordinates (xi,eta) are conventionally called the * "standard coordinates". If the direction cosines are with * respect to a right-handed triad, (xi,eta) are also right-handed. * The units of (xi,eta) are, effectively, radians at the tangent * point. * *
    3. The method used is to complete the star vector in the (xi,eta) * based triad and normalize it, then rotate the triad to put the * tangent point at the pole with the x-axis aligned to zero * longitude. Writing (a0,b0) for the celestial spherical * coordinates of the tangent point, the sequence of rotations is * (b-pi/2) around the x-axis followed by (-a-pi/2) around the * z-axis. * *
    4. If vector v0 is not of unit length, the returned vector v will * be wrong. * *
    5. If vector v0 points at a pole, the returned vector v will be * based on the arbitrary assumption that the longitude coordinate * of the tangent point is zero. * *
    6. This function is a member of the following set: *{@code * spherical vector solve for * * iauTpxes iauTpxev xi,eta * iauTpsts > iauTpstv < star * iauTpors iauTporv origin * } *
    * References: * * Calabretta M.R. & Greisen, E.W., 2002, "Representations of * celestial coordinates in FITS", Astron.Astrophys. 395, 1077 * * Green, R.M., "Spherical Astronomy", Cambridge University Press, * 1987, Chapter 13. * * @version 2018 January 2 * * @since JSOFA release 20180130 * */ public static double[] jauTpstv(double xi, double eta, double v0[]) { double x, y, z, f, r; double v[] = new double[3]; /* Tangent point. */ x = v0[0]; y = v0[1]; z = v0[2]; /* Deal with polar case. */ r = sqrt(x*x + y*y); if ( r == 0.0 ) { r = 1e-20; x = r; } /* Star vector length to tangent plane. */ f = sqrt(1.0 + xi*xi + eta*eta); /* Apply the transformation and normalize. */ v[0] = (x - (xi*y + eta*x*z) / r) / f; v[1] = (y + (xi*x - eta*y*z) / r) / f; v[2] = (z + eta*r) / f; return v; /* Finished. */ } /** * * In the tangent plane projection, given celestial spherical * coordinates for a star and the tangent point, solve for the star's * rectangular coordinates in the tangent plane. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param a double star's spherical coordinates * @param b double star's spherical coordinates * @param a0 double tangent point's spherical coordinates * @param b0 double tangent point's spherical coordinates * * * @return rectangular coordinates of star image (Note 2) * int status: 0 = OK * 1 = star too far from axis * 2 = antistar on tangent plane * 3 = antistar too far from axis * *

    Notes:

      * *
    1. The tangent plane projection is also called the "gnomonic * projection" and the "central projection". * *
    2. The eta axis points due north in the adopted coordinate system. * If the spherical coordinates are observed (RA,Dec), the tangent * plane coordinates (xi,eta) are conventionally called the * "standard coordinates". For right-handed spherical coordinates, * (xi,eta) are also right-handed. The units of (xi,eta) are, * effectively, radians at the tangent point. * *
    3. All angular arguments are in radians. * *
    4. This function is a member of the following set: *{@code * spherical vector solve for * * > iauTpxes < iauTpxev xi,eta * iauTpsts iauTpstv star * iauTpors iauTporv origin *} *
    * References: * * Calabretta M.R. & Greisen, E.W., 2002, "Representations of * celestial coordinates in FITS", Astron.Astrophys. 395, 1077 * * Green, R.M., "Spherical Astronomy", Cambridge University Press, * 1987, Chapter 13. * * @version 2018 January 2 * * @since JSOFA release 20180130 * */ public static TangentPlaneCoordinate jauTpxes(double a, double b, double a0, double b0) { int j; double sb0, sb, cb0, cb, da, sda, cda, d; /* Functions of the spherical coordinates. */ sb0 = sin(b0); sb = sin(b); cb0 = cos(b0); cb = cos(b); da = a - a0; sda = sin(da); cda = cos(da); /* Reciprocal of star vector length to tangent plane. */ d = sb*sb0 + cb*cb0*cda; /* Check for error cases. */ if ( d > TANGENT_TINY ) { j = 0; } else if ( d >= 0.0 ) { j = 1; d = TANGENT_TINY; } else if ( d > -TANGENT_TINY ) { j = 2; d = -TANGENT_TINY; } else { j = 3; } /* Return the tangent plane coordinates (even in dubious cases). */ return new TangentPlaneCoordinate( cb*sda / d, (sb*cb0 - cb*sb0*cda) / d, j); /* Finished. */ } /** * * In the tangent plane projection, given celestial direction cosines * for a star and the tangent point, solve for the star's rectangular * coordinates in the tangent plane. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * *

    Status: support function. * * * @param v double[3] direction cosines of star (Note 4) * @param v0 double[3] direction cosines of tangent point (Note 4) * * * @return tangent plane coordinates of star * int status: 0 = OK * 1 = star too far from axis * 2 = antistar on tangent plane * 3 = antistar too far from axis * *

    Notes:

      * *
    1. The tangent plane projection is also called the "gnomonic * projection" and the "central projection". * *
    2. The eta axis points due north in the adopted coordinate system. * If the direction cosines represent observed (RA,Dec), the tangent * plane coordinates (xi,eta) are conventionally called the * "standard coordinates". If the direction cosines are with * respect to a right-handed triad, (xi,eta) are also right-handed. * The units of (xi,eta) are, effectively, radians at the tangent * point. * *
    3. The method used is to extend the star vector to the tangent * plane and then rotate the triad so that (x,y) becomes (xi,eta). * Writing (a,b) for the celestial spherical coordinates of the * star, the sequence of rotations is (a+pi/2) around the z-axis * followed by (pi/2-b) around the x-axis. * *
    4. If vector v0 is not of unit length, or if vector v is of zero * length, the results will be wrong. * *
    5. If v0 points at a pole, the returned (xi,eta) will be based on * the arbitrary assumption that the longitude coordinate of the * tangent point is zero. * *
    6. This function is a member of the following set: *{@code * spherical vector solve for * * iauTpxes > iauTpxev < xi,eta * iauTpsts iauTpstv star * iauTpors iauTporv origin * } *
    * References: * * Calabretta M.R. & Greisen, E.W., 2002, "Representations of * celestial coordinates in FITS", Astron.Astrophys. 395, 1077 * * Green, R.M., "Spherical Astronomy", Cambridge University Press, * 1987, Chapter 13. * * @version 2018 January 2 * * @since JSOFA release 20180130 * */ public static TangentPlaneCoordinate jauTpxev(double v[], double v0[]) { int j; double x, y, z, x0, y0, z0, r2, r, w, d; /* Star and tangent point. */ x = v[0]; y = v[1]; z = v[2]; x0 = v0[0]; y0 = v0[1]; z0 = v0[2]; /* Deal with polar case. */ r2 = x0*x0 + y0*y0; r = sqrt(r2); if ( r == 0.0 ) { r = 1e-20; x0 = r; } /* Reciprocal of star vector length to tangent plane. */ w = x*x0 + y*y0; d = w + z*z0; /* Check for error cases. */ if ( d > TANGENT_TINY ) { j = 0; } else if ( d >= 0.0 ) { j = 1; d = TANGENT_TINY; } else if ( d > -TANGENT_TINY ) { j = 2; d = -TANGENT_TINY; } else { j = 3; } /* Return the tangent plane coordinates (even in dubious cases). */ d *= r; return new TangentPlaneCoordinate( (y*x0 - x*y0) / d, (z*r2 - z0*w) / d, j); /* Finished. */ } /** * Convert B1950.0 FK4 star catalog data to J2000.0 FK5. * This function converts a star's catalog data from the old FK4 * (Bessel-Newcomb) system to the later IAU 1976 FK5 (Fricke) system. * *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * * Status: support function. * * * (all B1950.0, FK4) * @param r1950 double B1950.0 RA (rad) * @param d1950 double B1950.0 Dec (rad) * @param dr1950 double B1950.0 proper motions (rad/trop.yr) * @param dd1950 double B1950.0 proper motions (rad/trop.yr) * @param p1950 double parallax (arcsec) * @param v1950 double radial velocity (km/s, +ve = moving away) * Returned: * * @return - catalogue coordinates (all J2000.0, FK5) * *

    Notes:

      * *
    1. The proper motions in RA are dRA/dt rather than cos(Dec)*dRA/dt, * and are per year rather than per century. *
    2. The conversion is somewhat complicated, for several reasons: * . Change of standard epoch from B1950.0 to J2000.0. * . An intermediate transition date of 1984 January 1.0 TT. * . A change of precession model. * . Change of time unit for proper motion (tropical to Julian). * . FK4 positions include the E-terms of aberration, to simplify * the hand computation of annual aberration. FK5 positions * assume a rigorous aberration computation based on the Earth's * barycentric velocity. * . The E-terms also affect proper motions, and in particular cause * objects at large distances to exhibit fictitious proper * motions. * The algorithm is based on Smith et al. (1989) and Yallop et al. * (1989), which presented a matrix method due to Standish (1982) as * developed by Aoki et al. (1983), using Kinoshita's development of * Andoyer's post-Newcomb precession. The numerical constants from * Seidelmann (1992) are used canonically. *
    3. Conversion from B1950.0 FK4 to J2000.0 FK5 only is provided for. * Conversions for different epochs and equinoxes would require * additional treatment for precession, proper motion and E-terms. *
    4. In the FK4 catalog the proper motions of stars within 10 degrees * of the poles do not embody differential E-terms effects and * should, strictly speaking, be handled in a different manner from * stars outside these regions. However, given the general lack of * homogeneity of the star data available for routine astrometry, * the difficulties of handling positions that may have been * determined from astrometric fields spanning the polar and non- * polar regions, the likelihood that the differential E-terms * effect was not taken into account when allowing for proper motion * in past astrometry, and the undesirability of a discontinuity in * the algorithm, the decision has been made in this SOFA algorithm * to include the effects of differential E-terms on the proper * motions for all stars, whether polar or not. At epoch J2000.0, * and measuring "on the sky" rather than in terms of RA change, the * errors resulting from this simplification are less than * 1 milliarcsecond in position and 1 milliarcsecond per century in * proper motion. *
    * Called: * iauAnp normalize angle into range 0 to 2pi * iauPv2s pv-vector to spherical coordinates * iauPdp scalar product of two p-vectors * iauPvmpv pv-vector minus pv_vector * iauPvppv pv-vector plus pv_vector * iauS2pv spherical coordinates to pv-vector * iauSxp multiply p-vector by scalar *

    References:

      *
    • Aoki, S. et al., 1983, "Conversion matrix of epoch B1950.0 * FK4-based positions of stars to epoch J2000.0 positions in * accordance with the new IAU resolutions". Astron.Astrophys. * 128, 263-267. *
    • Seidelmann, P.K. (ed), 1992, "Explanatory Supplement to the * Astronomical Almanac", ISBN 0-935702-68-7. *
    • Smith, C.A. et al., 1989, "The transformation of astrometric * catalog systems to the equinox J2000.0". Astron.J. 97, 265. *
    • Standish, E.M., 1982, "Conversion of positions and proper motions * from B1950.0 to the IAU system at J2000.0". Astron.Astrophys., * 115, 1, 20-22. *
    • Yallop, B.D. et al., 1989, "Transformation of mean star places * from FK4 B1950.0 to FK5 J2000.0 using matrices in 6-space". * Astron.J. 97, 274. *
    * @version 2018 December 5 * @since SOFA release 2019-07-22 */ public static CatalogCoords jauFk425(double r1950, double d1950, double dr1950, double dd1950, double p1950, double v1950 ) { /* Radians per year to arcsec per century */ final double PMF = 100.0*DR2AS; /* Small number to avoid arithmetic problems */ final double TINY = 1e-30; /* Miscellaneous */ double r, d, ur, ud, px, rv, pxvf, w; int i, j, k, l; /* Pv-vectors */ double r0[][], pv1[][], pv2[][] = new double[2][3]; /* * CANONICAL CONSTANTS (Seidelmann 1992) */ /* Km per sec to AU per tropical century */ /* = 86400 * 36524.2198782 / 149597870.7 */ final double VF = 21.095; /* Constant pv-vector (cf. Seidelmann 3.591-2, vectors A and Adot) */ final double a[][] = new double[][] { { -1.62557e-6, -0.31919e-6, -0.13843e-6 }, { +1.245e-3, -1.580e-3, -0.659e-3 } }; /* 3x2 matrix of pv-vectors (cf. Seidelmann 3.591-4, matrix M) */ final double em[][][][] = new double [][][][] { { { { +0.9999256782, -0.0111820611, -0.0048579477 }, { +0.00000242395018, -0.00000002710663, -0.00000001177656 } }, { { +0.0111820610, +0.9999374784, -0.0000271765 }, { +0.00000002710663, +0.00000242397878, -0.00000000006587 } }, { { +0.0048579479, -0.0000271474, +0.9999881997, }, { +0.00000001177656, -0.00000000006582, +0.00000242410173 } } }, { { { -0.000551, -0.238565, +0.435739 }, { +0.99994704, -0.01118251, -0.00485767 } }, { { +0.238514, -0.002667, -0.008541 }, { +0.01118251, +0.99995883, -0.00002718 } }, { { -0.435623, +0.012254, +0.002117 }, { +0.00485767, -0.00002714, +1.00000956 } } } }; /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* The FK4 data (units radians and arcsec per tropical century). */ r = r1950; d = d1950; ur = dr1950*PMF; ud = dd1950*PMF; px = p1950; rv = v1950; /* Express as a pv-vector. */ pxvf = px*VF; w = rv*pxvf; r0 = jauS2pv(r, d, 1.0, ur, ud, w); /* Allow for E-terms (cf. Seidelmann 3.591-2). */ pv1 = jauPvmpv(r0, a); pv2[0] = jauSxp(jauPdp(r0[0], a[0]), r0[0]); pv2[1] = jauSxp(jauPdp(r0[0], a[1]), r0[0]); pv1 = jauPvppv(pv1, pv2); /* Convert pv-vector to Fricke system (cf. Seidelmann 3.591-3). */ for ( i = 0; i < 2; i++ ) { for ( j = 0; j < 3; j++ ) { w = 0.0; for ( k = 0; k < 2; k++ ) { for ( l = 0; l < 3; l++ ) { w += em[i][j][k][l] * pv1[k][l]; } } pv2[i][j] = w; } } /* Revert to catalog form. */ SphericalPositionVelocity sv = jauPv2s(pv2);//, &r, &d, &w, &ur, &ud, &rd); if ( px > TINY ) { rv = sv.vel.r/pxvf; px = px/sv.pos.r; } /* Return the results. */ return new CatalogCoords(jauAnp(sv.pos.theta), sv.pos.phi, sv.vel.theta/PMF, sv.vel.phi/PMF, px, rv); } /** * Convert a B1950.0 FK4 star position to J2000.0 FK5, assuming zero * proper motion in the FK5 system. *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * Status: support function. * This function converts a star's catalog data from the old FK4 * (Bessel-Newcomb) system to the later IAU 1976 FK5 (Fricke) system, * in such a way that the FK5 proper motion is zero. Because such a * star has, in general, a non-zero proper motion in the FK4 system, * the routine requires the epoch at which the position in the FK4 * system was determined. * * * @param r1950 double B1950.0 FK4 RA at epoch (rad) * @param d1950 double B1950.0 FK4 Dec at epoch (rad) * @param bepoch double Besselian epoch (e.g. 1979.3) * * @return J2000.0 FK5 RA,Dec (rad) *

    Notes:

      *
    1. The epoch bepoch is strictly speaking Besselian, but if a * Julian epoch is supplied the result will be affected only to a * negligible extent. *
    2. The method is from Appendix 2 of Aoki et al. (1983), but using * the constants of Seidelmann (1992). See the routine iauFk425 * for a general introduction to the FK4 to FK5 conversion. *
    3. Conversion from equinox B1950.0 FK4 to equinox J2000.0 FK5 only * is provided for. Conversions for different starting and/or * ending epochs would require additional treatment for precession, * proper motion and E-terms. *
    4. In the FK4 catalog the proper motions of stars within 10 degrees * of the poles do not embody differential E-terms effects and * should, strictly speaking, be handled in a different manner from * stars outside these regions. However, given the general lack of * homogeneity of the star data available for routine astrometry, * the difficulties of handling positions that may have been * determined from astrometric fields spanning the polar and non- * polar regions, the likelihood that the differential E-terms * effect was not taken into account when allowing for proper motion * in past astrometry, and the undesirability of a discontinuity in * the algorithm, the decision has been made in this SOFA algorithm * to include the effects of differential E-terms on the proper * motions for all stars, whether polar or not. At epoch 2000.0, * and measuring "on the sky" rather than in terms of RA change, the * errors resulting from this simplification are less than * 1 milliarcsecond in position and 1 milliarcsecond per century in * proper motion. *
    *

    References:

      *
    • Aoki, S. et al., 1983, "Conversion matrix of epoch B1950.0 * FK4-based positions of stars to epoch J2000.0 positions in * accordance with the new IAU resolutions". Astron.Astrophys. * 128, 263-267. *
    • Seidelmann, P.K. (ed), 1992, "Explanatory Supplement to the * Astronomical Almanac", ISBN 0-935702-68-7. *
    * Called: * iauAnp normalize angle into range 0 to 2pi * iauC2s p-vector to spherical * iauEpb2jd Besselian epoch to Julian date * iauEpj Julian date to Julian epoch * iauPdp scalar product of two p-vectors * iauPmp p-vector minus p-vector * iauPpsp p-vector plus scaled p-vector * iauPvu update a pv-vector * iauS2c spherical to p-vector * @version 2018 December 5 * @since SOFA release 2019-07-22 */ public static SphericalCoordinate jauFk45z(double r1950, double d1950, double bepoch) { /* Radians per year to arcsec per century */ final double PMF = 100.0*DR2AS; /* Position and position+velocity vectors */ double r0[], p[], pv[][] = new double[2][3]; /* Miscellaneous */ double w; int i, j, k; /* * CANONICAL CONSTANTS (Seidelmann 1992) */ /* Vectors A and Adot (Seidelmann 3.591-2) */ final double a[] = new double[]{ -1.62557e-6, -0.31919e-6, -0.13843e-6 }; final double ad[] = new double[]{ +1.245e-3, -1.580e-3, -0.659e-3 }; /* 3x2 matrix of p-vectors (cf. Seidelmann 3.591-4, matrix M) */ final double em[][][] = new double[][][] { { { +0.9999256782, -0.0111820611, -0.0048579477 }, { +0.0111820610, +0.9999374784, -0.0000271765 }, { +0.0048579479, -0.0000271474, +0.9999881997 } }, { { -0.000551, -0.238565, +0.435739 }, { +0.238514, -0.002667, -0.008541 }, { -0.435623, +0.012254, +0.002117 } } }; /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Spherical coordinates to p-vector. */ r0 = jauS2c(r1950, d1950); /* Adjust p-vector A to give zero proper motion in FK5. */ w = (bepoch - 1950) / PMF; p = jauPpsp(a, w, ad ); /* Remove E-terms. */ p = jauPpsp(p, -jauPdp(r0,p), r0); p = jauPmp(r0, p); /* Convert to Fricke system pv-vector (cf. Seidelmann 3.591-3). */ for ( i = 0; i < 2; i++ ) { for ( j = 0; j < 3; j++ ) { w = 0.0; for ( k = 0; k < 3; k++ ) { w += em[i][j][k] * p[k]; } pv[i][j] = w; } } /* Allow for fictitious proper motion. */ JulianDate jd = jauEpb2jd(bepoch); w = (jauEpj(jd.djm0,jd.djm1)-2000.0) / PMF; pv = jauPvu(w, pv); /* Revert to spherical coordinates. */ SphericalCoordinate sc = jauC2s(pv[0]); sc.alpha = jauAnp(sc.alpha); return sc; } /** * Convert J2000.0 FK5 star catalog data to B1950.0 FK4. *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * Status: support function. * * @param r2000 double J2000.0 RA (rad) * @param d2000 double J2000.0 Dec (rad) * @param dr2000 double J2000.0 proper motions (rad/Jul.yr) * @param dd2000 double J2000.0 proper motions (rad/Jul.yr) * @param p2000 double parallax (arcsec) * @param v2000 double radial velocity (km/s, +ve = moving away) * * @return (all B1950.0, FK4) *

    Notes:

      *
    1. The proper motions in RA are dRA/dt rather than cos(Dec)*dRA/dt, * and are per year rather than per century. *
    2. The conversion is somewhat complicated, for several reasons: * . Change of standard epoch from J2000.0 to B1950.0. * . An intermediate transition date of 1984 January 1.0 TT. * . A change of precession model. * . Change of time unit for proper motion (Julian to tropical). * . FK4 positions include the E-terms of aberration, to simplify * the hand computation of annual aberration. FK5 positions * assume a rigorous aberration computation based on the Earth's * barycentric velocity. * . The E-terms also affect proper motions, and in particular cause * objects at large distances to exhibit fictitious proper * motions. * The algorithm is based on Smith et al. (1989) and Yallop et al. * (1989), which presented a matrix method due to Standish (1982) as * developed by Aoki et al. (1983), using Kinoshita's development of * Andoyer's post-Newcomb precession. The numerical constants from * Seidelmann (1992) are used canonically. *
    3. In the FK4 catalog the proper motions of stars within 10 degrees * of the poles do not embody differential E-terms effects and * should, strictly speaking, be handled in a different manner from * stars outside these regions. However, given the general lack of * homogeneity of the star data available for routine astrometry, * the difficulties of handling positions that may have been * determined from astrometric fields spanning the polar and non- * polar regions, the likelihood that the differential E-terms * effect was not taken into account when allowing for proper motion * in past astrometry, and the undesirability of a discontinuity in * the algorithm, the decision has been made in this SOFA algorithm * to include the effects of differential E-terms on the proper * motions for all stars, whether polar or not. At epoch J2000.0, * and measuring "on the sky" rather than in terms of RA change, the * errors resulting from this simplification are less than * 1 milliarcsecond in position and 1 milliarcsecond per century in * proper motion. *
    * Called: * iauAnp normalize angle into range 0 to 2pi * iauPdp scalar product of two p-vectors * iauPm modulus of p-vector * iauPmp p-vector minus p-vector * iauPpp p-vector pluus p-vector * iauPv2s pv-vector to spherical coordinates * iauS2pv spherical coordinates to pv-vector * iauSxp multiply p-vector by scalar *

    References:

      *
    • Aoki, S. et al., 1983, "Conversion matrix of epoch B1950.0 * FK4-based positions of stars to epoch J2000.0 positions in * accordance with the new IAU resolutions". Astron.Astrophys. * 128, 263-267. *
    • Seidelmann, P.K. (ed), 1992, "Explanatory Supplement to the * Astronomical Almanac", ISBN 0-935702-68-7. *
    • Smith, C.A. et al., 1989, "The transformation of astrometric * catalog systems to the equinox J2000.0". Astron.J. 97, 265. *
    • Standish, E.M., 1982, "Conversion of positions and proper motions * from B1950.0 to the IAU system at J2000.0". Astron.Astrophys., * 115, 1, 20-22. *
    • Yallop, B.D. et al., 1989, "Transformation of mean star places * from FK4 B1950.0 to FK5 J2000.0 using matrices in 6-space". * Astron.J. 97, 274. *
    * @version 2018 December 5 * @since SOFA release 2019-07-22 */ public static CatalogCoords jauFk524(double r2000, double d2000, double dr2000, double dd2000, double p2000, double v2000) { /* Radians per year to arcsec per century */ final double PMF = 100.0*DR2AS; /* Small number to avoid arithmetic problems */ final double TINY = 1e-30; /* Miscellaneous */ double r, d, ur, ud, px, rv, pxvf, w; int i, j, k, l; /* Vectors, p and pv */ double r0[][], r1[][] = new double[2][3], p1[], p2[], pv[][] = new double[2][3]; /* * CANONICAL CONSTANTS (Seidelmann 1992) */ /* Km per sec to AU per tropical century */ /* = 86400 * 36524.2198782 / 149597870.7 */ final double VF = 21.095; /* Constant pv-vector (cf. Seidelmann 3.591-2, vectors A and Adot) */ final double a[][] = new double[][] { { -1.62557e-6, -0.31919e-6, -0.13843e-6 }, { +1.245e-3, -1.580e-3, -0.659e-3 } }; /* 3x2 matrix of pv-vectors (cf. Seidelmann 3.592-1, matrix M^-1) */ final double em[][][][] = new double[][][][] { { { { +0.9999256795, +0.0111814828, +0.0048590039, }, { -0.00000242389840, -0.00000002710544, -0.00000001177742 } }, { { -0.0111814828, +0.9999374849, -0.0000271771, }, { +0.00000002710544, -0.00000242392702, +0.00000000006585 } }, { { -0.0048590040, -0.0000271557, +0.9999881946, }, { +0.00000001177742, +0.00000000006585, -0.00000242404995 } } }, { { { -0.000551, +0.238509, -0.435614, }, { +0.99990432, +0.01118145, +0.00485852 } }, { { -0.238560, -0.002667, +0.012254, }, { -0.01118145, +0.99991613, -0.00002717 } }, { { +0.435730, -0.008541, +0.002117, }, { -0.00485852, -0.00002716, +0.99996684 } } } }; /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* The FK5 data (units radians and arcsec per Julian century). */ r = r2000; d = d2000; ur = dr2000*PMF; ud = dd2000*PMF; px = p2000; rv = v2000; /* Express as a pv-vector. */ pxvf = px * VF; w = rv * pxvf; r0 = jauS2pv(r, d, 1.0, ur, ud, w); /* Convert pv-vector to Bessel-Newcomb system (cf. Seidelmann 3.592-1). */ for ( i = 0; i < 2; i++ ) { for ( j = 0; j < 3; j++ ) { w = 0.0; for ( k = 0; k < 2; k++ ) { for ( l = 0; l < 3; l++ ) { w += em[i][j][k][l] * r0[k][l]; } } r1[i][j] = w; } } /* Apply E-terms (equivalent to Seidelmann 3.592-3, one iteration). */ /* Direction. */ w = jauPm(r1[0]); p1 =jauSxp(jauPdp(r1[0],a[0]), r1[0]); p2 = jauSxp(w, a[0]); p1 = jauPmp(p2, p1); p1 = jauPpp(r1[0], p1); /* Recompute length. */ w = jauPm(p1); /* Direction. */ p1 = jauSxp(jauPdp(r1[0],a[0]), r1[0]); p2 = jauSxp(w, a[0]); p1 = jauPmp(p2, p1); pv[0] = jauPpp(r1[0], p1); /* Derivative. */ p1 =jauSxp(jauPdp(r1[0],a[1]), pv[0]); p2 = jauSxp(w, a[1]); p1 = jauPmp(p2, p1); pv[1] = jauPpp(r1[1], p1); /* Revert to catalog form. */ SphericalPositionVelocity sv = jauPv2s(pv);//, &r, &d, &w, &ur, &ud, &rd); if ( px > TINY ) { rv = sv.vel.r/pxvf; px = px/sv.pos.r; } /* Return the results. */ return new CatalogCoords(jauAnp(sv.pos.theta), sv.pos.phi, sv.vel.theta/PMF, sv.vel.phi/PMF, px, rv); } /** * Convert a J2000.0 FK5 star position to B1950.0 FK4, assuming zero * proper motion in FK5 and parallax. *

    This function is derived from the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * Status: support function. * @param r2000 double J2000.0 FK5 RA (rad) * @param d2000 double J2000.0 FK5 Dec (rad) * @param bepoch double Besselian epoch (e.g. 1950.0) * @return B1950.0 FK4 RA,Dec (rad) at epoch BEPOCH * *

    Notes:

      *
    1. In contrast to the iauFk524 routine, here the FK5 proper * motions, the parallax and the radial velocity are presumed zero. *
    2. This function converts a star position from the IAU 1976 FK5 * (Fricke) system to the former FK4 (Bessel-Newcomb) system, for * cases such as distant radio sources where it is presumed there is * zero parallax and no proper motion. Because of the E-terms of * aberration, such objects have (in general) non-zero proper motion * in FK4, and the present routine returns those fictitious proper * motions. *
    3. Conversion from B1950.0 FK4 to J2000.0 FK5 only is provided for. * Conversions involving other equinoxes would require additional * treatment for precession. *
    4. The position returned by this routine is in the B1950.0 FK4 * reference system but at Besselian epoch BEPOCH. For comparison * with catalogs the BEPOCH argument will frequently be 1950.0. (In * this context the distinction between Besselian and Julian epoch * is insignificant.) *
    5. The RA component of the returned (fictitious) proper motion is * dRA/dt rather than cos(Dec)*dRA/dt. *
    * Called: * jauAnp normalize angle into range 0 to 2pi * jauC2s p-vector to spherical * jauFk524 FK4 to FK5 * jauS2c spherical to p-vector * @version 2018 December 5 * @since SOFA release 2019-07-22 */ public static CatalogCoords jauFk54z(double r2000, double d2000, double bepoch) { double p[], w, v[]= new double[3]; int i; /* FK5 equinox J2000.0 to FK4 equinox B1950.0. */ CatalogCoords cc = jauFk524(r2000, d2000, 0.0, 0.0, 0.0, 0.0); /* Spherical to Cartesian. */ p = jauS2c(cc.pos.alpha, cc.pos.delta ); /* Fictitious proper motion (radians per year). */ v[0] = - cc.pm.alpha*p[1] - cc.pm.delta*cos(cc.pos.alpha)*sin(cc.pos.delta); v[1] = cc.pm.alpha*p[0] - cc.pm.delta*sin(cc.pos.alpha)*sin(cc.pos.delta); v[2] = cc.pm.delta*cos(cc.pos.delta); /* Apply the motion. */ w = bepoch - 1950.0; for ( i = 0; i < 3; i++ ) { p[i] += w*v[i]; } /* Cartesian to spherical. */ SphericalCoordinate sp = jauC2s(p); cc.pos.alpha = jauAnp(sp.alpha); cc.pos.delta = sp.delta; return cc; } /* * Coefficients for Moon longitude and distance series */ private static class Termlr { int nd; /* multiple of D in argument */ int nem; /* " " M " " */ int nemp; /* " " M' " " */ int nf; /* " " F " " */ double coefl; /* coefficient of L sine argument (deg) */ double coefr; /* coefficient of R cosine argument (m) */ public Termlr(int nd, int nem, int nemp, int nf, double coefl, double coefr) { this.nd = nd; this.nem = nem; this.nemp = nemp; this.nf = nf; this.coefl = coefl; this.coefr = coefr; } }; /* * Coefficients for Moon latitude series */ private static class Termb { int nd; /* multiple of D in argument */ int nem; /* " " M " " */ int nemp; /* " " M' " " */ int nf; /* " " F " " */ double coefb; /* coefficient of B sine argument (deg) */ public Termb(int nd, int nem, int nemp, int nf, double coefb) { this.nd = nd; this.nem = nem; this.nemp = nemp; this.nf = nf; this.coefb = coefb; } }; /** * * Approximate geocentric position and velocity of the Moon. * * This function is part of the International Astronomical Union's * SOFA (Standards Of Fundamental Astronomy) software collection. * *

    Status: support function. * *

    n.b. Not IAU-endorsed and without canonical status. * * * @param date1 double TT date part A (Notes 1,4) * @param date2 double TT date part B (Notes 1,4) * * * @return pv double[2][3] Moon p,v, GCRS (AU, AU/d, Note 5) * *

    Notes: *

      *
    1. The TT date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TT)=2450123.7 could be expressed in any of these ways, among * others: * * date1 date2 * * 2450123.7 0.0 (JD method) * 2451545.0 -1421.3 (J2000 method) * 2400000.5 50123.2 (MJD method) * 2450123.5 0.2 (date & time method) * * The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 method is best matched to the way the * argument is handled internally and will deliver the optimum * resolution. The MJD method and the date & time methods are both * good compromises between resolution and convenience. The limited * accuracy of the present algorithm is such that any of the methods * is satisfactory. * *
    2. This function is a full implementation of the algorithm * published by Meeus (see reference) except that the light-time * correction to the Moon's mean longitude has been omitted. * *
    3. Comparisons with ELP/MPP02 over the interval 1950-2100 gave RMS * errors of 2.9 arcsec in geocentric direction, 6.1 km in position * and 36 mm/s in velocity. The worst case errors were 18.3 arcsec * in geocentric direction, 31.7 km in position and 172 mm/s in * velocity. * *
    4. The original algorithm is expressed in terms of "dynamical time", * which can either be TDB or TT without any significant change in * accuracy. UT cannot be used without incurring significant errors * (30 arcsec in the present era) due to the Moon's 0.5 arcsec/sec * movement. * *
    5. The result is with respect to the GCRS (the same as J2000.0 mean * equator and equinox to within 23 mas). * *
    6. Velocity is obtained by a complete analytical differentiation * of the Meeus model. * *
    7. The Meeus algorithm generates position and velocity in mean * ecliptic coordinates of date, which the present function then * rotates into GCRS. Because the ecliptic system is precessing, * there is a coupling between this spin (about 1.4 degrees per * century) and the Moon position that produces a small velocity * contribution. In the present function this effect is neglected * as it corresponds to a maximum difference of less than 3 mm/s and * increases the RMS error by only 0.4%. *
    *

    References: *

      *
    • Meeus, J., Astronomical Algorithms, 2nd edition, Willmann-Bell, * 1998, p337. * *
    • Simon, J.L., Bretagnon, P., Chapront, J., Chapront-Touze, M., * Francou, G. & Laskar, J., Astron.Astrophys., 1994, 282, 663 *
    * Defined in sofam.h: * DAU astronomical unit (m) * DJC days per Julian century * DJ00 reference epoch (J2000.0), Julian Date * DD2R degrees to radians * * Called: * iauS2pv spherical coordinates to pv-vector * iauPfw06 bias-precession F-W angles, IAU 2006 * iauIr initialize r-matrix to identity * iauRz rotate around Z-axis * iauRx rotate around X-axis * iauRxpv product of r-matrix and pv-vector * * @version 2021 May 11 * * @since SOFA release 2021-05-12 * * */ public static double[][] jauMoon98 ( double date1, double date2 ) { /* ** Coefficients for fundamental arguments: ** ** . Powers of time in Julian centuries ** . Units are degrees. */ /* Moon's mean longitude (wrt mean equinox and ecliptic of date) */ final double elp0 = 218.31665436, /* Simon et al. (1994). */ elp1 = 481267.88123421, elp2 = -0.0015786, elp3 = 1.0 / 538841.0, elp4 = -1.0 / 65194000.0; double elp, delp; /* Moon's mean elongation */ final double d0 = 297.8501921, d1 = 445267.1114034, d2 = -0.0018819, d3 = 1.0 / 545868.0, d4 = 1.0 / 113065000.0; double d, dd; /* Sun's mean anomaly */ final double em0 = 357.5291092, em1 = 35999.0502909, em2 = -0.0001536, em3 = 1.0 / 24490000.0, em4 = 0.0; double em, dem; /* Moon's mean anomaly */ final double emp0 = 134.9633964, emp1 = 477198.8675055, emp2 = 0.0087414, emp3 = 1.0 / 69699.0, emp4 = -1.0 / 14712000.0; double emp, demp; /* Mean distance of the Moon from its ascending node */ final double f0 = 93.2720950, f1 = 483202.0175233, f2 = -0.0036539, f3 = 1.0 / 3526000.0, f4 = 1.0 / 863310000.0; double f, df; /* ** Other arguments */ /* Meeus A_1, due to Venus (deg) */ final double a10 = 119.75, a11 = 131.849; double a1, da1; /* Meeus A_2, due to Jupiter (deg) */ final double a20 = 53.09, a21 = 479264.290; double a2, da2; /* Meeus A_3, due to sidereal motion of the Moon in longitude (deg) */ final double a30 = 313.45, a31 = 481266.484; double a3, da3; /* Coefficients for Meeus "additive terms" (deg) */ final double al1 = 0.003958, al2 = 0.001962, al3 = 0.000318; final double ab1 = -0.002235, ab2 = 0.000382, ab3 = 0.000175, ab4 = 0.000175, ab5 = 0.000127, ab6 = -0.000115; /* Fixed term in distance (m) */ final double r0 = 385000560.0; /* Coefficients for (dimensionless) E factor */ final double e1 = -0.002516, e2 = -0.0000074; double e, de, esq, desq; final Termlr tlr[] = { new Termlr(0, 0, 1, 0, 6.288774, -20905355.0), new Termlr(2, 0, -1, 0, 1.274027, -3699111.0), new Termlr(2, 0, 0, 0, 0.658314, -2955968.0), new Termlr(0, 0, 2, 0, 0.213618, -569925.0), new Termlr(0, 1, 0, 0, -0.185116, 48888.0), new Termlr(0, 0, 0, 2, -0.114332, -3149.0), new Termlr(2, 0, -2, 0, 0.058793, 246158.0), new Termlr(2, -1, -1, 0, 0.057066, -152138.0), new Termlr(2, 0, 1, 0, 0.053322, -170733.0), new Termlr(2, -1, 0, 0, 0.045758, -204586.0), new Termlr(0, 1, -1, 0, -0.040923, -129620.0), new Termlr(1, 0, 0, 0, -0.034720, 108743.0), new Termlr(0, 1, 1, 0, -0.030383, 104755.0), new Termlr(2, 0, 0, -2, 0.015327, 10321.0), new Termlr(0, 0, 1, 2, -0.012528, 0.0), new Termlr(0, 0, 1, -2, 0.010980, 79661.0), new Termlr(4, 0, -1, 0, 0.010675, -34782.0), new Termlr(0, 0, 3, 0, 0.010034, -23210.0), new Termlr(4, 0, -2, 0, 0.008548, -21636.0), new Termlr(2, 1, -1, 0, -0.007888, 24208.0), new Termlr(2, 1, 0, 0, -0.006766, 30824.0), new Termlr(1, 0, -1, 0, -0.005163, -8379.0), new Termlr(1, 1, 0, 0, 0.004987, -16675.0), new Termlr(2, -1, 1, 0, 0.004036, -12831.0), new Termlr(2, 0, 2, 0, 0.003994, -10445.0), new Termlr(4, 0, 0, 0, 0.003861, -11650.0), new Termlr(2, 0, -3, 0, 0.003665, 14403.0), new Termlr(0, 1, -2, 0, -0.002689, -7003.0), new Termlr(2, 0, -1, 2, -0.002602, 0.0), new Termlr(2, -1, -2, 0, 0.002390, 10056.0), new Termlr(1, 0, 1, 0, -0.002348, 6322.0), new Termlr(2, -2, 0, 0, 0.002236, -9884.0), new Termlr(0, 1, 2, 0, -0.002120, 5751.0), new Termlr(0, 2, 0, 0, -0.002069, 0.0), new Termlr(2, -2, -1, 0, 0.002048, -4950.0), new Termlr(2, 0, 1, -2, -0.001773, 4130.0), new Termlr(2, 0, 0, 2, -0.001595, 0.0), new Termlr(4, -1, -1, 0, 0.001215, -3958.0), new Termlr(0, 0, 2, 2, -0.001110, 0.0), new Termlr(3, 0, -1, 0, -0.000892, 3258.0), new Termlr(2, 1, 1, 0, -0.000810, 2616.0), new Termlr(4, -1, -2, 0, 0.000759, -1897.0), new Termlr(0, 2, -1, 0, -0.000713, -2117.0), new Termlr(2, 2, -1, 0, -0.000700, 2354.0), new Termlr(2, 1, -2, 0, 0.000691, 0.0), new Termlr(2, -1, 0, -2, 0.000596, 0.0), new Termlr(4, 0, 1, 0, 0.000549, -1423.0), new Termlr(0, 0, 4, 0, 0.000537, -1117.0), new Termlr(4, -1, 0, 0, 0.000520, -1571.0), new Termlr(1, 0, -2, 0, -0.000487, -1739.0), new Termlr(2, 1, 0, -2, -0.000399, 0.0), new Termlr(0, 0, 2, -2, -0.000381, -4421.0), new Termlr(1, 1, 1, 0, 0.000351, 0.0), new Termlr(3, 0, -2, 0, -0.000340, 0.0), new Termlr(4, 0, -3, 0, 0.000330, 0.0), new Termlr(2, -1, 2, 0, 0.000327, 0.0), new Termlr(0, 2, 1, 0, -0.000323, 1165.0), new Termlr(1, 1, -1, 0, 0.000299, 0.0), new Termlr(2, 0, 3, 0, 0.000294, 0.0), new Termlr(2, 0, -1, -2, 0.000000, 8752.0)}; final int NLR = tlr.length; final Termb tb[] = { new Termb(0, 0, 0, 1, 5.128122), new Termb(0, 0, 1, 1, 0.280602), new Termb(0, 0, 1, -1, 0.277693), new Termb(2, 0, 0, -1, 0.173237), new Termb(2, 0, -1, 1, 0.055413), new Termb(2, 0, -1, -1, 0.046271), new Termb(2, 0, 0, 1, 0.032573), new Termb(0, 0, 2, 1, 0.017198), new Termb(2, 0, 1, -1, 0.009266), new Termb(0, 0, 2, -1, 0.008822), new Termb(2, -1, 0, -1, 0.008216), new Termb(2, 0, -2, -1, 0.004324), new Termb(2, 0, 1, 1, 0.004200), new Termb(2, 1, 0, -1, -0.003359), new Termb(2, -1, -1, 1, 0.002463), new Termb(2, -1, 0, 1, 0.002211), new Termb(2, -1, -1, -1, 0.002065), new Termb(0, 1, -1, -1, -0.001870), new Termb(4, 0, -1, -1, 0.001828), new Termb(0, 1, 0, 1, -0.001794), new Termb(0, 0, 0, 3, -0.001749), new Termb(0, 1, -1, 1, -0.001565), new Termb(1, 0, 0, 1, -0.001491), new Termb(0, 1, 1, 1, -0.001475), new Termb(0, 1, 1, -1, -0.001410), new Termb(0, 1, 0, -1, -0.001344), new Termb(1, 0, 0, -1, -0.001335), new Termb(0, 0, 3, 1, 0.001107), new Termb(4, 0, 0, -1, 0.001021), new Termb(4, 0, -1, 1, 0.000833), new Termb(0, 0, 1, -3, 0.000777), new Termb(4, 0, -2, 1, 0.000671), new Termb(2, 0, 0, -3, 0.000607), new Termb(2, 0, 2, -1, 0.000596), new Termb(2, -1, 1, -1, 0.000491), new Termb(2, 0, -2, 1, -0.000451), new Termb(0, 0, 3, -1, 0.000439), new Termb(2, 0, 2, 1, 0.000422), new Termb(2, 0, -3, -1, 0.000421), new Termb(2, 1, -1, 1, -0.000366), new Termb(2, 1, 0, 1, -0.000351), new Termb(4, 0, 0, 1, 0.000331), new Termb(2, -1, 1, 1, 0.000315), new Termb(2, -2, 0, -1, 0.000302), new Termb(0, 0, 1, 3, -0.000283), new Termb(2, 1, 1, -1, -0.000229), new Termb(1, 1, 0, -1, 0.000223), new Termb(1, 1, 0, 1, 0.000223), new Termb(0, 1, -2, -1, -0.000220), new Termb(2, 1, -1, -1, -0.000220), new Termb(1, 0, 1, 1, -0.000185), new Termb(2, -1, -2, -1, 0.000181), new Termb(0, 1, 2, 1, -0.000177), new Termb(4, 0, -2, -1, 0.000176), new Termb(4, -1, -1, -1, 0.000166), new Termb(1, 0, 1, -1, -0.000164), new Termb(4, 0, 1, -1, 0.000132), new Termb(1, 0, -1, -1, -0.000119), new Termb(4, -1, 0, -1, 0.000115), new Termb(2, -2, 0, 1, 0.000107)}; final int NB = tb.length; /* Miscellaneous */ int n, i; double t, elpmf, delpmf, vel, vdel, vr, vdr, a1mf, da1mf, a1pf, da1pf, dlpmp, slpmp, vb, vdb, v, dv, emn, empn, dn, fn, en, den, arg, darg, farg, coeff, el, del, r, dr, b, db, rm[][]= new double[3][3]; /* ------------------------------------------------------------------ */ /* Centuries since J2000.0 */ t = ((date1 - DJ00) + date2) / DJC; /* --------------------- */ /* Fundamental arguments */ /* --------------------- */ /* Arguments (radians) and derivatives (radians per Julian century) for the current date. */ /* Moon's mean longitude. */ elp = DD2R * fmod ( elp0 + ( elp1 + ( elp2 + ( elp3 + elp4 * t ) * t ) * t ) * t, 360.0 ); delp = DD2R * ( elp1 + ( elp2 * 2.0 + ( elp3 * 3.0 + elp4 * 4.0 * t ) * t ) * t ); /* Moon's mean elongation. */ d = DD2R * fmod ( d0 + ( d1 + ( d2 + ( d3 + d4 * t ) * t ) * t ) * t, 360.0 ); dd = DD2R * ( d1 + ( d2 * 2.0 + ( d3 * 3.0 + d4 * 4.0 * t ) * t ) * t ); /* Sun's mean anomaly. */ em = DD2R * fmod ( em0 + ( em1 + ( em2 + ( em3 + em4 * t ) * t ) * t ) * t, 360.0 ); dem = DD2R * ( em1 + ( em2 * 2.0 + ( em3 * 3.0 + em4 * 4.0 * t ) * t ) * t ); /* Moon's mean anomaly. */ emp = DD2R * fmod ( emp0 + ( emp1 + ( emp2 + ( emp3 + emp4 * t ) * t ) * t ) * t, 360.0 ); demp = DD2R * ( emp1 + ( emp2 * 2.0 + ( emp3 * 3.0 + emp4 * 4.0 * t ) * t ) * t ); /* Mean distance of the Moon from its ascending node. */ f = DD2R * fmod ( f0 + ( f1 + ( f2 + ( f3 + f4 * t ) * t ) * t ) * t, 360.0 ); df = DD2R * ( f1 + ( f2 * 2.0 + ( f3 * 3.0 + f4 * 4.0 * t ) * t ) * t ); /* Meeus further arguments. */ a1 = DD2R * ( a10 + a11*t ); da1 = DD2R * al1; a2 = DD2R * ( a20 + a21*t ); da2 = DD2R * a21; a3 = DD2R * ( a30 + a31*t ); da3 = DD2R * a31; /* E-factor, and square. */ e = 1.0 + ( e1 + e2*t ) * t; de = e1 + 2.0*e2*t; esq = e*e; desq = 2.0*e*de; /* Use the Meeus additive terms (deg) to start off the summations. */ elpmf = elp - f; delpmf = delp - df; vel = al1 * sin(a1) + al2 * sin(elpmf) + al3 * sin(a2); vdel = al1 * cos(a1) * da1 + al2 * cos(elpmf) * delpmf + al3 * cos(a2) * da2; vr = 0.0; vdr = 0.0; a1mf = a1 - f; da1mf = da1 - df; a1pf = a1 + f; da1pf = da1 + df; dlpmp = elp - emp; slpmp = elp + emp; vb = ab1 * sin(elp) + ab2 * sin(a3) + ab3 * sin(a1mf) + ab4 * sin(a1pf) + ab5 * sin(dlpmp) + ab6 * sin(slpmp); vdb = ab1 * cos(elp) * delp + ab2 * cos(a3) * da3 + ab3 * cos(a1mf) * da1mf + ab4 * cos(a1pf) * da1pf + ab5 * cos(dlpmp) * (delp-demp) + ab6 * cos(slpmp) * (delp+demp); /* ----------------- */ /* Series expansions */ /* ----------------- */ /* Longitude and distance plus derivatives. */ for ( n = NLR-1; n >= 0; n-- ) { dn = (double) tlr[n].nd; emn = (double) ( i = tlr[n].nem ); empn = (double) tlr[n].nemp; fn = (double) tlr[n].nf; switch ( abs(i) ) { case 1: en = e; den = de; break; case 2: en = esq; den = desq; break; default: en = 1.0; den = 0.0; } arg = dn*d + emn*em + empn*emp + fn*f; darg = dn*dd + emn*dem + empn*demp + fn*df; farg = sin(arg); v = farg * en; dv = cos(arg)*darg*en + farg*den; coeff = tlr[n].coefl; vel += coeff * v; vdel += coeff * dv; farg = cos(arg); v = farg * en; dv = -sin(arg)*darg*en + farg*den; coeff = tlr[n].coefr; vr += coeff * v; vdr += coeff * dv; } el = elp + DD2R*vel; del = ( delp + DD2R*vdel ) / DJC; r = ( vr + r0 ) / DAU; dr = vdr / DAU / DJC; /* Latitude plus derivative. */ for ( n = NB-1; n >= 0; n-- ) { dn = (double) tb[n].nd; emn = (double) ( i = tb[n].nem ); empn = (double) tb[n].nemp; fn = (double) tb[n].nf; switch ( abs(i) ) { case 1: en = e; den = de; break; case 2: en = esq; den = desq; break; default: en = 1.0; den = 0.0; } arg = dn*d + emn*em + empn*emp + fn*f; darg = dn*dd + emn*dem + empn*demp + fn*df; farg = sin(arg); v = farg * en; dv = cos(arg)*darg*en + farg*den; coeff = tb[n].coefb; vb += coeff * v; vdb += coeff * dv; } b = vb * DD2R; db = vdb * DD2R / DJC; /* ------------------------------ */ /* Transformation into final form */ /* ------------------------------ */ /* Longitude, latitude to x, y, z (AU). */ double[][] pv = jauS2pv ( el, b, r, del, db, dr ); /* IAU 2006 Fukushima-Williams bias+precession angles. */ FWPrecessionAngles fw = jauPfw06 ( date1, date2 ); /* Mean ecliptic coordinates to GCRS rotation matrix. */ jauIr ( rm ); jauRz ( fw.psib, rm ); jauRx ( -fw.phib, rm ); jauRz ( -fw.gamb, rm ); /* Rotate the Moon position and velocity into GCRS (Note 6). */ return jauRxpv ( rm, pv); } /** * Transform a star's ICRS catalog entry (epoch J2000.0) into ICRS * astrometric place. * * This function is part of the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * * Status: support function. * * * @param rc double ICRS right ascension at J2000.0 (radians, Note 1) * @param dc double ICRS declination at J2000.0 (radians, Note 1) * @param pr double RA proper motion (radians/year, Note 2) * @param pd double Dec proper motion (radians/year) * @param px double parallax (arcsec) * @param rv double radial velocity (km/s, +ve if receding) * @param date1 double TDB as a 2-part... * @param date2 double ...Julian Date (Note 3) * * * @return ra,da double* ICRS astrometric RA,Dec (radians) * *

    Notes: *

      *
    1. Star data for an epoch other than J2000.0 (for example from the * Hipparcos catalog, which has an epoch of J1991.25) will require a * preliminary call to iauPmsafe before use. * *
    2. The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. * *
    3. The TDB date date1+date2 is a Julian Date, apportioned in any * convenient way between the two arguments. For example, * JD(TDB)=2450123.7 could be expressed in any of these ways, among * others: * * date1 date2 * * 2450123.7 0.0 (JD method) * 2451545.0 -1421.3 (J2000 method) * 2400000.5 50123.2 (MJD method) * 2450123.5 0.2 (date & time method) * * The JD method is the most natural and convenient to use in cases * where the loss of several decimal digits of resolution is * acceptable. The J2000 method is best matched to the way the * argument is handled internally and will deliver the optimum * resolution. The MJD method and the date & time methods are both * good compromises between resolution and convenience. For most * applications of this function the choice will not be at all * critical. * * TT can be used instead of TDB without any significant impact on * accuracy. *
    * Called: * iauApci13 astrometry parameters, ICRS-CIRS, 2013 * iauAtccq quick catalog ICRS to astrometric * * @version 2021 April 18 * * @since SOFA release 2021-05-12 * * */ public static SphericalCoordinate jauAtcc13(double rc, double dc, double pr, double pd, double px, double rv, double date1, double date2) { /* Star-independent astrometry parameters */ Astrom astrom = new Astrom(); /* The transformation parameters. */ jauApci13(date1, date2, astrom); /* Catalog ICRS (epoch J2000.0) to astrometric. */ return jauAtccq(rc, dc, pr, pd, px, rv, astrom); /* Finished. */ } /** * Quick transformation of a star's ICRS catalog entry (epoch J2000.0) * into ICRS astrometric place, given precomputed star-independent * astrometry parameters. * * Use of this function is appropriate when efficiency is important and * where many star positions are to be transformed for one date. The * star-independent parameters can be obtained by calling one of the * functions iauApci[13], iauApcg[13], iauApco[13] or iauApcs[13]. * * If the parallax and proper motions are zero the transformation has * no effect. * * This function is part of the International Astronomical Union's * SOFA (Standards of Fundamental Astronomy) software collection. * * Status: support function. * * * @param rc double ICRS RA at J2000.0 (radians) * @param dc double ICRS Dec at J2000.0 (radians) * @param pr double RA proper motion (radians/year, Note 3) * @param pd double Dec proper motion (radians/year) * @param px double parallax (arcsec) * @param rv double radial velocity (km/s, +ve if receding) * @param astrom Astrom star-independent astrometry parameters: * * * @return ra,da SphericalCoordinate ICRS astrometric RA,Dec (radians) * *

    Notes: *

      *
    1. All the vectors are with respect to BCRS axes. * *
    2. Star data for an epoch other than J2000.0 (for example from the * Hipparcos catalog, which has an epoch of J1991.25) will require a * preliminary call to iauPmsafe before use. * *
    3. The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. *
    * Called: * iauPmpx proper motion and parallax * iauC2s p-vector to spherical * iauAnp normalize angle into range 0 to 2pi * * @version 2021 April 18 * * @since SOFA release 2021-05-12 * * */ public static SphericalCoordinate jauAtccq(double rc, double dc, double pr, double pd, double px, double rv, Astrom astrom) { double p[]; /* Proper motion and parallax, giving BCRS coordinate direction. */ p = jauPmpx(rc, dc, pr, pd, px, rv, astrom.pmt, astrom.eb); /* ICRS astrometric RA,Dec. */ SphericalCoordinate co = jauC2s(p); co.alpha = jauAnp(co.alpha); return co; /* Finished. */ } } // end of JSOFA Class /* * Copyright © 2021 Paul Harrison, University of Manchester. * * This JSOFA software is derived from the official C release of the "Standards Of Fundamental Astronomy" (SOFA) library * of the International Astronomical Union. The intention is to reproduce the functionality and algorithms of * the official SOFA library in a pure Java form. * * The responsibility for the maintenance and supply of the JSOFA library lies with the author (not the IAU SOFA Board), * However, The JSOFA software is provided "as is" and the author makes no warranty as to its use or performance. * The author does not and cannot warrant the performance or results which the user may obtain by using the JSOFA software. * The author makes no warranties, express or implied, as to non-infringement of third party rights, merchantability, * or fitness for any particular purpose. In no event will the author be liable to the user for any consequential, * incidental, or special damages, including any lost profits or lost savings, even if the author has been advised * of such damages, or for any claim by any third party. * * Other conditions of the original license (reproduced below) are carried over as applicable. */ /*---------------------------------------------------------------------- * * Copyright (C) 2021 * Standards Of Fundamental Astronomy Board * of the International Astronomical Union. * * ===================== * SOFA Software License * ===================== * * NOTICE TO USER: * * BY USING THIS SOFTWARE YOU ACCEPT THE FOLLOWING SIX TERMS AND * CONDITIONS WHICH APPLY TO ITS USE. * * 1. The Software is owned by the IAU SOFA Board ("SOFA"). * * 2. Permission is granted to anyone to use the SOFA software for any * purpose, including commercial applications, free of charge and * without payment of royalties, subject to the conditions and * restrictions listed below. * * 3. You (the user) may copy and distribute SOFA source code to others, * and use and adapt its code and algorithms in your own software, * on a world-wide, royalty-free basis. That portion of your * distribution that does not consist of intact and unchanged copies * of SOFA source code files is a "derived work" that must comply * with the following requirements: * * a) Your work shall be marked or carry a statement that it * (i) uses routines and computations derived by you from * software provided by SOFA under license to you; and * (ii) does not itself constitute software provided by and/or * endorsed by SOFA. * * b) The source code of your derived work must contain descriptions * of how the derived work is based upon, contains and/or differs * from the original SOFA software. * * c) The names of all routines in your derived work shall not * include the prefix "iau" or "sofa" or trivial modifications * thereof such as changes of case. * * d) The origin of the SOFA components of your derived work must * not be misrepresented; you must not claim that you wrote the * original software, nor file a patent application for SOFA * software or algorithms embedded in the SOFA software. * * e) These requirements must be reproduced intact in any source * distribution and shall apply to anyone to whom you have * granted a further right to modify the source code of your * derived work. * * Note that, as originally distributed, the SOFA software is * intended to be a definitive implementation of the IAU standards, * and consequently third-party modifications are discouraged. All * variations, no matter how minor, must be explicitly marked as * such, as explained above. * * 4. You shall not cause the SOFA software to be brought into * disrepute, either by misuse, or use for inappropriate tasks, or * by inappropriate modification. * * 5. The SOFA software is provided "as is" and SOFA makes no warranty * as to its use or performance. SOFA does not and cannot warrant * the performance or results which the user may obtain by using the * SOFA software. SOFA makes no warranties, express or implied, as * to non-infringement of third party rights, merchantability, or * fitness for any particular purpose. In no event will SOFA be * liable to the user for any consequential, incidental, or special * damages, including any lost profits or lost savings, even if a * SOFA representative has been advised of such damages, or for any * claim by any third party. * * 6. The provision of any version of the SOFA software under the terms * and conditions specified herein does not imply that future * versions will also be made available under the same terms and * conditions. * * In any published work or commercial product which uses the SOFA * software directly, acknowledgement (see www.iausofa.org) is * appreciated. * * Correspondence concerning SOFA software should be addressed as * follows: * * By email: sofa@ukho.gov.uk * By post: IAU SOFA Center * HM Nautical Almanac Office * UK Hydrographic Office * Admiralty Way, Taunton * Somerset, TA1 2DN * United Kingdom * *--------------------------------------------------------------------*/ /* * $Log$ */ jsofa-20210512_JSOFA_Release/src/main/java/org/jastronomy/jsofa/JSOFAException.java000066400000000000000000000016441404751573700275740ustar00rootroot00000000000000/* * $Id$ * * Created on 28 Jan 2010 by Paul Harrison (paul.harrison@manchester.ac.uk) * Copyright 2010 Paul Harrison. All rights reserved. * * This software is published under the terms of the * software license which has been included * with this distribution in the LICENSE.txt file. * */ package org.jastronomy.jsofa; /** * Base class for JSOFA exceptions. * . * @author Paul Harrison (paul.harrison@manchester.ac.uk) 21 Nov 2011 * @version $Revision$ $date$ */ public class JSOFAException extends Exception { /** Comment for serialVersionUID */ private static final long serialVersionUID = 4100437038026589596L; /** Original JSOFA status value; */ private int status; public int getStatus() { return status; } public JSOFAException(String message, int status) { super(message); this.status = status; } } /* * $Log$ */ jsofa-20210512_JSOFA_Release/src/main/java/org/jastronomy/jsofa/JSOFAFailedConvergenceException.java000066400000000000000000000013601404751573700330530ustar00rootroot00000000000000/* * $Id$ * * Created on 1 Feb 2010 by Paul Harrison (paul.harrison@manchester.ac.uk) * Copyright 2010 Paul Harrison. All rights reserved. * * This software is published under the terms of the * software license which has been included * with this distribution in the LICENSE.txt file. * */ package org.jastronomy.jsofa; /** * Exception reporting some form of convergence failure in an algorithm. */ public class JSOFAFailedConvergenceException extends JSOFAException { /** Comment for serialVersionUID */ private static final long serialVersionUID = 4417087001300889769L; public JSOFAFailedConvergenceException(String message, int status) { super(message, status); } } /* * $Log$ */ jsofa-20210512_JSOFA_Release/src/main/java/org/jastronomy/jsofa/JSOFAIllegalParameter.java000066400000000000000000000015061404751573700310450ustar00rootroot00000000000000/* * $Id$ * * Created on 1 Feb 2010 by Paul Harrison (paul.harrison@manchester.ac.uk) * Copyright 2010 Paul Harrison. All rights reserved. * * This software is published under the terms of the * software license which has been included * with this distribution in the LICENSE.txt file. * */ package org.jastronomy.jsofa; /** * Various forms of illegal parameters are reported with this execption. * . * @author Paul Harrison (paul.harrison@manchester.ac.uk) 21 Nov 2011 * @version $Revision$ $date$ */ public class JSOFAIllegalParameter extends JSOFAException { /** Comment for serialVersionUID */ private static final long serialVersionUID = 4164536110692125140L; public JSOFAIllegalParameter(String message, int status) { super(message, status); } } /* * $Log$ */ jsofa-20210512_JSOFA_Release/src/main/java/org/jastronomy/jsofa/JSOFAInternalError.java000066400000000000000000000014401404751573700304160ustar00rootroot00000000000000/* * $Id$ * * Created on 1 Feb 2010 by Paul Harrison (paul.harrison@manchester.ac.uk) * Copyright 2010 Paul Harrison. All rights reserved. * * This software is published under the terms of the * software license which has been included * with this distribution in the LICENSE.txt file. * */ package org.jastronomy.jsofa; /** * Exception signalling a internal error. * . * @author Paul Harrison (paul.harrison@manchester.ac.uk) 21 Nov 2011 * @version $Revision$ $date$ */ public class JSOFAInternalError extends JSOFAException { /** Comment for serialVersionUID */ private static final long serialVersionUID = 6067803703985219165L; public JSOFAInternalError(String message, int status) { super(message, status); } } /* * $Log$ */ jsofa-20210512_JSOFA_Release/src/main/java/org/jastronomy/jsofa/package-info.java000066400000000000000000000747141404751573700274070ustar00rootroot00000000000000/** * This software is a translation of the official C SOFA software package. http://www.iausofa.org/. The translation was done * by hand with the intention of retaining the structure of the original software as far as possible. This means that the original JSOFA C functions are translated to static member functions of * the main {@link org.jastronomy.jsofa.JSOFA} class. * * The translation was originally made from the 2010-12-01 release of the JSOFA Library for ANSI C. Any updates to this software * have been be made by incremental changes in the original source. * * The current software (version @value org.jastronomy.jsofa.JSOFA#JSOFA_RELEASE}) is based on SOFA version {@value org.jastronomy.jsofa.JSOFA#SOFA_RELEASE} revision {@value org.jastronomy.jsofa.JSOFA#SOFA_REVISION} * * This javadoc provides a detailed manual on how to use each function - there are also some cookbooks on the IAU SOFA site which can * also be used to discover how to use the library bearing in mind the changes outlined below. * *

    Notable API changes from the original include: *

      *
    • function names begin with the prefix "jau" rather than "iau"
    • *
    • many of the original SOFA routines return multiple values via pointers - the java translation achieves this by returning composite objects * (e.g. {@link org.jastronomy.jsofa.JSOFA#jauEpb2jd(double)} which * uses {@link org.jastronomy.jsofa.JSOFA.JulianDate} as the function return value), or a single array (e.g. {@link org.jastronomy.jsofa.JSOFA#jauC2i06a(double, double)} ), * however in some cases where the original was returning several arrays (that must be supplied in an empty form on calling), that pattern has been retained in the java version.
    • *
    • introduced simple {@link org.jastronomy.jsofa.JSOFAException} and children instead of the status return value.
    • *
    • the test routines use the JUnit framework.
    • *
    * *

    There are a number of features of the java translation *

      *
    • The "functions" of the library are all static member functions of {@link org.jastronomy.jsofa.JSOFA}
    • *
    • Class data members are typically publicly visible and no accessors are used - This makes the library code more "C"-like
    • *
    * * *

    List of Routines Grouped by functionality

    *

    Calendars

    {@link org.jastronomy.jsofa.JSOFA#jauCal2jd} Gregorian calendar to Julian Day number
    {@link org.jastronomy.jsofa.JSOFA#jauEpb} Julian Date to Besselian Epoch
    {@link org.jastronomy.jsofa.JSOFA#jauEpb2jd} Besselian Epoch to Julian Date
    {@link org.jastronomy.jsofa.JSOFA#jauEpj} Julian Date to Julian Epoch
    {@link org.jastronomy.jsofa.JSOFA#jauEpj2jd} Julian Epoch to Julian Date
    {@link org.jastronomy.jsofa.JSOFA#jauJd2cal} Julian Date to Gregorian year, month, day, fraction
    {@link org.jastronomy.jsofa.JSOFA#jauJdcalf} Julian Date to Gregorian date for formatted output

    Astrometry

    {@link org.jastronomy.jsofa.JSOFA#jauAb} Apply stellar aberration
    {@link org.jastronomy.jsofa.JSOFA#jauApcg} prepare for ICRS <-> GCRS, geocentric, special
    {@link org.jastronomy.jsofa.JSOFA#jauApcg13} prepare for ICRS <-> GCRS, geocentric
    {@link org.jastronomy.jsofa.JSOFA#jauApci} prepare for ICRS <-> CIRS, terrestrial, special
    {@link org.jastronomy.jsofa.JSOFA#jauApci13} prepare for ICRS <-> CIRS, terrestrial
    {@link org.jastronomy.jsofa.JSOFA#jauApco} prepare for ICRS <-> observed, terrestrial, special
    {@link org.jastronomy.jsofa.JSOFA#jauApco13} prepare for ICRS <-> observed, terrestrial
    {@link org.jastronomy.jsofa.JSOFA#jauApcs} prepare for ICRS <-> CIRS, space, special
    {@link org.jastronomy.jsofa.JSOFA#jauApcs13} prepare for ICRS <-> CIRS, space
    {@link org.jastronomy.jsofa.JSOFA#jauAper} insert ERA into context
    {@link org.jastronomy.jsofa.JSOFA#jauAper13} update context for Earth rotation
    {@link org.jastronomy.jsofa.JSOFA#jauApio} prepare for CIRS <-> observed, terrestrial, special
    {@link org.jastronomy.jsofa.JSOFA#jauApio13} prepare for CIRS <-> observed, terrestrial
    {@link org.jastronomy.jsofa.JSOFA#jauAtcc13} catalog -> ICRS
    {@link org.jastronomy.jsofa.JSOFA#jauAtccq} quick catalog -> ICRS
    {@link org.jastronomy.jsofa.JSOFA#jauAtci13} catalog -> CIRS
    {@link org.jastronomy.jsofa.JSOFA#jauAtciq} quick ICRS -> CIRS
    {@link org.jastronomy.jsofa.JSOFA#jauAtciqn} quick ICRS -> CIRS, multiple deflections
    {@link org.jastronomy.jsofa.JSOFA#jauAtciqz} quick astrometric ICRS -> CIRS
    {@link org.jastronomy.jsofa.JSOFA#jauAtco13} ICRS -> observed
    {@link org.jastronomy.jsofa.JSOFA#jauAtic13} CIRS -> ICRS
    {@link org.jastronomy.jsofa.JSOFA#jauAticq} quick CIRS -> ICRS
    {@link org.jastronomy.jsofa.JSOFA#jauAtciqn} quick CIRS -> ICRS, multiple deflections
    {@link org.jastronomy.jsofa.JSOFA#jauAtio13} CIRS -> observed
    {@link org.jastronomy.jsofa.JSOFA#jauAtioq} quick CIRS -> observed
    {@link org.jastronomy.jsofa.JSOFA#jauAtoc13} observed -> astrometric ICRS
    {@link org.jastronomy.jsofa.JSOFA#jauAtoi13} observed -> CIRS
    {@link org.jastronomy.jsofa.JSOFA#jauAtoiq} quick observed -> CIRS
    {@link org.jastronomy.jsofa.JSOFA#jauLd} light deflection by a single solar-system body
    {@link org.jastronomy.jsofa.JSOFA#jauLdn} light deflection by multiple solar-system bodies
    {@link org.jastronomy.jsofa.JSOFA#jauLdsun} light deflection by the Sun
    {@link org.jastronomy.jsofa.JSOFA#jauPmpx} apply proper motion and parallax
    {@link org.jastronomy.jsofa.JSOFA#jauPvtob} observatory position and velocity
    {@link org.jastronomy.jsofa.JSOFA#jauRefco} refraction constants
    {@link org.jastronomy.jsofa.JSOFA#jauPvstar} space motion pv-vector to star catalog data
    {@link org.jastronomy.jsofa.JSOFA#jauStarpv} star catalog data to space motion pv-vector

    Galactic

    {@link org.jastronomy.jsofa.JSOFA#jauG2icrs} Transformation from Galactic Coordinates to ICRS
    {@link org.jastronomy.jsofa.JSOFA#jauIcrs2g} Transformation from ICRS to Galactic Coordinates

    Ecliptic coordinates

    {@link org.jastronomy.jsofa.JSOFA#jauEceq06} ecliptic to ICRS, IAU 2006
    {@link org.jastronomy.jsofa.JSOFA#jauEcm06} rotation matrix, ICRS to ecliptic, IAU 2006
    {@link org.jastronomy.jsofa.JSOFA#jauEqec06} ICRS to ecliptic, IAU 2006
    {@link org.jastronomy.jsofa.JSOFA#jauLteceq} ecliptic to ICRS, long term
    {@link org.jastronomy.jsofa.JSOFA#jauLtecm} rotation matrix, ICRS to ecliptic, long-term
    {@link org.jastronomy.jsofa.JSOFA#jauLteqec} ICRS to ecliptic, long term

    Time scales

    {@link org.jastronomy.jsofa.JSOFA#jauD2dtf} format 2-part JD for output
    {@link org.jastronomy.jsofa.JSOFA#jauDat} Delta(AT) (=TAI-UTC) for a given UTC date
    {@link org.jastronomy.jsofa.JSOFA#jauDtdb} TDB-TT
    {@link org.jastronomy.jsofa.JSOFA#jauDtf2d} encode time and date fields into 2-part JD
    {@link org.jastronomy.jsofa.JSOFA#jauTaitt} TAI to TT
    {@link org.jastronomy.jsofa.JSOFA#jauTaiut1} TAI to UT1
    {@link org.jastronomy.jsofa.JSOFA#jauTaiutc} TAI to UTC
    {@link org.jastronomy.jsofa.JSOFA#jauTcbtdb} TCB to TDB
    {@link org.jastronomy.jsofa.JSOFA#jauTcgtt} TCG to TT
    {@link org.jastronomy.jsofa.JSOFA#jauTdbtcb} TDB to TCB
    {@link org.jastronomy.jsofa.JSOFA#jauTdbtt} TDB to TT
    {@link org.jastronomy.jsofa.JSOFA#jauTttai} TT to TAI
    {@link org.jastronomy.jsofa.JSOFA#jauTttcg} TT to TCG
    {@link org.jastronomy.jsofa.JSOFA#jauTttdb} TT to TDB
    {@link org.jastronomy.jsofa.JSOFA#jauTtut1} TT to UT1
    {@link org.jastronomy.jsofa.JSOFA#jauUt1tai} UT1 to TAI
    {@link org.jastronomy.jsofa.JSOFA#jauUt1tt} UT1 to TT
    {@link org.jastronomy.jsofa.JSOFA#jauUt1utc} UT1 to UTC
    {@link org.jastronomy.jsofa.JSOFA#jauUtctai} UTC to TAI
    {@link org.jastronomy.jsofa.JSOFA#jauUtcut1} UTC to UT1

    Earth rotation angle and sidereal time

    {@link org.jastronomy.jsofa.JSOFA#jauEe00} equation of the equinoxes, IAU 2000
    {@link org.jastronomy.jsofa.JSOFA#jauEe00a} equation of the equinoxes, IAU 2000A
    {@link org.jastronomy.jsofa.JSOFA#jauEe00b} equation of the equinoxes, IAU 2000B
    {@link org.jastronomy.jsofa.JSOFA#jauEe06a} equation of the equinoxes, IAU 2006/2000A
    {@link org.jastronomy.jsofa.JSOFA#jauEect00} equation of the equinoxes complementary terms, IAU 2000
    {@link org.jastronomy.jsofa.JSOFA#jauEqeq94} equation of the equinoxes, IAU 1994
    {@link org.jastronomy.jsofa.JSOFA#jauEra00} Earth rotation angle, IAU 2000
    {@link org.jastronomy.jsofa.JSOFA#jauGmst00} Greenwich mean sidereal time, IAU 2000
    {@link org.jastronomy.jsofa.JSOFA#jauGmst06} Greenwich mean sidereal time, IAU 2006
    {@link org.jastronomy.jsofa.JSOFA#jauGmst82} Greenwich mean sidereal time, IAU 1982
    {@link org.jastronomy.jsofa.JSOFA#jauGst00a} Greenwich apparent sidereal time, IAU 2000A
    {@link org.jastronomy.jsofa.JSOFA#jauGst00b} Greenwich apparent sidereal time, IAU 2000B
    {@link org.jastronomy.jsofa.JSOFA#jauGst06} Greenwich apparent ST, IAU 2006, given NPB matrix
    {@link org.jastronomy.jsofa.JSOFA#jauGst06a} Greenwich apparent sidereal time, IAU 2006/2000A
    {@link org.jastronomy.jsofa.JSOFA#jauGst94} Greenwich apparent sidereal time, IAU 1994

    Ephemerides (limited precision)

    {@link org.jastronomy.jsofa.JSOFA#jauEpv00} Earth position and velocity
    {@link org.jastronomy.jsofa.JSOFA#jauPlan94} major-planet position and velocity
    {@link org.jastronomy.jsofa.JSOFA#jauMoon98} moon position and velocity

    Precession, nutation, polar motion

    {@link org.jastronomy.jsofa.JSOFA#jauBi00} frame bias components, IAU 2000
    {@link org.jastronomy.jsofa.JSOFA#jauBp00} frame bias and precession matrices, IAU 2000
    {@link org.jastronomy.jsofa.JSOFA#jauBp06} frame bias and precession matrices, IAU 2006
    {@link org.jastronomy.jsofa.JSOFA#jauBpn2xy} extract CIP X,Y coordinates from NPB matrix
    {@link org.jastronomy.jsofa.JSOFA#jauC2i00a} celestial-to-intermediate matrix, IAU 2000A
    {@link org.jastronomy.jsofa.JSOFA#jauC2i00b} celestial-to-intermediate matrix, IAU 2000B
    {@link org.jastronomy.jsofa.JSOFA#jauC2i06a} celestial-to-intermediate matrix, IAU 2006/2000A
    {@link org.jastronomy.jsofa.JSOFA#jauC2ibpn} celestial-to-intermediate matrix, given NPB matrix, IAU 2000
    {@link org.jastronomy.jsofa.JSOFA#jauC2ixy} celestial-to-intermediate matrix, given X,Y, IAU 2000
    {@link org.jastronomy.jsofa.JSOFA#jauC2ixys} celestial-to-intermediate matrix, given X,Y and s
    {@link org.jastronomy.jsofa.JSOFA#jauC2t00a} celestial-to-terrestrial matrix, IAU 2000A
    {@link org.jastronomy.jsofa.JSOFA#jauC2t00b} celestial-to-terrestrial matrix, IAU 2000B
    {@link org.jastronomy.jsofa.JSOFA#jauC2t06a} celestial-to-terrestrial matrix, IAU 2006/2000A
    {@link org.jastronomy.jsofa.JSOFA#jauC2tcio} form CIO-based celestial-to-terrestrial matrix
    {@link org.jastronomy.jsofa.JSOFA#jauC2teqx} form equinox-based celestial-to-terrestrial matrix
    {@link org.jastronomy.jsofa.JSOFA#jauC2tpe} celestial-to-terrestrial matrix given nutation, IAU 2000
    {@link org.jastronomy.jsofa.JSOFA#jauC2txy} celestial-to-terrestrial matrix given CIP, IAU 2000
    {@link org.jastronomy.jsofa.JSOFA#jauEo06a} equation of the origins, IAU 2006/2000A
    {@link org.jastronomy.jsofa.JSOFA#jauEors} equation of the origins, given NPB matrix and s
    {@link org.jastronomy.jsofa.JSOFA#jauFw2m} Fukushima-Williams angles to r-matrix
    {@link org.jastronomy.jsofa.JSOFA#jauFw2xy} Fukushima-Williams angles to X,Y
    {@link org.jastronomy.jsofa.JSOFA#jauNum00a} nutation matrix, IAU 2000A
    {@link org.jastronomy.jsofa.JSOFA#jauLtp} long-term precession matrix
    {@link org.jastronomy.jsofa.JSOFA#jauLtpb} long-term precession matrix, including ICRS frame bias
    {@link org.jastronomy.jsofa.JSOFA#jauLtpecl} long-term precession of the ecliptic
    {@link org.jastronomy.jsofa.JSOFA#jauLtpequ} long-term precession of the equator
    {@link org.jastronomy.jsofa.JSOFA#jauNum00b} nutation matrix, IAU 2000B
    {@link org.jastronomy.jsofa.JSOFA#jauNum06a} nutation matrix, IAU 2006/2000A
    {@link org.jastronomy.jsofa.JSOFA#jauNumat} form nutation matrix
    {@link org.jastronomy.jsofa.JSOFA#jauNut00a} nutation, IAU 2000A
    {@link org.jastronomy.jsofa.JSOFA#jauNut00b} nutation, IAU 2000B
    {@link org.jastronomy.jsofa.JSOFA#jauNut06a} nutation, IAU 2006/2000A
    {@link org.jastronomy.jsofa.JSOFA#jauNut80} nutation, IAU 1980
    {@link org.jastronomy.jsofa.JSOFA#jauNutm80} nutation matrix, IAU 1980
    {@link org.jastronomy.jsofa.JSOFA#jauObl06} mean obliquity, IAU 2006
    {@link org.jastronomy.jsofa.JSOFA#jauObl80} mean obliquity, IAU 1980
    {@link org.jastronomy.jsofa.JSOFA#jauPb06} zeta,z,theta precession angles, IAU 2006, including bias
    {@link org.jastronomy.jsofa.JSOFA#jauPfw06} bias-precession Fukushima-Williams angles, IAU 2006
    {@link org.jastronomy.jsofa.JSOFA#jauPmat00} precession matrix (including frame bias), IAU 2000
    {@link org.jastronomy.jsofa.JSOFA#jauPmat06} PB matrix, IAU 2006
    {@link org.jastronomy.jsofa.JSOFA#jauPmat76} precession matrix, IAU 1976
    {@link org.jastronomy.jsofa.JSOFA#jauPn00} bias/precession/nutation results, IAU 2000
    {@link org.jastronomy.jsofa.JSOFA#jauPn00a} bias/precession/nutation, IAU 2000A
    {@link org.jastronomy.jsofa.JSOFA#jauPn00b} bias/precession/nutation, IAU 2000B
    {@link org.jastronomy.jsofa.JSOFA#jauPn06} bias/precession/nutation results, IAU 2006
    {@link org.jastronomy.jsofa.JSOFA#jauPn06a} bias/precession/nutation results, IAU 2006/2000A
    {@link org.jastronomy.jsofa.JSOFA#jauPnm00a} classical NPB matrix, IAU 2000A
    {@link org.jastronomy.jsofa.JSOFA#jauPnm00b} classical NPB matrix, IAU 2000B
    {@link org.jastronomy.jsofa.JSOFA#jauPnm06a} classical NPB matrix, IAU 2006/2000A
    {@link org.jastronomy.jsofa.JSOFA#jauPnm80} precession/nutation matrix, IAU 1976/1980
    {@link org.jastronomy.jsofa.JSOFA#jauP06e} precession angles, IAU 2006, equinox based
    {@link org.jastronomy.jsofa.JSOFA#jauPom00} polar motion matrix
    {@link org.jastronomy.jsofa.JSOFA#jauPr00} IAU 2000 precession adjustments
    {@link org.jastronomy.jsofa.JSOFA#jauPrec76} accumulated precession angles, IAU 1976
    {@link org.jastronomy.jsofa.JSOFA#jauS00} the CIO locator s, given X,Y, IAU 2000A
    {@link org.jastronomy.jsofa.JSOFA#jauS00a} the CIO locator s, IAU 2000A
    {@link org.jastronomy.jsofa.JSOFA#jauS00b} the CIO locator s, IAU 2000B
    {@link org.jastronomy.jsofa.JSOFA#jauS06} the CIO locator s, given X,Y, IAU 2006
    {@link org.jastronomy.jsofa.JSOFA#jauS06a} the CIO locator s, IAU 2006/2000A
    {@link org.jastronomy.jsofa.JSOFA#jauSp00} the TIO locator s', IERS 2003
    {@link org.jastronomy.jsofa.JSOFA#jauXy06} CIP, IAU 2006/2000A, from series
    {@link org.jastronomy.jsofa.JSOFA#jauXys00a} CIP and s, IAU 2000A
    {@link org.jastronomy.jsofa.JSOFA#jauXys00b} CIP and s, IAU 2000B
    {@link org.jastronomy.jsofa.JSOFA#jauXys06a} CIP and s, IAU 2006/2000A

    Fundamental arguments for nutation etc.

    {@link org.jastronomy.jsofa.JSOFA#jauFad03} mean elongation of the Moon from the Sun
    {@link org.jastronomy.jsofa.JSOFA#jauFae03} mean longitude of Earth
    {@link org.jastronomy.jsofa.JSOFA#jauFaf03} mean argument of the latitude of the Moon
    {@link org.jastronomy.jsofa.JSOFA#jauFaju03} mean longitude of Jupiter
    {@link org.jastronomy.jsofa.JSOFA#jauFal03} mean anomaly of the Moon
    {@link org.jastronomy.jsofa.JSOFA#jauFalp03} mean anomaly of the Sun
    {@link org.jastronomy.jsofa.JSOFA#jauFama03} mean longitude of Mars
    {@link org.jastronomy.jsofa.JSOFA#jauFame03} mean longitude of Mercury
    {@link org.jastronomy.jsofa.JSOFA#jauFane03} mean longitude of Neptune
    {@link org.jastronomy.jsofa.JSOFA#jauFaom03} mean longitude of the Moon's ascending node
    {@link org.jastronomy.jsofa.JSOFA#jauFapa03} general accumulated precession in longitude
    {@link org.jastronomy.jsofa.JSOFA#jauFasa03} mean longitude of Saturn
    {@link org.jastronomy.jsofa.JSOFA#jauFaur03} mean longitude of Uranus
    {@link org.jastronomy.jsofa.JSOFA#jauFave03} mean longitude of Venus

    Star catalog conversions

    {@link org.jastronomy.jsofa.JSOFA#jauFk425} convert B1950.0 FK4 star catalog data to J2000.0 FK5
    {@link org.jastronomy.jsofa.JSOFA#jauFk45z} convert a B1950.0 FK4 star position to J2000.0 FK5, assuming zero proper motion in the FK5 system
    {@link org.jastronomy.jsofa.JSOFA#jauFk524} convert J2000.0 FK5 star catalog data to B1950.0 FK4
    {@link org.jastronomy.jsofa.JSOFA#jauFk54z} convert a J2000.0 FK5 star position to B1950.0 FK4, assuming zero proper motion in FK5 system and zero parallax
    {@link org.jastronomy.jsofa.JSOFA#jauFk52h} transform FK5 star data into the Hipparcos system
    {@link org.jastronomy.jsofa.JSOFA#jauFk5hip} FK5 to Hipparcos rotation and spin
    {@link org.jastronomy.jsofa.JSOFA#jauFk5hz} FK5 to Hipparcos assuming zero Hipparcos proper motion
    {@link org.jastronomy.jsofa.JSOFA#jauH2fk5} transform Hipparcos star data into the FK5 system
    {@link org.jastronomy.jsofa.JSOFA#jauHfk5z} Hipparcos to FK5 assuming zero Hipparcos proper motion
    {@link org.jastronomy.jsofa.JSOFA#jauStarpm} proper motion between two epochs

    Geodetic/geocentric

    {@link org.jastronomy.jsofa.JSOFA#jauEform} a,f for a nominated Earth reference ellipsoid
    {@link org.jastronomy.jsofa.JSOFA#jauGc2gd} geocentric to geodetic for a nominated ellipsoid
    {@link org.jastronomy.jsofa.JSOFA#jauGc2gde} geocentric to geodetic given ellipsoid a,f
    {@link org.jastronomy.jsofa.JSOFA#jauGd2gc} geodetic to geocentric for a nominated ellipsoid
    {@link org.jastronomy.jsofa.JSOFA#jauGd2gce} geodetic to geocentric given ellipsoid a,f

    OPERATIONS INVOLVING P-VECTORS AND R-MATRICES

    Initialize

    {@link org.jastronomy.jsofa.JSOFA#jauZp} zero p-vector
    {@link org.jastronomy.jsofa.JSOFA#jauZr} initialize r-matrix to null
    {@link org.jastronomy.jsofa.JSOFA#jauIr} initialize r-matrix to identity

    Copy/extend/extract

    {@link org.jastronomy.jsofa.JSOFA#jauCp} copy p-vector
    {@link org.jastronomy.jsofa.JSOFA#jauCr} copy r-matrix

    Build rotations

    {@link org.jastronomy.jsofa.JSOFA#jauRx} rotate r-matrix about x
    {@link org.jastronomy.jsofa.JSOFA#jauRy} rotate r-matrix about y
    {@link org.jastronomy.jsofa.JSOFA#jauRz} rotate r-matrix about z

    Spherical/Cartesian conversions

    {@link org.jastronomy.jsofa.JSOFA#jauS2c} spherical to unit vector
    {@link org.jastronomy.jsofa.JSOFA#jauC2s} unit vector to spherical
    {@link org.jastronomy.jsofa.JSOFA#jauS2p} spherical to p-vector
    {@link org.jastronomy.jsofa.JSOFA#jauP2s} p-vector to spherical

    Operations on vectors

    {@link org.jastronomy.jsofa.JSOFA#jauPpp} p-vector plus p-vector
    {@link org.jastronomy.jsofa.JSOFA#jauPmp} p-vector minus p-vector
    {@link org.jastronomy.jsofa.JSOFA#jauPpsp} p-vector plus scaled p-vector
    {@link org.jastronomy.jsofa.JSOFA#jauPdp} inner (=scalar=dot) product of two p-vectors
    {@link org.jastronomy.jsofa.JSOFA#jauPxp} outer (=vector=cross) product of two p-vectors
    {@link org.jastronomy.jsofa.JSOFA#jauPm} modulus of p-vector
    {@link org.jastronomy.jsofa.JSOFA#jauPn} normalize p-vector returning modulus
    {@link org.jastronomy.jsofa.JSOFA#jauSxp} multiply p-vector by scalar

    Operations on matrices

    {@link org.jastronomy.jsofa.JSOFA#jauRxr} r-matrix multiply
    {@link org.jastronomy.jsofa.JSOFA#jauTr} transpose r-matrix

    Matrix-vector products

    {@link org.jastronomy.jsofa.JSOFA#jauRxp} product of r-matrix and p-vector
    {@link org.jastronomy.jsofa.JSOFA#jauTrxp} product of transpose of r-matrix and p-vector

    Separation and position-angle

    {@link org.jastronomy.jsofa.JSOFA#jauSepp} angular separation from p-vectors
    {@link org.jastronomy.jsofa.JSOFA#jauSeps} angular separation from spherical coordinates
    {@link org.jastronomy.jsofa.JSOFA#jauPap} position-angle from p-vectors
    {@link org.jastronomy.jsofa.JSOFA#jauPas} position-angle from spherical coordinates

    Rotation vectors

    {@link org.jastronomy.jsofa.JSOFA#jauRv2m} r-vector to r-matrix
    {@link org.jastronomy.jsofa.JSOFA#jauRm2v} r-matrix to r-vector

    OPERATIONS INVOLVING PV-VECTORS

    Initialize

    {@link org.jastronomy.jsofa.JSOFA#jauZpv} zero pv-vector

    Copy/extend/extract

    {@link org.jastronomy.jsofa.JSOFA#jauCpv} copy pv-vector
    {@link org.jastronomy.jsofa.JSOFA#jauP2pv} append zero velocity to p-vector
    {@link org.jastronomy.jsofa.JSOFA#jauPv2p} discard velocity component of pv-vector

    Spherical/Cartesian conversions

    {@link org.jastronomy.jsofa.JSOFA#jauS2pv} spherical to pv-vector
    {@link org.jastronomy.jsofa.JSOFA#jauPv2s} pv-vector to spherical

    Operations on vectors

    {@link org.jastronomy.jsofa.JSOFA#jauPvppv} pv-vector plus pv-vector
    {@link org.jastronomy.jsofa.JSOFA#jauPvmpv} pv-vector minus pv-vector
    {@link org.jastronomy.jsofa.JSOFA#jauPvdpv} inner (=scalar=dot) product of two pv-vectors
    {@link org.jastronomy.jsofa.JSOFA#jauPvxpv} outer (=vector=cross) product of two pv-vectors
    {@link org.jastronomy.jsofa.JSOFA#jauPvm} modulus of pv-vector
    {@link org.jastronomy.jsofa.JSOFA#jauSxpv} multiply pv-vector by scalar
    {@link org.jastronomy.jsofa.JSOFA#jauS2xpv} multiply pv-vector by two scalars
    {@link org.jastronomy.jsofa.JSOFA#jauPvu} update pv-vector
    {@link org.jastronomy.jsofa.JSOFA#jauPvup} update pv-vector discarding velocity

    Matrix-vector products

    {@link org.jastronomy.jsofa.JSOFA#jauRxpv} product of r-matrix and pv-vector
    {@link org.jastronomy.jsofa.JSOFA#jauTrxpv} product of transpose of r-matrix and pv-vector

    OPERATIONS ON ANGLES

    {@link org.jastronomy.jsofa.JSOFA#jauAnp} normalize radians to range 0 to 2pi
    {@link org.jastronomy.jsofa.JSOFA#jauAnpm} normalize radians to range -pi to +pi
    {@link org.jastronomy.jsofa.JSOFA#jauA2tf} decompose radians into hms
    {@link org.jastronomy.jsofa.JSOFA#jauA2af} decompose radians into d ' "
    {@link org.jastronomy.jsofa.JSOFA#jauD2tf} decompose days into hms

    Gnomonic projection

    {@link org.jastronomy.jsofa.JSOFA#jauTpors} solve for tangent point, spherical
    {@link org.jastronomy.jsofa.JSOFA#jauTporv} solve for tangent point, vector
    {@link org.jastronomy.jsofa.JSOFA#jauTpsts} deproject tangent plane to celestial, spherical
    {@link org.jastronomy.jsofa.JSOFA#jauTpstv} deproject tangent plane to celestial, vector
    {@link org.jastronomy.jsofa.JSOFA#jauTpxes} project celestial to tangent plane, spherical
    {@link org.jastronomy.jsofa.JSOFA#jauTpxev} project celestial to tangent plane, vector

    Horizon/equatorial

    {@link org.jastronomy.jsofa.JSOFA#jauAe2hd} (azimuth, altitude) to (hour angle, declination)
    {@link org.jastronomy.jsofa.JSOFA#jauHd2ae} (hour angle, declination) to (azimuth, altitude)
    {@link org.jastronomy.jsofa.JSOFA#jauHd2pa} parallactic angle
    * * @since February 2010 * @author Paul Harrison (paul.harrison@manchester.ac.uk) 1 Feb 2010 *
     * Copyright © 2019 Paul Harrison, University of Manchester.
     * 
     * This JSOFA software is derived from the official C release of the "Standards Of Fundamental Astronomy" (SOFA) library 
     * of the International Astronomical Union. The intention is to reproduce the functionality and algorithms of 
     * the official SOFA library in a pure Java form.
     * 
     * The responsibility for the maintenance and supply of the JSOFA library lies with the author (not the IAU SOFA Board). 
     * However, The JSOFA software is provided "as is" and the author makes no warranty as to its use or performance. 
     * The author does not and cannot warrant the performance or results which the user may obtain by using the JSOFA software. 
     * The author makes no warranties, express or implied, as to non-infringement of third party rights, merchantability,
     * or fitness for any particular purpose. In no event will the author be liable to the user for any consequential, 
     * incidental, or special damages, including any lost profits or lost savings, even if the author has been advised
     * of such damages, or for any claim by any third party.
     * 
     * Other conditions of the original license (reproduced below) are carried over as applicable.
     * 
    *+----------------------------------------------------------------------
    *
    *  Copyright (C) 2019
    *  Standards Of Fundamental Astronomy Board
    *  of the International Astronomical Union.
    *
    *  =====================
    *  SOFA Software License
    *  =====================
    *
    *  NOTICE TO USER:
    *
    *  BY USING THIS SOFTWARE YOU ACCEPT THE FOLLOWING SIX TERMS AND
    *  CONDITIONS WHICH APPLY TO ITS USE.
    *
    *  1. The Software is owned by the IAU SOFA Board ("SOFA").
    *
    *  2. Permission is granted to anyone to use the SOFA software for any
    *     purpose, including commercial applications, free of charge and
    *     without payment of royalties, subject to the conditions and
    *     restrictions listed below.
    *
    *  3. You (the user) may copy and distribute SOFA source code to others,
    *     and use and adapt its code and algorithms in your own software,
    *     on a world-wide, royalty-free basis.  That portion of your
    *     distribution that does not consist of intact and unchanged copies
    *     of SOFA source code files is a "derived work" that must comply
    *     with the following requirements:
    *
    *     a) Your work shall be marked or carry a statement that it
    *        (i) uses routines and computations derived by you from
    *        software provided by SOFA under license to you; and
    *        (ii) does not itself constitute software provided by and/or
    *        endorsed by SOFA.
    *
    *     b) The source code of your derived work must contain descriptions
    *        of how the derived work is based upon, contains and/or differs
    *        from the original SOFA software.
    *
    *     c) The names of all routines in your derived work shall not
    *        include the prefix "iau" or "sofa" or trivial modifications
    *        thereof such as changes of case.
    *
    *     d) The origin of the SOFA components of your derived work must
    *        not be misrepresented;  you must not claim that you wrote the
    *        original software, nor file a patent application for SOFA
    *        software or algorithms embedded in the SOFA software.
    *
    *     e) These requirements must be reproduced intact in any source
    *        distribution and shall apply to anyone to whom you have
    *        granted a further right to modify the source code of your
    *        derived work.
    *
    *     Note that, as originally distributed, the SOFA software is
    *     intended to be a definitive implementation of the IAU standards,
    *     and consequently third-party modifications are discouraged.  All
    *     variations, no matter how minor, must be explicitly marked as
    *     such, as explained above.
    *
    *  4. You shall not cause the SOFA software to be brought into
    *     disrepute, either by misuse, or use for inappropriate tasks, or
    *     by inappropriate modification.
    *
    *  5. The SOFA software is provided "as is" and SOFA makes no warranty
    *     as to its use or performance.   SOFA does not and cannot warrant
    *     the performance or results which the user may obtain by using the
    *     SOFA software.  SOFA makes no warranties, express or implied, as
    *     to non-infringement of third party rights, merchantability, or
    *     fitness for any particular purpose.  In no event will SOFA be
    *     liable to the user for any consequential, incidental, or special
    *     damages, including any lost profits or lost savings, even if a
    *     SOFA representative has been advised of such damages, or for any
    *     claim by any third party.
    *
    *  6. The provision of any version of the SOFA software under the terms
    *     and conditions specified herein does not imply that future
    *     versions will also be made available under the same terms and
    *     conditions.
    *
    *  In any published work or commercial product which uses the SOFA
    *  software directly, acknowledgement (see www.iausofa.org) is
    *  appreciated.
    *
    *  Correspondence concerning SOFA software should be addressed as
    *  follows:
    *
    *      By email:  sofa@ukho.gov.uk
    *      By post:   IAU SOFA Center
    *                 HM Nautical Almanac Office
    *                 UK Hydrographic Office
    *                 Admiralty Way, Taunton
    *                 Somerset, TA1 2DN
    *                 United Kingdom
    *
    *-----------------------------------------------------------------------
     *
    **/ package org.jastronomy.jsofa; jsofa-20210512_JSOFA_Release/src/site/000077500000000000000000000000001404751573700172045ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/src/site/apt/000077500000000000000000000000001404751573700177705ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/src/site/apt/deploying.apt000066400000000000000000000015521404751573700224730ustar00rootroot00000000000000 ----- Deploying JSOFA ----- Paul Harrison ----- Deploying JSOFA The JSOFA software is built with maven and is deployed to the maven central repository using the {{{http://central.sonatype.org/pages/apache-maven.html}following instructions}} summarized below. Check that the build and tests are passed +---+ mvn clean install +---+ then deploy to the staging repository +---+ mvn deploy -P release +---+ if this is successful then +---+ mvn nexus-staging:release -P release +---+ will release to the central repository * Deploying the site The maven site is now deployed to {{https://javastro.github.com/jsofa/}} +---+ mvn site +---+ will create the site to test that it is ok - then to deploy +---+ ./ghsite.sh +---+ will prepare site ready for git push in a temporary directory - follow the commands suggested jsofa-20210512_JSOFA_Release/src/site/apt/index.apt.vm000066400000000000000000000021051404751573700222240ustar00rootroot00000000000000 ----- JSOFA ----- Paul Harrison ----- JSOFA The JSOFA software is a pure Java translation of the International Astronomical Union's C SOFA software library (version ${project.version}) at {{http://www.iausofa.org/}}. For more information on using please read the {{{./apidocs/org/jastronomy/jsofa/package-summary.html#package.description}javadoc}} overview. A jar (Java version 1.8) of the software can be obtained from the {{{http://central.sonatype.org/}Central Maven repository}} directly by clicking the links in the sidebar and if using maven as a build tool by including the following in the POM --- org.javastro jsofa ${project.version} --- The software {{{./surefire-report.html}passes}} all its {{{./xref-test/org/jastronomy/jsofa/JSOFATest.html}unit tests}} which are based on the standard tests that come with the official C and Fortran versions from the IAU. The source code is {{{https://github.com/Javastro/jsofa}on GitHub}} jsofa-20210512_JSOFA_Release/src/site/site.xml000066400000000000000000000017141404751573700206750ustar00rootroot00000000000000 jsofa-20210512_JSOFA_Release/src/test/000077500000000000000000000000001404751573700172175ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/src/test/java/000077500000000000000000000000001404751573700201405ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/src/test/java/org/000077500000000000000000000000001404751573700207275ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/src/test/java/org/jastronomy/000077500000000000000000000000001404751573700231345ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/src/test/java/org/jastronomy/jsofa/000077500000000000000000000000001404751573700242365ustar00rootroot00000000000000jsofa-20210512_JSOFA_Release/src/test/java/org/jastronomy/jsofa/JSOFATest.java000066400000000000000000007132231404751573700266130ustar00rootroot00000000000000/* * $Id$ * * * Created on 26 Jan 2010 by Paul Harrison (paul.harrison@manchester.ac.uk) * * Adapted from official SOFA C implementation http://www.iausofa.org/ * * */ package org.jastronomy.jsofa; import static org.jastronomy.jsofa.JSOFA.*; import static org.junit.Assert.*; import org.jastronomy.jsofa.JSOFA.CatalogCoords; import org.jastronomy.jsofa.JSOFA.SphericalCoordinate; import org.jastronomy.jsofa.JSOFAException; import org.jastronomy.jsofa.JSOFAIllegalParameter; import org.jastronomy.jsofa.JSOFAInternalError; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import static java.lang.Math.*; public class JSOFATest { private static boolean verbose; @BeforeClass public static void setUpBeforeClass() throws Exception { } @Before public void setUp() throws Exception { } @Test public void testversion() throws JSOFAIllegalParameter { assertEquals("sofa release", "2021-05-12", SOFA_RELEASE); assertEquals("sofa revision", "18", SOFA_REVISION); assertEquals("lastleap second", jauCal2jd(2017,1,1), lastLeapSecondDate()); assertEquals("last omitted leap second", jauCal2jd(2021,06,30), latestConfirmedNoLeapSecondChange); assertEquals("Jsofa release", System.getProperty("SOFAVERSION"), JSOFA_RELEASE); // check that the correct version is being released - system properly set from POM } /* ** ** Validate the JSOFA C functions. ** ** Each JSOFA function is tested to some useful but not exhaustive ** level. Successful completion is signalled by an absence of ** output messages. Failure of a given function or group of functions ** results in error messages. ** ** All messages go to stdout. ** ** This revision: 2010 January 18 ** ** JSOFA release 2009-12-31 ** ** Copyright (C) 2009 IAU SOFA Review Board. See notes at end. */ /** ** ** Validate an integer result. ** ** Internal function used by t_sofa_c program. ** ** Given: ** ival int value computed by function under test ** ivalok int correct value ** func char[] name of function under test ** test char[] name of individual test ** ** Given and returned: ** status int set to FALSE if test fails ** ** This revision: 2009 November 4 */ private void viv(int ival, int ivalok, String func, String test) { if (ival != ivalok) { System.err.printf("%s failed: %s want %d got %d\n", func, test, ivalok, ival); } else if (verbose) { System.out.printf("%s passed: %s want %d got %d\n", func, test, ivalok, ival); } assertEquals(func+" "+test, ivalok, ival); return; } /** ** ** Validate a double result. ** ** Internal function used by t_sofa_c program. ** ** Given: ** val double value computed by function under test ** valok double expected value ** dval double maximum allowable error ** func char[] name of function under test ** test char[] name of individual test ** ** Given and returned: ** status int set to FALSE if test fails ** ** This revision: 2008 June 8 */ private void vvd(double val, double valok, double dval, String func, String test) { double a, f; /* absolute and fractional error */ a = val - valok; f = abs(valok / a); String msg = String.format("%s: %s want %.20g got %.20g (1/%.3g)\n", func, test, valok, val, f); if (verbose && abs(a) <= dval) { System.out.println("passed: " + msg); } assertTrue(msg, abs(a) <= dval); return; } @Test public void t_a2af() /** ** ** Test jauA2af function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauA2af, viv ** ** This revision: 2008 November 30 */ { int idmsf[] = new int[4]; char s; s = jauA2af(4, 2.345, idmsf); viv(s, '+', "jauA2af", "s"); viv(idmsf[0], 134, "jauA2af", "0"); viv(idmsf[1], 21, "jauA2af", "1"); viv(idmsf[2], 30, "jauA2af", "2"); viv(idmsf[3], 9706, "jauA2af", "3"); } @Test public void t_a2tf() /** ** ** Test jauA2tf function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauA2tf, viv ** ** This revision: 2008 November 30 */ { int ihmsf[] = new int[4]; char s; s = jauA2tf(4, -3.01234, ihmsf); viv((int)s, '-', "jauA2tf", "s"); viv(ihmsf[0], 11, "jauA2tf", "0"); viv(ihmsf[1], 30, "jauA2tf", "1"); viv(ihmsf[2], 22, "jauA2tf", "2"); viv(ihmsf[3], 6484, "jauA2tf", "3"); } @Test public void t_anp() /** ** ** Test jauAnp function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauAnp, vvd ** ** This revision: 2008 November 30 */ { vvd(jauAnp(-0.1), 6.183185307179586477, 1e-12, "jauAnp", ""); } @Test public void t_anpm() /** ** ** Test jauAnpm function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauAnpm, vvd ** ** This revision: 2008 November 30 */ { vvd(jauAnpm(-4.0), 2.283185307179586477, 1e-12, "jauAnpm", ""); } @Test public void t_bi00() /** ** ** Test jauBi00 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauBi00, vvd ** ** This revision: 2009 November 4 */ { FrameBias ret = jauBi00(); vvd(ret.dpsibi, -0.2025309152835086613e-6, 1e-12,"jauBi00", "dpsibi"); vvd(ret.depsbi, -0.3306041454222147847e-7, 1e-12,"jauBi00", "depsbi"); vvd(ret.dra, -0.7078279744199225506e-7, 1e-12,"jauBi00", "dra"); } @Test public void t_bp00() /** ** ** Test jauBp00 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauBp00, vvd ** ** This revision: 2008 November 28 */ { double rb[][] = new double[3][3], rp[][] = new double[3][3], rbp[][] = new double[3][3]; jauBp00(2400000.5, 50123.9999, rb, rp, rbp); vvd(rb[0][0], 0.9999999999999942498, 1e-12,"jauBp00", "rb11"); vvd(rb[0][1], -0.7078279744199196626e-7, 1e-16,"jauBp00", "rb12"); vvd(rb[0][2], 0.8056217146976134152e-7, 1e-16,"jauBp00", "rb13"); vvd(rb[1][0], 0.7078279477857337206e-7, 1e-16,"jauBp00", "rb21"); vvd(rb[1][1], 0.9999999999999969484, 1e-12,"jauBp00", "rb22"); vvd(rb[1][2], 0.3306041454222136517e-7, 1e-16,"jauBp00", "rb23"); vvd(rb[2][0], -0.8056217380986972157e-7, 1e-16,"jauBp00", "rb31"); vvd(rb[2][1], -0.3306040883980552500e-7, 1e-16,"jauBp00", "rb32"); vvd(rb[2][2], 0.9999999999999962084, 1e-12,"jauBp00", "rb33"); vvd(rp[0][0], 0.9999995504864048241, 1e-12,"jauBp00", "rp11"); vvd(rp[0][1], 0.8696113836207084411e-3, 1e-14,"jauBp00", "rp12"); vvd(rp[0][2], 0.3778928813389333402e-3, 1e-14,"jauBp00", "rp13"); vvd(rp[1][0], -0.8696113818227265968e-3, 1e-14,"jauBp00", "rp21"); vvd(rp[1][1], 0.9999996218879365258, 1e-12,"jauBp00", "rp22"); vvd(rp[1][2], -0.1690679263009242066e-6, 1e-14,"jauBp00", "rp23"); vvd(rp[2][0], -0.3778928854764695214e-3, 1e-14,"jauBp00", "rp31"); vvd(rp[2][1], -0.1595521004195286491e-6, 1e-14,"jauBp00", "rp32"); vvd(rp[2][2], 0.9999999285984682756, 1e-12,"jauBp00", "rp33"); vvd(rbp[0][0], 0.9999995505175087260, 1e-12,"jauBp00", "rbp11"); vvd(rbp[0][1], 0.8695405883617884705e-3, 1e-14,"jauBp00", "rbp12"); vvd(rbp[0][2], 0.3779734722239007105e-3, 1e-14,"jauBp00", "rbp13"); vvd(rbp[1][0], -0.8695405990410863719e-3, 1e-14,"jauBp00", "rbp21"); vvd(rbp[1][1], 0.9999996219494925900, 1e-12,"jauBp00", "rbp22"); vvd(rbp[1][2], -0.1360775820404982209e-6, 1e-14,"jauBp00", "rbp23"); vvd(rbp[2][0], -0.3779734476558184991e-3, 1e-14,"jauBp00", "rbp31"); vvd(rbp[2][1], -0.1925857585832024058e-6, 1e-14,"jauBp00", "rbp32"); vvd(rbp[2][2], 0.9999999285680153377, 1e-12,"jauBp00", "rbp33"); } @Test public void t_bp06() /** ** ** Test jauBp06 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauBp06, vvd ** ** This revision: 2008 November 28 */ { double rb[][] = new double[3][3], rp[][] = new double[3][3], rbp[][] = new double[3][3]; jauBp06(2400000.5, 50123.9999, rb, rp, rbp); vvd(rb[0][0], 0.9999999999999942497, 1e-12,"jauBp06", "rb11"); vvd(rb[0][1], -0.7078368960971557145e-7, 1e-14,"jauBp06", "rb12"); vvd(rb[0][2], 0.8056213977613185606e-7, 1e-14,"jauBp06", "rb13"); vvd(rb[1][0], 0.7078368694637674333e-7, 1e-14,"jauBp06", "rb21"); vvd(rb[1][1], 0.9999999999999969484, 1e-12,"jauBp06", "rb22"); vvd(rb[1][2], 0.3305943742989134124e-7, 1e-14,"jauBp06", "rb23"); vvd(rb[2][0], -0.8056214211620056792e-7, 1e-14,"jauBp06", "rb31"); vvd(rb[2][1], -0.3305943172740586950e-7, 1e-14,"jauBp06", "rb32"); vvd(rb[2][2], 0.9999999999999962084, 1e-12,"jauBp06", "rb33"); vvd(rp[0][0], 0.9999995504864960278, 1e-12,"jauBp06", "rp11"); vvd(rp[0][1], 0.8696112578855404832e-3, 1e-14,"jauBp06", "rp12"); vvd(rp[0][2], 0.3778929293341390127e-3, 1e-14,"jauBp06", "rp13"); vvd(rp[1][0], -0.8696112560510186244e-3, 1e-14,"jauBp06", "rp21"); vvd(rp[1][1], 0.9999996218880458820, 1e-12,"jauBp06", "rp22"); vvd(rp[1][2], -0.1691646168941896285e-6, 1e-14,"jauBp06", "rp23"); vvd(rp[2][0], -0.3778929335557603418e-3, 1e-14,"jauBp06", "rp31"); vvd(rp[2][1], -0.1594554040786495076e-6, 1e-14,"jauBp06", "rp32"); vvd(rp[2][2], 0.9999999285984501222, 1e-12,"jauBp06", "rp33"); vvd(rbp[0][0], 0.9999995505176007047, 1e-12,"jauBp06", "rbp11"); vvd(rbp[0][1], 0.8695404617348208406e-3, 1e-14,"jauBp06", "rbp12"); vvd(rbp[0][2], 0.3779735201865589104e-3, 1e-14,"jauBp06", "rbp13"); vvd(rbp[1][0], -0.8695404723772031414e-3, 1e-14,"jauBp06", "rbp21"); vvd(rbp[1][1], 0.9999996219496027161, 1e-12,"jauBp06", "rbp22"); vvd(rbp[1][2], -0.1361752497080270143e-6, 1e-14,"jauBp06", "rbp23"); vvd(rbp[2][0], -0.3779734957034089490e-3, 1e-14,"jauBp06", "rbp31"); vvd(rbp[2][1], -0.1924880847894457113e-6, 1e-14,"jauBp06", "rbp32"); vvd(rbp[2][2], 0.9999999285679971958, 1e-12,"jauBp06", "rbp33"); } @Test public void t_bpn2xy() /** ** ** Test jauBpn2xy function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauBpn2xy, vvd ** ** This revision: 2008 May 26 */ { double rbpn[][] = new double[3][3]; rbpn[0][0] = 9.999962358680738e-1; rbpn[0][1] = -2.516417057665452e-3; rbpn[0][2] = -1.093569785342370e-3; rbpn[1][0] = 2.516462370370876e-3; rbpn[1][1] = 9.999968329010883e-1; rbpn[1][2] = 4.006159587358310e-5; rbpn[2][0] = 1.093465510215479e-3; rbpn[2][1] = -4.281337229063151e-5; rbpn[2][2] = 9.999994012499173e-1; CelestialIntermediatePole ret = jauBpn2xy(rbpn); vvd(ret.x, 1.093465510215479e-3, 1e-12, "jauBpn2xy", "x"); vvd(ret.y, -4.281337229063151e-5, 1e-12, "jauBpn2xy", "y"); } @Test public void t_c2i00a() /** ** ** Test jauC2i00a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauC2i00a, vvd ** ** This revision: 2008 November 28 */ { double rc2i[][]; rc2i = jauC2i00a(2400000.5, 53736.0); vvd(rc2i[0][0], 0.9999998323037165557, 1e-12,"jauC2i00a", "11"); vvd(rc2i[0][1], 0.5581526348992140183e-9, 1e-12,"jauC2i00a", "12"); vvd(rc2i[0][2], -0.5791308477073443415e-3, 1e-12,"jauC2i00a", "13"); vvd(rc2i[1][0], -0.2384266227870752452e-7, 1e-12,"jauC2i00a", "21"); vvd(rc2i[1][1], 0.9999999991917405258, 1e-12,"jauC2i00a", "22"); vvd(rc2i[1][2], -0.4020594955028209745e-4, 1e-12,"jauC2i00a", "23"); vvd(rc2i[2][0], 0.5791308472168152904e-3, 1e-12,"jauC2i00a", "31"); vvd(rc2i[2][1], 0.4020595661591500259e-4, 1e-12,"jauC2i00a", "32"); vvd(rc2i[2][2], 0.9999998314954572304, 1e-12,"jauC2i00a", "33"); } @Test public void t_c2i00b() /** ** ** Test jauC2i00b function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauC2i00b, vvd ** ** This revision: 2008 November 28 */ { double rc2i[][] = new double[3][3]; rc2i = jauC2i00b(2400000.5, 53736.0 ); vvd(rc2i[0][0], 0.9999998323040954356, 1e-12,"jauC2i00b", "11"); vvd(rc2i[0][1], 0.5581526349131823372e-9, 1e-12,"jauC2i00b", "12"); vvd(rc2i[0][2], -0.5791301934855394005e-3, 1e-12,"jauC2i00b", "13"); vvd(rc2i[1][0], -0.2384239285499175543e-7, 1e-12,"jauC2i00b", "21"); vvd(rc2i[1][1], 0.9999999991917574043, 1e-12,"jauC2i00b", "22"); vvd(rc2i[1][2], -0.4020552974819030066e-4, 1e-12,"jauC2i00b", "23"); vvd(rc2i[2][0], 0.5791301929950208873e-3, 1e-12,"jauC2i00b", "31"); vvd(rc2i[2][1], 0.4020553681373720832e-4, 1e-12,"jauC2i00b", "32"); vvd(rc2i[2][2], 0.9999998314958529887, 1e-12,"jauC2i00b", "33"); } @Test public void t_c2i06a() /** ** ** Test jauC2i06a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauC2i06a, vvd ** ** This revision: 2008 November 28 */ { double rc2i[][] = new double[3][3]; rc2i = jauC2i06a(2400000.5, 53736.0); vvd(rc2i[0][0], 0.9999998323037159379, 1e-12,"jauC2i06a", "11"); vvd(rc2i[0][1], 0.5581121329587613787e-9, 1e-12,"jauC2i06a", "12"); vvd(rc2i[0][2], -0.5791308487740529749e-3, 1e-12,"jauC2i06a", "13"); vvd(rc2i[1][0], -0.2384253169452306581e-7, 1e-12,"jauC2i06a", "21"); vvd(rc2i[1][1], 0.9999999991917467827, 1e-12,"jauC2i06a", "22"); vvd(rc2i[1][2], -0.4020579392895682558e-4, 1e-12,"jauC2i06a", "23"); vvd(rc2i[2][0], 0.5791308482835292617e-3, 1e-12,"jauC2i06a", "31"); vvd(rc2i[2][1], 0.4020580099454020310e-4, 1e-12,"jauC2i06a", "32"); vvd(rc2i[2][2], 0.9999998314954628695, 1e-12,"jauC2i06a", "33"); } @Test public void t_c2ibpn() /** ** ** Test jauC2ibpn function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauC2ibpn, vvd ** ** This revision: 2008 November 28 */ { double rbpn[][] = new double[3][3], rc2i[][] = new double[3][3]; rbpn[0][0] = 9.999962358680738e-1; rbpn[0][1] = -2.516417057665452e-3; rbpn[0][2] = -1.093569785342370e-3; rbpn[1][0] = 2.516462370370876e-3; rbpn[1][1] = 9.999968329010883e-1; rbpn[1][2] = 4.006159587358310e-5; rbpn[2][0] = 1.093465510215479e-3; rbpn[2][1] = -4.281337229063151e-5; rbpn[2][2] = 9.999994012499173e-1; rc2i = jauC2ibpn(2400000.5, 50123.9999, rbpn ); vvd(rc2i[0][0], 0.9999994021664089977, 1e-12,"jauC2ibpn", "11"); vvd(rc2i[0][1], -0.3869195948017503664e-8, 1e-12,"jauC2ibpn", "12"); vvd(rc2i[0][2], -0.1093465511383285076e-2, 1e-12,"jauC2ibpn", "13"); vvd(rc2i[1][0], 0.5068413965715446111e-7, 1e-12,"jauC2ibpn", "21"); vvd(rc2i[1][1], 0.9999999990835075686, 1e-12,"jauC2ibpn", "22"); vvd(rc2i[1][2], 0.4281334246452708915e-4, 1e-12,"jauC2ibpn", "23"); vvd(rc2i[2][0], 0.1093465510215479000e-2, 1e-12,"jauC2ibpn", "31"); vvd(rc2i[2][1], -0.4281337229063151000e-4, 1e-12,"jauC2ibpn", "32"); vvd(rc2i[2][2], 0.9999994012499173103, 1e-12,"jauC2ibpn", "33"); } @Test public void t_c2ixy() /** ** ** Test jauC2ixy function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauC2ixy, vvd ** ** This revision: 2008 November 28 */ { double x, y, rc2i[][] = new double[3][3]; x = 0.5791308486706011000e-3; y = 0.4020579816732961219e-4; rc2i = jauC2ixy(2400000.5, 53736, x, y); vvd(rc2i[0][0], 0.9999998323037157138, 1e-12,"jauC2ixy", "11"); vvd(rc2i[0][1], 0.5581526349032241205e-9, 1e-12,"jauC2ixy", "12"); vvd(rc2i[0][2], -0.5791308491611263745e-3, 1e-12,"jauC2ixy", "13"); vvd(rc2i[1][0], -0.2384257057469842953e-7, 1e-12,"jauC2ixy", "21"); vvd(rc2i[1][1], 0.9999999991917468964, 1e-12,"jauC2ixy", "22"); vvd(rc2i[1][2], -0.4020579110172324363e-4, 1e-12,"jauC2ixy", "23"); vvd(rc2i[2][0], 0.5791308486706011000e-3, 1e-12,"jauC2ixy", "31"); vvd(rc2i[2][1], 0.4020579816732961219e-4, 1e-12,"jauC2ixy", "32"); vvd(rc2i[2][2], 0.9999998314954627590, 1e-12,"jauC2ixy", "33"); } @Test public void t_c2ixys() /** ** ** Test jauC2ixys function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauC2ixys, vvd ** ** This revision: 2008 November 28 */ { double x, y, s, rc2i[][] = new double[3][3]; x = 0.5791308486706011000e-3; y = 0.4020579816732961219e-4; s = -0.1220040848472271978e-7; rc2i = jauC2ixys(x, y, s); vvd(rc2i[0][0], 0.9999998323037157138, 1e-12,"jauC2ixys", "11"); vvd(rc2i[0][1], 0.5581984869168499149e-9, 1e-12,"jauC2ixys", "12"); vvd(rc2i[0][2], -0.5791308491611282180e-3, 1e-12,"jauC2ixys", "13"); vvd(rc2i[1][0], -0.2384261642670440317e-7, 1e-12,"jauC2ixys", "21"); vvd(rc2i[1][1], 0.9999999991917468964, 1e-12,"jauC2ixys", "22"); vvd(rc2i[1][2], -0.4020579110169668931e-4, 1e-12,"jauC2ixys", "23"); vvd(rc2i[2][0], 0.5791308486706011000e-3, 1e-12,"jauC2ixys", "31"); vvd(rc2i[2][1], 0.4020579816732961219e-4, 1e-12,"jauC2ixys", "32"); vvd(rc2i[2][2], 0.9999998314954627590, 1e-12,"jauC2ixys", "33"); } @Test public void t_c2s() /** ** ** Test jauC2s function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauC2s, vvd ** ** This revision: 2008 May 27 */ { double p[] = new double[3]; p[0] = 100.0; p[1] = -50.0; p[2] = 25.0; SphericalCoordinate ret = jauC2s(p); vvd(ret.alpha, -0.4636476090008061162, 1e-14, "jauC2s", "theta"); vvd(ret.delta, 0.2199879773954594463, 1e-14, "jauC2s", "phi"); } @Test public void t_c2t00a() /** ** ** Test jauC2t00a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauC2t00a, vvd ** ** This revision: 2008 November 28 */ { double tta, ttb, uta, utb, xp, yp, rc2t[][] = new double[3][3]; tta = 2400000.5; uta = 2400000.5; ttb = 53736.0; utb = 53736.0; xp = 2.55060238e-7; yp = 1.860359247e-6; rc2t = jauC2t00a(tta, ttb, uta, utb, xp, yp); vvd(rc2t[0][0], -0.1810332128307182668, 1e-12,"jauC2t00a", "11"); vvd(rc2t[0][1], 0.9834769806938457836, 1e-12,"jauC2t00a", "12"); vvd(rc2t[0][2], 0.6555535638688341725e-4, 1e-12,"jauC2t00a", "13"); vvd(rc2t[1][0], -0.9834768134135984552, 1e-12,"jauC2t00a", "21"); vvd(rc2t[1][1], -0.1810332203649520727, 1e-12,"jauC2t00a", "22"); vvd(rc2t[1][2], 0.5749801116141056317e-3, 1e-12,"jauC2t00a", "23"); vvd(rc2t[2][0], 0.5773474014081406921e-3, 1e-12,"jauC2t00a", "31"); vvd(rc2t[2][1], 0.3961832391770163647e-4, 1e-12,"jauC2t00a", "32"); vvd(rc2t[2][2], 0.9999998325501692289, 1e-12,"jauC2t00a", "33"); } @Test public void t_c2t00b() /** ** ** Test jauC2t00b function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauC2t00b, vvd ** ** This revision: 2008 November 28 */ { double tta, ttb, uta, utb, xp, yp, rc2t[][] = new double[3][3]; tta = 2400000.5; uta = 2400000.5; ttb = 53736.0; utb = 53736.0; xp = 2.55060238e-7; yp = 1.860359247e-6; rc2t = jauC2t00b(tta, ttb, uta, utb, xp, yp); vvd(rc2t[0][0], -0.1810332128439678965, 1e-12,"jauC2t00b", "11"); vvd(rc2t[0][1], 0.9834769806913872359, 1e-12,"jauC2t00b", "12"); vvd(rc2t[0][2], 0.6555565082458415611e-4, 1e-12,"jauC2t00b", "13"); vvd(rc2t[1][0], -0.9834768134115435923, 1e-12,"jauC2t00b", "21"); vvd(rc2t[1][1], -0.1810332203784001946, 1e-12,"jauC2t00b", "22"); vvd(rc2t[1][2], 0.5749793922030017230e-3, 1e-12,"jauC2t00b", "23"); vvd(rc2t[2][0], 0.5773467471863534901e-3, 1e-12,"jauC2t00b", "31"); vvd(rc2t[2][1], 0.3961790411549945020e-4, 1e-12,"jauC2t00b", "32"); vvd(rc2t[2][2], 0.9999998325505635738, 1e-12,"jauC2t00b", "33"); } @Test public void t_c2t06a() /** ** ** Test jauC2t06a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauC2t06a, vvd ** ** This revision: 2008 November 28 */ { double tta, ttb, uta, utb, xp, yp, rc2t[][] = new double[3][3]; tta = 2400000.5; uta = 2400000.5; ttb = 53736.0; utb = 53736.0; xp = 2.55060238e-7; yp = 1.860359247e-6; rc2t = jauC2t06a(tta, ttb, uta, utb, xp, yp); vvd(rc2t[0][0], -0.1810332128305897282, 1e-12,"jauC2t06a", "11"); vvd(rc2t[0][1], 0.9834769806938592296, 1e-12,"jauC2t06a", "12"); vvd(rc2t[0][2], 0.6555550962998436505e-4, 1e-12,"jauC2t06a", "13"); vvd(rc2t[1][0], -0.9834768134136214897, 1e-12,"jauC2t06a", "21"); vvd(rc2t[1][1], -0.1810332203649130832, 1e-12,"jauC2t06a", "22"); vvd(rc2t[1][2], 0.5749800844905594110e-3, 1e-12,"jauC2t06a", "23"); vvd(rc2t[2][0], 0.5773474024748545878e-3, 1e-12,"jauC2t06a", "31"); vvd(rc2t[2][1], 0.3961816829632690581e-4, 1e-12,"jauC2t06a", "32"); vvd(rc2t[2][2], 0.9999998325501747785, 1e-12,"jauC2t06a", "33"); } @Test public void t_c2tcio() /** ** ** Test jauC2tcio function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauC2tcio, vvd ** ** This revision: 2008 November 28 */ { double rc2i[][] = new double[3][3], era, rpom[][] = new double[3][3], rc2t[][] = new double[3][3]; rc2i[0][0] = 0.9999998323037164738; rc2i[0][1] = 0.5581526271714303683e-9; rc2i[0][2] = -0.5791308477073443903e-3; rc2i[1][0] = -0.2384266227524722273e-7; rc2i[1][1] = 0.9999999991917404296; rc2i[1][2] = -0.4020594955030704125e-4; rc2i[2][0] = 0.5791308472168153320e-3; rc2i[2][1] = 0.4020595661593994396e-4; rc2i[2][2] = 0.9999998314954572365; era = 1.75283325530307; rpom[0][0] = 0.9999999999999674705; rpom[0][1] = -0.1367174580728847031e-10; rpom[0][2] = 0.2550602379999972723e-6; rpom[1][0] = 0.1414624947957029721e-10; rpom[1][1] = 0.9999999999982694954; rpom[1][2] = -0.1860359246998866338e-5; rpom[2][0] = -0.2550602379741215275e-6; rpom[2][1] = 0.1860359247002413923e-5; rpom[2][2] = 0.9999999999982369658; rc2t = jauC2tcio(rc2i, era, rpom); vvd(rc2t[0][0], -0.1810332128307110439, 1e-12,"jauC2tcio", "11"); vvd(rc2t[0][1], 0.9834769806938470149, 1e-12,"jauC2tcio", "12"); vvd(rc2t[0][2], 0.6555535638685466874e-4, 1e-12,"jauC2tcio", "13"); vvd(rc2t[1][0], -0.9834768134135996657, 1e-12,"jauC2tcio", "21"); vvd(rc2t[1][1], -0.1810332203649448367, 1e-12,"jauC2tcio", "22"); vvd(rc2t[1][2], 0.5749801116141106528e-3, 1e-12,"jauC2tcio", "23"); vvd(rc2t[2][0], 0.5773474014081407076e-3, 1e-12,"jauC2tcio", "31"); vvd(rc2t[2][1], 0.3961832391772658944e-4, 1e-12,"jauC2tcio", "32"); vvd(rc2t[2][2], 0.9999998325501691969, 1e-12,"jauC2tcio", "33"); } @Test public void t_c2teqx() /** ** ** Test jauC2teqx function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauC2teqx, vvd ** ** This revision: 2008 November 28 */ { double rbpn[][] = new double[3][3], gst, rpom[][] = new double[3][3], rc2t[][] = new double[3][3]; rbpn[0][0] = 0.9999989440476103608; rbpn[0][1] = -0.1332881761240011518e-2; rbpn[0][2] = -0.5790767434730085097e-3; rbpn[1][0] = 0.1332858254308954453e-2; rbpn[1][1] = 0.9999991109044505944; rbpn[1][2] = -0.4097782710401555759e-4; rbpn[2][0] = 0.5791308472168153320e-3; rbpn[2][1] = 0.4020595661593994396e-4; rbpn[2][2] = 0.9999998314954572365; gst = 1.754166138040730516; rpom[0][0] = 0.9999999999999674705; rpom[0][1] = -0.1367174580728847031e-10; rpom[0][2] = 0.2550602379999972723e-6; rpom[1][0] = 0.1414624947957029721e-10; rpom[1][1] = 0.9999999999982694954; rpom[1][2] = -0.1860359246998866338e-5; rpom[2][0] = -0.2550602379741215275e-6; rpom[2][1] = 0.1860359247002413923e-5; rpom[2][2] = 0.9999999999982369658; rc2t = jauC2teqx(rbpn, gst, rpom); vvd(rc2t[0][0], -0.1810332128528685730, 1e-12,"jauC2teqx", "11"); vvd(rc2t[0][1], 0.9834769806897685071, 1e-12,"jauC2teqx", "12"); vvd(rc2t[0][2], 0.6555535639982634449e-4, 1e-12,"jauC2teqx", "13"); vvd(rc2t[1][0], -0.9834768134095211257, 1e-12,"jauC2teqx", "21"); vvd(rc2t[1][1], -0.1810332203871023800, 1e-12,"jauC2teqx", "22"); vvd(rc2t[1][2], 0.5749801116126438962e-3, 1e-12,"jauC2teqx", "23"); vvd(rc2t[2][0], 0.5773474014081539467e-3, 1e-12,"jauC2teqx", "31"); vvd(rc2t[2][1], 0.3961832391768640871e-4, 1e-12,"jauC2teqx", "32"); vvd(rc2t[2][2], 0.9999998325501691969, 1e-12,"jauC2teqx", "33"); } @Test public void t_c2tpe() /** ** ** Test jauC2tpe function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauC2tpe, vvd ** ** This revision: 2008 November 28 */ { double tta, ttb, uta, utb, dpsi, deps, xp, yp, rc2t[][] = new double[3][3]; tta = 2400000.5; uta = 2400000.5; ttb = 53736.0; utb = 53736.0; deps = 0.4090789763356509900; dpsi = -0.9630909107115582393e-5; xp = 2.55060238e-7; yp = 1.860359247e-6; rc2t = jauC2tpe(tta, ttb, uta, utb, dpsi, deps, xp, yp); vvd(rc2t[0][0], -0.1813677995763029394, 1e-12,"jauC2tpe", "11"); vvd(rc2t[0][1], 0.9023482206891683275, 1e-12,"jauC2tpe", "12"); vvd(rc2t[0][2], -0.3909902938641085751, 1e-12,"jauC2tpe", "13"); vvd(rc2t[1][0], -0.9834147641476804807, 1e-12,"jauC2tpe", "21"); vvd(rc2t[1][1], -0.1659883635434995121, 1e-12,"jauC2tpe", "22"); vvd(rc2t[1][2], 0.7309763898042819705e-1, 1e-12,"jauC2tpe", "23"); vvd(rc2t[2][0], 0.1059685430673215247e-2, 1e-12,"jauC2tpe", "31"); vvd(rc2t[2][1], 0.3977631855605078674, 1e-12,"jauC2tpe", "32"); vvd(rc2t[2][2], 0.9174875068792735362, 1e-12,"jauC2tpe", "33"); } @Test public void t_c2txy() /** ** ** Test jauC2txy function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauC2txy, vvd ** ** This revision: 2008 November 28 */ { double tta, ttb, uta, utb, x, y, xp, yp, rc2t[][] = new double[3][3]; tta = 2400000.5; uta = 2400000.5; ttb = 53736.0; utb = 53736.0; x = 0.5791308486706011000e-3; y = 0.4020579816732961219e-4; xp = 2.55060238e-7; yp = 1.860359247e-6; rc2t = jauC2txy(tta, ttb, uta, utb, x, y, xp, yp); vvd(rc2t[0][0], -0.1810332128306279253, 1e-12,"jauC2txy", "11"); vvd(rc2t[0][1], 0.9834769806938520084, 1e-12,"jauC2txy", "12"); vvd(rc2t[0][2], 0.6555551248057665829e-4, 1e-12,"jauC2txy", "13"); vvd(rc2t[1][0], -0.9834768134136142314, 1e-12,"jauC2txy", "21"); vvd(rc2t[1][1], -0.1810332203649529312, 1e-12,"jauC2txy", "22"); vvd(rc2t[1][2], 0.5749800843594139912e-3, 1e-12,"jauC2txy", "23"); vvd(rc2t[2][0], 0.5773474028619264494e-3, 1e-12,"jauC2txy", "31"); vvd(rc2t[2][1], 0.3961816546911624260e-4, 1e-12,"jauC2txy", "32"); vvd(rc2t[2][2], 0.9999998325501746670, 1e-12,"jauC2txy", "33"); } @Test public void t_cal2jd() /** ** ** Test jauCal2jd function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauCal2jd, vvd, viv ** ** This revision: 2008 May 27 */ { try { JulianDate jd = jauCal2jd(2003, 06, 01); vvd(jd.djm0, 2400000.5, 0.0, "jauCal2jd", "djm0"); vvd(jd.djm1, 52791.0, 0.0, "jauCal2jd", "djm"); } catch (JSOFAIllegalParameter e) { fail("jauCal2jd should not throw execption"); } // viv(j, 0, "jauCal2jd", "j"); } @Test public void t_cp() /** ** ** Test jauCp function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauCp, vvd ** ** This revision: 2008 November 30 */ { double p[] = new double[3], c[] = new double[3]; p[0] = 0.3; p[1] = 1.2; p[2] = -2.5; jauCp(p, c); vvd(c[0], 0.3, 0.0, "jauCp", "1"); vvd(c[1], 1.2, 0.0, "jauCp", "2"); vvd(c[2], -2.5, 0.0, "jauCp", "3"); } @Test public void t_cpv() /** ** ** Test jauCpv function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauCpv, vvd ** ** This revision: 2008 May 25 */ { double pv[][] = new double[2][3], c[][] = new double[2][3]; pv[0][0] = 0.3; pv[0][1] = 1.2; pv[0][2] = -2.5; pv[1][0] = -0.5; pv[1][1] = 3.1; pv[1][2] = 0.9; jauCpv(pv, c); vvd(c[0][0], 0.3, 0.0, "jauCpv", "p1"); vvd(c[0][1], 1.2, 0.0, "jauCpv", "p2"); vvd(c[0][2], -2.5, 0.0, "jauCpv", "p3"); vvd(c[1][0], -0.5, 0.0, "jauCpv", "v1"); vvd(c[1][1], 3.1, 0.0, "jauCpv", "v2"); vvd(c[1][2], 0.9, 0.0, "jauCpv", "v3"); } @Test public void t_cr() /** ** ** Test jauCr function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauCr, vvd ** ** This revision: 2008 November 30 */ { double r[][] = new double[3][3], c[][] = new double[3][3]; r[0][0] = 2.0; r[0][1] = 3.0; r[0][2] = 2.0; r[1][0] = 3.0; r[1][1] = 2.0; r[1][2] = 3.0; r[2][0] = 3.0; r[2][1] = 4.0; r[2][2] = 5.0; jauCr(r, c); vvd(c[0][0], 2.0, 0.0, "jauCr", "11"); vvd(c[0][1], 3.0, 0.0, "jauCr", "12"); vvd(c[0][2], 2.0, 0.0, "jauCr", "13"); vvd(c[1][0], 3.0, 0.0, "jauCr", "21"); vvd(c[1][1], 2.0, 0.0, "jauCr", "22"); vvd(c[1][2], 3.0, 0.0, "jauCr", "23"); vvd(c[2][0], 3.0, 0.0, "jauCr", "31"); vvd(c[2][1], 4.0, 0.0, "jauCr", "32"); vvd(c[2][2], 5.0, 0.0, "jauCr", "33"); } @Test public void t_d2tf() /** ** ** Test jauD2tf function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauD2tf, viv, vvd ** ** This revision: 2008 November 30 */ { int ihmsf[] = new int[4]; char s; s = jauD2tf(4, -0.987654321, ihmsf); viv((int)s, '-', "jauD2tf", "s"); viv(ihmsf[0], 23, "jauD2tf", "0"); viv(ihmsf[1], 42, "jauD2tf", "1"); viv(ihmsf[2], 13, "jauD2tf", "2"); viv(ihmsf[3], 3333, "jauD2tf", "3"); } @Test public void t_dat() /** ** ** Test jauDat function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauDat, vvd, viv ** ** This revision: 2008 November 29 */ { double deltat; int nls = leapSeconds.length; viv(nls, 42, "jauDat", "number of leap second entries"); viv(leapSeconds[nls-1].iyear, 2017, "jauDat", "year of last leap second"); viv(leapSeconds[nls-1].month, 1, "jauDat", "month of last leap second"); try { deltat = jauDat(2003, 6, 1, 0.0); vvd(deltat, 32.0, 0.0, "jauDat", "d1"); } catch (Exception e) { fail("jauDat j1"); } try { deltat = jauDat(2008, 1, 17, 0.0); vvd(deltat, 33.0, 0.0, "jauDat", "d2"); } catch (Exception e) { fail("jauDat j2"); } try { deltat = jauDat(2017, 9, 1, 0.0 ); vvd(deltat, 37.0, 0.0, "jauDat", "d3"); } catch (Exception e) { fail("jauDat j3"); } } @Test public void t_dtdb() /** ** ** Test jauDtdb function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauDtdb, vvd ** ** This revision: 2008 November 28 */ { double dtdb; dtdb = jauDtdb(2448939.5, 0.123, 0.76543, 5.0123, 5525.242, 3190.0); vvd(dtdb, -0.1280368005936998991e-2, 1e-15, "jauDtdb", ""); } @Test public void t_ee00() /** ** ** Test jauEe00 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauEe00, vvd ** ** This revision: 2008 November 28 */ { double epsa, dpsi, ee; epsa = 0.4090789763356509900; dpsi = -0.9630909107115582393e-5; ee = jauEe00(2400000.5, 53736.0, epsa, dpsi); vvd(ee, -0.8834193235367965479e-5, 1e-18, "jauEe00", ""); } @Test public void t_ee00a() /** ** ** Test jauEe00a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauEe00a, vvd ** ** This revision: 2008 November 28 */ { double ee; ee = jauEe00a(2400000.5, 53736.0); vvd(ee, -0.8834192459222588227e-5, 1e-18, "jauEe00a", ""); } @Test public void t_ee00b() /** ** ** Test jauEe00b function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauEe00b, vvd ** ** This revision: 2008 November 28 */ { double ee; ee = jauEe00b(2400000.5, 53736.0); vvd(ee, -0.8835700060003032831e-5, 1e-18, "jauEe00b", ""); } @Test public void t_ee06a() /** ** ** Test jauEe06a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauEe06a, vvd ** ** This revision: 2008 November 28 */ { double ee; ee = jauEe06a(2400000.5, 53736.0); vvd(ee, -0.8834195072043790156e-5, 1e-15, "jauEe06a", ""); } @Test public void t_eect00() /** ** ** Test jauEect00 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauEect00, vvd ** ** This revision: 2008 November 28 */ { double eect; eect = jauEect00(2400000.5, 53736.0); vvd(eect, 0.2046085004885125264e-8, 1e-20, "jauEect00", ""); } @Test public void t_eform() /** ** ** Test jauEform function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauEform, viv, vvd ** ** This revision: 2010 January 18 */ { ReferenceEllipsoid ef; try { ef = jauEform( 0 ); fail("jauEform should throw exception for illegal identifier"); } catch (JSOFAIllegalParameter e) { } try { ef = jauEform( 1 ); vvd(ef.a, 6378137.0, 1e-10, "jauEform", "a"); vvd(ef.f, 0.0033528106647474807, 1e-18, "jauEform", "f"); ef = jauEform( 2 ); vvd(ef.a, 6378137.0, 1e-10, "jauEform", "a"); vvd(ef.f, 0.0033528106811823189, 1e-18, "jauEform", "f"); ef = jauEform( 3 ); vvd(ef.a, 6378135.0, 1e-10, "jauEform", "a"); vvd(ef.f, 0.0033527794541675049, 1e-18, "jauEform", "f"); } catch (JSOFAIllegalParameter e) { fail("jauEform should not throw exception for legal identifier"); } try { ef = jauEform( 4 ); fail("jauEform should throw exception for illegal identifier"); } catch (JSOFAIllegalParameter e) { } } @Test public void t_eo06a() /** ** ** Test jauEo06a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauEo06a, vvd ** ** This revision: 2008 November 28 */ { double eo; eo = jauEo06a(2400000.5, 53736.0); vvd(eo, -0.1332882371941833644e-2, 1e-15, "jauEo06a", ""); } @Test public void t_eors() /** ** ** Test jauEors function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauEors, vvd ** ** This revision: 2008 November 28 */ { double rnpb[][] = new double[3][3], s, eo; rnpb[0][0] = 0.9999989440476103608; rnpb[0][1] = -0.1332881761240011518e-2; rnpb[0][2] = -0.5790767434730085097e-3; rnpb[1][0] = 0.1332858254308954453e-2; rnpb[1][1] = 0.9999991109044505944; rnpb[1][2] = -0.4097782710401555759e-4; rnpb[2][0] = 0.5791308472168153320e-3; rnpb[2][1] = 0.4020595661593994396e-4; rnpb[2][2] = 0.9999998314954572365; s = -0.1220040848472271978e-7; eo = jauEors(rnpb, s); vvd(eo, -0.1332882715130744606e-2, 1e-14, "jauEors", ""); } @Test public void t_epb() /** ** ** Test jauEpb function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauEpb, vvd ** ** This revision: 2008 May 27 */ { double epb; epb = jauEpb(2415019.8135, 30103.18648); vvd(epb, 1982.418424159278580, 1e-12, "jauEpb", ""); } @Test public void t_epb2jd() /** ** ** Test jauEpb2jd function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauEpb2jd, vvd ** ** This revision: 2008 November 29 */ { double epb; epb = 1957.3; JulianDate jd = jauEpb2jd(epb); vvd(jd.djm0, 2400000.5, 1e-9, "jauEpb2jd", "djm0"); vvd(jd.djm1, 35948.1915101513, 1e-9, "jauEpb2jd", "mjd"); } @Test public void t_epj() /** ** ** Test jauEpj function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauEpj, vvd ** ** This revision: 2008 May 27 */ { double epj; epj = jauEpj(2451545, -7392.5); vvd(epj, 1979.760438056125941, 1e-12, "jauEpj", ""); } @Test public void t_epj2jd() /** ** ** Test jauEpj2jd function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauEpj2jd, vvd ** ** This revision: 2008 November 29 */ { double epj; epj = 1996.8; JulianDate jd = jauEpj2jd(epj); vvd(jd.djm0, 2400000.5, 1e-9, "jauEpj2jd", "djm0"); vvd(jd.djm1, 50375.7, 1e-9, "jauEpj2jd", "mjd"); } @Test public void t_epv00() /** ** ** Test jauEpv00 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauEpv00, vvd, viv ** ** This revision: 2008 November 28 */ { double pvh[][] = new double[2][3], pvb[][] = new double[2][3]; int j = jauEpv00(2400000.5, 53411.52501161, pvh, pvb); vvd(pvh[0][0], -0.7757238809297706813, 1e-14, "jauEpv00", "ph(x)"); vvd(pvh[0][1], 0.5598052241363340596, 1e-14, "jauEpv00", "ph(y)"); vvd(pvh[0][2], 0.2426998466481686993, 1e-14, "jauEpv00", "ph(z)"); vvd(pvh[1][0], -0.1091891824147313846e-1, 1e-15, "jauEpv00", "vh(x)"); vvd(pvh[1][1], -0.1247187268440845008e-1, 1e-15, "jauEpv00", "vh(y)"); vvd(pvh[1][2], -0.5407569418065039061e-2, 1e-15, "jauEpv00", "vh(z)"); vvd(pvb[0][0], -0.7714104440491111971, 1e-14, "jauEpv00", "pb(x)"); vvd(pvb[0][1], 0.5598412061824171323, 1e-14, "jauEpv00", "pb(y)"); vvd(pvb[0][2], 0.2425996277722452400, 1e-14, "jauEpv00", "pb(z)"); vvd(pvb[1][0], -0.1091874268116823295e-1, 1e-15, "jauEpv00", "vb(x)"); vvd(pvb[1][1], -0.1246525461732861538e-1, 1e-15, "jauEpv00", "vb(y)"); vvd(pvb[1][2], -0.5404773180966231279e-2, 1e-15, "jauEpv00", "vb(z)"); viv(j, 0, "jauEpv00", "j"); } @Test public void t_eqeq94() /** ** ** Test jauEqeq94 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauEqeq94, vvd ** ** This revision: 2008 November 28 */ { double eqeq; eqeq = jauEqeq94(2400000.5, 41234.0); vvd(eqeq, 0.5357758254609256894e-4, 1e-17, "jauEqeq94", ""); } @Test public void t_era00() /** ** ** Test jauEra00 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauEra00, vvd ** ** This revision: 2008 May 26 */ { double era00; era00 = jauEra00(2400000.5, 54388.0); vvd(era00, 0.4022837240028158102, 1e-12, "jauEra00", ""); } @Test public void t_fad03() /** ** ** Test jauFad03 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFad03, vvd ** ** This revision: 2008 May 22 */ { vvd(jauFad03(0.80), 1.946709205396925672, 1e-12, "jauFad03", ""); } @Test public void t_fae03() /** ** ** Test jauFae03 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFae03, vvd ** ** This revision: 2008 May 22 */ { vvd(jauFae03(0.80), 1.744713738913081846, 1e-12, "jauFae03", ""); } @Test public void t_faf03() /** ** ** Test jauFaf03 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFaf03, vvd ** ** This revision: 2008 May 22 */ { vvd(jauFaf03(0.80), 0.2597711366745499518, 1e-12, "jauFaf03", ""); } @Test public void t_faju03() /** ** ** Test jauFaju03 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFaju03, vvd ** ** This revision: 2008 May 22 */ { vvd(jauFaju03(0.80), 5.275711665202481138, 1e-12, "jauFaju03", ""); } @Test public void t_fal03() /** ** ** Test jauFal03 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFal03, vvd ** ** This revision: 2008 May 22 */ { vvd(jauFal03(0.80), 5.132369751108684150, 1e-12, "jauFal03", ""); } @Test public void t_falp03() /** ** ** Test jauFalp03 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFalp03, vvd ** ** This revision: 2008 May 22 */ { vvd(jauFalp03(0.80), 6.226797973505507345, 1e-12, "jauFalp03", ""); } @Test public void t_fama03() /** ** ** Test jauFama03 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFama03, vvd ** ** This revision: 2008 May 22 */ { vvd(jauFama03(0.80), 3.275506840277781492, 1e-12, "jauFama03", ""); } @Test public void t_fame03() /** ** ** Test jauFame03 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFame03, vvd ** ** This revision: 2008 May 22 */ { vvd(jauFame03(0.80), 5.417338184297289661, 1e-12, "jauFame03", ""); } @Test public void t_fane03() /** ** ** Test jauFane03 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFane03, vvd ** ** This revision: 2008 May 22 */ { vvd(jauFane03(0.80), 2.079343830860413523, 1e-12, "jauFane03", ""); } @Test public void t_faom03() /** ** ** Test jauFaom03 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFaom03, vvd ** ** This revision: 2008 May 22 */ { vvd(jauFaom03(0.80), -5.973618440951302183, 1e-12, "jauFaom03", ""); } @Test public void t_fapa03() /** ** ** Test jauFapa03 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFapa03, vvd ** ** This revision: 2008 November 28 */ { vvd(jauFapa03(0.80), 0.1950884762240000000e-1, 1e-12, "jauFapa03", ""); } @Test public void t_fasa03() /** ** ** Test jauFasa03 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFasa03, vvd ** ** This revision: 2008 May 22 */ { vvd(jauFasa03(0.80), 5.371574539440827046, 1e-12, "jauFasa03", ""); } @Test public void t_faur03() /** ** ** Test jauFaur03 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFaur03, vvd ** ** This revision: 2008 May 22 */ { vvd(jauFaur03(0.80), 5.180636450180413523, 1e-12, "jauFaur03", ""); } @Test public void t_fave03() /** ** ** Test jauFave03 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFave03, vvd ** ** This revision: 2008 May 22 */ { vvd(jauFave03(0.80), 3.424900460533758000, 1e-12, "jauFave03", ""); } @Test public void t_fk52h() /** ** ** Test jauFk52h function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFk52h, vvd ** ** This revision: 2009 November 6 */ { double r5, d5, dr5, dd5, px5, rv5; r5 = 1.76779433; d5 = -0.2917517103; dr5 = -1.91851572e-7; dd5 = -5.8468475e-6; px5 = 0.379210; rv5 = -7.6; CatalogCoords cat = jauFk52h(r5, d5, dr5, dd5, px5, rv5); vvd(cat.pos.alpha, 1.767794226299947632, 1e-14,"jauFk52h", "ra"); vvd(cat.pos.delta, -0.2917516070530391757, 1e-14,"jauFk52h", "dec"); vvd(cat.pm.alpha, -0.1961874125605721270e-6,1e-19,"jauFk52h", "dr5"); vvd(cat.pm.delta, -0.58459905176693911e-5, 1e-19,"jauFk52h", "dd5"); vvd(cat.px, 0.37921, 1e-14,"jauFk52h", "px"); vvd(cat.rv, -7.6000000940000254, 1e-11,"jauFk52h", "rv"); } @Test public void t_fk5hip() /** ** ** Test jauFk5hip function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFk5hip, vvd ** ** This revision: 2008 November 30 */ { double r5h[][] = new double[3][3], s5h[] = new double[3]; jauFk5hip(r5h, s5h); vvd(r5h[0][0], 0.9999999999999928638, 1e-14,"jauFk5hip", "11"); vvd(r5h[0][1], 0.1110223351022919694e-6, 1e-17,"jauFk5hip", "12"); vvd(r5h[0][2], 0.4411803962536558154e-7, 1e-17,"jauFk5hip", "13"); vvd(r5h[1][0], -0.1110223308458746430e-6, 1e-17,"jauFk5hip", "21"); vvd(r5h[1][1], 0.9999999999999891830, 1e-14,"jauFk5hip", "22"); vvd(r5h[1][2], -0.9647792498984142358e-7, 1e-17,"jauFk5hip", "23"); vvd(r5h[2][0], -0.4411805033656962252e-7, 1e-17,"jauFk5hip", "31"); vvd(r5h[2][1], 0.9647792009175314354e-7, 1e-17,"jauFk5hip", "32"); vvd(r5h[2][2], 0.9999999999999943728, 1e-14,"jauFk5hip", "33"); vvd(s5h[0], -0.1454441043328607981e-8, 1e-17,"jauFk5hip", "s1"); vvd(s5h[1], 0.2908882086657215962e-8, 1e-17,"jauFk5hip", "s2"); vvd(s5h[2], 0.3393695767766751955e-8, 1e-17,"jauFk5hip", "s3"); } @Test public void t_fk5hz() /** ** ** Test jauFk5hz function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFk5hz, vvd ** ** This revision: 2008 May 26 */ { double r5, d5; r5 = 1.76779433; d5 = -0.2917517103; SphericalCoordinate pos = jauFk5hz(r5, d5, 2400000.5, 54479.0); vvd(pos.alpha, 1.767794191464423978, 1e-12, "jauFk5hz", "ra"); vvd(pos.delta, -0.2917516001679884419, 1e-12, "jauFk5hz", "dec"); } @Test public void t_fw2m() /** ** ** Test jauFw2m function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFw2m, vvd ** ** This revision: 2008 November 30 */ { double gamb, phib, psi, eps, r[][] = new double[3][3]; gamb = -0.2243387670997992368e-5; phib = 0.4091014602391312982; psi = -0.9501954178013015092e-3; eps = 0.4091014316587367472; r = jauFw2m(gamb, phib, psi, eps); vvd(r[0][0], 0.9999995505176007047, 1e-12,"jauFw2m", "11"); vvd(r[0][1], 0.8695404617348192957e-3, 1e-12,"jauFw2m", "12"); vvd(r[0][2], 0.3779735201865582571e-3, 1e-12,"jauFw2m", "13"); vvd(r[1][0], -0.8695404723772016038e-3, 1e-12,"jauFw2m", "21"); vvd(r[1][1], 0.9999996219496027161, 1e-12,"jauFw2m", "22"); vvd(r[1][2], -0.1361752496887100026e-6, 1e-12,"jauFw2m", "23"); vvd(r[2][0], -0.3779734957034082790e-3, 1e-12,"jauFw2m", "31"); vvd(r[2][1], -0.1924880848087615651e-6, 1e-12,"jauFw2m", "32"); vvd(r[2][2], 0.9999999285679971958, 1e-12,"jauFw2m", "33"); } @Test public void t_fw2xy() /** ** ** Test jauFw2xy function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauFw2xy, vvd ** ** This revision: 2008 November 28 */ { double gamb, phib, psi, eps; gamb = -0.2243387670997992368e-5; phib = 0.4091014602391312982; psi = -0.9501954178013015092e-3; eps = 0.4091014316587367472; CelestialIntermediatePole cip = jauFw2xy(gamb, phib, psi, eps); vvd(cip.x, -0.3779734957034082790e-3, 1e-14, "jauFw2xy", "x"); vvd(cip.y, -0.1924880848087615651e-6, 1e-14, "jauFw2xy", "y"); } @Test public void t_gc2gd() /** ** ** Test jauGc2gd function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauGc2gd, viv, vvd ** ** This revision: 2009 November 8 */ { double xyz[] = {2e6, 3e6, 5.244e6}; GeodeticCoord geo; try { geo = jauGc2gd( 0, xyz); fail("jauGc2gd should thow exception for illegal parameter"); } catch (JSOFAIllegalParameter e1) { } try { geo = jauGc2gd( 1, xyz ); vvd(geo.elong, 0.98279372324732907, 1e-14, "jauGc2gd", "e1"); vvd(geo.phi, 0.97160184819075459, 1e-14, "jauGc2gd", "p1"); vvd(geo.height, 331.41724614260599, 1e-8, "jauGc2gd", "h1"); geo = jauGc2gd( 2, xyz ); vvd(geo.elong, 0.98279372324732907, 1e-14, "jauGc2gd", "e2"); vvd(geo.phi, 0.97160184820607853, 1e-14, "jauGc2gd", "p2"); vvd(geo.height, 331.41731754844348, 1e-8, "jauGc2gd", "h2"); geo = jauGc2gd( 3, xyz ); vvd(geo.elong, 0.98279372324732907, 1e-14, "jauGc2gd", "e3"); vvd(geo.phi, 0.97160181811015119, 1e-14, "jauGc2gd", "p3"); vvd(geo.height, 333.27707261303181, 1e-8, "jauGc2gd", "h3"); } catch (JSOFAIllegalParameter e1) { fail("jauGc2gd should not thow exception for legal parameter"); } try { geo = jauGc2gd( 4, xyz ); fail("jauGc2gd should thow exception for illegal parameter"); } catch (JSOFAIllegalParameter e1) { } } @Test public void t_gc2gde() /** ** ** Test jauGc2gde function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauGc2gde, viv, vvd ** ** This revision: 2009 November 8 */ { double a = 6378136.0, f = 0.0033528; double xyz[] = {2e6, 3e6, 5.244e6}; try { GeodeticCoord geo = jauGc2gde( a, f, xyz); vvd(geo.elong, 0.98279372324732907, 1e-14, "jauGc2gde", "e"); vvd(geo.phi, 0.97160183775704115, 1e-14, "jauGc2gde", "p"); vvd(geo.height, 332.36862495764397, 1e-8, "jauGc2gde", "h"); } catch (JSOFAIllegalParameter e1) { fail("jauGc2gde should not thow exception for legal parameter"); } } @Test public void t_gd2gc() /** ** ** Test jauGd2gc function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauGd2gc, viv, vvd ** ** This revision: 2009 November 6 */ { double e = 3.1, p = -0.5, h = 2500.0; double xyz[] = new double[3]; try { xyz = jauGd2gc( 0, e, p, h ); fail("jauGd2gc should thow exception for illegal parameter"); } catch (JSOFAIllegalParameter e1) { // expected behaviour } catch (JSOFAInternalError e1) { fail("jauGd2gc should thow exception for illegal parameter"); } try { xyz = jauGd2gc( 1, e, p, h ); vvd(xyz[0], -5599000.5577049947, 1e-7, "jauGd2gc", "0/1"); vvd(xyz[1], 233011.67223479203, 1e-7, "jauGd2gc", "1/1"); vvd(xyz[2], -3040909.4706983363, 1e-7, "jauGd2gc", "2/1"); xyz = jauGd2gc( 2, e, p, h); vvd(xyz[0], -5599000.5577260984, 1e-7, "jauGd2gc", "0/2"); vvd(xyz[1], 233011.6722356703, 1e-7, "jauGd2gc", "1/2"); vvd(xyz[2], -3040909.4706095476, 1e-7, "jauGd2gc", "2/2"); xyz = jauGd2gc( 3, e, p, h); vvd(xyz[0], -5598998.7626301490, 1e-7, "jauGd2gc", "0/3"); vvd(xyz[1], 233011.5975297822, 1e-7, "jauGd2gc", "1/3"); vvd(xyz[2], -3040908.6861467111, 1e-7, "jauGd2gc", "2/3"); } catch (JSOFAException e1) { fail("jauGd2gc should not thow exception "); } try { xyz = jauGd2gc( 4, e, p, h ); fail("jauGd2gc should thow exception for illegal parameter"); } catch (JSOFAIllegalParameter e1) { //expected behaviour } catch (JSOFAInternalError e1) { fail("jauGd2gc should thow exception for illegal parameter"); } } @Test public void t_gd2gce() throws JSOFAInternalError /** ** ** Test jauGd2gce function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauGd2gce, viv, vvd ** ** This revision: 2009 November 6 */ { double a = 6378136.0, f = 0.0033528; double e = 3.1, p = -0.5, h = 2500.0; double xyz[] = new double[3]; xyz = jauGd2gce( a, f, e, p, h ); vvd(xyz[0], -5598999.6665116328, 1e-7, "jauGd2gce", "0"); vvd(xyz[1], 233011.63514630572, 1e-7, "jauGd2gce", "1"); vvd(xyz[2], -3040909.0517314132, 1e-7, "jauGd2gce", "2"); } @Test public void t_gmst00() /** ** ** Test jauGmst00 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauGmst00, vvd ** ** This revision: 2008 May 26 */ { double theta; theta = jauGmst00(2400000.5, 53736.0, 2400000.5, 53736.0); vvd(theta, 1.754174972210740592, 1e-12, "jauGmst00", ""); } @Test public void t_gmst06() /** ** ** Test jauGmst06 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauGmst06, vvd ** ** This revision: 2008 May 26 */ { double theta; theta = jauGmst06(2400000.5, 53736.0, 2400000.5, 53736.0); vvd(theta, 1.754174971870091203, 1e-12, "jauGmst06", ""); } @Test public void t_gmst82() /** ** ** Test jauGmst82 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauGmst82, vvd ** ** This revision: 2008 May 26 */ { double theta; theta = jauGmst82(2400000.5, 53736.0); vvd(theta, 1.754174981860675096, 1e-12, "jauGmst82", ""); } @Test public void t_gst00a() /** ** ** Test jauGst00a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauGst00a, vvd ** ** This revision: 2008 May 26 */ { double theta; theta = jauGst00a(2400000.5, 53736.0, 2400000.5, 53736.0); vvd(theta, 1.754166138018281369, 1e-12, "jauGst00a", ""); } @Test public void t_gst00b() /** ** ** Test jauGst00b function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauGst00b, vvd ** ** This revision: 2008 May 26 */ { double theta; theta = jauGst00b(2400000.5, 53736.0); vvd(theta, 1.754166136510680589, 1e-12, "jauGst00b", ""); } @Test public void t_gst06() /** ** ** Test jauGst06 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauGst06, vvd ** ** This revision: 2008 November 28 */ { double rnpb[][] = new double[3][3], theta; rnpb[0][0] = 0.9999989440476103608; rnpb[0][1] = -0.1332881761240011518e-2; rnpb[0][2] = -0.5790767434730085097e-3; rnpb[1][0] = 0.1332858254308954453e-2; rnpb[1][1] = 0.9999991109044505944; rnpb[1][2] = -0.4097782710401555759e-4; rnpb[2][0] = 0.5791308472168153320e-3; rnpb[2][1] = 0.4020595661593994396e-4; rnpb[2][2] = 0.9999998314954572365; theta = jauGst06(2400000.5, 53736.0, 2400000.5, 53736.0, rnpb); vvd(theta, 1.754166138018167568, 1e-12, "jauGst06", ""); } @Test public void t_gst06a() /** ** ** Test jauGst06a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauGst06a, vvd ** ** This revision: 2008 May 26 */ { double theta; theta = jauGst06a(2400000.5, 53736.0, 2400000.5, 53736.0); vvd(theta, 1.754166137675019159, 1e-12, "jauGst06a", ""); } @Test public void t_gst94() /** ** ** Test jauGst94 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauGst94, vvd ** ** This revision: 2008 May 26 */ { double theta; theta = jauGst94(2400000.5, 53736.0); vvd(theta, 1.754166136020645203, 1e-12, "jauGst94", ""); } @Test public void t_h2fk5() /** ** ** Test jauH2fk5 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauH2fk5, vvd ** ** This revision: 2009 November 6 */ { double rh, dh, drh, ddh, pxh, rvh; rh = 1.767794352; dh = -0.2917512594; drh = -2.76413026e-6; ddh = -5.92994449e-6; pxh = 0.379210; rvh = -7.6; CatalogCoords cat = jauH2fk5(rh, dh, drh, ddh, pxh, rvh); vvd(cat.pos.alpha, 1.767794455700065506, 1e-13,"jauH2fk5", "ra"); vvd(cat.pos.delta, -0.2917513626469638890, 1e-13,"jauH2fk5", "dec"); vvd(cat.pm.alpha, -0.27597945024511204e-5, 1e-18,"jauH2fk5", "dr5"); vvd(cat.pm.delta, -0.59308014093262838e-5, 1e-18,"jauH2fk5", "dd5"); vvd(cat.px, 0.37921, 1e-13,"jauH2fk5", "px"); vvd(cat.rv, -7.6000001309071126, 2e-11,"jauH2fk5", "rv"); //NB have relaxed the precision slightly to get this test to pass cf official release } @Test public void t_hfk5z() /** ** ** Test jauHfk5z function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauHfk5z, vvd ** ** This revision: 2008 November 29 */ { double rh, dh; rh = 1.767794352; dh = -0.2917512594; CatalogCoords cat = jauHfk5z(rh, dh, 2400000.5, 54479.0); vvd(cat.pos.alpha, 1.767794490535581026, 1e-13,"jauHfk5z", "ra"); vvd(cat.pos.delta, -0.2917513695320114258, 1e-14,"jauHfk5z", "dec"); vvd(cat.pm.alpha, 0.4335890983539243029e-8, 1e-22,"jauHfk5z", "dr5"); vvd(cat.pm.delta, -0.8569648841237745902e-9, 1e-23,"jauHfk5z", "dd5"); } @Test public void t_ir() /** ** ** Test jauIr function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauIr, vvd ** ** This revision: 2008 November 30 */ { double r[][] = new double[3][3]; r[0][0] = 2.0; r[0][1] = 3.0; r[0][2] = 2.0; r[1][0] = 3.0; r[1][1] = 2.0; r[1][2] = 3.0; r[2][0] = 3.0; r[2][1] = 4.0; r[2][2] = 5.0; jauIr(r); vvd(r[0][0], 1.0, 0.0, "jauIr", "11"); vvd(r[0][1], 0.0, 0.0, "jauIr", "12"); vvd(r[0][2], 0.0, 0.0, "jauIr", "13"); vvd(r[1][0], 0.0, 0.0, "jauIr", "21"); vvd(r[1][1], 1.0, 0.0, "jauIr", "22"); vvd(r[1][2], 0.0, 0.0, "jauIr", "23"); vvd(r[2][0], 0.0, 0.0, "jauIr", "31"); vvd(r[2][1], 0.0, 0.0, "jauIr", "32"); vvd(r[2][2], 1.0, 0.0, "jauIr", "33"); } @Test public void t_jd2cal() throws JSOFAIllegalParameter /** ** ** Test jauJd2cal function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauJd2cal, viv, vvd ** ** This revision: 2008 November 29 */ { double dj1, dj2; dj1 = 2400000.5; dj2 = 50123.9999; Calendar cal = jauJd2cal(dj1, dj2); viv(cal.iy, 1996, "jauJd2cal", "y"); viv(cal.im, 2, "jauJd2cal", "m"); viv(cal.id, 10, "jauJd2cal", "d"); vvd(cal.fd, 0.9999, 1e-7, "jauJd2cal", "fd"); //FIXME should test j when jauJd2cal returns status viv(j, 0, "jauJd2cal", "j"); } @Test public void t_jdcalf() /** ** ** Test jauJdcalf function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauJdcalf, viv ** ** This revision: 2008 May 26 */ { double dj1, dj2; int iydmf[] = new int[4], j; dj1 = 2400000.5; dj2 = 50123.9999; j = jauJdcalf(4, dj1, dj2, iydmf); viv(iydmf[0], 1996, "jauJdcalf", "y"); viv(iydmf[1], 2, "jauJdcalf", "m"); viv(iydmf[2], 10, "jauJdcalf", "d"); viv(iydmf[3], 9999, "jauJdcalf", "f"); viv(j, 0, "jauJdcalf", "j"); } @Test public void t_num00a() /** ** ** Test jauNum00a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauNum00a, vvd ** ** This revision: 2008 November 28 */ { double rmatn[][] = new double[3][3]; rmatn = jauNum00a(2400000.5, 53736.0); vvd(rmatn[0][0], 0.9999999999536227949, 1e-12,"jauNum00a", "11"); vvd(rmatn[0][1], 0.8836238544090873336e-5, 1e-12,"jauNum00a", "12"); vvd(rmatn[0][2], 0.3830835237722400669e-5, 1e-12,"jauNum00a", "13"); vvd(rmatn[1][0], -0.8836082880798569274e-5, 1e-12,"jauNum00a", "21"); vvd(rmatn[1][1], 0.9999999991354655028, 1e-12,"jauNum00a", "22"); vvd(rmatn[1][2], -0.4063240865362499850e-4, 1e-12,"jauNum00a", "23"); vvd(rmatn[2][0], -0.3831194272065995866e-5, 1e-12,"jauNum00a", "31"); vvd(rmatn[2][1], 0.4063237480216291775e-4, 1e-12,"jauNum00a", "32"); vvd(rmatn[2][2], 0.9999999991671660338, 1e-12,"jauNum00a", "33"); } @Test public void t_num00b() /** ** ** Test jauNum00b function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauNum00b, vvd ** ** This revision: 2008 November 28 */ { double rmatn[][] = new double[3][3]; rmatn = jauNum00b(2400000.5, 53736); vvd(rmatn[0][0], 0.9999999999536069682, 1e-12,"jauNum00b", "11"); vvd(rmatn[0][1], 0.8837746144871248011e-5, 1e-12,"jauNum00b", "12"); vvd(rmatn[0][2], 0.3831488838252202945e-5, 1e-12,"jauNum00b", "13"); vvd(rmatn[1][0], -0.8837590456632304720e-5, 1e-12,"jauNum00b", "21"); vvd(rmatn[1][1], 0.9999999991354692733, 1e-12,"jauNum00b", "22"); vvd(rmatn[1][2], -0.4063198798559591654e-4, 1e-12,"jauNum00b", "23"); vvd(rmatn[2][0], -0.3831847930134941271e-5, 1e-12,"jauNum00b", "31"); vvd(rmatn[2][1], 0.4063195412258168380e-4, 1e-12,"jauNum00b", "32"); vvd(rmatn[2][2], 0.9999999991671806225, 1e-12,"jauNum00b", "33"); } @Test public void t_num06a() /** ** ** Test jauNum06a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauNum06a, vvd ** ** This revision: 2008 November 28 */ { double rmatn[][] = new double[3][3]; rmatn = jauNum06a(2400000.5, 53736); vvd(rmatn[0][0], 0.9999999999536227668, 1e-12,"jauNum06a", "11"); vvd(rmatn[0][1], 0.8836241998111535233e-5, 1e-12,"jauNum06a", "12"); vvd(rmatn[0][2], 0.3830834608415287707e-5, 1e-12,"jauNum06a", "13"); vvd(rmatn[1][0], -0.8836086334870740138e-5, 1e-12,"jauNum06a", "21"); vvd(rmatn[1][1], 0.9999999991354657474, 1e-12,"jauNum06a", "22"); vvd(rmatn[1][2], -0.4063240188248455065e-4, 1e-12,"jauNum06a", "23"); vvd(rmatn[2][0], -0.3831193642839398128e-5, 1e-12,"jauNum06a", "31"); vvd(rmatn[2][1], 0.4063236803101479770e-4, 1e-12,"jauNum06a", "32"); vvd(rmatn[2][2], 0.9999999991671663114, 1e-12,"jauNum06a", "33"); } @Test public void t_numat() /** ** ** Test jauNumat function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauNumat, vvd ** ** This revision: 2008 November 28 */ { double epsa, dpsi, deps, rmatn[][] = new double[3][3]; epsa = 0.4090789763356509900; dpsi = -0.9630909107115582393e-5; deps = 0.4063239174001678826e-4; rmatn = jauNumat(epsa, dpsi, deps); vvd(rmatn[0][0], 0.9999999999536227949, 1e-12,"jauNumat", "11"); vvd(rmatn[0][1], 0.8836239320236250577e-5, 1e-12,"jauNumat", "12"); vvd(rmatn[0][2], 0.3830833447458251908e-5, 1e-12,"jauNumat", "13"); vvd(rmatn[1][0], -0.8836083657016688588e-5, 1e-12,"jauNumat", "21"); vvd(rmatn[1][1], 0.9999999991354654959, 1e-12,"jauNumat", "22"); vvd(rmatn[1][2], -0.4063240865361857698e-4, 1e-12,"jauNumat", "23"); vvd(rmatn[2][0], -0.3831192481833385226e-5, 1e-12,"jauNumat", "31"); vvd(rmatn[2][1], 0.4063237480216934159e-4, 1e-12,"jauNumat", "32"); vvd(rmatn[2][2], 0.9999999991671660407, 1e-12,"jauNumat", "33"); } @Test public void t_nut00a() /** ** ** Test jauNut00a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauNut00a, vvd ** ** This revision: 2008 November 28 */ { NutationTerms nut = jauNut00a(2400000.5, 53736.0); vvd(nut.dpsi, -0.9630909107115518431e-5, 1e-13,"jauNut00a", "dpsi"); vvd(nut.deps, 0.4063239174001678710e-4, 1e-13,"jauNut00a", "deps"); } @Test public void t_nut00b() /** ** ** Test jauNut00b function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauNut00b, vvd ** ** This revision: 2008 November 28 */ { NutationTerms nut = jauNut00b(2400000.5, 53736.0); vvd(nut.dpsi, -0.9632552291148362783e-5, 1e-13,"jauNut00b", "dpsi"); vvd(nut.deps, 0.4063197106621159367e-4, 1e-13,"jauNut00b", "deps"); } @Test public void t_nut06a() /** ** ** Test jauNut06a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauNut06a, vvd ** ** This revision: 2008 November 28 */ { NutationTerms nut = jauNut06a(2400000.5, 53736.0); vvd(nut.dpsi, -0.9630912025820308797e-5, 1e-13,"jauNut06a", "dpsi"); vvd(nut.deps, 0.4063238496887249798e-4, 1e-13,"jauNut06a", "deps"); } @Test public void t_nut80() /** ** ** Test jauNut80 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauNut80, vvd ** ** This revision: 2008 November 28 */ { NutationTerms nut = jauNut80(2400000.5, 53736.0); vvd(nut.dpsi, -0.9643658353226563966e-5, 1e-13,"jauNut80", "dpsi"); vvd(nut.deps, 0.4060051006879713322e-4, 1e-13,"jauNut80", "deps"); } @Test public void t_nutm80() /** ** ** Test jauNutm80 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauNutm80, vvd ** ** This revision: 2008 November 30 */ { double rmatn[][] = new double[3][3]; rmatn = jauNutm80(2400000.5, 53736.0); vvd(rmatn[0][0], 0.9999999999534999268, 1e-12,"jauNutm80", "11"); vvd(rmatn[0][1], 0.8847935789636432161e-5, 1e-12,"jauNutm80", "12"); vvd(rmatn[0][2], 0.3835906502164019142e-5, 1e-12,"jauNutm80", "13"); vvd(rmatn[1][0], -0.8847780042583435924e-5, 1e-12,"jauNutm80", "21"); vvd(rmatn[1][1], 0.9999999991366569963, 1e-12,"jauNutm80", "22"); vvd(rmatn[1][2], -0.4060052702727130809e-4, 1e-12,"jauNutm80", "23"); vvd(rmatn[2][0], -0.3836265729708478796e-5, 1e-12,"jauNutm80", "31"); vvd(rmatn[2][1], 0.4060049308612638555e-4, 1e-12,"jauNutm80", "32"); vvd(rmatn[2][2], 0.9999999991684415129, 1e-12,"jauNutm80", "33"); } @Test public void t_obl06() /** ** ** Test jauObl06 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauObl06, vvd ** ** This revision: 2008 November 29 */ { vvd(jauObl06(2400000.5, 54388.0), 0.4090749229387258204, 1e-14, "jauObl06", ""); } @Test public void t_obl80() /** ** ** Test jauObl80 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauObl80, vvd ** ** This revision: 2008 November 29 */ { double eps0; eps0 = jauObl80(2400000.5, 54388.0); vvd(eps0, 0.4090751347643816218, 1e-14, "jauObl80", ""); } @Test public void t_p06e() /** ** ** Test jauP06e function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauP06e, vvd ** ** This revision: 2008 November 28 */ { PrecessionAngles pa = jauP06e(2400000.5, 52541.0); vvd(pa.eps0, 0.4090926006005828715, 1e-14,"jauP06e", "eps0"); vvd(pa.psia, 0.6664369630191613431e-3, 1e-14,"jauP06e", "psia"); vvd(pa.oma , 0.4090925973783255982, 1e-14,"jauP06e", "oma"); vvd(pa.bpa, 0.5561149371265209445e-6, 1e-14,"jauP06e", "bpa"); vvd(pa.bqa, -0.6191517193290621270e-5, 1e-14,"jauP06e", "bqa"); vvd(pa.pia, 0.6216441751884382923e-5, 1e-14,"jauP06e", "pia"); vvd(pa.bpia, 3.052014180023779882, 1e-14,"jauP06e", "bpia"); vvd(pa.epsa, 0.4090864054922431688, 1e-14,"jauP06e", "epsa"); vvd(pa.chia, 0.1387703379530915364e-5, 1e-14,"jauP06e", "chia"); vvd(pa.za, 0.2921789846651790546e-3, 1e-14,"jauP06e", "za"); vvd(pa.zetaa, 0.3178773290332009310e-3, 1e-14,"jauP06e", "zetaa"); vvd(pa.thetaa, 0.2650932701657497181e-3, 1e-14,"jauP06e", "thetaa"); vvd(pa.pa, 0.6651637681381016288e-3, 1e-14,"jauP06e", "pa"); vvd(pa.gam, 0.1398077115963754987e-5, 1e-14,"jauP06e", "gam"); vvd(pa.phi, 0.4090864090837462602, 1e-14,"jauP06e", "phi"); vvd(pa.psi, 0.6664464807480920325e-3, 1e-14,"jauP06e", "psi"); } @Test public void t_p2pv() /** ** ** Test jauP2pv function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauP2pv, vvd ** ** This revision: 2008 May 26 */ { double p[] = new double[3], pv[][]=new double[2][3]; p[0] = 0.25; p[1] = 1.2; p[2] = 3.0; pv[0][0] = 0.3; pv[0][1] = 1.2; pv[0][2] = -2.5; pv[1][0] = -0.5; pv[1][1] = 3.1; pv[1][2] = 0.9; pv = jauP2pv(p); vvd(pv[0][0], 0.25, 0.0, "jauP2pv", "p1"); vvd(pv[0][1], 1.2, 0.0, "jauP2pv", "p2"); vvd(pv[0][2], 3.0, 0.0, "jauP2pv", "p3"); vvd(pv[1][0], 0.0, 0.0, "jauP2pv", "v1"); vvd(pv[1][1], 0.0, 0.0, "jauP2pv", "v2"); vvd(pv[1][2], 0.0, 0.0, "jauP2pv", "v3"); } @Test public void t_p2s() /** ** ** Test jauP2s function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauP2s, vvd ** ** This revision: 2008 November 29 */ { double p[] = new double[3]; p[0] = 100.0; p[1] = -50.0; p[2] = 25.0; SphericalPosition co = jauP2s(p); vvd(co.theta, -0.4636476090008061162, 1e-12, "jauP2s", "theta"); vvd(co.phi, 0.2199879773954594463, 1e-12, "jauP2s", "phi"); vvd(co.r, 114.5643923738960002, 1e-9, "jauP2s", "r"); } @Test public void t_pap() /** ** ** Test jauPap function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPap, vvd ** ** This revision: 2008 May 25 */ { double a[] = new double[3], b[] = new double[3], theta; a[0] = 1.0; a[1] = 0.1; a[2] = 0.2; b[0] = -3.0; b[1] = 1e-3; b[2] = 0.2; theta = jauPap(a, b); vvd(theta, 0.3671514267841113674, 1e-12, "jauPap", ""); } @Test public void t_pas() /** ** ** Test jauPas function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPas, vvd ** ** This revision: 2008 May 25 */ { double al, ap, bl, bp, theta; al = 1.0; ap = 0.1; bl = 0.2; bp = -1.0; theta = jauPas(al, ap, bl, bp); vvd(theta, -2.724544922932270424, 1e-12, "jauPas", ""); } @Test public void t_pb06() /** ** ** Test jauPb06 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPb06, vvd ** ** This revision: 2008 November 28 */ { EulerAngles an = jauPb06(2400000.5, 50123.9999); vvd(an.zeta, -0.5092634016326478238e-3, 1e-12,"jauPb06", "bzeta"); vvd(an.z, -0.3602772060566044413e-3, 1e-12,"jauPb06", "bz"); vvd(an.theta, -0.3779735537167811177e-3, 1e-12,"jauPb06", "btheta"); } @Test public void t_pdp() /** ** ** Test jauPdp function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPdp, vvd ** ** This revision: 2008 November 30 */ { double a[] = new double[3], b[] = new double[3], adb; a[0] = 2.0; a[1] = 2.0; a[2] = 3.0; b[0] = 1.0; b[1] = 3.0; b[2] = 4.0; adb = jauPdp(a, b); vvd(adb, 20, 1e-12, "jauPdp", ""); } @Test public void t_pfw06() /** ** ** Test jauPfw06 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPfw06, vvd ** ** This revision: 2008 November 30 */ { FWPrecessionAngles fw = jauPfw06(2400000.5, 50123.9999); vvd(fw.gamb, -0.2243387670997995690e-5, 1e-16,"jauPfw06", "gamb"); vvd(fw.phib, 0.4091014602391312808, 1e-12,"jauPfw06", "phib"); vvd(fw.psib, -0.9501954178013031895e-3, 1e-14,"jauPfw06", "psib"); vvd(fw.epsa, 0.4091014316587367491, 1e-12,"jauPfw06", "epsa"); } @Test public void t_plan94() /** ** ** Test jauPlan94 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPlan94, VVD, VIV ** ** This revision: 2008 November 28 */ { double pv[][]; try { pv = jauPlan94(2400000.5, 1e6, 0); fail("did not throw all the illegal argument for bad planet number"); } catch (JSOFAIllegalParameter e) { // do nothing } try { pv = jauPlan94(2400000.5, 1e6, 10); fail("did not throw all the illegal argument for bad planet number"); } catch (JSOFAIllegalParameter e) { // do nothing } try { pv = jauPlan94(2400000.5, -320000, 3); vvd(pv[0][0], 0.9308038666832975759, 1e-11,"jauPlan94", "x 3"); vvd(pv[0][1], 0.3258319040261346000, 1e-11,"jauPlan94", "y 3"); vvd(pv[0][2], 0.1422794544481140560, 1e-11,"jauPlan94", "z 3"); vvd(pv[1][0], -0.6429458958255170006e-2, 1e-11,"jauPlan94", "xd 3"); vvd(pv[1][1], 0.1468570657704237764e-1, 1e-11,"jauPlan94", "yd 3"); vvd(pv[1][2], 0.6406996426270981189e-2, 1e-11,"jauPlan94", "zd 3"); pv = jauPlan94(2400000.5, 43999.9, 1); vvd(pv[0][0], 0.2945293959257430832, 1e-11,"jauPlan94", "x 4"); vvd(pv[0][1], -0.2452204176601049596, 1e-11,"jauPlan94", "y 4"); vvd(pv[0][2], -0.1615427700571978153, 1e-11,"jauPlan94", "z 4"); vvd(pv[1][0], 0.1413867871404614441e-1, 1e-11,"jauPlan94", "xd 4"); vvd(pv[1][1], 0.1946548301104706582e-1, 1e-11,"jauPlan94", "yd 4"); vvd(pv[1][2], 0.8929809783898904786e-2, 1e-11,"jauPlan94", "zd 4"); } catch (JSOFAIllegalParameter e) { fail("legal call threw exception"); } } @Test public void t_pmat00() /** ** ** Test jauPmat00 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPmat00, vvd ** ** This revision: 2008 November 29 */ { double rbp[][] = new double[3][3]; rbp = jauPmat00(2400000.5, 50123.9999); vvd(rbp[0][0], 0.9999995505175087260, 1e-12,"jauPmat00", "11"); vvd(rbp[0][1], 0.8695405883617884705e-3, 1e-14,"jauPmat00", "12"); vvd(rbp[0][2], 0.3779734722239007105e-3, 1e-14,"jauPmat00", "13"); vvd(rbp[1][0], -0.8695405990410863719e-3, 1e-14,"jauPmat00", "21"); vvd(rbp[1][1], 0.9999996219494925900, 1e-12,"jauPmat00", "22"); vvd(rbp[1][2], -0.1360775820404982209e-6, 1e-14,"jauPmat00", "23"); vvd(rbp[2][0], -0.3779734476558184991e-3, 1e-14,"jauPmat00", "31"); vvd(rbp[2][1], -0.1925857585832024058e-6, 1e-14,"jauPmat00", "32"); vvd(rbp[2][2], 0.9999999285680153377, 1e-12,"jauPmat00", "33"); } @Test public void t_pmat06() /** ** ** Test jauPmat06 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPmat06, vvd ** ** This revision: 2008 November 30 */ { double rbp[][] = new double[3][3]; rbp = jauPmat06(2400000.5, 50123.9999); vvd(rbp[0][0], 0.9999995505176007047, 1e-12,"jauPmat06", "11"); vvd(rbp[0][1], 0.8695404617348208406e-3, 1e-14,"jauPmat06", "12"); vvd(rbp[0][2], 0.3779735201865589104e-3, 1e-14,"jauPmat06", "13"); vvd(rbp[1][0], -0.8695404723772031414e-3, 1e-14,"jauPmat06", "21"); vvd(rbp[1][1], 0.9999996219496027161, 1e-12,"jauPmat06", "22"); vvd(rbp[1][2], -0.1361752497080270143e-6, 1e-14,"jauPmat06", "23"); vvd(rbp[2][0], -0.3779734957034089490e-3, 1e-14,"jauPmat06", "31"); vvd(rbp[2][1], -0.1924880847894457113e-6, 1e-14,"jauPmat06", "32"); vvd(rbp[2][2], 0.9999999285679971958, 1e-12,"jauPmat06", "33"); } @Test public void t_pmat76() /** ** ** Test jauPmat76 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPmat76, vvd ** ** This revision: 2008 November 28 */ { double rmatp[][] = new double[3][3]; rmatp = jauPmat76(2400000.5, 50123.9999); vvd(rmatp[0][0], 0.9999995504328350733, 1e-12,"jauPmat76", "11"); vvd(rmatp[0][1], 0.8696632209480960785e-3, 1e-14,"jauPmat76", "12"); vvd(rmatp[0][2], 0.3779153474959888345e-3, 1e-14,"jauPmat76", "13"); vvd(rmatp[1][0], -0.8696632209485112192e-3, 1e-14,"jauPmat76", "21"); vvd(rmatp[1][1], 0.9999996218428560614, 1e-12,"jauPmat76", "22"); vvd(rmatp[1][2], -0.1643284776111886407e-6, 1e-14,"jauPmat76", "23"); vvd(rmatp[2][0], -0.3779153474950335077e-3, 1e-14,"jauPmat76", "31"); vvd(rmatp[2][1], -0.1643306746147366896e-6, 1e-14,"jauPmat76", "32"); vvd(rmatp[2][2], 0.9999999285899790119, 1e-12,"jauPmat76", "33"); } @Test public void t_pm() /** ** ** Test jauPm function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPm, vvd ** ** This revision: 2008 November 30 */ { double p[] = new double[3], r; p[0] = 0.3; p[1] = 1.2; p[2] = -2.5; r = jauPm(p); vvd(r, 2.789265136196270604, 1e-12, "jauPm", ""); } @Test public void t_pmp() /** ** ** Test jauPmp function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPmp, vvd ** ** This revision: 2008 November 30 */ { double a[] = new double[3], b[] = new double[3], amb[] = new double[3]; a[0] = 2.0; a[1] = 2.0; a[2] = 3.0; b[0] = 1.0; b[1] = 3.0; b[2] = 4.0; amb = jauPmp(a, b); vvd(amb[0], 1.0, 1e-12, "jauPmp", "0"); vvd(amb[1], -1.0, 1e-12, "jauPmp", "1"); vvd(amb[2], -1.0, 1e-12, "jauPmp", "2"); } @Test public void t_pn() /** ** ** Test jauPn function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPn, vvd ** ** This revision: 2008 November 30 */ { double p[] = new double[3]; p[0] = 0.3; p[1] = 1.2; p[2] = -2.5; NormalizedVector mv = jauPn(p); vvd(mv.r, 2.789265136196270604, 1e-12, "jauPn", "r"); vvd(mv.u[0], 0.1075552109073112058, 1e-12, "jauPn", "u1"); vvd(mv.u[1], 0.4302208436292448232, 1e-12, "jauPn", "u2"); vvd(mv.u[2], -0.8962934242275933816, 1e-12, "jauPn", "u3"); } @Test public void t_pn00() /** ** ** Test jauPn00 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPn00, vvd ** ** This revision: 2008 November 28 */ { double dpsi, deps; dpsi = -0.9632552291149335877e-5; deps = 0.4063197106621141414e-4; PrecessionNutation pn = jauPn00(2400000.5, 53736.0, dpsi, deps); vvd(pn.epsa, 0.4090791789404229916, 1e-12, "jauPn00", "epsa"); vvd(pn.rb[0][0], 0.9999999999999942498, 1e-12,"jauPn00", "rb11"); vvd(pn.rb[0][1], -0.7078279744199196626e-7, 1e-18,"jauPn00", "rb12"); vvd(pn.rb[0][2], 0.8056217146976134152e-7, 1e-18,"jauPn00", "rb13"); vvd(pn.rb[1][0], 0.7078279477857337206e-7, 1e-18,"jauPn00", "rb21"); vvd(pn.rb[1][1], 0.9999999999999969484, 1e-12,"jauPn00", "rb22"); vvd(pn.rb[1][2], 0.3306041454222136517e-7, 1e-18,"jauPn00", "rb23"); vvd(pn.rb[2][0], -0.8056217380986972157e-7, 1e-18,"jauPn00", "rb31"); vvd(pn.rb[2][1], -0.3306040883980552500e-7, 1e-18,"jauPn00", "rb32"); vvd(pn.rb[2][2], 0.9999999999999962084, 1e-12,"jauPn00", "rb33"); vvd(pn.rp[0][0], 0.9999989300532289018, 1e-12,"jauPn00", "rp11"); vvd(pn.rp[0][1], -0.1341647226791824349e-2, 1e-14,"jauPn00", "rp12"); vvd(pn.rp[0][2], -0.5829880927190296547e-3, 1e-14,"jauPn00", "rp13"); vvd(pn.rp[1][0], 0.1341647231069759008e-2, 1e-14,"jauPn00", "rp21"); vvd(pn.rp[1][1], 0.9999990999908750433, 1e-12,"jauPn00", "rp22"); vvd(pn.rp[1][2], -0.3837444441583715468e-6, 1e-14,"jauPn00", "rp23"); vvd(pn.rp[2][0], 0.5829880828740957684e-3, 1e-14,"jauPn00", "rp31"); vvd(pn.rp[2][1], -0.3984203267708834759e-6, 1e-14,"jauPn00", "rp32"); vvd(pn.rp[2][2], 0.9999998300623538046, 1e-12,"jauPn00", "rp33"); vvd(pn.rbp[0][0], 0.9999989300052243993, 1e-12,"jauPn00", "rbp11"); vvd(pn.rbp[0][1], -0.1341717990239703727e-2, 1e-14,"jauPn00", "rbp12"); vvd(pn.rbp[0][2], -0.5829075749891684053e-3, 1e-14,"jauPn00", "rbp13"); vvd(pn.rbp[1][0], 0.1341718013831739992e-2, 1e-14,"jauPn00", "rbp21"); vvd(pn.rbp[1][1], 0.9999990998959191343, 1e-12,"jauPn00", "rbp22"); vvd(pn.rbp[1][2], -0.3505759733565421170e-6, 1e-14,"jauPn00", "rbp23"); vvd(pn.rbp[2][0], 0.5829075206857717883e-3, 1e-14,"jauPn00", "rbp31"); vvd(pn.rbp[2][1], -0.4315219955198608970e-6, 1e-14,"jauPn00", "rbp32"); vvd(pn.rbp[2][2], 0.9999998301093036269, 1e-12,"jauPn00", "rbp33"); vvd(pn.rn[0][0], 0.9999999999536069682, 1e-12,"jauPn00", "rn11"); vvd(pn.rn[0][1], 0.8837746144872140812e-5, 1e-16,"jauPn00", "rn12"); vvd(pn.rn[0][2], 0.3831488838252590008e-5, 1e-16,"jauPn00", "rn13"); vvd(pn.rn[1][0], -0.8837590456633197506e-5, 1e-16,"jauPn00", "rn21"); vvd(pn.rn[1][1], 0.9999999991354692733, 1e-12,"jauPn00", "rn22"); vvd(pn.rn[1][2], -0.4063198798559573702e-4, 1e-16,"jauPn00", "rn23"); vvd(pn.rn[2][0], -0.3831847930135328368e-5, 1e-16,"jauPn00", "rn31"); vvd(pn.rn[2][1], 0.4063195412258150427e-4, 1e-16,"jauPn00", "rn32"); vvd(pn.rn[2][2], 0.9999999991671806225, 1e-12,"jauPn00", "rn33"); vvd(pn.rbpn[0][0], 0.9999989440499982806, 1e-12,"jauPn00", "rbpn11"); vvd(pn.rbpn[0][1], -0.1332880253640848301e-2, 1e-14,"jauPn00", "rbpn12"); vvd(pn.rbpn[0][2], -0.5790760898731087295e-3, 1e-14,"jauPn00", "rbpn13"); vvd(pn.rbpn[1][0], 0.1332856746979948745e-2, 1e-14,"jauPn00", "rbpn21"); vvd(pn.rbpn[1][1], 0.9999991109064768883, 1e-12,"jauPn00", "rbpn22"); vvd(pn.rbpn[1][2], -0.4097740555723063806e-4, 1e-14,"jauPn00", "rbpn23"); vvd(pn.rbpn[2][0], 0.5791301929950205000e-3, 1e-14,"jauPn00", "rbpn31"); vvd(pn.rbpn[2][1], 0.4020553681373702931e-4, 1e-14,"jauPn00", "rbpn32"); vvd(pn.rbpn[2][2], 0.9999998314958529887, 1e-12,"jauPn00", "rbpn33"); } @Test public void t_pn00a() /** ** ** Test jauPn00a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPn00a, vvd ** ** This revision: 2008 November 28 */ { PrecessionNutation pn = jauPn00a(2400000.5, 53736.0); vvd(pn.nut.dpsi, -0.9630909107115518431e-5, 1e-12,"jauPn00a", "dpsi"); vvd(pn.nut.deps, 0.4063239174001678710e-4, 1e-12,"jauPn00a", "deps"); vvd(pn.epsa, 0.4090791789404229916, 1e-12, "jauPn00a", "epsa"); vvd(pn.rb[0][0], 0.9999999999999942498, 1e-12,"jauPn00a", "rb11"); vvd(pn.rb[0][1], -0.7078279744199196626e-7, 1e-16,"jauPn00a", "rb12"); vvd(pn.rb[0][2], 0.8056217146976134152e-7, 1e-16,"jauPn00a", "rb13"); vvd(pn.rb[1][0], 0.7078279477857337206e-7, 1e-16,"jauPn00a", "rb21"); vvd(pn.rb[1][1], 0.9999999999999969484, 1e-12,"jauPn00a", "rb22"); vvd(pn.rb[1][2], 0.3306041454222136517e-7, 1e-16,"jauPn00a", "rb23"); vvd(pn.rb[2][0], -0.8056217380986972157e-7, 1e-16,"jauPn00a", "rb31"); vvd(pn.rb[2][1], -0.3306040883980552500e-7, 1e-16,"jauPn00a", "rb32"); vvd(pn.rb[2][2], 0.9999999999999962084, 1e-12,"jauPn00a", "rb33"); vvd(pn.rp[0][0], 0.9999989300532289018, 1e-12,"jauPn00a", "rp11"); vvd(pn.rp[0][1], -0.1341647226791824349e-2, 1e-14,"jauPn00a", "rp12"); vvd(pn.rp[0][2], -0.5829880927190296547e-3, 1e-14,"jauPn00a", "rp13"); vvd(pn.rp[1][0], 0.1341647231069759008e-2, 1e-14,"jauPn00a", "rp21"); vvd(pn.rp[1][1], 0.9999990999908750433, 1e-12,"jauPn00a", "rp22"); vvd(pn.rp[1][2], -0.3837444441583715468e-6, 1e-14,"jauPn00a", "rp23"); vvd(pn.rp[2][0], 0.5829880828740957684e-3, 1e-14,"jauPn00a", "rp31"); vvd(pn.rp[2][1], -0.3984203267708834759e-6, 1e-14,"jauPn00a", "rp32"); vvd(pn.rp[2][2], 0.9999998300623538046, 1e-12,"jauPn00a", "rp33"); vvd(pn.rbp[0][0], 0.9999989300052243993, 1e-12,"jauPn00a", "rbp11"); vvd(pn.rbp[0][1], -0.1341717990239703727e-2, 1e-14,"jauPn00a", "rbp12"); vvd(pn.rbp[0][2], -0.5829075749891684053e-3, 1e-14,"jauPn00a", "rbp13"); vvd(pn.rbp[1][0], 0.1341718013831739992e-2, 1e-14,"jauPn00a", "rbp21"); vvd(pn.rbp[1][1], 0.9999990998959191343, 1e-12,"jauPn00a", "rbp22"); vvd(pn.rbp[1][2], -0.3505759733565421170e-6, 1e-14,"jauPn00a", "rbp23"); vvd(pn.rbp[2][0], 0.5829075206857717883e-3, 1e-14,"jauPn00a", "rbp31"); vvd(pn.rbp[2][1], -0.4315219955198608970e-6, 1e-14,"jauPn00a", "rbp32"); vvd(pn.rbp[2][2], 0.9999998301093036269, 1e-12,"jauPn00a", "rbp33"); vvd(pn.rn[0][0], 0.9999999999536227949, 1e-12,"jauPn00a", "rn11"); vvd(pn.rn[0][1], 0.8836238544090873336e-5, 1e-14,"jauPn00a", "rn12"); vvd(pn.rn[0][2], 0.3830835237722400669e-5, 1e-14,"jauPn00a", "rn13"); vvd(pn.rn[1][0], -0.8836082880798569274e-5, 1e-14,"jauPn00a", "rn21"); vvd(pn.rn[1][1], 0.9999999991354655028, 1e-12,"jauPn00a", "rn22"); vvd(pn.rn[1][2], -0.4063240865362499850e-4, 1e-14,"jauPn00a", "rn23"); vvd(pn.rn[2][0], -0.3831194272065995866e-5, 1e-14,"jauPn00a", "rn31"); vvd(pn.rn[2][1], 0.4063237480216291775e-4, 1e-14,"jauPn00a", "rn32"); vvd(pn.rn[2][2], 0.9999999991671660338, 1e-12,"jauPn00a", "rn33"); vvd(pn.rbpn[0][0], 0.9999989440476103435, 1e-12,"jauPn00a", "rbpn11"); vvd(pn.rbpn[0][1], -0.1332881761240011763e-2, 1e-14,"jauPn00a", "rbpn12"); vvd(pn.rbpn[0][2], -0.5790767434730085751e-3, 1e-14,"jauPn00a", "rbpn13"); vvd(pn.rbpn[1][0], 0.1332858254308954658e-2, 1e-14,"jauPn00a", "rbpn21"); vvd(pn.rbpn[1][1], 0.9999991109044505577, 1e-12,"jauPn00a", "rbpn22"); vvd(pn.rbpn[1][2], -0.4097782710396580452e-4, 1e-14,"jauPn00a", "rbpn23"); vvd(pn.rbpn[2][0], 0.5791308472168152904e-3, 1e-14,"jauPn00a", "rbpn31"); vvd(pn.rbpn[2][1], 0.4020595661591500259e-4, 1e-14,"jauPn00a", "rbpn32"); vvd(pn.rbpn[2][2], 0.9999998314954572304, 1e-12,"jauPn00a", "rbpn33"); } @Test public void t_pn00b() /** ** ** Test jauPn00b function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPn00b, vvd ** ** This revision: 2008 November 28 */ { PrecessionNutation pn = jauPn00b(2400000.5, 53736.0); vvd(pn.nut.dpsi, -0.9632552291148362783e-5, 1e-12,"jauPn00b", "dpsi"); vvd(pn.nut.deps, 0.4063197106621159367e-4, 1e-12,"jauPn00b", "deps"); vvd(pn.epsa, 0.4090791789404229916, 1e-12, "jauPn00b", "epsa"); vvd(pn.rb[0][0], 0.9999999999999942498, 1e-12,"jauPn00b", "rb11"); vvd(pn.rb[0][1], -0.7078279744199196626e-7, 1e-16,"jauPn00b", "rb12"); vvd(pn.rb[0][2], 0.8056217146976134152e-7, 1e-16,"jauPn00b", "rb13"); vvd(pn.rb[1][0], 0.7078279477857337206e-7, 1e-16,"jauPn00b", "rb21"); vvd(pn.rb[1][1], 0.9999999999999969484, 1e-12,"jauPn00b", "rb22"); vvd(pn.rb[1][2], 0.3306041454222136517e-7, 1e-16,"jauPn00b", "rb23"); vvd(pn.rb[2][0], -0.8056217380986972157e-7, 1e-16,"jauPn00b", "rb31"); vvd(pn.rb[2][1], -0.3306040883980552500e-7, 1e-16,"jauPn00b", "rb32"); vvd(pn.rb[2][2], 0.9999999999999962084, 1e-12,"jauPn00b", "rb33"); vvd(pn.rp[0][0], 0.9999989300532289018, 1e-12,"jauPn00b", "rp11"); vvd(pn.rp[0][1], -0.1341647226791824349e-2, 1e-14,"jauPn00b", "rp12"); vvd(pn.rp[0][2], -0.5829880927190296547e-3, 1e-14,"jauPn00b", "rp13"); vvd(pn.rp[1][0], 0.1341647231069759008e-2, 1e-14,"jauPn00b", "rp21"); vvd(pn.rp[1][1], 0.9999990999908750433, 1e-12,"jauPn00b", "rp22"); vvd(pn.rp[1][2], -0.3837444441583715468e-6, 1e-14,"jauPn00b", "rp23"); vvd(pn.rp[2][0], 0.5829880828740957684e-3, 1e-14,"jauPn00b", "rp31"); vvd(pn.rp[2][1], -0.3984203267708834759e-6, 1e-14,"jauPn00b", "rp32"); vvd(pn.rp[2][2], 0.9999998300623538046, 1e-12,"jauPn00b", "rp33"); vvd(pn.rbp[0][0], 0.9999989300052243993, 1e-12,"jauPn00b", "rbp11"); vvd(pn.rbp[0][1], -0.1341717990239703727e-2, 1e-14,"jauPn00b", "rbp12"); vvd(pn.rbp[0][2], -0.5829075749891684053e-3, 1e-14,"jauPn00b", "rbp13"); vvd(pn.rbp[1][0], 0.1341718013831739992e-2, 1e-14,"jauPn00b", "rbp21"); vvd(pn.rbp[1][1], 0.9999990998959191343, 1e-12,"jauPn00b", "rbp22"); vvd(pn.rbp[1][2], -0.3505759733565421170e-6, 1e-14,"jauPn00b", "rbp23"); vvd(pn.rbp[2][0], 0.5829075206857717883e-3, 1e-14,"jauPn00b", "rbp31"); vvd(pn.rbp[2][1], -0.4315219955198608970e-6, 1e-14,"jauPn00b", "rbp32"); vvd(pn.rbp[2][2], 0.9999998301093036269, 1e-12,"jauPn00b", "rbp33"); vvd(pn.rn[0][0], 0.9999999999536069682, 1e-12,"jauPn00b", "rn11"); vvd(pn.rn[0][1], 0.8837746144871248011e-5, 1e-14,"jauPn00b", "rn12"); vvd(pn.rn[0][2], 0.3831488838252202945e-5, 1e-14,"jauPn00b", "rn13"); vvd(pn.rn[1][0], -0.8837590456632304720e-5, 1e-14,"jauPn00b", "rn21"); vvd(pn.rn[1][1], 0.9999999991354692733, 1e-12,"jauPn00b", "rn22"); vvd(pn.rn[1][2], -0.4063198798559591654e-4, 1e-14,"jauPn00b", "rn23"); vvd(pn.rn[2][0], -0.3831847930134941271e-5, 1e-14,"jauPn00b", "rn31"); vvd(pn.rn[2][1], 0.4063195412258168380e-4, 1e-14,"jauPn00b", "rn32"); vvd(pn.rn[2][2], 0.9999999991671806225, 1e-12,"jauPn00b", "rn33"); vvd(pn.rbpn[0][0], 0.9999989440499982806, 1e-12,"jauPn00b", "rbpn11"); vvd(pn.rbpn[0][1], -0.1332880253640849194e-2, 1e-14,"jauPn00b", "rbpn12"); vvd(pn.rbpn[0][2], -0.5790760898731091166e-3, 1e-14,"jauPn00b", "rbpn13"); vvd(pn.rbpn[1][0], 0.1332856746979949638e-2, 1e-14,"jauPn00b", "rbpn21"); vvd(pn.rbpn[1][1], 0.9999991109064768883, 1e-12,"jauPn00b", "rbpn22"); vvd(pn.rbpn[1][2], -0.4097740555723081811e-4, 1e-14,"jauPn00b", "rbpn23"); vvd(pn.rbpn[2][0], 0.5791301929950208873e-3, 1e-14,"jauPn00b", "rbpn31"); vvd(pn.rbpn[2][1], 0.4020553681373720832e-4, 1e-14,"jauPn00b", "rbpn32"); vvd(pn.rbpn[2][2], 0.9999998314958529887, 1e-12,"jauPn00b", "rbpn33"); } @Test public void t_pn06a() /** ** ** Test jauPn06a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPn06a, vvd ** ** This revision: 2008 November 28 */ { PrecessionNutation pn = jauPn06a(2400000.5, 53736.0); vvd(pn.nut.dpsi, -0.9630912025820308797e-5, 1e-12,"jauPn06a", "dpsi"); vvd(pn.nut.deps, 0.4063238496887249798e-4, 1e-12,"jauPn06a", "deps"); vvd(pn.epsa, 0.4090789763356509926, 1e-12, "jauPn06a", "epsa"); vvd(pn.rb[0][0], 0.9999999999999942497, 1e-12,"jauPn06a", "rb11"); vvd(pn.rb[0][1], -0.7078368960971557145e-7, 1e-14,"jauPn06a", "rb12"); vvd(pn.rb[0][2], 0.8056213977613185606e-7, 1e-14,"jauPn06a", "rb13"); vvd(pn.rb[1][0], 0.7078368694637674333e-7, 1e-14,"jauPn06a", "rb21"); vvd(pn.rb[1][1], 0.9999999999999969484, 1e-12,"jauPn06a", "rb22"); vvd(pn.rb[1][2], 0.3305943742989134124e-7, 1e-14,"jauPn06a", "rb23"); vvd(pn.rb[2][0], -0.8056214211620056792e-7, 1e-14,"jauPn06a", "rb31"); vvd(pn.rb[2][1], -0.3305943172740586950e-7, 1e-14,"jauPn06a", "rb32"); vvd(pn.rb[2][2], 0.9999999999999962084, 1e-12,"jauPn06a", "rb33"); vvd(pn.rp[0][0], 0.9999989300536854831, 1e-12,"jauPn06a", "rp11"); vvd(pn.rp[0][1], -0.1341646886204443795e-2, 1e-14,"jauPn06a", "rp12"); vvd(pn.rp[0][2], -0.5829880933488627759e-3, 1e-14,"jauPn06a", "rp13"); vvd(pn.rp[1][0], 0.1341646890569782183e-2, 1e-14,"jauPn06a", "rp21"); vvd(pn.rp[1][1], 0.9999990999913319321, 1e-12,"jauPn06a", "rp22"); vvd(pn.rp[1][2], -0.3835944216374477457e-6, 1e-14,"jauPn06a", "rp23"); vvd(pn.rp[2][0], 0.5829880833027867368e-3, 1e-14,"jauPn06a", "rp31"); vvd(pn.rp[2][1], -0.3985701514686976112e-6, 1e-14,"jauPn06a", "rp32"); vvd(pn.rp[2][2], 0.9999998300623534950, 1e-12,"jauPn06a", "rp33"); vvd(pn.rbp[0][0], 0.9999989300056797893, 1e-12,"jauPn06a", "rbp11"); vvd(pn.rbp[0][1], -0.1341717650545059598e-2, 1e-14,"jauPn06a", "rbp12"); vvd(pn.rbp[0][2], -0.5829075756493728856e-3, 1e-14,"jauPn06a", "rbp13"); vvd(pn.rbp[1][0], 0.1341717674223918101e-2, 1e-14,"jauPn06a", "rbp21"); vvd(pn.rbp[1][1], 0.9999990998963748448, 1e-12,"jauPn06a", "rbp22"); vvd(pn.rbp[1][2], -0.3504269280170069029e-6, 1e-14,"jauPn06a", "rbp23"); vvd(pn.rbp[2][0], 0.5829075211461454599e-3, 1e-14,"jauPn06a", "rbp31"); vvd(pn.rbp[2][1], -0.4316708436255949093e-6, 1e-14,"jauPn06a", "rbp32"); vvd(pn.rbp[2][2], 0.9999998301093032943, 1e-12,"jauPn06a", "rbp33"); vvd(pn.rn[0][0], 0.9999999999536227668, 1e-12,"jauPn06a", "rn11"); vvd(pn.rn[0][1], 0.8836241998111535233e-5, 1e-14,"jauPn06a", "rn12"); vvd(pn.rn[0][2], 0.3830834608415287707e-5, 1e-14,"jauPn06a", "rn13"); vvd(pn.rn[1][0], -0.8836086334870740138e-5, 1e-14,"jauPn06a", "rn21"); vvd(pn.rn[1][1], 0.9999999991354657474, 1e-12,"jauPn06a", "rn22"); vvd(pn.rn[1][2], -0.4063240188248455065e-4, 1e-14,"jauPn06a", "rn23"); vvd(pn.rn[2][0], -0.3831193642839398128e-5, 1e-14,"jauPn06a", "rn31"); vvd(pn.rn[2][1], 0.4063236803101479770e-4, 1e-14,"jauPn06a", "rn32"); vvd(pn.rn[2][2], 0.9999999991671663114, 1e-12,"jauPn06a", "rn33"); vvd(pn.rbpn[0][0], 0.9999989440480669738, 1e-12,"jauPn06a", "rbpn11"); vvd(pn.rbpn[0][1], -0.1332881418091915973e-2, 1e-14,"jauPn06a", "rbpn12"); vvd(pn.rbpn[0][2], -0.5790767447612042565e-3, 1e-14,"jauPn06a", "rbpn13"); vvd(pn.rbpn[1][0], 0.1332857911250989133e-2, 1e-14,"jauPn06a", "rbpn21"); vvd(pn.rbpn[1][1], 0.9999991109049141908, 1e-12,"jauPn06a", "rbpn22"); vvd(pn.rbpn[1][2], -0.4097767128546784878e-4, 1e-14,"jauPn06a", "rbpn23"); vvd(pn.rbpn[2][0], 0.5791308482835292617e-3, 1e-14,"jauPn06a", "rbpn31"); vvd(pn.rbpn[2][1], 0.4020580099454020310e-4, 1e-14,"jauPn06a", "rbpn32"); vvd(pn.rbpn[2][2], 0.9999998314954628695, 1e-12,"jauPn06a", "rbpn33"); } @Test public void t_pn06() /** ** ** Test jauPn06 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPn06, vvd ** ** This revision: 2008 November 28 */ { double dpsi, deps; dpsi = -0.9632552291149335877e-5; deps = 0.4063197106621141414e-4; PrecessionNutation pn = jauPn06(2400000.5, 53736.0, dpsi, deps); vvd(pn.epsa, 0.4090789763356509926, 1e-12, "jauPn06", "epsa"); vvd(pn.rb[0][0], 0.9999999999999942497, 1e-12,"jauPn06", "rb11"); vvd(pn.rb[0][1], -0.7078368960971557145e-7, 1e-14,"jauPn06", "rb12"); vvd(pn.rb[0][2], 0.8056213977613185606e-7, 1e-14,"jauPn06", "rb13"); vvd(pn.rb[1][0], 0.7078368694637674333e-7, 1e-14,"jauPn06", "rb21"); vvd(pn.rb[1][1], 0.9999999999999969484, 1e-12,"jauPn06", "rb22"); vvd(pn.rb[1][2], 0.3305943742989134124e-7, 1e-14,"jauPn06", "rb23"); vvd(pn.rb[2][0], -0.8056214211620056792e-7, 1e-14,"jauPn06", "rb31"); vvd(pn.rb[2][1], -0.3305943172740586950e-7, 1e-14,"jauPn06", "rb32"); vvd(pn.rb[2][2], 0.9999999999999962084, 1e-12,"jauPn06", "rb33"); vvd(pn.rp[0][0], 0.9999989300536854831, 1e-12,"jauPn06", "rp11"); vvd(pn.rp[0][1], -0.1341646886204443795e-2, 1e-14,"jauPn06", "rp12"); vvd(pn.rp[0][2], -0.5829880933488627759e-3, 1e-14,"jauPn06", "rp13"); vvd(pn.rp[1][0], 0.1341646890569782183e-2, 1e-14,"jauPn06", "rp21"); vvd(pn.rp[1][1], 0.9999990999913319321, 1e-12,"jauPn06", "rp22"); vvd(pn.rp[1][2], -0.3835944216374477457e-6, 1e-14,"jauPn06", "rp23"); vvd(pn.rp[2][0], 0.5829880833027867368e-3, 1e-14,"jauPn06", "rp31"); vvd(pn.rp[2][1], -0.3985701514686976112e-6, 1e-14,"jauPn06", "rp32"); vvd(pn.rp[2][2], 0.9999998300623534950, 1e-12,"jauPn06", "rp33"); vvd(pn.rbp[0][0], 0.9999989300056797893, 1e-12,"jauPn06", "rbp11"); vvd(pn.rbp[0][1], -0.1341717650545059598e-2, 1e-14,"jauPn06", "rbp12"); vvd(pn.rbp[0][2], -0.5829075756493728856e-3, 1e-14,"jauPn06", "rbp13"); vvd(pn.rbp[1][0], 0.1341717674223918101e-2, 1e-14,"jauPn06", "rbp21"); vvd(pn.rbp[1][1], 0.9999990998963748448, 1e-12,"jauPn06", "rbp22"); vvd(pn.rbp[1][2], -0.3504269280170069029e-6, 1e-14,"jauPn06", "rbp23"); vvd(pn.rbp[2][0], 0.5829075211461454599e-3, 1e-14,"jauPn06", "rbp31"); vvd(pn.rbp[2][1], -0.4316708436255949093e-6, 1e-14,"jauPn06", "rbp32"); vvd(pn.rbp[2][2], 0.9999998301093032943, 1e-12,"jauPn06", "rbp33"); vvd(pn.rn[0][0], 0.9999999999536069682, 1e-12,"jauPn06", "rn11"); vvd(pn.rn[0][1], 0.8837746921149881914e-5, 1e-14,"jauPn06", "rn12"); vvd(pn.rn[0][2], 0.3831487047682968703e-5, 1e-14,"jauPn06", "rn13"); vvd(pn.rn[1][0], -0.8837591232983692340e-5, 1e-14,"jauPn06", "rn21"); vvd(pn.rn[1][1], 0.9999999991354692664, 1e-12,"jauPn06", "rn22"); vvd(pn.rn[1][2], -0.4063198798558931215e-4, 1e-14,"jauPn06", "rn23"); vvd(pn.rn[2][0], -0.3831846139597250235e-5, 1e-14,"jauPn06", "rn31"); vvd(pn.rn[2][1], 0.4063195412258792914e-4, 1e-14,"jauPn06", "rn32"); vvd(pn.rn[2][2], 0.9999999991671806293, 1e-12,"jauPn06", "rn33"); vvd(pn.rbpn[0][0], 0.9999989440504506688, 1e-12,"jauPn06", "rbpn11"); vvd(pn.rbpn[0][1], -0.1332879913170492655e-2, 1e-14,"jauPn06", "rbpn12"); vvd(pn.rbpn[0][2], -0.5790760923225655753e-3, 1e-14,"jauPn06", "rbpn13"); vvd(pn.rbpn[1][0], 0.1332856406595754748e-2, 1e-14,"jauPn06", "rbpn21"); vvd(pn.rbpn[1][1], 0.9999991109069366795, 1e-12,"jauPn06", "rbpn22"); vvd(pn.rbpn[1][2], -0.4097725651142641812e-4, 1e-14,"jauPn06", "rbpn23"); vvd(pn.rbpn[2][0], 0.5791301952321296716e-3, 1e-14,"jauPn06", "rbpn31"); vvd(pn.rbpn[2][1], 0.4020538796195230577e-4, 1e-14,"jauPn06", "rbpn32"); vvd(pn.rbpn[2][2], 0.9999998314958576778, 1e-12,"jauPn06", "rbpn33"); } @Test public void t_pnm00a() /** ** ** Test jauPnm00a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPnm00a, vvd ** ** This revision: 2008 November 28 */ { double rbpn[][] = new double[3][3]; rbpn = jauPnm00a(2400000.5, 50123.9999); vvd(rbpn[0][0], 0.9999995832793134257, 1e-12,"jauPnm00a", "11"); vvd(rbpn[0][1], 0.8372384254137809439e-3, 1e-14,"jauPnm00a", "12"); vvd(rbpn[0][2], 0.3639684306407150645e-3, 1e-14,"jauPnm00a", "13"); vvd(rbpn[1][0], -0.8372535226570394543e-3, 1e-14,"jauPnm00a", "21"); vvd(rbpn[1][1], 0.9999996486491582471, 1e-12,"jauPnm00a", "22"); vvd(rbpn[1][2], 0.4132915262664072381e-4, 1e-14,"jauPnm00a", "23"); vvd(rbpn[2][0], -0.3639337004054317729e-3, 1e-14,"jauPnm00a", "31"); vvd(rbpn[2][1], -0.4163386925461775873e-4, 1e-14,"jauPnm00a", "32"); vvd(rbpn[2][2], 0.9999999329094390695, 1e-12,"jauPnm00a", "33"); } @Test public void t_pnm00b() /** ** ** Test jauPnm00b function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPnm00b, vvd ** ** This revision: 2008 November 28 */ { double rbpn[][] = new double[3][3]; rbpn = jauPnm00b(2400000.5, 50123.9999); vvd(rbpn[0][0], 0.9999995832776208280, 1e-12,"jauPnm00b", "11"); vvd(rbpn[0][1], 0.8372401264429654837e-3, 1e-14,"jauPnm00b", "12"); vvd(rbpn[0][2], 0.3639691681450271771e-3, 1e-14,"jauPnm00b", "13"); vvd(rbpn[1][0], -0.8372552234147137424e-3, 1e-14,"jauPnm00b", "21"); vvd(rbpn[1][1], 0.9999996486477686123, 1e-12,"jauPnm00b", "22"); vvd(rbpn[1][2], 0.4132832190946052890e-4, 1e-14,"jauPnm00b", "23"); vvd(rbpn[2][0], -0.3639344385341866407e-3, 1e-14,"jauPnm00b", "31"); vvd(rbpn[2][1], -0.4163303977421522785e-4, 1e-14,"jauPnm00b", "32"); vvd(rbpn[2][2], 0.9999999329092049734, 1e-12,"jauPnm00b", "33"); } @Test public void t_pnm06a() /** ** ** Test jauPnm06a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPnm06a, vvd ** ** This revision: 2008 November 28 */ { double rbpn[][] = new double[3][3]; rbpn = jauPnm06a(2400000.5, 50123.9999); vvd(rbpn[0][0], 0.9999995832794205484, 1e-12,"jauPnm06a", "11"); vvd(rbpn[0][1], 0.8372382772630962111e-3, 1e-14,"jauPnm06a", "12"); vvd(rbpn[0][2], 0.3639684771140623099e-3, 1e-14,"jauPnm06a", "13"); vvd(rbpn[1][0], -0.8372533744743683605e-3, 1e-14,"jauPnm06a", "21"); vvd(rbpn[1][1], 0.9999996486492861646, 1e-12,"jauPnm06a", "22"); vvd(rbpn[1][2], 0.4132905944611019498e-4, 1e-14,"jauPnm06a", "23"); vvd(rbpn[2][0], -0.3639337469629464969e-3, 1e-14,"jauPnm06a", "31"); vvd(rbpn[2][1], -0.4163377605910663999e-4, 1e-14,"jauPnm06a", "32"); vvd(rbpn[2][2], 0.9999999329094260057, 1e-12,"jauPnm06a", "33"); } @Test public void t_pnm80() /** ** ** Test jauPnm80 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPnm80, vvd ** ** This revision: 2008 November 28 */ { double rmatpn[][] = new double[3][3]; rmatpn = jauPnm80(2400000.5, 50123.9999); vvd(rmatpn[0][0], 0.9999995831934611169, 1e-12,"jauPnm80", "11"); vvd(rmatpn[0][1], 0.8373654045728124011e-3, 1e-14,"jauPnm80", "12"); vvd(rmatpn[0][2], 0.3639121916933106191e-3, 1e-14,"jauPnm80", "13"); vvd(rmatpn[1][0], -0.8373804896118301316e-3, 1e-14,"jauPnm80", "21"); vvd(rmatpn[1][1], 0.9999996485439674092, 1e-12,"jauPnm80", "22"); vvd(rmatpn[1][2], 0.4130202510421549752e-4, 1e-14,"jauPnm80", "23"); vvd(rmatpn[2][0], -0.3638774789072144473e-3, 1e-14,"jauPnm80", "31"); vvd(rmatpn[2][1], -0.4160674085851722359e-4, 1e-14,"jauPnm80", "32"); vvd(rmatpn[2][2], 0.9999999329310274805, 1e-12,"jauPnm80", "33"); } @Test public void t_pom00() /** ** ** Test jauPom00 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPom00, vvd ** ** This revision: 2008 November 28 */ { double xp, yp, sp, rpom[][] = new double[3][3]; xp = 2.55060238e-7; yp = 1.860359247e-6; sp = -0.1367174580728891460e-10; rpom = jauPom00(xp, yp, sp); vvd(rpom[0][0], 0.9999999999999674721, 1e-12,"jauPom00", "11"); vvd(rpom[0][1], -0.1367174580728846989e-10, 1e-16,"jauPom00", "12"); vvd(rpom[0][2], 0.2550602379999972345e-6, 1e-16,"jauPom00", "13"); vvd(rpom[1][0], 0.1414624947957029801e-10, 1e-16,"jauPom00", "21"); vvd(rpom[1][1], 0.9999999999982695317, 1e-12,"jauPom00", "22"); vvd(rpom[1][2], -0.1860359246998866389e-5, 1e-16,"jauPom00", "23"); vvd(rpom[2][0], -0.2550602379741215021e-6, 1e-16,"jauPom00", "31"); vvd(rpom[2][1], 0.1860359247002414021e-5, 1e-16,"jauPom00", "32"); vvd(rpom[2][2], 0.9999999999982370039, 1e-12,"jauPom00", "33"); double vec[]= {0,0,1}; double vec2[] = jauRxp(rpom,vec); for (double d : vec2) { System.out.println(d); } } @Test public void t_ppp() /** ** ** Test jauPpp function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPpp, vvd ** ** This revision: 2008 November 30 */ { double a[] = new double[3], b[] = new double[3], apb[] = new double[3]; a[0] = 2.0; a[1] = 2.0; a[2] = 3.0; b[0] = 1.0; b[1] = 3.0; b[2] = 4.0; apb = jauPpp(a, b); vvd(apb[0], 3.0, 1e-12, "jauPpp", "0"); vvd(apb[1], 5.0, 1e-12, "jauPpp", "1"); vvd(apb[2], 7.0, 1e-12, "jauPpp", "2"); } @Test public void t_ppsp() /** ** ** Test jauPpsp function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPpsp, vvd ** ** This revision: 2008 November 30 */ { double a[] = new double[3], s, b[] = new double[3], apsb[] = new double[3]; a[0] = 2.0; a[1] = 2.0; a[2] = 3.0; s = 5.0; b[0] = 1.0; b[1] = 3.0; b[2] = 4.0; apsb = jauPpsp(a, s, b); vvd(apsb[0], 7.0, 1e-12, "jauPpsp", "0"); vvd(apsb[1], 17.0, 1e-12, "jauPpsp", "1"); vvd(apsb[2], 23.0, 1e-12, "jauPpsp", "2"); } @Test public void t_pr00() /** ** ** Test jauPr00 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPr00, vvd ** ** This revision: 2008 November 28 */ { PrecessionDeltaTerms nut = jauPr00(2400000.5, 53736); vvd(nut.dpsipr, -0.8716465172668347629e-7, 1e-22,"jauPr00", "dpsipr"); vvd(nut.depspr, -0.7342018386722813087e-8, 1e-22,"jauPr00", "depspr"); } @Test public void t_prec76() /** ** ** Test jauPrec76 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPrec76, vvd ** ** This revision: 2008 November 28 */ { double ep01, ep02, ep11, ep12; ep01 = 2400000.5; ep02 = 33282.0; ep11 = 2400000.5; ep12 = 51544.0; EulerAngles an = jauPrec76(ep01, ep02, ep11, ep12); vvd(an.zeta, 0.5588961642000161243e-2, 1e-12,"jauPrec76", "zeta"); vvd(an.z, 0.5589922365870680624e-2, 1e-12,"jauPrec76", "z"); vvd(an.theta, 0.4858945471687296760e-2, 1e-12,"jauPrec76", "theta"); } @Test public void t_pv2p() /** ** ** Test jauPv2p function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPv2p, vvd ** ** This revision: 2008 November 30 */ { double pv[][] = new double[2][3], p[] = new double[3]; pv[0][0] = 0.3; pv[0][1] = 1.2; pv[0][2] = -2.5; pv[1][0] = -0.5; pv[1][1] = 3.1; pv[1][2] = 0.9; p = jauPv2p(pv); vvd(p[0], 0.3, 0.0, "jauPv2p", "1"); vvd(p[1], 1.2, 0.0, "jauPv2p", "2"); vvd(p[2], -2.5, 0.0, "jauPv2p", "3"); } @Test public void t_pv2s() /** ** ** Test jauPv2s function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPv2s, vvd ** ** This revision: 2008 November 28 */ { double pv[][] = new double[2][3]; pv[0][0] = -0.4514964673880165; pv[0][1] = 0.03093394277342585; pv[0][2] = 0.05594668105108779; pv[1][0] = 1.292270850663260e-5; pv[1][1] = 2.652814182060692e-6; pv[1][2] = 2.568431853930293e-6; SphericalPositionVelocity pvs = jauPv2s(pv); vvd(pvs.pos.theta, 3.073185307179586515, 1e-12, "jauPv2s", "theta"); vvd(pvs.pos.phi, 0.1229999999999999992, 1e-12, "jauPv2s", "phi"); vvd(pvs.pos.r, 0.4559999999999999757, 1e-12, "jauPv2s", "r"); vvd(pvs.vel.theta, -0.7800000000000000364e-5, 1e-16, "jauPv2s", "td"); vvd(pvs.vel.phi, 0.9010000000000001639e-5, 1e-16, "jauPv2s", "pd"); vvd(pvs.vel.r, -0.1229999999999999832e-4, 1e-16, "jauPv2s", "rd"); } @Test public void t_pvdpv() /** ** ** Test jauPvdpv function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPvdpv, vvd ** ** This revision: 2008 November 30 */ { double a[][] = new double[2][3], b[][] = new double[2][3], adb[] = new double[2]; a[0][0] = 2.0; a[0][1] = 2.0; a[0][2] = 3.0; a[1][0] = 6.0; a[1][1] = 0.0; a[1][2] = 4.0; b[0][0] = 1.0; b[0][1] = 3.0; b[0][2] = 4.0; b[1][0] = 0.0; b[1][1] = 2.0; b[1][2] = 8.0; adb = jauPvdpv(a, b); vvd(adb[0], 20.0, 1e-12, "jauPvdpv", "1"); vvd(adb[1], 50.0, 1e-12, "jauPvdpv", "2"); } @Test public void t_pvm() /** ** ** Test jauPvm function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPvm, vvd ** ** This revision: 2008 May 25 */ { double pv[][] = new double[2][3]; pv[0][0] = 0.3; pv[0][1] = 1.2; pv[0][2] = -2.5; pv[1][0] = 0.45; pv[1][1] = -0.25; pv[1][2] = 1.1; PVModulus ret = jauPvm(pv); vvd(ret.r, 2.789265136196270604, 1e-12, "jauPvm", "r"); vvd(ret.s, 1.214495780149111922, 1e-12, "jauPvm", "s"); } @Test public void t_pvmpv() /** ** ** Test jauPvmpv function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPvmpv, vvd ** ** This revision: 2008 November 30 */ { double a[][] = new double[2][3], b[][] = new double[2][3], amb[][] = new double[2][3]; a[0][0] = 2.0; a[0][1] = 2.0; a[0][2] = 3.0; a[1][0] = 5.0; a[1][1] = 6.0; a[1][2] = 3.0; b[0][0] = 1.0; b[0][1] = 3.0; b[0][2] = 4.0; b[1][0] = 3.0; b[1][1] = 2.0; b[1][2] = 1.0; amb = jauPvmpv(a, b); vvd(amb[0][0], 1.0, 1e-12, "jauPvmpv", "11"); vvd(amb[0][1], -1.0, 1e-12, "jauPvmpv", "21"); vvd(amb[0][2], -1.0, 1e-12, "jauPvmpv", "31"); vvd(amb[1][0], 2.0, 1e-12, "jauPvmpv", "12"); vvd(amb[1][1], 4.0, 1e-12, "jauPvmpv", "22"); vvd(amb[1][2], 2.0, 1e-12, "jauPvmpv", "32"); } @Test public void t_pvppv() /** ** ** Test jauPvppv function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPvppv, vvd ** ** This revision: 2008 November 30 */ { double a[][] = new double[2][3], b[][] = new double[2][3], apb[][] = new double[2][3]; a[0][0] = 2.0; a[0][1] = 2.0; a[0][2] = 3.0; a[1][0] = 5.0; a[1][1] = 6.0; a[1][2] = 3.0; b[0][0] = 1.0; b[0][1] = 3.0; b[0][2] = 4.0; b[1][0] = 3.0; b[1][1] = 2.0; b[1][2] = 1.0; apb = jauPvppv(a, b); vvd(apb[0][0], 3.0, 1e-12, "jauPvppv", "p1"); vvd(apb[0][1], 5.0, 1e-12, "jauPvppv", "p2"); vvd(apb[0][2], 7.0, 1e-12, "jauPvppv", "p3"); vvd(apb[1][0], 8.0, 1e-12, "jauPvppv", "v1"); vvd(apb[1][1], 8.0, 1e-12, "jauPvppv", "v2"); vvd(apb[1][2], 4.0, 1e-12, "jauPvppv", "v3"); } @Test public void t_pvstar() /** ** ** Test jauPvstar function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPvstar, vvd, viv ** ** This revision: 2009 November 6 */ { double pv[][] = new double[2][3]; pv[0][0] = 126668.5912743160601; pv[0][1] = 2136.792716839935195; pv[0][2] = -245251.2339876830091; pv[1][0] = -0.4051854035740712739e-2; pv[1][1] = -0.6253919754866173866e-2; pv[1][2] = 0.1189353719774107189e-1; try { CatalogCoords cat = jauPvstar(pv); vvd(cat.pos.alpha, 0.1686756e-1, 1e-12, "jauPvstar", "ra"); vvd(cat.pos.delta, -1.093989828, 1e-12, "jauPvstar", "dec"); vvd(cat.pm.alpha, -0.1783235160000472788e-4, 1e-16, "jauPvstar", "pmr"); vvd(cat.pm.delta, 0.2336024047000619347e-5, 1e-16, "jauPvstar", "pmd"); vvd(cat.px, 0.74723, 1e-12, "jauPvstar", "px"); vvd(cat.rv, -21.60000010107306010, 1e-11, "jauPvstar", "rv"); } catch (JSOFAInternalError e) { fail(" internal exception"); } } @Test public void t_pvu() /** ** ** Test jauPvu function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPvu, vvd ** ** This revision: 2008 November 30 */ { double pv[][] = new double[2][3], upv[][] = new double[2][3]; pv[0][0] = 126668.5912743160734; pv[0][1] = 2136.792716839935565; pv[0][2] = -245251.2339876830229; pv[1][0] = -0.4051854035740713039e-2; pv[1][1] = -0.6253919754866175788e-2; pv[1][2] = 0.1189353719774107615e-1; upv = jauPvu(2920.0, pv); vvd(upv[0][0], 126656.7598605317105, 1e-6,"jauPvu", "p1"); vvd(upv[0][1], 2118.531271155726332, 1e-8,"jauPvu", "p2"); vvd(upv[0][2], -245216.5048590656190, 1e-6,"jauPvu", "p3"); vvd(upv[1][0], -0.4051854035740713039e-2, 1e-12,"jauPvu", "v1"); vvd(upv[1][1], -0.6253919754866175788e-2, 1e-12,"jauPvu", "v2"); vvd(upv[1][2], 0.1189353719774107615e-1, 1e-12,"jauPvu", "v3"); } @Test public void t_pvup() /** ** ** Test jauPvup function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPvup, vvd ** ** This revision: 2008 November 30 */ { double pv[][] = new double[2][3], p[] = new double[3]; pv[0][0] = 126668.5912743160734; pv[0][1] = 2136.792716839935565; pv[0][2] = -245251.2339876830229; pv[1][0] = -0.4051854035740713039e-2; pv[1][1] = -0.6253919754866175788e-2; pv[1][2] = 0.1189353719774107615e-1; p = jauPvup(2920.0, pv); vvd(p[0], 126656.7598605317105, 1e-12, "jauPvup", "1"); vvd(p[1], 2118.531271155726332, 1e-12, "jauPvup", "2"); vvd(p[2], -245216.5048590656190, 1e-12, "jauPvup", "3"); } @Test public void t_pvxpv() /** ** ** Test jauPvxpv function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPvxpv, vvd ** ** This revision: 2008 November 30 */ { double a[][] = new double[2][3], b[][] = new double[2][3], axb[][] = new double[2][3]; a[0][0] = 2.0; a[0][1] = 2.0; a[0][2] = 3.0; a[1][0] = 6.0; a[1][1] = 0.0; a[1][2] = 4.0; b[0][0] = 1.0; b[0][1] = 3.0; b[0][2] = 4.0; b[1][0] = 0.0; b[1][1] = 2.0; b[1][2] = 8.0; axb = jauPvxpv(a, b); vvd(axb[0][0], -1.0, 1e-12, "jauPvxpv", "p1"); vvd(axb[0][1], -5.0, 1e-12, "jauPvxpv", "p2"); vvd(axb[0][2], 4.0, 1e-12, "jauPvxpv", "p3"); vvd(axb[1][0], -2.0, 1e-12, "jauPvxpv", "v1"); vvd(axb[1][1], -36.0, 1e-12, "jauPvxpv", "v2"); vvd(axb[1][2], 22.0, 1e-12, "jauPvxpv", "v3"); } @Test public void t_pxp() /** ** ** Test jauPxp function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauPxp, vvd ** ** This revision: 2008 November 30 */ { double a[] = new double[3], b[] = new double[3], axb[] = new double[3]; a[0] = 2.0; a[1] = 2.0; a[2] = 3.0; b[0] = 1.0; b[1] = 3.0; b[2] = 4.0; axb = jauPxp(a, b); vvd(axb[0], -1.0, 1e-12, "jauPxp", "1"); vvd(axb[1], -5.0, 1e-12, "jauPxp", "2"); vvd(axb[2], 4.0, 1e-12, "jauPxp", "3"); } @Test public void t_rm2v() /** ** ** Test jauRm2v function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauRm2v, vvd ** ** This revision: 2008 November 30 */ { double r[][] = new double[3][3], w[] = new double[3]; r[0][0] = 0.00; r[0][1] = -0.80; r[0][2] = -0.60; r[1][0] = 0.80; r[1][1] = -0.36; r[1][2] = 0.48; r[2][0] = 0.60; r[2][1] = 0.48; r[2][2] = -0.64; w = jauRm2v(r); vvd(w[0], 0.0, 1e-12, "jauRm2v", "1"); vvd(w[1], 1.413716694115406957, 1e-12, "jauRm2v", "2"); vvd(w[2], -1.884955592153875943, 1e-12, "jauRm2v", "3"); } @Test public void t_rv2m() /** ** ** Test jauRv2m function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauRv2m, vvd ** ** This revision: 2008 May 27 */ { double w[] = new double[3], r[][] = new double[3][3]; w[0] = 0.0; w[1] = 1.41371669; w[2] = -1.88495559; r = jauRv2m(w); vvd(r[0][0], -0.7071067782221119905, 1e-14, "jauRv2m", "11"); vvd(r[0][1], -0.5656854276809129651, 1e-14, "jauRv2m", "12"); vvd(r[0][2], -0.4242640700104211225, 1e-14, "jauRv2m", "13"); vvd(r[1][0], 0.5656854276809129651, 1e-14, "jauRv2m", "21"); vvd(r[1][1], -0.0925483394532274246, 1e-14, "jauRv2m", "22"); vvd(r[1][2], -0.8194112531408833269, 1e-14, "jauRv2m", "23"); vvd(r[2][0], 0.4242640700104211225, 1e-14, "jauRv2m", "31"); vvd(r[2][1], -0.8194112531408833269, 1e-14, "jauRv2m", "32"); vvd(r[2][2], 0.3854415612311154341, 1e-14, "jauRv2m", "33"); } @Test public void t_rx() /** ** ** Test jauRx function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauRx, vvd ** ** This revision: 2008 November 30 */ { double phi, r[][] = new double[3][3]; phi = 0.3456789; r[0][0] = 2.0; r[0][1] = 3.0; r[0][2] = 2.0; r[1][0] = 3.0; r[1][1] = 2.0; r[1][2] = 3.0; r[2][0] = 3.0; r[2][1] = 4.0; r[2][2] = 5.0; jauRx(phi, r); vvd(r[0][0], 2.0, 0.0, "jauRx", "11"); vvd(r[0][1], 3.0, 0.0, "jauRx", "12"); vvd(r[0][2], 2.0, 0.0, "jauRx", "13"); vvd(r[1][0], 3.839043388235612460, 1e-12, "jauRx", "21"); vvd(r[1][1], 3.237033249594111899, 1e-12, "jauRx", "22"); vvd(r[1][2], 4.516714379005982719, 1e-12, "jauRx", "23"); vvd(r[2][0], 1.806030415924501684, 1e-12, "jauRx", "31"); vvd(r[2][1], 3.085711545336372503, 1e-12, "jauRx", "32"); vvd(r[2][2], 3.687721683977873065, 1e-12, "jauRx", "33"); } @Test public void t_rxp() /** ** ** Test jauRxp function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauRxp, vvd ** ** This revision: 2008 November 30 */ { double r[][] = new double[3][3], p[] = new double[3], rp[] = new double[3]; r[0][0] = 2.0; r[0][1] = 3.0; r[0][2] = 2.0; r[1][0] = 3.0; r[1][1] = 2.0; r[1][2] = 3.0; r[2][0] = 3.0; r[2][1] = 4.0; r[2][2] = 5.0; p[0] = 0.2; p[1] = 1.5; p[2] = 0.1; rp = jauRxp(r, p); vvd(rp[0], 5.1, 1e-12, "jauRxp", "1"); vvd(rp[1], 3.9, 1e-12, "jauRxp", "2"); vvd(rp[2], 7.1, 1e-12, "jauRxp", "3"); } @Test public void t_rxpv() /** ** ** Test jauRxpv function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauRxpv, vvd ** ** This revision: 2008 November 30 */ { double r[][] = new double[3][3], pv[][] = new double[2][3], rpv[][] = new double[2][3]; r[0][0] = 2.0; r[0][1] = 3.0; r[0][2] = 2.0; r[1][0] = 3.0; r[1][1] = 2.0; r[1][2] = 3.0; r[2][0] = 3.0; r[2][1] = 4.0; r[2][2] = 5.0; pv[0][0] = 0.2; pv[0][1] = 1.5; pv[0][2] = 0.1; pv[1][0] = 1.5; pv[1][1] = 0.2; pv[1][2] = 0.1; rpv = jauRxpv(r, pv); vvd(rpv[0][0], 5.1, 1e-12, "jauRxpv", "11"); vvd(rpv[1][0], 3.8, 1e-12, "jauRxpv", "12"); vvd(rpv[0][1], 3.9, 1e-12, "jauRxpv", "21"); vvd(rpv[1][1], 5.2, 1e-12, "jauRxpv", "22"); vvd(rpv[0][2], 7.1, 1e-12, "jauRxpv", "31"); vvd(rpv[1][2], 5.8, 1e-12, "jauRxpv", "32"); } @Test public void t_rxr() /** ** ** Test jauRxr function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauRxr, vvd ** ** This revision: 2008 November 30 */ { double a[][] = new double[3][3], b[][] = new double[3][3], atb[][] = new double[3][3]; a[0][0] = 2.0; a[0][1] = 3.0; a[0][2] = 2.0; a[1][0] = 3.0; a[1][1] = 2.0; a[1][2] = 3.0; a[2][0] = 3.0; a[2][1] = 4.0; a[2][2] = 5.0; b[0][0] = 1.0; b[0][1] = 2.0; b[0][2] = 2.0; b[1][0] = 4.0; b[1][1] = 1.0; b[1][2] = 1.0; b[2][0] = 3.0; b[2][1] = 0.0; b[2][2] = 1.0; atb = jauRxr(a, b); vvd(atb[0][0], 20.0, 1e-12, "jauRxr", "11"); vvd(atb[0][1], 7.0, 1e-12, "jauRxr", "12"); vvd(atb[0][2], 9.0, 1e-12, "jauRxr", "13"); vvd(atb[1][0], 20.0, 1e-12, "jauRxr", "21"); vvd(atb[1][1], 8.0, 1e-12, "jauRxr", "22"); vvd(atb[1][2], 11.0, 1e-12, "jauRxr", "23"); vvd(atb[2][0], 34.0, 1e-12, "jauRxr", "31"); vvd(atb[2][1], 10.0, 1e-12, "jauRxr", "32"); vvd(atb[2][2], 15.0, 1e-12, "jauRxr", "33"); } @Test public void t_ry() /** ** ** Test jauRy function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauRy, vvd ** ** This revision: 2008 November 30 */ { double theta, r[][] = new double[3][3]; theta = 0.3456789; r[0][0] = 2.0; r[0][1] = 3.0; r[0][2] = 2.0; r[1][0] = 3.0; r[1][1] = 2.0; r[1][2] = 3.0; r[2][0] = 3.0; r[2][1] = 4.0; r[2][2] = 5.0; jauRy(theta, r); vvd(r[0][0], 0.8651847818978159930, 1e-12, "jauRy", "11"); vvd(r[0][1], 1.467194920539316554, 1e-12, "jauRy", "12"); vvd(r[0][2], 0.1875137911274457342, 1e-12, "jauRy", "13"); vvd(r[1][0], 3, 1e-12, "jauRy", "21"); vvd(r[1][1], 2, 1e-12, "jauRy", "22"); vvd(r[1][2], 3, 1e-12, "jauRy", "23"); vvd(r[2][0], 3.500207892850427330, 1e-12, "jauRy", "31"); vvd(r[2][1], 4.779889022262298150, 1e-12, "jauRy", "32"); vvd(r[2][2], 5.381899160903798712, 1e-12, "jauRy", "33"); } @Test public void t_rz() /** ** ** Test jauRz function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauRz, vvd ** ** This revision: 2008 November 30 */ { double psi, r[][] = new double[3][3]; psi = 0.3456789; r[0][0] = 2.0; r[0][1] = 3.0; r[0][2] = 2.0; r[1][0] = 3.0; r[1][1] = 2.0; r[1][2] = 3.0; r[2][0] = 3.0; r[2][1] = 4.0; r[2][2] = 5.0; jauRz(psi, r); vvd(r[0][0], 2.898197754208926769, 1e-12, "jauRz", "11"); vvd(r[0][1], 3.500207892850427330, 1e-12, "jauRz", "12"); vvd(r[0][2], 2.898197754208926769, 1e-12, "jauRz", "13"); vvd(r[1][0], 2.144865911309686813, 1e-12, "jauRz", "21"); vvd(r[1][1], 0.865184781897815993, 1e-12, "jauRz", "22"); vvd(r[1][2], 2.144865911309686813, 1e-12, "jauRz", "23"); vvd(r[2][0], 3.0, 1e-12, "jauRz", "31"); vvd(r[2][1], 4.0, 1e-12, "jauRz", "32"); vvd(r[2][2], 5.0, 1e-12, "jauRz", "33"); } @Test public void t_s00a() /** ** ** Test jauS00a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauS00a, vvd ** ** This revision: 2008 November 28 */ { double s; s = jauS00a(2400000.5, 52541.0); vvd(s, -0.1340684448919163584e-7, 1e-18, "jauS00a", ""); } @Test public void t_s00b() /** ** ** Test jauS00b function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauS00b, vvd ** ** This revision: 2008 November 28 */ { double s; s = jauS00b(2400000.5, 52541.0); vvd(s, -0.1340695782951026584e-7, 1e-18, "jauS00b", ""); } @Test public void t_s00() /** ** ** Test jauS00 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauS00, vvd ** ** This revision: 2008 November 28 */ { double x, y, s; x = 0.5791308486706011000e-3; y = 0.4020579816732961219e-4; s = jauS00(2400000.5, 53736.0, x, y); vvd(s, -0.1220036263270905693e-7, 1e-18, "jauS00", ""); } @Test public void t_s06a() /** ** ** Test jauS06a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauS06a, vvd ** ** This revision: 2008 November 28 */ { double s; s = jauS06a(2400000.5, 52541.0); vvd(s, -0.1340680437291812383e-7, 1e-18, "jauS06a", ""); } @Test public void t_s06() /** ** ** Test jauS06 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauS06, vvd ** ** This revision: 2008 November 28 */ { double x, y, s; x = 0.5791308486706011000e-3; y = 0.4020579816732961219e-4; s = jauS06(2400000.5, 53736.0, x, y); vvd(s, -0.1220032213076463117e-7, 1e-18, "jauS06", ""); } @Test public void t_s2c() /** ** ** Test jauS2c function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauS2c, vvd ** ** This revision: 2008 November 30 */ { double c[] = new double[3]; c = jauS2c(3.0123, -0.999); vvd(c[0], -0.5366267667260523906, 1e-12, "jauS2c", "1"); vvd(c[1], 0.0697711109765145365, 1e-12, "jauS2c", "2"); vvd(c[2], -0.8409302618566214041, 1e-12, "jauS2c", "3"); } @Test public void t_s2p() /** ** ** Test jauS2p function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauS2p, vvd ** ** This revision: 2008 May 25 */ { double p[] = new double[3]; p = jauS2p(-3.21, 0.123, 0.456); vvd(p[0], -0.4514964673880165228, 1e-12, "jauS2p", "x"); vvd(p[1], 0.0309339427734258688, 1e-12, "jauS2p", "y"); vvd(p[2], 0.0559466810510877933, 1e-12, "jauS2p", "z"); } @Test public void t_s2pv() /** ** ** Test jauS2pv function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauS2pv, vvd ** ** This revision: 2008 November 28 */ { double pv[][] = new double[2][3]; pv = jauS2pv(-3.21, 0.123, 0.456, -7.8e-6, 9.01e-6, -1.23e-5); vvd(pv[0][0], -0.4514964673880165228, 1e-12, "jauS2pv", "x"); vvd(pv[0][1], 0.0309339427734258688, 1e-12, "jauS2pv", "y"); vvd(pv[0][2], 0.0559466810510877933, 1e-12, "jauS2pv", "z"); vvd(pv[1][0], 0.1292270850663260170e-4, 1e-16,"jauS2pv", "vx"); vvd(pv[1][1], 0.2652814182060691422e-5, 1e-16,"jauS2pv", "vy"); vvd(pv[1][2], 0.2568431853930292259e-5, 1e-16,"jauS2pv", "vz"); } @Test public void t_s2xpv() /** ** ** Test jauS2xpv function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauS2xpv, vvd ** ** This revision: 2008 November 30 */ { double s1, s2, pv[][] = new double[2][3], spv[][]= new double[2][3]; s1 = 2.0; s2 = 3.0; pv[0][0] = 0.3; pv[0][1] = 1.2; pv[0][2] = -2.5; pv[1][0] = 0.5; pv[1][1] = 2.3; pv[1][2] = -0.4; spv = jauS2xpv(s1, s2, pv); vvd(spv[0][0], 0.6, 1e-12, "jauS2xpv", "p1"); vvd(spv[0][1], 2.4, 1e-12, "jauS2xpv", "p2"); vvd(spv[0][2], -5.0, 1e-12, "jauS2xpv", "p3"); vvd(spv[1][0], 1.5, 1e-12, "jauS2xpv", "v1"); vvd(spv[1][1], 6.9, 1e-12, "jauS2xpv", "v2"); vvd(spv[1][2], -1.2, 1e-12, "jauS2xpv", "v3"); } @Test public void t_sepp() /** ** ** Test jauSepp function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauSepp, vvd ** ** This revision: 2008 November 29 */ { double a[] = new double[3], b[] = new double[3], s; a[0] = 1.0; a[1] = 0.1; a[2] = 0.2; b[0] = -3.0; b[1] = 1e-3; b[2] = 0.2; s = jauSepp(a, b); vvd(s, 2.860391919024660768, 1e-12, "jauSepp", ""); } @Test public void t_seps() /** ** ** Test jauSeps function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauSeps, vvd ** ** This revision: 2008 May 22 */ { double al, ap, bl, bp, s; al = 1.0; ap = 0.1; bl = 0.2; bp = -3.0; s = jauSeps(al, ap, bl, bp); vvd(s, 2.346722016996998842, 1e-14, "jauSeps", ""); } @Test public void t_sp00() /** ** ** Test jauSp00 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauSp00, vvd ** ** This revision: 2008 May 25 */ { vvd(jauSp00(2400000.5, 52541.0), -0.6216698469981019309e-11, 1e-12, "jauSp00", ""); } @Test public void t_starpm() /** ** ** Test jauStarpm function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauStarpm, vvd, viv ** ** This revision: 2008 November 30 */ { double ra1, dec1, pmr1, pmd1, px1, rv1; ra1 = 0.01686756; dec1 = -1.093989828; pmr1 = -1.78323516e-5; pmd1 = 2.336024047e-6; px1 = 0.74723; rv1 = -21.6; try { CatalogCoords cat = jauStarpm(ra1, dec1, pmr1, pmd1, px1, rv1, 2400000.5, 50083.0, 2400000.5, 53736.0 ); vvd(cat.pos.alpha, 0.01668919069414256149, 1e-13,"jauStarpm", "ra"); vvd(cat.pos.delta, -1.093966454217127897, 1e-13,"jauStarpm", "dec"); vvd(cat.pm.alpha, -0.1783662682153176524e-4, 1e-17,"jauStarpm", "pmr"); vvd(cat.pm.delta, 0.2338092915983989595e-5, 1e-17,"jauStarpm", "pmd"); vvd(cat.px, 0.7473533835317719243, 1e-13,"jauStarpm", "px"); vvd(cat.rv, -21.59905170476417175, 1e-11,"jauStarpm", "rv"); } catch (JSOFAInternalError e) { e.printStackTrace(); fail("jauStarpm threw exception"); } } @Test public void t_starpv() /** ** ** Test jauStarpv function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauStarpv, vvd, viv ** ** This revision: 2008 November 30 */ { double ra, dec, pmr, pmd, px, rv, pv[][] = new double[2][3]; ra = 0.01686756; dec = -1.093989828; pmr = -1.78323516e-5; pmd = 2.336024047e-6; px = 0.74723; rv = -21.6; int j = jauStarpv(ra, dec, pmr, pmd, px, rv, pv); vvd(pv[0][0], 126668.5912743160601, 1e-10,"jauStarpv", "11"); vvd(pv[0][1], 2136.792716839935195, 1e-12,"jauStarpv", "12"); vvd(pv[0][2], -245251.2339876830091, 1e-10,"jauStarpv", "13"); vvd(pv[1][0], -0.4051854008955659551e-2, 1e-13,"jauStarpv", "21"); vvd(pv[1][1], -0.6253919754414777970e-2, 1e-15,"jauStarpv", "22"); vvd(pv[1][2], 0.1189353714588109341e-1, 1e-13,"jauStarpv", "23"); viv(j, 0, "jauStarpv", "j"); } @Test public void t_sxp() /** ** ** Test jauSxp function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauSxp, vvd ** ** This revision: 2008 November 30 */ { double s, p[] = new double[3], sp[] = new double[3]; s = 2.0; p[0] = 0.3; p[1] = 1.2; p[2] = -2.5; sp = jauSxp(s, p); vvd(sp[0], 0.6, 0.0, "jauSxp", "1"); vvd(sp[1], 2.4, 0.0, "jauSxp", "2"); vvd(sp[2], -5.0, 0.0, "jauSxp", "3"); } @Test public void t_sxpv() /** ** ** Test jauSxpv function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauSxpv, vvd ** ** This revision: 2008 November 30 */ { double s, pv[][] = new double[2][3], spv[][] = new double[2][3]; s = 2.0; pv[0][0] = 0.3; pv[0][1] = 1.2; pv[0][2] = -2.5; pv[1][0] = 0.5; pv[1][1] = 3.2; pv[1][2] = -0.7; spv = jauSxpv(s, pv); vvd(spv[0][0], 0.6, 0.0, "jauSxpv", "p1"); vvd(spv[0][1], 2.4, 0.0, "jauSxpv", "p2"); vvd(spv[0][2], -5.0, 0.0, "jauSxpv", "p3"); vvd(spv[1][0], 1.0, 0.0, "jauSxpv", "v1"); vvd(spv[1][1], 6.4, 0.0, "jauSxpv", "v2"); vvd(spv[1][2], -1.4, 0.0, "jauSxpv", "v3"); } @Test public void t_taitt() /** ** ** Test jauTaitt function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauTaitt, vvd, viv ** ** This revision: 2010 September 7 */ { JulianDate jd = jauTaitt(2453750.5, 0.892482639); vvd(jd.djm0, 2453750.5, 1e-6, "jauTaitt", "t1"); vvd(jd.djm1, 0.892855139, 1e-12, "jauTaitt", "t2"); } @Test public void t_taiut1() /** ** ** Test jauTaiut1 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauTaiut1, vvd, viv ** ** This revision: 2010 September 7 */ { JulianDate jd = jauTaiut1(2453750.5, 0.892482639, -32.6659); vvd(jd.djm0, 2453750.5, 1e-6, "jauTaiut1", "u1"); vvd(jd.djm1, 0.8921045614537037037, 1e-12, "jauTaiut1", "u2"); } @Test public void t_taiutc() throws JSOFAIllegalParameter, JSOFAInternalError /** ** ** Test jauTaiutc function. ** ** Returned: ** status LOGICAL TRUE = success, FALSE = fail ** ** Called: jauTaiutc, vvd, viv ** ** This revision: 2010 September 7 */ { JulianDate jd = jauTaiutc(2453750.5, 0.892482639); vvd(jd.djm0, 2453750.5, 1e-6, "jauTaiutc", "u1"); vvd(jd.djm1, 0.8921006945555555556, 1e-12, "jauTaiutc", "u2"); } @Test public void t_tcbtdb() /** ** ** Test jauTcbtdb function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauTcbtdb, vvd, viv ** ** This revision: 2010 September 6 */ { JulianDate jd = jauTcbtdb(2453750.5, 0.893019599); vvd(jd.djm0, 2453750.5, 1e-6, "jauTcbtdb", "b1"); vvd(jd.djm1, 0.8928551362746343397, 1e-12, "jauTcbtdb", "b2"); } @Test public void t_tcgtt() /** ** ** Test jauTcgtt function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauTcgtt, vvd, viv ** ** This revision: 2010 September g */ { JulianDate jd = jauTcgtt(2453750.5, 0.892862531); vvd(jd.djm0, 2453750.5, 1e-6, "jauTcgtt", "t1"); vvd(jd.djm1, 0.8928551387488816828, 1e-12, "jauTcgtt", "t2"); } @Test public void t_tdbtcb() /** ** ** Test jauTdbtcb function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauTdbtcb, vvd, viv ** ** This revision: 2010 September 6 */ { JulianDate jd = jauTdbtcb(2453750.5, 0.892855137); vvd( jd.djm0, 2453750.5, 1e-6, "jauTdbtcb", "b1"); vvd( jd.djm1, 0.8930195997253656716, 1e-12, "jauTdbtcb", "b2"); } @Test public void t_tdbtt() /** ** ** Test jauTdbtt function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauTdbtt, vvd, viv ** ** This revision: 2010 September 7 */ { JulianDate jd = jauTdbtt(2453750.5, 0.892855137, -0.000201); vvd(jd.djm0, 2453750.5, 1e-6, "jauTdbtt", "t1"); vvd(jd.djm1, 0.8928551393263888889, 1e-12, "jauTdbtt", "t2"); } // void t_tf2a() // /* // ** - - - - - - - // ** t _ t f 2 a // ** - - - - - - - // ** // ** Test jauTf2a function. // ** // ** Returned: // ** status int TRUE = success, FALSE = fail // ** // ** Called: jauTf2a, vvd, viv // ** // ** This revision: 2010 September 7 // */ // { // double a; // // // // j = jauTf2a('+', 4, 58, 20.2, a); // // vvd(a, 1.301739278189537429, 1e-12, "jauTf2a", "a"); // viv(j, 0, "jauTf2a", "j"); // // } // // void t_tf2d() // /* // ** - - - - - - - // ** t _ t f 2 d // ** - - - - - - - // ** // ** Test jauTf2d function. // ** // ** Returned: // ** status int TRUE = success, FALSE = fail // ** // ** Called: jauTf2d, vvd, viv // ** // ** This revision: 2010 September 7 // */ // { // double d; // // // // j = jauTf2d(' ', 23, 55, 10.9, d); // // vvd(d, 0.9966539351851851852, 1e-12, "jauTf2d", "d"); // viv(j, 0, "jauTf2d", "j"); // // } @Test public void t_tr() /** ** ** Test jauTr function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauTr, vvd ** ** This revision: 2008 November 30 */ { double r[][] = new double[3][3], rt[][] = new double[3][3]; r[0][0] = 2.0; r[0][1] = 3.0; r[0][2] = 2.0; r[1][0] = 3.0; r[1][1] = 2.0; r[1][2] = 3.0; r[2][0] = 3.0; r[2][1] = 4.0; r[2][2] = 5.0; rt = jauTr(r); vvd(rt[0][0], 2.0, 0.0, "jauTr", "11"); vvd(rt[0][1], 3.0, 0.0, "jauTr", "12"); vvd(rt[0][2], 3.0, 0.0, "jauTr", "13"); vvd(rt[1][0], 3.0, 0.0, "jauTr", "21"); vvd(rt[1][1], 2.0, 0.0, "jauTr", "22"); vvd(rt[1][2], 4.0, 0.0, "jauTr", "23"); vvd(rt[2][0], 2.0, 0.0, "jauTr", "31"); vvd(rt[2][1], 3.0, 0.0, "jauTr", "32"); vvd(rt[2][2], 5.0, 0.0, "jauTr", "33"); } @Test public void t_trxp() /** ** ** Test jauTrxp function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauTrxp, vvd ** ** This revision: 2008 November 30 */ { double r[][] = new double[3][3], p[] = new double[3], trp[] = new double[3]; r[0][0] = 2.0; r[0][1] = 3.0; r[0][2] = 2.0; r[1][0] = 3.0; r[1][1] = 2.0; r[1][2] = 3.0; r[2][0] = 3.0; r[2][1] = 4.0; r[2][2] = 5.0; p[0] = 0.2; p[1] = 1.5; p[2] = 0.1; trp = jauTrxp(r, p); vvd(trp[0], 5.2, 1e-12, "jauTrxp", "1"); vvd(trp[1], 4.0, 1e-12, "jauTrxp", "2"); vvd(trp[2], 5.4, 1e-12, "jauTrxp", "3"); } @Test public void t_trxpv() /** ** ** Test jauTrxpv function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauTrxpv, vvd ** ** This revision: 2008 November 30 */ { double r[][] = new double[3][3], pv[][] = new double[2][3], trpv[][] = new double[2][3]; r[0][0] = 2.0; r[0][1] = 3.0; r[0][2] = 2.0; r[1][0] = 3.0; r[1][1] = 2.0; r[1][2] = 3.0; r[2][0] = 3.0; r[2][1] = 4.0; r[2][2] = 5.0; pv[0][0] = 0.2; pv[0][1] = 1.5; pv[0][2] = 0.1; pv[1][0] = 1.5; pv[1][1] = 0.2; pv[1][2] = 0.1; trpv = jauTrxpv(r, pv); vvd(trpv[0][0], 5.2, 1e-12, "jauTrxpv", "p1"); vvd(trpv[0][1], 4.0, 1e-12, "jauTrxpv", "p1"); vvd(trpv[0][2], 5.4, 1e-12, "jauTrxpv", "p1"); vvd(trpv[1][0], 3.9, 1e-12, "jauTrxpv", "v1"); vvd(trpv[1][1], 5.3, 1e-12, "jauTrxpv", "v2"); vvd(trpv[1][2], 4.1, 1e-12, "jauTrxpv", "v3"); } @Test public void t_tttai() /** ** ** Test jauTttai function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauTttai, vvd, viv ** ** This revision: 2010 September 7 */ { JulianDate jd = jauTttai(2453750.5, 0.892482639); vvd(jd.djm0, 2453750.5, 1e-6, "jauTttai", "a1"); vvd(jd.djm1, 0.892110139, 1e-12, "jauTttai", "a2"); } @Test public void t_tttcg() /** ** ** Test jauTttcg function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauTttcg, vvd, viv ** ** This revision: 2010 September 7 */ { JulianDate jd = jauTttcg(2453750.5, 0.892482639); vvd( jd.djm0, 2453750.5, 1e-6, "jauTttcg", "g1"); vvd( jd.djm1, 0.8924900312508587113, 1e-12, "jauTttcg", "g2"); } @Test public void t_tttdb() /** ** ** Test jauTttdb function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauTttdb, vvd, viv ** ** This revision: 2010 September 7 */ { JulianDate jd = jauTttdb(2453750.5, 0.892855139, -0.000201); vvd(jd.djm0, 2453750.5, 1e-6, "jauTttdb", "b1"); vvd(jd.djm1, 0.8928551366736111111, 1e-12, "jauTttdb", "b2"); } @Test public void t_ttut1() /** ** ** Test jauTtut1 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauTtut1, vvd, viv ** ** This revision: 2010 September 7 */ { JulianDate jd = jauTtut1(2453750.5, 0.892855139, 64.8499); vvd(jd.djm0, 2453750.5, 1e-6, "jauTtut1", "u1"); vvd(jd.djm1, 0.8921045614537037037, 1e-12, "jauTtut1", "u2"); } @Test public void t_ut1tai() /** ** ** Test jauUt1tai function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauUt1tai, vvd, viv ** ** This revision: 2010 September 7 */ { JulianDate jd = jauUt1tai(2453750.5, 0.892104561, -32.6659); vvd(jd.djm0, 2453750.5, 1e-6, "jauUt1tai", "a1"); vvd(jd.djm1, 0.8924826385462962963, 1e-12, "jauUt1tai", "a2"); } @Test public void t_ut1tt() /** ** ** Test jauUt1tt function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauUt1tt, vvd, viv ** ** This revision: 2010 September 7 */ { JulianDate jd = jauUt1tt(2453750.5, 0.892104561, 64.8499); vvd(jd.djm0, 2453750.5, 1e-6, "jauUt1tt", "t1"); vvd(jd.djm1, 0.8928551385462962963, 1e-12, "jauUt1tt", "t2"); } @Test public void t_ut1utc() throws JSOFAIllegalParameter, JSOFAInternalError /** ** ** Test jauUt1utc function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauUt1utc, vvd, viv ** ** This revision: 2010 September 7 */ { JulianDate jd = jauUt1utc(2453750.5, 0.892104561, 0.3341); vvd(jd.djm0, 2453750.5, 1e-6, "jauUt1utc", "u1"); vvd(jd.djm1, 0.8921006941018518519, 1e-12, "jauUt1utc", "u2"); } @Test public void t_utctai() throws JSOFAIllegalParameter, JSOFAInternalError /** ** ** Test jauUtctai function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauUtctai, vvd, viv ** ** This revision: 2010 September 7 */ { JulianDate jd = jauUtctai(2453750.5, 0.892100694); vvd(jd.djm0, 2453750.5, 1e-6, "jauUtctai", "u1"); vvd(jd.djm1, 0.8924826384444444444, 1e-12, "jauUtctai", "u2"); } @Test public void t_utcut1() throws JSOFAIllegalParameter, JSOFAInternalError /** ** ** Test jauUtcut1 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauUtcut1, vvd, viv ** ** This revision: 2010 September 7 */ { JulianDate jd = jauUtcut1(2453750.5, 0.892100694, 0.3341); vvd(jd.djm0, 2453750.5, 1e-6, "jauUtcut1", "u1"); vvd(jd.djm1, 0.8921045608981481481, 1e-12, "jauUtcut1", "u2"); } @Test public void t_xy06() /** ** ** Test jauXy06 function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauXy06, vvd ** ** This revision: 2008 November 28 */ { CelestialIntermediatePole cip = jauXy06(2400000.5, 53736.0); vvd(cip.x, 0.5791308486706010975e-3, 1e-15, "jauXy06", "x"); vvd(cip.y, 0.4020579816732958141e-4, 1e-16, "jauXy06", "y"); } @Test public void t_xys00a() /** ** ** Test jauXys00a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauXys00a, vvd ** ** This revision: 2008 November 28 */ { ICRFrame fr = jauXys00a(2400000.5, 53736.0); vvd(fr.cip.x, 0.5791308472168152904e-3, 1e-14, "jauXys00a", "x"); vvd(fr.cip.y, 0.4020595661591500259e-4, 1e-15, "jauXys00a", "y"); vvd(fr.s, -0.1220040848471549623e-7, 1e-18, "jauXys00a", "s"); } @Test public void t_xys00b() /** ** ** Test jauXys00b function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauXys00b, vvd ** ** This revision: 2008 November 28 */ { ICRFrame fr = jauXys00b(2400000.5, 53736.0); vvd(fr.cip.x, 0.5791301929950208873e-3, 1e-14, "jauXys00b", "x"); vvd(fr.cip.y, 0.4020553681373720832e-4, 1e-15, "jauXys00b", "y"); vvd(fr.s, -0.1220027377285083189e-7, 1e-18, "jauXys00b", "s"); } @Test public void t_xys06a() /** ** ** Test jauXys06a function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauXys06a, vvd ** ** This revision: 2008 November 28 */ { ICRFrame fr = jauXys06a(2400000.5, 53736.0); vvd(fr.cip.x, 0.5791308482835292617e-3, 1e-14, "jauXys06a", "x"); vvd(fr.cip.y, 0.4020580099454020310e-4, 1e-15, "jauXys06a", "y"); vvd(fr.s, -0.1220032294164579896e-7, 1e-18, "jauXys06a", "s"); } @Test public void t_zp() /** ** ** Test jauZp function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauZp, vvd ** ** This revision: 2008 November 30 */ { double p[] = new double[3]; p[0] = 0.3; p[1] = 1.2; p[2] = -2.5; jauZp(p); vvd(p[0], 0.0, 0.0, "jauZp", "1"); vvd(p[1], 0.0, 0.0, "jauZp", "2"); vvd(p[2], 0.0, 0.0, "jauZp", "3"); } @Test public void t_zpv() /** ** ** Test jauZpv function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauZpv, vvd ** ** This revision: 2008 May 25 */ { double pv[][] = new double[2][3]; pv[0][0] = 0.3; pv[0][1] = 1.2; pv[0][2] = -2.5; pv[1][0] = -0.5; pv[1][1] = 3.1; pv[1][2] = 0.9; jauZpv(pv); vvd(pv[0][0], 0.0, 0.0, "jauZpv", "p1"); vvd(pv[0][1], 0.0, 0.0, "jauZpv", "p2"); vvd(pv[0][2], 0.0, 0.0, "jauZpv", "p3"); vvd(pv[1][0], 0.0, 0.0, "jauZpv", "v1"); vvd(pv[1][1], 0.0, 0.0, "jauZpv", "v2"); vvd(pv[1][2], 0.0, 0.0, "jauZpv", "v3"); } @Test public void t_zr() /** ** ** Test jauZr function. ** ** Returned: ** status int TRUE = success, FALSE = fail ** ** Called: jauZr, vvd ** ** This revision: 2008 November 30 */ { double r[][] = new double[3][3]; r[0][0] = 2.0; r[1][0] = 3.0; r[2][0] = 2.0; r[0][1] = 3.0; r[1][1] = 2.0; r[2][1] = 3.0; r[0][2] = 3.0; r[1][2] = 4.0; r[2][2] = 5.0; jauZr(r); vvd(r[0][0], 0.0, 0.0, "jauZr", "00"); vvd(r[1][0], 0.0, 0.0, "jauZr", "01"); vvd(r[2][0], 0.0, 0.0, "jauZr", "02"); vvd(r[0][1], 0.0, 0.0, "jauZr", "10"); vvd(r[1][1], 0.0, 0.0, "jauZr", "11"); vvd(r[2][1], 0.0, 0.0, "jauZr", "12"); vvd(r[0][2], 0.0, 0.0, "jauZr", "20"); vvd(r[1][2], 0.0, 0.0, "jauZr", "21"); vvd(r[2][2], 0.0, 0.0, "jauZr", "22"); } // additions for 20131202 @Test public void t_apcg() /** ** ** Test jauApcg function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauApcg, vvd ** ** This revision: 2013 October 3 */ { double date1, date2, ebpv[][] = new double[2][3], ehp[] = new double[3]; Astrom astrom = new Astrom(); date1 = 2456165.5; date2 = 0.401182685; ebpv[0][0] = 0.901310875; ebpv[0][1] = -0.417402664; ebpv[0][2] = -0.180982288; ebpv[1][0] = 0.00742727954; ebpv[1][1] = 0.0140507459; ebpv[1][2] = 0.00609045792; ehp[0] = 0.903358544; ehp[1] = -0.415395237; ehp[2] = -0.180084014; jauApcg(date1, date2, ebpv, ehp, astrom); vvd(astrom.pmt, 12.65133794027378508, 1e-11, "jauApcg", "pmt"); vvd(astrom.eb[0], 0.901310875, 1e-12, "jauApcg", "eb(1)"); vvd(astrom.eb[1], -0.417402664, 1e-12, "jauApcg", "eb(2)"); vvd(astrom.eb[2], -0.180982288, 1e-12, "jauApcg", "eb(3)"); vvd(astrom.eh[0], 0.8940025429324143045, 1e-12, "jauApcg", "eh(1)"); vvd(astrom.eh[1], -0.4110930268679817955, 1e-12, "jauApcg", "eh(2)"); vvd(astrom.eh[2], -0.1782189004872870264, 1e-12, "jauApcg", "eh(3)"); vvd(astrom.em, 1.010465295811013146, 1e-12, "jauApcg", "em"); vvd(astrom.v[0], 0.4289638913597693554e-4, 1e-16, "jauApcg", "v(1)"); vvd(astrom.v[1], 0.8115034051581320575e-4, 1e-16, "jauApcg", "v(2)"); vvd(astrom.v[2], 0.3517555136380563427e-4, 1e-16, "jauApcg", "v(3)"); vvd(astrom.bm1, 0.9999999951686012981, 1e-12, "jauApcg", "bm1"); vvd(astrom.bpn[0][0], 1.0, 0.0, "jauApcg", "bpn(1,1)"); vvd(astrom.bpn[1][0], 0.0, 0.0, "jauApcg", "bpn(2,1)"); vvd(astrom.bpn[2][0], 0.0, 0.0, "jauApcg", "bpn(3,1)"); vvd(astrom.bpn[0][1], 0.0, 0.0, "jauApcg", "bpn(1,2)"); vvd(astrom.bpn[1][1], 1.0, 0.0, "jauApcg", "bpn(2,2)"); vvd(astrom.bpn[2][1], 0.0, 0.0, "jauApcg", "bpn(3,2)"); vvd(astrom.bpn[0][2], 0.0, 0.0, "jauApcg", "bpn(1,3)"); vvd(astrom.bpn[1][2], 0.0, 0.0, "jauApcg", "bpn(2,3)"); vvd(astrom.bpn[2][2], 1.0, 0.0, "jauApcg", "bpn(3,3)"); } @Test public void t_ab() /** ** ** Test jauAb function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauAb, vvd ** ** This revision: 2013 October 1 */ { double pnat[] = new double[3], v[] = new double[3], s, bm1, ppr[]; pnat[0] = -0.76321968546737951; pnat[1] = -0.60869453983060384; pnat[2] = -0.21676408580639883; v[0] = 2.1044018893653786e-5; v[1] = -8.9108923304429319e-5; v[2] = -3.8633714797716569e-5; s = 0.99980921395708788; bm1 = 0.99999999506209258; ppr = jauAb(pnat, v, s, bm1); vvd(ppr[0], -0.7631631094219556269, 1e-12, "jauAb", "1"); vvd(ppr[1], -0.6087553082505590832, 1e-12, "jauAb", "2"); vvd(ppr[2], -0.2167926269368471279, 1e-12, "jauAb", "3"); } @Test public void t_apcg13() /** ** ** Test jauApcg13 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauApcg13, vvd ** ** This revision: 2013 October 3 */ { double date1, date2; Astrom astrom = new Astrom(); date1 = 2456165.5; date2 = 0.401182685; jauApcg13(date1, date2, astrom); vvd(astrom.pmt, 12.65133794027378508, 1e-11, "jauApcg13", "pmt"); vvd(astrom.eb[0], 0.9013108747340644755, 1e-12, "jauApcg13", "eb(1)"); vvd(astrom.eb[1], -0.4174026640406119957, 1e-12, "jauApcg13", "eb(2)"); vvd(astrom.eb[2], -0.1809822877867817771, 1e-12, "jauApcg13", "eb(3)"); vvd(astrom.eh[0], 0.8940025429255499549, 1e-12, "jauApcg13", "eh(1)"); vvd(astrom.eh[1], -0.4110930268331896318, 1e-12, "jauApcg13", "eh(2)"); vvd(astrom.eh[2], -0.1782189006019749850, 1e-12, "jauApcg13", "eh(3)"); vvd(astrom.em, 1.010465295964664178, 1e-12, "jauApcg13", "em"); vvd(astrom.v[0], 0.4289638912941341125e-4, 1e-16, "jauApcg13", "v(1)"); vvd(astrom.v[1], 0.8115034032405042132e-4, 1e-16, "jauApcg13", "v(2)"); vvd(astrom.v[2], 0.3517555135536470279e-4, 1e-16, "jauApcg13", "v(3)"); vvd(astrom.bm1, 0.9999999951686013142, 1e-12, "jauApcg13", "bm1"); vvd(astrom.bpn[0][0], 1.0, 0.0, "jauApcg13", "bpn(1,1)"); vvd(astrom.bpn[1][0], 0.0, 0.0, "jauApcg13", "bpn(2,1)"); vvd(astrom.bpn[2][0], 0.0, 0.0, "jauApcg13", "bpn(3,1)"); vvd(astrom.bpn[0][1], 0.0, 0.0, "jauApcg13", "bpn(1,2)"); vvd(astrom.bpn[1][1], 1.0, 0.0, "jauApcg13", "bpn(2,2)"); vvd(astrom.bpn[2][1], 0.0, 0.0, "jauApcg13", "bpn(3,2)"); vvd(astrom.bpn[0][2], 0.0, 0.0, "jauApcg13", "bpn(1,3)"); vvd(astrom.bpn[1][2], 0.0, 0.0, "jauApcg13", "bpn(2,3)"); vvd(astrom.bpn[2][2], 1.0, 0.0, "jauApcg13", "bpn(3,3)"); } @Test public void t_apci() /** ** ** Test jauApci function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauApci, vvd ** ** This revision: 2013 October 3 */ { double date1, date2, ebpv[][] = new double[2][3], ehp[] = new double[3], x, y, s; Astrom astrom = new Astrom() ; date1 = 2456165.5; date2 = 0.401182685; ebpv[0][0] = 0.901310875; ebpv[0][1] = -0.417402664; ebpv[0][2] = -0.180982288; ebpv[1][0] = 0.00742727954; ebpv[1][1] = 0.0140507459; ebpv[1][2] = 0.00609045792; ehp[0] = 0.903358544; ehp[1] = -0.415395237; ehp[2] = -0.180084014; x = 0.0013122272; y = -2.92808623e-5; s = 3.05749468e-8; jauApci(date1, date2, ebpv, ehp, x, y, s, astrom); vvd(astrom.pmt, 12.65133794027378508, 1e-11, "jauApci", "pmt"); vvd(astrom.eb[0], 0.901310875, 1e-12, "jauApci", "eb(1)"); vvd(astrom.eb[1], -0.417402664, 1e-12, "jauApci", "eb(2)"); vvd(astrom.eb[2], -0.180982288, 1e-12, "jauApci", "eb(3)"); vvd(astrom.eh[0], 0.8940025429324143045, 1e-12, "jauApci", "eh(1)"); vvd(astrom.eh[1], -0.4110930268679817955, 1e-12, "jauApci", "eh(2)"); vvd(astrom.eh[2], -0.1782189004872870264, 1e-12, "jauApci", "eh(3)"); vvd(astrom.em, 1.010465295811013146, 1e-12, "jauApci", "em"); vvd(astrom.v[0], 0.4289638913597693554e-4, 1e-16, "jauApci", "v(1)"); vvd(astrom.v[1], 0.8115034051581320575e-4, 1e-16, "jauApci", "v(2)"); vvd(astrom.v[2], 0.3517555136380563427e-4, 1e-16, "jauApci", "v(3)"); vvd(astrom.bm1, 0.9999999951686012981, 1e-12, "jauApci", "bm1"); vvd(astrom.bpn[0][0], 0.9999991390295159156, 1e-12, "jauApci", "bpn(1,1)"); vvd(astrom.bpn[1][0], 0.4978650072505016932e-7, 1e-12, "jauApci", "bpn(2,1)"); vvd(astrom.bpn[2][0], 0.1312227200000000000e-2, 1e-12, "jauApci", "bpn(3,1)"); vvd(astrom.bpn[0][1], -0.1136336653771609630e-7, 1e-12, "jauApci", "bpn(1,2)"); vvd(astrom.bpn[1][1], 0.9999999995713154868, 1e-12, "jauApci", "bpn(2,2)"); vvd(astrom.bpn[2][1], -0.2928086230000000000e-4, 1e-12, "jauApci", "bpn(3,2)"); vvd(astrom.bpn[0][2], -0.1312227200895260194e-2, 1e-12, "jauApci", "bpn(1,3)"); vvd(astrom.bpn[1][2], 0.2928082217872315680e-4, 1e-12, "jauApci", "bpn(2,3)"); vvd(astrom.bpn[2][2], 0.9999991386008323373, 1e-12, "jauApci", "bpn(3,3)"); } @Test public void t_apci13() /** ** ** Test jauApci13 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauApci13, vvd ** ** This revision: 2013 October 3 */ { double date1, date2, eo; Astrom astrom = new Astrom() ; date1 = 2456165.5; date2 = 0.401182685; eo = jauApci13(date1, date2, astrom); vvd(astrom.pmt, 12.65133794027378508, 1e-11, "jauApci13", "pmt"); vvd(astrom.eb[0], 0.9013108747340644755, 1e-12, "jauApci13", "eb(1)"); vvd(astrom.eb[1], -0.4174026640406119957, 1e-12, "jauApci13", "eb(2)"); vvd(astrom.eb[2], -0.1809822877867817771, 1e-12, "jauApci13", "eb(3)"); vvd(astrom.eh[0], 0.8940025429255499549, 1e-12, "jauApci13", "eh(1)"); vvd(astrom.eh[1], -0.4110930268331896318, 1e-12, "jauApci13", "eh(2)"); vvd(astrom.eh[2], -0.1782189006019749850, 1e-12, "jauApci13", "eh(3)"); vvd(astrom.em, 1.010465295964664178, 1e-12, "jauApci13", "em"); vvd(astrom.v[0], 0.4289638912941341125e-4, 1e-16, "jauApci13", "v(1)"); vvd(astrom.v[1], 0.8115034032405042132e-4, 1e-16, "jauApci13", "v(2)"); vvd(astrom.v[2], 0.3517555135536470279e-4, 1e-16, "jauApci13", "v(3)"); vvd(astrom.bm1, 0.9999999951686013142, 1e-12, "jauApci13", "bm1"); vvd(astrom.bpn[0][0], 0.9999992060376761710, 1e-12, "jauApci13", "bpn(1,1)"); vvd(astrom.bpn[1][0], 0.4124244860106037157e-7, 1e-12, "jauApci13", "bpn(2,1)"); vvd(astrom.bpn[2][0], 0.1260128571051709670e-2, 1e-12, "jauApci13", "bpn(3,1)"); vvd(astrom.bpn[0][1], -0.1282291987222130690e-7, 1e-12, "jauApci13", "bpn(1,2)"); vvd(astrom.bpn[1][1], 0.9999999997456835325, 1e-12, "jauApci13", "bpn(2,2)"); vvd(astrom.bpn[2][1], -0.2255288829420524935e-4, 1e-12, "jauApci13", "bpn(3,2)"); vvd(astrom.bpn[0][2], -0.1260128571661374559e-2, 1e-12, "jauApci13", "bpn(1,3)"); vvd(astrom.bpn[1][2], 0.2255285422953395494e-4, 1e-12, "jauApci13", "bpn(2,3)"); vvd(astrom.bpn[2][2], 0.9999992057833604343, 1e-12, "jauApci13", "bpn(3,3)"); vvd(eo, -0.2900618712657375647e-2, 1e-12, "jauApci13", "eo"); } @Test public void t_apco() throws JSOFAIllegalParameter, JSOFAInternalError /** ** ** Test jauApco function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauApco, vvd ** ** This revision: 2013 October 3 */ { double date1, date2, ebpv[][] = new double[2][3], ehp[] = new double[3], x, y, s, theta, elong, phi, hm, xp, yp, sp, refa, refb; Astrom astrom = new Astrom() ; date1 = 2456384.5; date2 = 0.970031644; ebpv[0][0] = -0.974170438; ebpv[0][1] = -0.211520082; ebpv[0][2] = -0.0917583024; ebpv[1][0] = 0.00364365824; ebpv[1][1] = -0.0154287319; ebpv[1][2] = -0.00668922024; ehp[0] = -0.973458265; ehp[1] = -0.209215307; ehp[2] = -0.0906996477; x = 0.0013122272; y = -2.92808623e-5; s = 3.05749468e-8; theta = 3.14540971; elong = -0.527800806; phi = -1.2345856; hm = 2738.0; xp = 2.47230737e-7; yp = 1.82640464e-6; sp = -3.01974337e-11; refa = 0.000201418779; refb = -2.36140831e-7; jauApco(date1, date2, ebpv, ehp, x, y, s, theta, elong, phi, hm, xp, yp, sp, refa, refb, astrom); vvd(astrom.pmt, 13.25248468622587269, 1e-11, "jauApco", "pmt"); vvd(astrom.eb[0], -0.9741827110630322720, 1e-12, "jauApco", "eb(1)"); vvd(astrom.eb[1], -0.2115130190135344832, 1e-12, "jauApco", "eb(2)"); vvd(astrom.eb[2], -0.09179840186949532298, 1e-12, "jauApco", "eb(3)"); vvd(astrom.eh[0], -0.9736425571689739035, 1e-12, "jauApco", "eh(1)"); vvd(astrom.eh[1], -0.2092452125849330936, 1e-12, "jauApco", "eh(2)"); vvd(astrom.eh[2], -0.09075578152243272599, 1e-12, "jauApco", "eh(3)"); vvd(astrom.em, 0.9998233241709957653, 1e-12, "jauApco", "em"); vvd(astrom.v[0], 0.2078704992916728762e-4, 1e-16, "jauApco", "v(1)"); vvd(astrom.v[1], -0.8955360107151952319e-4, 1e-16, "jauApco", "v(2)"); vvd(astrom.v[2], -0.3863338994288951082e-4, 1e-16, "jauApco", "v(3)"); vvd(astrom.bm1, 0.9999999950277561236, 1e-12, "jauApco", "bm1"); vvd(astrom.bpn[0][0], 0.9999991390295159156, 1e-12, "jauApco", "bpn(1,1)"); vvd(astrom.bpn[1][0], 0.4978650072505016932e-7, 1e-12, "jauApco", "bpn(2,1)"); vvd(astrom.bpn[2][0], 0.1312227200000000000e-2, 1e-12, "jauApco", "bpn(3,1)"); vvd(astrom.bpn[0][1], -0.1136336653771609630e-7, 1e-12, "jauApco", "bpn(1,2)"); vvd(astrom.bpn[1][1], 0.9999999995713154868, 1e-12, "jauApco", "bpn(2,2)"); vvd(astrom.bpn[2][1], -0.2928086230000000000e-4, 1e-12, "jauApco", "bpn(3,2)"); vvd(astrom.bpn[0][2], -0.1312227200895260194e-2, 1e-12, "jauApco", "bpn(1,3)"); vvd(astrom.bpn[1][2], 0.2928082217872315680e-4, 1e-12, "jauApco", "bpn(2,3)"); vvd(astrom.bpn[2][2], 0.9999991386008323373, 1e-12, "jauApco", "bpn(3,3)"); vvd(astrom.along, -0.5278008060295995734, 1e-12, "jauApco", "along"); vvd(astrom.xpl, 0.1133427418130752958e-5, 1e-17, "jauApco", "xpl"); vvd(astrom.ypl, 0.1453347595780646207e-5, 1e-17, "jauApco", "ypl"); vvd(astrom.sphi, -0.9440115679003211329, 1e-12, "jauApco", "sphi"); vvd(astrom.cphi, 0.3299123514971474711, 1e-12, "jauApco", "cphi"); vvd(astrom.diurab, 0, 0, "jauApco", "diurab"); vvd(astrom.eral, 2.617608903970400427, 1e-12, "jauApco", "eral"); vvd(astrom.refa, 0.2014187790000000000e-3, 1e-15, "jauApco", "refa"); vvd(astrom.refb, -0.2361408310000000000e-6, 1e-18, "jauApco", "refb"); } @Test public void t_apco13() throws JSOFAIllegalParameter, JSOFAInternalError /** ** Test jauApco13 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauApco13, vvd, viv ** ** This revision: 2013 October 4 */ { double utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl, eo; Astrom astrom = new Astrom() ; utc1 = 2456384.5; utc2 = 0.969254051; dut1 = 0.1550675; elong = -0.527800806; phi = -1.2345856; hm = 2738.0; xp = 2.47230737e-7; yp = 1.82640464e-6; phpa = 731.0; tc = 12.8; rh = 0.59; wl = 0.55; eo = jauApco13(utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl, astrom); vvd(astrom.pmt, 13.25248468622475727, 1e-11, "jauApco13", "pmt"); vvd(astrom.eb[0], -0.9741827107320875162, 1e-12, "jauApco13", "eb(1)"); vvd(astrom.eb[1], -0.2115130190489716682, 1e-12, "jauApco13", "eb(2)"); vvd(astrom.eb[2], -0.09179840189496755339, 1e-12, "jauApco13", "eb(3)"); vvd(astrom.eh[0], -0.9736425572586935247, 1e-12, "jauApco13", "eh(1)"); vvd(astrom.eh[1], -0.2092452121603336166, 1e-12, "jauApco13", "eh(2)"); vvd(astrom.eh[2], -0.09075578153885665295, 1e-12, "jauApco13", "eh(3)"); vvd(astrom.em, 0.9998233240913898141, 1e-12, "jauApco13", "em"); vvd(astrom.v[0], 0.2078704994520489246e-4, 1e-16, "jauApco13", "v(1)"); vvd(astrom.v[1], -0.8955360133238868938e-4, 1e-16, "jauApco13", "v(2)"); vvd(astrom.v[2], -0.3863338993055887398e-4, 1e-16, "jauApco13", "v(3)"); vvd(astrom.bm1, 0.9999999950277561004, 1e-12, "jauApco13", "bm1"); vvd(astrom.bpn[0][0], 0.9999991390295147999, 1e-12, "jauApco13", "bpn(1,1)"); vvd(astrom.bpn[1][0], 0.4978650075315529277e-7, 1e-12, "jauApco13", "bpn(2,1)"); vvd(astrom.bpn[2][0], 0.001312227200850293372, 1e-12, "jauApco13", "bpn(3,1)"); vvd(astrom.bpn[0][1], -0.1136336652812486604e-7, 1e-12, "jauApco13", "bpn(1,2)"); vvd(astrom.bpn[1][1], 0.9999999995713154865, 1e-12, "jauApco13", "bpn(2,2)"); vvd(astrom.bpn[2][1], -0.2928086230975367296e-4, 1e-12, "jauApco13", "bpn(3,2)"); vvd(astrom.bpn[0][2], -0.001312227201745553566, 1e-12, "jauApco13", "bpn(1,3)"); vvd(astrom.bpn[1][2], 0.2928082218847679162e-4, 1e-12, "jauApco13", "bpn(2,3)"); vvd(astrom.bpn[2][2], 0.9999991386008312212, 1e-12, "jauApco13", "bpn(3,3)"); vvd(astrom.along, -0.5278008060295995733, 1e-12, "jauApco13", "along"); vvd(astrom.xpl, 0.1133427418130752958e-5, 1e-17, "jauApco13", "xpl"); vvd(astrom.ypl, 0.1453347595780646207e-5, 1e-17, "jauApco13", "ypl"); vvd(astrom.sphi, -0.9440115679003211329, 1e-12, "jauApco13", "sphi"); vvd(astrom.cphi, 0.3299123514971474711, 1e-12, "jauApco13", "cphi"); vvd(astrom.diurab, 0, 0, "jauApco13", "diurab"); vvd(astrom.eral, 2.617608909189664000, 1e-12, "jauApco13", "eral"); vvd(astrom.refa, 0.2014187785940396921e-3, 1e-15, "jauApco13", "refa"); vvd(astrom.refb, -0.2361408314943696227e-6, 1e-18, "jauApco13", "refb"); vvd(eo, -0.003020548354802412839, 1e-14, "jauApco13", "eo"); } @Test public void t_apcs() /** ** Test jauApcs function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauApcs, vvd ** ** This revision: 2013 October 3 */ { double date1, date2, pv[][] = new double[2][3], ebpv[][] = new double[2][3], ehp[] = new double[3]; Astrom astrom = new Astrom() ; date1 = 2456384.5; date2 = 0.970031644; pv[0][0] = -1836024.09; pv[0][1] = 1056607.72; pv[0][2] = -5998795.26; pv[1][0] = -77.0361767; pv[1][1] = -133.310856; pv[1][2] = 0.0971855934; ebpv[0][0] = -0.974170438; ebpv[0][1] = -0.211520082; ebpv[0][2] = -0.0917583024; ebpv[1][0] = 0.00364365824; ebpv[1][1] = -0.0154287319; ebpv[1][2] = -0.00668922024; ehp[0] = -0.973458265; ehp[1] = -0.209215307; ehp[2] = -0.0906996477; jauApcs(date1, date2, pv, ebpv, ehp, astrom); vvd(astrom.pmt, 13.25248468622587269, 1e-11, "jauApcs", "pmt"); vvd(astrom.eb[0], -0.9741827110629881886, 1e-12, "jauApcs", "eb(1)"); vvd(astrom.eb[1], -0.2115130190136415986, 1e-12, "jauApcs", "eb(2)"); vvd(astrom.eb[2], -0.09179840186954412099, 1e-12, "jauApcs", "eb(3)"); vvd(astrom.eh[0], -0.9736425571689454706, 1e-12, "jauApcs", "eh(1)"); vvd(astrom.eh[1], -0.2092452125850435930, 1e-12, "jauApcs", "eh(2)"); vvd(astrom.eh[2], -0.09075578152248299218, 1e-12, "jauApcs", "eh(3)"); vvd(astrom.em, 0.9998233241709796859, 1e-12, "jauApcs", "em"); vvd(astrom.v[0], 0.2078704993282685510e-4, 1e-16, "jauApcs", "v(1)"); vvd(astrom.v[1], -0.8955360106989405683e-4, 1e-16, "jauApcs", "v(2)"); vvd(astrom.v[2], -0.3863338994289409097e-4, 1e-16, "jauApcs", "v(3)"); vvd(astrom.bm1, 0.9999999950277561237, 1e-12, "jauApcs", "bm1"); vvd(astrom.bpn[0][0], 1, 0, "jauApcs", "bpn(1,1)"); vvd(astrom.bpn[1][0], 0, 0, "jauApcs", "bpn(2,1)"); vvd(astrom.bpn[2][0], 0, 0, "jauApcs", "bpn(3,1)"); vvd(astrom.bpn[0][1], 0, 0, "jauApcs", "bpn(1,2)"); vvd(astrom.bpn[1][1], 1, 0, "jauApcs", "bpn(2,2)"); vvd(astrom.bpn[2][1], 0, 0, "jauApcs", "bpn(3,2)"); vvd(astrom.bpn[0][2], 0, 0, "jauApcs", "bpn(1,3)"); vvd(astrom.bpn[1][2], 0, 0, "jauApcs", "bpn(2,3)"); vvd(astrom.bpn[2][2], 1, 0, "jauApcs", "bpn(3,3)"); } @Test public void t_apcs13() /** ** Test jauApcs13 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauApcs13, vvd ** ** This revision: 2013 October 3 */ { double date1, date2, pv[][] = new double[2][3]; Astrom astrom = new Astrom() ; date1 = 2456165.5; date2 = 0.401182685; pv[0][0] = -6241497.16; pv[0][1] = 401346.896; pv[0][2] = -1251136.04; pv[1][0] = -29.264597; pv[1][1] = -455.021831; pv[1][2] = 0.0266151194; jauApcs13(date1, date2, pv, astrom); vvd(astrom.pmt, 12.65133794027378508, 1e-11, "jauApcs13", "pmt"); vvd(astrom.eb[0], 0.9012691529025250644, 1e-12, "jauApcs13", "eb(1)"); vvd(astrom.eb[1], -0.4173999812023194317, 1e-12, "jauApcs13", "eb(2)"); vvd(astrom.eb[2], -0.1809906511146429670, 1e-12, "jauApcs13", "eb(3)"); vvd(astrom.eh[0], 0.8939939101760130792, 1e-12, "jauApcs13", "eh(1)"); vvd(astrom.eh[1], -0.4111053891734021478, 1e-12, "jauApcs13", "eh(2)"); vvd(astrom.eh[2], -0.1782336880636997374, 1e-12, "jauApcs13", "eh(3)"); vvd(astrom.em, 1.010428384373491095, 1e-12, "jauApcs13", "em"); vvd(astrom.v[0], 0.4279877294121697570e-4, 1e-16, "jauApcs13", "v(1)"); vvd(astrom.v[1], 0.7963255087052120678e-4, 1e-16, "jauApcs13", "v(2)"); vvd(astrom.v[2], 0.3517564013384691531e-4, 1e-16, "jauApcs13", "v(3)"); vvd(astrom.bm1, 0.9999999952947980978, 1e-12, "jauApcs13", "bm1"); vvd(astrom.bpn[0][0], 1, 0, "jauApcs13", "bpn(1,1)"); vvd(astrom.bpn[1][0], 0, 0, "jauApcs13", "bpn(2,1)"); vvd(astrom.bpn[2][0], 0, 0, "jauApcs13", "bpn(3,1)"); vvd(astrom.bpn[0][1], 0, 0, "jauApcs13", "bpn(1,2)"); vvd(astrom.bpn[1][1], 1, 0, "jauApcs13", "bpn(2,2)"); vvd(astrom.bpn[2][1], 0, 0, "jauApcs13", "bpn(3,2)"); vvd(astrom.bpn[0][2], 0, 0, "jauApcs13", "bpn(1,3)"); vvd(astrom.bpn[1][2], 0, 0, "jauApcs13", "bpn(2,3)"); vvd(astrom.bpn[2][2], 1, 0, "jauApcs13", "bpn(3,3)"); } @Test public void t_aper() /* ** Test jauAper function. * ** Returned: ** status int FALSE = success, TRUE = fail * ** Called: jauAper, vvd * ** This revision: 2013 October 3 */ { double theta; Astrom astrom = new Astrom() ; astrom.along = 1.234; theta = 5.678; jauAper(theta, astrom); vvd(astrom.eral, 6.912000000000000000, 1e-12, "jauAper", "pmt"); } @Test public void t_aper13() /** ** Test jauAper13 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauAper13, vvd ** ** This revision: 2013 October 3 */ { double ut11, ut12; Astrom astrom = new Astrom() ; astrom.along = 1.234; ut11 = 2456165.5; ut12 = 0.401182685; jauAper13(ut11, ut12, astrom); vvd(astrom.eral, 3.316236661789694933, 1e-12, "jauAper13", "pmt"); } @Test public void t_apio() throws JSOFAIllegalParameter, JSOFAInternalError /** ** Test jauApio function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauApio, vvd ** ** This revision: 2013 October 3 */ { double sp, theta, elong, phi, hm, xp, yp, refa, refb; Astrom astrom = new Astrom() ; sp = -3.01974337e-11; theta = 3.14540971; elong = -0.527800806; phi = -1.2345856; hm = 2738.0; xp = 2.47230737e-7; yp = 1.82640464e-6; refa = 0.000201418779; refb = -2.36140831e-7; jauApio(sp, theta, elong, phi, hm, xp, yp, refa, refb, astrom); vvd(astrom.along, -0.5278008060295995734, 1e-12, "jauApio", "along"); vvd(astrom.xpl, 0.1133427418130752958e-5, 1e-17, "jauApio", "xpl"); vvd(astrom.ypl, 0.1453347595780646207e-5, 1e-17, "jauApio", "ypl"); vvd(astrom.sphi, -0.9440115679003211329, 1e-12, "jauApio", "sphi"); vvd(astrom.cphi, 0.3299123514971474711, 1e-12, "jauApio", "cphi"); vvd(astrom.diurab, 0.5135843661699913529e-6, 1e-12, "jauApio", "diurab"); vvd(astrom.eral, 2.617608903970400427, 1e-12, "jauApio", "eral"); vvd(astrom.refa, 0.2014187790000000000e-3, 1e-15, "jauApio", "refa"); vvd(astrom.refb, -0.2361408310000000000e-6, 1e-18, "jauApio", "refb"); } @Test public void t_apio13() throws JSOFAIllegalParameter, JSOFAInternalError /** ** Test jauApio13 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauApio13, vvd, viv ** ** This revision: 2013 October 4 */ { double utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl; Astrom astrom = new Astrom() ; utc1 = 2456384.5; utc2 = 0.969254051; dut1 = 0.1550675; elong = -0.527800806; phi = -1.2345856; hm = 2738.0; xp = 2.47230737e-7; yp = 1.82640464e-6; phpa = 731.0; tc = 12.8; rh = 0.59; wl = 0.55; jauApio13(utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl, astrom); vvd(astrom.along, -0.5278008060295995733, 1e-12, "jauApio13", "along"); vvd(astrom.xpl, 0.1133427418130752958e-5, 1e-17, "jauApio13", "xpl"); vvd(astrom.ypl, 0.1453347595780646207e-5, 1e-17, "jauApio13", "ypl"); vvd(astrom.sphi, -0.9440115679003211329, 1e-12, "jauApio13", "sphi"); vvd(astrom.cphi, 0.3299123514971474711, 1e-12, "jauApio13", "cphi"); vvd(astrom.diurab, 0.5135843661699913529e-6, 1e-12, "jauApio13", "diurab"); vvd(astrom.eral, 2.617608909189664000, 1e-12, "jauApio13", "eral"); vvd(astrom.refa, 0.2014187785940396921e-3, 1e-15, "jauApio13", "refa"); vvd(astrom.refb, -0.2361408314943696227e-6, 1e-18, "jauApio13", "refb"); } @Test public void t_atci13() /** ** Test jauAtci13 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauAtci13, vvd ** ** This revision: 2013 October 3 */ { double rc, dc, pr, pd, px, rv, date1, date2; rc = 2.71; dc = 0.174; pr = 1e-5; pd = 5e-6; px = 0.1; rv = 55.0; date1 = 2456165.5; date2 = 0.401182685; SphericalCoordinateEO coe = jauAtci13(rc, dc, pr, pd, px, rv, date1, date2); vvd(coe.pos.alpha, 2.710121572968696744, 1e-12, "jauAtci13", "ri"); vvd(coe.pos.delta, 0.1729371367219539137, 1e-12, "jauAtci13", "di"); vvd(coe.eo, -0.002900618712657375647, 1e-14, "jauAtci13", "eo"); } @Test public void t_atciq() /** ** Test jauAtciq function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauApci13, jauAtciq, vvd ** ** This revision: 2013 October 3 */ { double date1, date2, rc, dc, pr, pd, px, rv; Astrom astrom = new Astrom() ; date1 = 2456165.5; date2 = 0.401182685; jauApci13(date1, date2, astrom); rc = 2.71; dc = 0.174; pr = 1e-5; pd = 5e-6; px = 0.1; rv = 55.0; SphericalCoordinate co = jauAtciq(rc, dc, pr, pd, px, rv, astrom); vvd(co.alpha, 2.710121572968696744, 1e-12, "jauAtciq", "ri"); vvd(co.delta, 0.1729371367219539137, 1e-12, "jauAtciq", "di"); } @Test public void t_atciqn() /** ** Test jauAtciqn function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauApci13, jauAtciqn, vvd ** ** This revision: 2013 October 3 */ { Ldbody b[] = {new Ldbody(),new Ldbody(),new Ldbody()}; double date1, date2, rc, dc, pr, pd, px, rv; Astrom astrom = new Astrom() ; date1 = 2456165.5; date2 = 0.401182685; jauApci13(date1, date2, astrom); rc = 2.71; dc = 0.174; pr = 1e-5; pd = 5e-6; px = 0.1; rv = 55.0; b[0].bm = 0.00028574; b[0].dl = 3e-10; b[0].pv[0][0] = -7.81014427; b[0].pv[0][1] = -5.60956681; b[0].pv[0][2] = -1.98079819; b[0].pv[1][0] = 0.0030723249; b[0].pv[1][1] = -0.00406995477; b[0].pv[1][2] = -0.00181335842; b[1].bm = 0.00095435; b[1].dl = 3e-9; b[1].pv[0][0] = 0.738098796; b[1].pv[0][1] = 4.63658692; b[1].pv[0][2] = 1.9693136; b[1].pv[1][0] = -0.00755816922; b[1].pv[1][1] = 0.00126913722; b[1].pv[1][2] = 0.000727999001; b[2].bm = 1.0; b[2].dl = 6e-6; b[2].pv[0][0] = -0.000712174377; b[2].pv[0][1] = -0.00230478303; b[2].pv[0][2] = -0.00105865966; b[2].pv[1][0] = 6.29235213e-6; b[2].pv[1][1] = -3.30888387e-7; b[2].pv[1][2] = -2.96486623e-7; SphericalCoordinate co = jauAtciqn( rc, dc, pr, pd, px, rv, astrom, 3, b); vvd(co.alpha, 2.710122008104983335, 1e-12, "jauAtciqn", "ri"); vvd(co.delta, 0.1729371916492767821, 1e-12, "jauAtciqn", "di"); } @Test public void t_atciqz() /** ** Test jauAtciqz function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauApci13, jauAtciqz, vvd ** ** This revision: 2013 October 3 */ { double date1, date2, rc, dc; Astrom astrom = new Astrom() ; date1 = 2456165.5; date2 = 0.401182685; jauApci13(date1, date2, astrom); rc = 2.71; dc = 0.174; SphericalCoordinate co = jauAtciqz(rc, dc, astrom); vvd(co.alpha, 2.709994899247256984, 1e-12, "jauAtciqz", "ri"); vvd(co.delta, 0.1728740720984931891, 1e-12, "jauAtciqz", "di"); } @Test public void t_atco13() throws JSOFAIllegalParameter, JSOFAInternalError /** ** Test jauAtco13 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauAtco13, vvd, viv ** ** This revision: 2013 October 4 */ { double rc, dc, pr, pd, px, rv, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl ; rc = 2.71; dc = 0.174; pr = 1e-5; pd = 5e-6; px = 0.1; rv = 55.0; utc1 = 2456384.5; utc2 = 0.969254051; dut1 = 0.1550675; elong = -0.527800806; phi = -1.2345856; hm = 2738.0; xp = 2.47230737e-7; yp = 1.82640464e-6; phpa = 731.0; tc = 12.8; rh = 0.59; wl = 0.55; ObservedPositionEO ope = jauAtco13(rc, dc, pr, pd, px, rv, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl); vvd(ope.op.aob, 0.9251774485485515207e-1, 1e-12, "jauAtco13", "aob"); vvd(ope.op.zob, 1.407661405256499357, 1e-12, "jauAtco13", "zob"); vvd(ope.op.hob, -0.9265154431529724692e-1, 1e-12, "jauAtco13", "hob"); vvd(ope.op.dob, 0.1716626560072526200, 1e-12, "jauAtco13", "dob"); vvd(ope.op.rob, 2.710260453504961012, 1e-12, "jauAtco13", "rob"); vvd(ope.eo, -0.003020548354802412839, 1e-14, "jauAtco13", "eo"); } @Test public void t_atic13() /** ** Test jauAtic13 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauAtic13, vvd ** ** This revision: 2013 October 3 */ { double ri, di, date1, date2; ri = 2.710121572969038991; di = 0.1729371367218230438; date1 = 2456165.5; date2 = 0.401182685; SphericalCoordinateEO oe = jauAtic13(ri, di, date1, date2); vvd(oe.pos.alpha, 2.710126504531716819, 1e-12, "jauAtic13", "rc"); vvd(oe.pos.delta, 0.1740632537627034482, 1e-12, "jauAtic13", "dc"); vvd(oe.eo, -0.002900618712657375647, 1e-14, "jauAtic13", "eo"); } @Test public void t_aticq() /** ** Test jauAticq function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauApci13, jauAticq, vvd ** ** This revision: 2013 October 3 */ { double date1, date2, ri, di; Astrom astrom = new Astrom() ; date1 = 2456165.5; date2 = 0.401182685; jauApci13(date1, date2, astrom); ri = 2.710121572969038991; di = 0.1729371367218230438; SphericalCoordinate co = jauAticq(ri, di, astrom); vvd(co.alpha, 2.710126504531716819, 1e-12, "jauAticq", "rc"); vvd(co.delta, 0.1740632537627034482, 1e-12, "jauAticq", "dc"); } @Test public void t_aticqn() /** ** Test jauAticqn function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauApci13, jauAticqn, vvd ** ** This revision: 2013 October 3 */ { double date1, date2, ri, di; Ldbody b[] = {new Ldbody(),new Ldbody(),new Ldbody()}; Astrom astrom = new Astrom() ; date1 = 2456165.5; date2 = 0.401182685; jauApci13(date1, date2, astrom); ri = 2.709994899247599271; di = 0.1728740720983623469; b[0].bm = 0.00028574; b[0].dl = 3e-10; b[0].pv[0][0] = -7.81014427; b[0].pv[0][1] = -5.60956681; b[0].pv[0][2] = -1.98079819; b[0].pv[1][0] = 0.0030723249; b[0].pv[1][1] = -0.00406995477; b[0].pv[1][2] = -0.00181335842; b[1].bm = 0.00095435; b[1].dl = 3e-9; b[1].pv[0][0] = 0.738098796; b[1].pv[0][1] = 4.63658692; b[1].pv[0][2] = 1.9693136; b[1].pv[1][0] = -0.00755816922; b[1].pv[1][1] = 0.00126913722; b[1].pv[1][2] = 0.000727999001; b[2].bm = 1.0; b[2].dl = 6e-6; b[2].pv[0][0] = -0.000712174377; b[2].pv[0][1] = -0.00230478303; b[2].pv[0][2] = -0.00105865966; b[2].pv[1][0] = 6.29235213e-6; b[2].pv[1][1] = -3.30888387e-7; b[2].pv[1][2] = -2.96486623e-7; SphericalCoordinate co = jauAticqn(ri, di, astrom, 3, b); vvd(co.alpha, 2.709999575033027333, 1e-12, "jauAtciqn", "rc"); vvd(co.delta, 0.1739999656316469990, 1e-12, "jauAtciqn", "dc"); } @Test public void t_atio13() throws JSOFAIllegalParameter, JSOFAInternalError /** ** Test jauAtio13 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauAtio13, vvd, viv ** ** This revision: 2013 October 3 */ { double ri, di, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl; ri = 2.710121572969038991; di = 0.1729371367218230438; utc1 = 2456384.5; utc2 = 0.969254051; dut1 = 0.1550675; elong = -0.527800806; phi = -1.2345856; hm = 2738.0; xp = 2.47230737e-7; yp = 1.82640464e-6; phpa = 731.0; tc = 12.8; rh = 0.59; wl = 0.55; ObservedPosition o = jauAtio13(ri, di, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl ); vvd(o.aob, 0.9233952224895122499e-1, 1e-12, "jauAtio13", "aob"); vvd(o.zob, 1.407758704513549991, 1e-12, "jauAtio13", "zob"); vvd(o.hob, -0.9247619879881698140e-1, 1e-12, "jauAtio13", "hob"); vvd(o.dob, 0.1717653435756234676, 1e-12, "jauAtio13", "dob"); vvd(o.rob, 2.710085107988480746, 1e-12, "jauAtio13", "rob"); } @Test public void t_atioq() throws JSOFAIllegalParameter, JSOFAInternalError /** ** Test jauAtioq function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauApio13, jauAtioq, vvd, viv ** ** This revision: 2013 October 4 */ { double utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl, ri, di; Astrom astrom = new Astrom() ; utc1 = 2456384.5; utc2 = 0.969254051; dut1 = 0.1550675; elong = -0.527800806; phi = -1.2345856; hm = 2738.0; xp = 2.47230737e-7; yp = 1.82640464e-6; phpa = 731.0; tc = 12.8; rh = 0.59; wl = 0.55; jauApio13(utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl, astrom); ri = 2.710121572969038991; di = 0.1729371367218230438; ObservedPosition o = jauAtioq(ri, di, astrom); vvd(o.aob, 0.9233952224895122499e-1, 1e-12, "jauAtioq", "aob"); vvd(o.zob, 1.407758704513549991, 1e-12, "jauAtioq", "zob"); vvd(o.hob, -0.9247619879881698140e-1, 1e-12, "jauAtioq", "hob"); vvd(o.dob, 0.1717653435756234676, 1e-12, "jauAtioq", "dob"); vvd(o.rob, 2.710085107988480746, 1e-12, "jauAtioq", "rob"); } @Test public void t_atoc13() throws JSOFAIllegalParameter, JSOFAInternalError /** ** Test jauAtoc13 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauAtoc13, vvd, viv ** ** This revision: 2013 October 3 */ { double utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl, ob1, ob2; utc1 = 2456384.5; utc2 = 0.969254051; dut1 = 0.1550675; elong = -0.527800806; phi = -1.2345856; hm = 2738.0; xp = 2.47230737e-7; yp = 1.82640464e-6; phpa = 731.0; tc = 12.8; rh = 0.59; wl = 0.55; ob1 = 2.710085107986886201; ob2 = 0.1717653435758265198; SphericalCoordinate oc = jauAtoc13 ( "R", ob1, ob2, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl ); vvd(oc.alpha, 2.709956744659136129, 1e-12, "jauAtoc13", "R/rc"); vvd(oc.delta, 0.1741696500898471362, 1e-12, "jauAtoc13", "R/dc"); ob1 = -0.09247619879782006106; ob2 = 0.1717653435758265198; oc = jauAtoc13 ( "H", ob1, ob2, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl); vvd(oc.alpha, 2.709956744659734086, 1e-12, "jauAtoc13", "H/rc"); vvd(oc.delta, 0.1741696500898471362, 1e-12, "jauAtoc13", "H/dc"); ob1 = 0.09233952224794989993; ob2 = 1.407758704513722461; oc = jauAtoc13 ( "A", ob1, ob2, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl); vvd(oc.alpha, 2.709956744659734086, 1e-12, "jauAtoc13", "A/rc"); vvd(oc.delta, 0.1741696500898471366, 1e-12, "jauAtoc13", "A/dc"); } @Test public void t_atoi13() throws JSOFAIllegalParameter, JSOFAInternalError /** ** Test jauAtoi13 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauAtoi13, vvd, viv ** ** This revision: 2013 October 3 */ { double utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl, ob1, ob2; utc1 = 2456384.5; utc2 = 0.969254051; dut1 = 0.1550675; elong = -0.527800806; phi = -1.2345856; hm = 2738.0; xp = 2.47230737e-7; yp = 1.82640464e-6; phpa = 731.0; tc = 12.8; rh = 0.59; wl = 0.55; ob1 = 2.710085107986886201; ob2 = 0.1717653435758265198; SphericalCoordinate co = jauAtoi13( "R", ob1, ob2, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl); vvd(co.alpha, 2.710121574447540810, 1e-12, "jauAtoi13", "R/ri"); vvd(co.delta, 0.1729371839116608778, 1e-12, "jauAtoi13", "R/di"); ob1 = -0.09247619879782006106; ob2 = 0.1717653435758265198; co = jauAtoi13( "H", ob1, ob2, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl); vvd(co.alpha, 2.710121574448138676, 1e-12, "jauAtoi13", "H/ri"); vvd(co.delta, 0.1729371839116608778, 1e-12, "jauAtoi13", "H/di"); ob1 = 0.09233952224794989993; ob2 = 1.407758704513722461; co = jauAtoi13( "A", ob1, ob2, utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl); vvd(co.alpha, 2.710121574448138676, 1e-12, "jauAtoi13", "A/ri"); vvd(co.delta, 0.1729371839116608781, 1e-12, "jauAtoi13", "A/di"); } @Test public void t_atoiq() throws JSOFAIllegalParameter, JSOFAInternalError /* ** Test jauAtoiq function. * ** Returned: ** status int FALSE = success, TRUE = fail * ** Called: jauApio13, jauAtoiq, vvd * ** This revision: 2013 October 4 */ { double utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl, ob1, ob2; Astrom astrom = new Astrom() ; utc1 = 2456384.5; utc2 = 0.969254051; dut1 = 0.1550675; elong = -0.527800806; phi = -1.2345856; hm = 2738.0; xp = 2.47230737e-7; yp = 1.82640464e-6; phpa = 731.0; tc = 12.8; rh = 0.59; wl = 0.55; jauApio13(utc1, utc2, dut1, elong, phi, hm, xp, yp, phpa, tc, rh, wl, astrom); ob1 = 2.710085107986886201; ob2 = 0.1717653435758265198; SphericalCoordinate co = jauAtoiq("R", ob1, ob2, astrom); vvd(co.alpha, 2.710121574447540810, 1e-12, "jauAtoiq", "R/ri"); vvd(co.delta, 0.17293718391166087785, 1e-12, "jauAtoiq", "R/di"); ob1 = -0.09247619879782006106; ob2 = 0.1717653435758265198; co = jauAtoiq("H", ob1, ob2, astrom); vvd(co.alpha, 2.710121574448138676, 1e-12, "jauAtoiq", "H/ri"); vvd(co.delta, 0.1729371839116608778, 1e-12, "jauAtoiq", "H/di"); ob1 = 0.09233952224794989993; ob2 = 1.407758704513722461; co = jauAtoiq("A", ob1, ob2, astrom); vvd(co.alpha, 2.710121574448138676, 1e-12, "jauAtoiq", "A/ri"); vvd(co.delta, 0.1729371839116608781, 1e-12, "jauAtoiq", "A/di"); } @Test public void t_ld() /** ** Test jauLd function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauLd, vvd * ** This revision: 2013 October 2 */ { double bm, p[] = new double[3], q[] = new double[3], e[] = new double[3], em, dlim, p1[]; bm = 0.00028574; p[0] = -0.763276255; p[1] = -0.608633767; p[2] = -0.216735543; q[0] = -0.763276255; q[1] = -0.608633767; q[2] = -0.216735543; e[0] = 0.76700421; e[1] = 0.605629598; e[2] = 0.211937094; em = 8.91276983; dlim = 3e-10; p1 = jauLd(bm, p, q, e, em, dlim); vvd(p1[0], -0.7632762548968159627, 1e-12, "jauLd", "1"); vvd(p1[1], -0.6086337670823762701, 1e-12, "jauLd", "2"); vvd(p1[2], -0.2167355431320546947, 1e-12, "jauLd", "3"); } @Test public void t_ldn() /** ** - - - - - - ** t _ l d n ** - - - - - - ** ** Test jauLdn function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauLdn, vvd ** ** This revision: 2013 October 2 */ { int n; Ldbody b[] = {new Ldbody(),new Ldbody(),new Ldbody()}; double ob[] = new double[3], sc[] = new double[3], sn[]; n = 3; b[0].bm = 0.00028574; b[0].dl = 3e-10; b[0].pv[0][0] = -7.81014427; b[0].pv[0][1] = -5.60956681; b[0].pv[0][2] = -1.98079819; b[0].pv[1][0] = 0.0030723249; b[0].pv[1][1] = -0.00406995477; b[0].pv[1][2] = -0.00181335842; b[1].bm = 0.00095435; b[1].dl = 3e-9; b[1].pv[0][0] = 0.738098796; b[1].pv[0][1] = 4.63658692; b[1].pv[0][2] = 1.9693136; b[1].pv[1][0] = -0.00755816922; b[1].pv[1][1] = 0.00126913722; b[1].pv[1][2] = 0.000727999001; b[2].bm = 1.0; b[2].dl = 6e-6; b[2].pv[0][0] = -0.000712174377; b[2].pv[0][1] = -0.00230478303; b[2].pv[0][2] = -0.00105865966; b[2].pv[1][0] = 6.29235213e-6; b[2].pv[1][1] = -3.30888387e-7; b[2].pv[1][2] = -2.96486623e-7; ob[0] = -0.974170437; ob[1] = -0.2115201; ob[2] = -0.0917583114; sc[0] = -0.763276255; sc[1] = -0.608633767; sc[2] = -0.216735543; sn = jauLdn(n, b, ob, sc); vvd(sn[0], -0.7632762579693333866, 1e-12, "jauLdn", "1"); vvd(sn[1], -0.6086337636093002660, 1e-12, "jauLdn", "2"); vvd(sn[2], -0.2167355420646328159, 1e-12, "jauLdn", "3"); } @Test public void t_ldsun() /** ** Test jauLdsun function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauLdsun, vvd ** ** This revision: 2013 October 2 */ { double p[] = new double[3], e[] = new double[3], em, p1[]; p[0] = -0.763276255; p[1] = -0.608633767; p[2] = -0.216735543; e[0] = -0.973644023; e[1] = -0.20925523; e[2] = -0.0907169552; em = 0.999809214; p1 = jauLdsun(p, e, em); vvd(p1[0], -0.7632762580731413169, 1e-12, "jauLdsun", "1"); vvd(p1[1], -0.6086337635262647900, 1e-12, "jauLdsun", "2"); vvd(p1[2], -0.2167355419322321302, 1e-12, "jauLdsun", "3"); } @Test public void t_pmpx() /** ** Test jauPmpx function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauPmpx, vvd ** ** This revision: 2013 October 2 */ { double rc, dc, pr, pd, px, rv, pmt, pob[] = new double[3], pco[]; rc = 1.234; dc = 0.789; pr = 1e-5; pd = -2e-5; px = 1e-2; rv = 10.0; pmt = 8.75; pob[0] = 0.9; pob[1] = 0.4; pob[2] = 0.1; pco = jauPmpx(rc, dc, pr, pd, px, rv, pmt, pob); vvd(pco[0], 0.2328137623960308438, 1e-12, "jauPmpx", "1"); vvd(pco[1], 0.6651097085397855328, 1e-12, "jauPmpx", "2"); vvd(pco[2], 0.7095257765896359837, 1e-12, "jauPmpx", "3"); } @Test public void t_pmsafe() throws JSOFAInternalError /** ** Test jauPmsafe function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauPmsafe, vvd, viv ** ** This revision: 2013 October 2 */ { double ra1, dec1, pmr1, pmd1, px1, rv1, ep1a, ep1b, ep2a, ep2b; ra1 = 1.234; dec1 = 0.789; pmr1 = 1e-5; pmd1 = -2e-5; px1 = 1e-2; rv1 = 10.0; ep1a = 2400000.5; ep1b = 48348.5625; ep2a = 2400000.5; ep2b = 51544.5; CatalogCoords cc = jauPmsafe(ra1, dec1, pmr1, pmd1, px1, rv1, ep1a, ep1b, ep2a, ep2b ); vvd(cc.pos.alpha, 1.234087484501017061, 1e-12, "jauPmsafe", "ra2"); vvd(cc.pos.delta, 0.7888249982450468567, 1e-12, "jauPmsafe", "dec2"); vvd(cc.pm.alpha, 0.9996457663586073988e-5, 1e-12, "jauPmsafe", "pmr2"); vvd(cc.pm.delta, -0.2000040085106754565e-4, 1e-16, "jauPmsafe", "pmd2"); vvd(cc.px, 0.9999997295356830666e-2, 1e-12, "jauPmsafe", "px2"); vvd(cc.rv, 10.38468380293920069, 1e-10, "jauPmsafe", "rv2"); } @Test public void t_pvtob() throws JSOFAIllegalParameter, JSOFAInternalError /** ** Test jauPvtob function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauPvtob, vvd ** ** This revision: 2013 October 2 */ { double elong, phi, hm, xp, yp, sp, theta, pv[][]; elong = 2.0; phi = 0.5; hm = 3000.0; xp = 1e-6; yp = -0.5e-6; sp = 1e-8; theta = 5.0; pv = jauPvtob(elong, phi, hm, xp, yp, sp, theta); vvd(pv[0][0], 4225081.367071159207, 1e-5, "jauPvtob", "p(1)"); vvd(pv[0][1], 3681943.215856198144, 1e-5, "jauPvtob", "p(2)"); vvd(pv[0][2], 3041149.399241260785, 1e-5, "jauPvtob", "p(3)"); vvd(pv[1][0], -268.4915389365998787, 1e-9, "jauPvtob", "v(1)"); vvd(pv[1][1], 308.0977983288903123, 1e-9, "jauPvtob", "v(2)"); vvd(pv[1][2], 0, 0, "jauPvtob", "v(3)"); } @Test public void t_refco() /** ** Test jauRefco function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauRefco, vvd ** ** This revision: 2013 October 2 */ { double phpa, tc, rh, wl; phpa = 800.0; tc = 10.0; rh = 0.9; wl = 0.4; RefCos ref = jauRefco(phpa, tc, rh, wl); vvd(ref.a, 0.2264949956241415009e-3, 1e-15, "jauRefco", "refa"); vvd(ref.b, -0.2598658261729343970e-6, 1e-18, "jauRefco", "refb"); } @Test public void t_d2dtf() throws JSOFAIllegalParameter, JSOFAInternalError /** ** Test jauD2dtf function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauD2dtf, viv ** ** This revision: 2013 August 7 */ { CalendarHMS c = jauD2dtf("UTC", 5, 2400000.5, 49533.99999); viv(c.iy, 1994, "jauD2dtf", "y"); viv(c.im, 6, "jauD2dtf", "mo"); viv(c.id, 30, "jauD2dtf", "d"); viv(c.ihmsf[0], 23, "jauD2dtf", "h"); viv(c.ihmsf[1], 59, "jauD2dtf", "m"); viv(c.ihmsf[2], 60, "jauD2dtf", "s"); viv(c.ihmsf[3], 13599, "jauD2dtf", "f"); } /** ** - - - - - - - - ** t _ d t f 2 d ** - - - - - - - - ** ** Test jauDtf2d function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauDtf2d, vvd, viv ** ** This revision: 2013 August 7 * @throws JSOFAInternalError * @throws JSOFAIllegalParameter */ @Test public void t_dtf2d() throws JSOFAIllegalParameter, JSOFAInternalError { JulianDate jd = jauDtf2d("UTC", 1994, 6, 30, 23, 59, 60.13599); vvd(jd.djm0+jd.djm1, 2449534.49999, 1e-6, "jauDtf2d", "u"); } /** ** ** Test jauG2icrs function. ** ** Called: jauG2icrs, vvd ** ** This revision: 2015 March 02 */ @Test public void t_g2icrs() { double dl, db; SphericalCoordinate co; dl = 5.5850536063818546461558105; db = -0.7853981633974483096156608; co = jauG2icrs(dl, db); vvd(co.alpha, 5.9338074302227188048671, 1e-14, "jauG2icrs", "Ra"); vvd(co.delta, -1.1784870613579944551541, 1e-14, "jauG2icrs", "Dec"); } /** ** ** Test jauIcrs2g function. ** ** Called: jauIcrs2g, vvd ** ** This revision: 2015 March 02 */ @Test public void t_icrs2g() { double dr, dd; dr = 5.9338074302227188048671087; dd = -1.1784870613579944551540570; SphericalCoordinate co = jauIcrs2g (dr, dd); vvd(co.alpha, 5.5850536063818546461558, 1e-14, "jauIcrs2g", "L"); vvd(co.delta, -0.7853981633974483096157, 1e-14, "jauIcrs2g", "B"); } /** ** ** Test jauEceq06 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauEceq06, vvd ** ** This revision: 2016 March 12 */ @Test public void t_eceq06() { double date1, date2, dl, db; date1 = 2456165.5; date2 = 0.401182685; dl = 5.1; db = -0.9; SphericalCoordinate co = jauEceq06(date1, date2, dl, db); vvd(co.alpha, 5.533459733613627767, 1e-14, "jauEceq06", "dr"); vvd(co.delta, -1.246542932554480576, 1e-14, "jauEceq06", "dd"); } /** ** ** Test jauEcm06 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauEcm06, vvd ** ** This revision: 2016 March 12 */ @Test public void t_ecm06() { double date1, date2; date1 = 2456165.5; date2 = 0.401182685; double rm[][] = jauEcm06(date1, date2); vvd(rm[0][0], 0.9999952427708701137, 1e-14, "jauEcm06", "rm11"); vvd(rm[0][1], -0.2829062057663042347e-2, 1e-14, "jauEcm06", "rm12"); vvd(rm[0][2], -0.1229163741100017629e-2, 1e-14, "jauEcm06", "rm13"); vvd(rm[1][0], 0.3084546876908653562e-2, 1e-14, "jauEcm06", "rm21"); vvd(rm[1][1], 0.9174891871550392514, 1e-14, "jauEcm06", "rm22"); vvd(rm[1][2], 0.3977487611849338124, 1e-14, "jauEcm06", "rm23"); vvd(rm[2][0], 0.2488512951527405928e-5, 1e-14, "jauEcm06", "rm31"); vvd(rm[2][1], -0.3977506604161195467, 1e-14, "jauEcm06", "rm32"); vvd(rm[2][2], 0.9174935488232863071, 1e-14, "jauEcm06", "rm33"); } /** ** ** Test jauEqec06 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauEqec06, vvd ** ** This revision: 2016 March 12 */ @Test public void t_eqec06() { double date1, date2, dr, dd; date1 = 1234.5; date2 = 2440000.5; dr = 1.234; dd = 0.987; SphericalCoordinate co = jauEqec06(date1, date2, dr, dd); vvd(co.alpha, 1.342509918994654619, 1e-14, "jauEqec06", "dl"); vvd(co.delta, 0.5926215259704608132, 1e-14, "jauEqec06", "db"); } /** ** Test jauLteceq function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauLteceq, vvd ** ** This revision: 2016 March 12 */ @Test public void t_lteceq() { double epj, dl, db; epj = 2500.0; dl = 1.5; db = 0.6; SphericalCoordinate co = jauLteceq(epj, dl, db); vvd(co.alpha, 1.275156021861921167, 1e-14, "jauLteceq", "dr"); vvd(co.delta, 0.9966573543519204791, 1e-14, "jauLteceq", "dd"); } /** ** Test jauLtecm function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauLtecm, vvd ** ** This revision: 2016 March 12 */ @Test public void t_ltecm() { double epj; epj = -3000.0; double rm[][] =jauLtecm(epj); vvd(rm[0][0], 0.3564105644859788825, 1e-14, "jauLtecm", "rm11"); vvd(rm[0][1], 0.8530575738617682284, 1e-14, "jauLtecm", "rm12"); vvd(rm[0][2], 0.3811355207795060435, 1e-14, "jauLtecm", "rm13"); vvd(rm[1][0], -0.9343283469640709942, 1e-14, "jauLtecm", "rm21"); vvd(rm[1][1], 0.3247830597681745976, 1e-14, "jauLtecm", "rm22"); vvd(rm[1][2], 0.1467872751535940865, 1e-14, "jauLtecm", "rm23"); vvd(rm[2][0], 0.1431636191201167793e-2, 1e-14, "jauLtecm", "rm31"); vvd(rm[2][1], -0.4084222566960599342, 1e-14, "jauLtecm", "rm32"); vvd(rm[2][2], 0.9127919865189030899, 1e-14, "jauLtecm", "rm33"); } /** ** ** Test jauLteqec function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauLteqec, vvd ** ** This revision: 2016 March 12 */ @Test public void t_lteqec() { double epj, dr, dd; epj = -1500.0; dr = 1.234; dd = 0.987; SphericalCoordinate co = jauLteqec(epj, dr, dd); vvd(co.alpha, 0.5039483649047114859, 1e-14, "jauLteqec", "dl"); vvd(co.delta, 0.5848534459726224882, 1e-14, "jauLteqec", "db"); } /** ** Test jauLtp function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauLtp, vvd ** ** This revision: 2016 March 12 */ @Test public void t_ltp() { double epj; epj = 1666.666; double rp[][] = jauLtp(epj); vvd(rp[0][0], 0.9967044141159213819, 1e-14, "jauLtp", "rp11"); vvd(rp[0][1], 0.7437801893193210840e-1, 1e-14, "jauLtp", "rp12"); vvd(rp[0][2], 0.3237624409345603401e-1, 1e-14, "jauLtp", "rp13"); vvd(rp[1][0], -0.7437802731819618167e-1, 1e-14, "jauLtp", "rp21"); vvd(rp[1][1], 0.9972293894454533070, 1e-14, "jauLtp", "rp22"); vvd(rp[1][2], -0.1205768842723593346e-2, 1e-14, "jauLtp", "rp23"); vvd(rp[2][0], -0.3237622482766575399e-1, 1e-14, "jauLtp", "rp31"); vvd(rp[2][1], -0.1206286039697609008e-2, 1e-14, "jauLtp", "rp32"); vvd(rp[2][2], 0.9994750246704010914, 1e-14, "jauLtp", "rp33"); } /** ** Test jauLtpb function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauLtpb, vvd ** ** This revision: 2016 March 12 */ @Test public void t_ltpb() { double epj ; epj = 1666.666; double rpb[][] = jauLtpb(epj); vvd(rpb[0][0], 0.9967044167723271851, 1e-14, "jauLtpb", "rpb11"); vvd(rpb[0][1], 0.7437794731203340345e-1, 1e-14, "jauLtpb", "rpb12"); vvd(rpb[0][2], 0.3237632684841625547e-1, 1e-14, "jauLtpb", "rpb13"); vvd(rpb[1][0], -0.7437795663437177152e-1, 1e-14, "jauLtpb", "rpb21"); vvd(rpb[1][1], 0.9972293947500013666, 1e-14, "jauLtpb", "rpb22"); vvd(rpb[1][2], -0.1205741865911243235e-2, 1e-14, "jauLtpb", "rpb23"); vvd(rpb[2][0], -0.3237630543224664992e-1, 1e-14, "jauLtpb", "rpb31"); vvd(rpb[2][1], -0.1206316791076485295e-2, 1e-14, "jauLtpb", "rpb32"); vvd(rpb[2][2], 0.9994750220222438819, 1e-14, "jauLtpb", "rpb33"); } /** ** Test jauLtpecl function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauLtpecl, vvd ** ** This revision: 2016 March 12 */ @Test public void t_ltpecl() { double epj; epj = -1500.0; double vec[] = jauLtpecl(epj); vvd(vec[0], 0.4768625676477096525e-3, 1e-14, "jauLtpecl", "vec1"); vvd(vec[1], -0.4052259533091875112, 1e-14, "jauLtpecl", "vec2"); vvd(vec[2], 0.9142164401096448012, 1e-14, "jauLtpecl", "vec3"); } /** ** ** Test jauLtpequ function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauLtpequ, vvd ** ** This revision: 2016 March 12 */ @Test public void t_ltpequ() { double epj; epj = -2500.0; double veq[] = jauLtpequ(epj); vvd(veq[0], -0.3586652560237326659, 1e-14, "jauLtpequ", "veq1"); vvd(veq[1], -0.1996978910771128475, 1e-14, "jauLtpequ", "veq2"); vvd(veq[2], 0.9118552442250819624, 1e-14, "jauLtpequ", "veq3"); } /** ** - - - - - - - - ** t _ a e 2 h d ** - - - - - - - - ** ** Test iauAe2hd function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: iauAe2hd and vvd ** ** This revision: 2017 October 21 */ @Test public void t_ae2hd() { double a, e, p; a = 5.5; e = 1.1; p = 0.7; EquatorialCoordinate ec = jauAe2hd(a, e, p); vvd(ec.ha, 0.5933291115507309663, 1e-14, "jauAe2hd", "h"); vvd(ec.dec, 0.9613934761647817620, 1e-14, "jauAe2hd", "d"); } public void t_hd2ae() /* ** - - - - - - - - ** t _ h d 2 a e ** - - - - - - - - ** ** Test jauHd2ae function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauHd2ae and vvd ** ** This revision: 2017 October 21 */ { double h, d, p; h = 1.1; d = 1.2; p = 0.3; HorizonCoordinate hc = jauHd2ae(h, d, p); vvd(hc.az, 5.916889243730066194, 1e-13, "jauHd2ae", "a"); vvd(hc.el, 0.4472186304990486228, 1e-14, "jauHd2ae", "e"); } /** ** - - - - - - - - ** t _ h d 2 p a ** - - - - - - - - ** ** Test jauHd2pa function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauHd2pa and vvd ** ** This revision: 2017 October 21 */ @Test public void t_hd2pa() { double h, d, p, q; h = 1.1; d = 1.2; p = 0.3; q = jauHd2pa(h, d, p); vvd(q, 1.906227428001995580, 1e-13, "jauHd2pa", "q"); } /** ** - - - - - - - - ** t _ t p o r s ** - - - - - - - - ** ** Test jauTpors function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauTpors, vvd, viv ** ** This revision: 2017 October 21 */ @Test public void t_tpors() { double xi, eta, ra, dec; xi = -0.03; eta = 0.07; ra = 1.3; dec = 1.5; TangentPointSolution tps = jauTpors(xi, eta, ra, dec); vvd(tps.sol1.alpha, 1.736621577783208748, 1e-13, "jauTpors", "az1"); vvd(tps.sol1.delta, 1.436736561844090323, 1e-13, "jauTpors", "bz1"); vvd(tps.sol2.alpha, 4.004971075806584490, 1e-13, "jauTpors", "az2"); vvd(tps.sol2.delta, 1.565084088476417917, 1e-13, "jauTpors", "bz2"); viv(tps.nsolutions, 2, "jauTpors", "n"); } /* ** - - - - - - - - ** t _ t p o r v ** - - - - - - - - ** ** Test jauTporv function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauTporv, jauS2c, vvd, viv ** ** This revision: 2017 October 21 */ @Test public void t_tporv() { double xi, eta, ra, dec, v[] = new double[3]; xi = -0.03; eta = 0.07; ra = 1.3; dec = 1.5; v = jauS2c(ra, dec); TangentPointDirectionCosines tpc = jauTporv(xi, eta, v); vvd(tpc.dc1[0], -0.02206252822366888610, 1e-15, "jauTporv", "x1"); vvd(tpc.dc1[1], 0.1318251060359645016, 1e-14, "jauTporv", "y1"); vvd(tpc.dc1[2], 0.9910274397144543895, 1e-14, "jauTporv", "z1"); vvd(tpc.dc2[0], -0.003712211763801968173, 1e-16, "jauTporv", "x2"); vvd(tpc.dc2[1], -0.004341519956299836813, 1e-16, "jauTporv", "y2"); vvd(tpc.dc2[2], 0.9999836852110587012, 1e-14, "jauTporv", "z2"); viv(tpc.nsolution, 2, "jauTporv", "n"); } /** ** - - - - - - - - ** t _ t p s t s ** - - - - - - - - ** ** Test jauTpsts function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauTpsts, vvd ** ** This revision: 2017 October 21 */ @Test public void t_tpsts() { double xi, eta, raz, decz; xi = -0.03; eta = 0.07; raz = 2.3; decz = 1.5; SphericalCoordinate sc = jauTpsts(xi, eta, raz, decz); vvd(sc.alpha, 0.7596127167359629775, 1e-14, "jauTpsts", "ra"); vvd(sc.delta, 1.540864645109263028, 1e-13, "jauTpsts", "dec"); } /** ** - - - - - - - - ** t _ t p s t v ** - - - - - - - - ** ** Test jauTpstv function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauTpstv, jauS2c, vvd ** ** This revision: 2017 October 21 */ @Test public void t_tpstv() { double xi, eta, raz, decz, vz[], v[]; xi = -0.03; eta = 0.07; raz = 2.3; decz = 1.5; vz = jauS2c(raz, decz); v = jauTpstv(xi, eta, vz); vvd(v[0], 0.02170030454907376677, 1e-15, "jauTpstv", "x"); vvd(v[1], 0.02060909590535367447, 1e-15, "jauTpstv", "y"); vvd(v[2], 0.9995520806583523804, 1e-14, "jauTpstv", "z"); } /* ** - - - - - - - - ** t _ t p x e s ** - - - - - - - - ** ** Test jauTpxes function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauTpxes, vvd, viv ** ** This revision: 2017 October 21 */ @Test public void t_tpxes() { double ra, dec, raz, decz; ra = 1.3; dec = 1.55; raz = 2.3; decz = 1.5; TangentPlaneCoordinate tpc = jauTpxes(ra, dec, raz, decz); vvd(tpc.xi, -0.01753200983236980595, 1e-15, "jauTpxes", "xi"); vvd(tpc.eta, 0.05962940005778712891, 1e-15, "jauTpxes", "eta"); viv(tpc.status, 0, "jauTpxes", "j"); } /** ** - - - - - - - - ** t _ t p x e v ** - - - - - - - - ** ** Test jauTpxev function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: jauTpxev, jauS2c, vvd ** ** This revision: 2017 October 21 */ @Test public void t_tpxev() { double ra, dec, raz, decz, v[], vz[]; ra = 1.3; dec = 1.55; raz = 2.3; decz = 1.5; v = jauS2c(ra, dec); vz = jauS2c(raz, decz); TangentPlaneCoordinate tpc = jauTpxev(v, vz); vvd(tpc.xi, -0.01753200983236980595, 1e-15, "jauTpxev", "xi"); vvd(tpc.eta, 0.05962940005778712891, 1e-15, "jauTpxev", "eta"); viv(tpc.status, 0, "jauTpxev", "j"); } /** ** - - - - - - - - ** t _ f k 4 2 5 ** - - - - - - - - ** ** Test iauFk425 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: iauFk425, vvd ** ** This revision: 2018 December 6 */ @Test public void t_fk425() { double r1950, d1950, dr1950, dd1950, p1950, v1950; r1950 = 0.07626899753879587532; d1950 = -1.137405378399605780; dr1950 = 0.1973749217849087460e-4; dd1950 = 0.5659714913272723189e-5; p1950 = 0.134; v1950 = 8.7; CatalogCoords c = jauFk425(r1950, d1950, dr1950, dd1950, p1950, v1950); vvd(c.pos.alpha, 0.08757989933556446040, 1e-14, "iauFk425", "r2000"); vvd(c.pos.delta, -1.132279113042091895, 1e-12, "iauFk425", "d2000"); vvd(c.pm.alpha, 0.1953670614474396139e-4, 1e-17, "iauFk425", "dr2000"); vvd(c.pm.delta, 0.5637686678659640164e-5, 1e-18, "iauFk425", "dd2000"); vvd(c.px, 0.1339919950582767871, 1e-13, "iauFk425", "p2000"); vvd(c.rv, 8.736999669183529069, 1e-12, "iauFk425", "v2000"); } /** ** - - - - - - - - ** t _ f k 4 5 z ** - - - - - - - - ** ** Test iauFk45z function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: iauFk45z, vvd ** ** This revision: 2018 December 6 */ @Test public void t_fk45z() { double r1950, d1950, bepoch; r1950 = 0.01602284975382960982; d1950 = -0.1164347929099906024; bepoch = 1954.677617625256806; SphericalCoordinate r = jauFk45z(r1950, d1950, bepoch); vvd(r.alpha, 0.02719295911606862303, 1e-15, "iauFk45z", "r2000"); vvd(r.delta, -0.1115766001565926892, 1e-13, "iauFk45z", "d2000"); } /** ** - - - - - - - - ** t _ f k 5 2 4 ** - - - - - - - - ** ** Test iauFk524 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: iauFk524, vvd ** ** This revision: 2018 December 6 */ @Test public void t_fk524() { double r2000, d2000, dr2000, dd2000, p2000, v2000; r2000 = 0.8723503576487275595; d2000 = -0.7517076365138887672; dr2000 = 0.2019447755430472323e-4; dd2000 = 0.3541563940505160433e-5; p2000 = 0.1559; v2000 = 86.87; CatalogCoords r = jauFk524(r2000, d2000, dr2000, dd2000, p2000, v2000); vvd(r.pos.alpha, 0.8636359659799603487, 1e-13, "iauFk524", "r1950"); vvd(r.pos.delta, -0.7550281733160843059, 1e-13, "iauFk524", "d1950"); vvd(r.pm.alpha, 0.2023628192747172486e-4, 1e-17, "iauFk524", "dr1950"); vvd(r.pm.delta, 0.3624459754935334718e-5, 1e-18, "iauFk524", "dd1950"); vvd(r.px, 0.1560079963299390241, 1e-13, "iauFk524", "p1950"); vvd(r.rv, 86.79606353469163751, 1e-11, "iauFk524", "v1950"); } /** ** - - - - - - - - ** t _ f k 5 4 z ** - - - - - - - - ** ** Test iauFk54z function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: iauFk54z, vvd ** ** This revision: 2018 December 6 */ @Test public void t_fk54z() { double r2000, d2000, bepoch; r2000 = 0.02719026625066316119; d2000 = -0.1115815170738754813; bepoch = 1954.677308160316374; CatalogCoords r = jauFk54z(r2000, d2000, bepoch); vvd(r.pos.alpha, 0.01602015588390065476, 1e-14, "iauFk54z", "r1950"); vvd(r.pos.delta, -0.1164397101110765346, 1e-13, "iauFk54z", "d1950"); vvd(r.pm.alpha, -0.1175712648471090704e-7, 1e-20, "iauFk54z", "dr1950"); vvd(r.pm.delta, 0.2108109051316431056e-7, 1e-20, "iauFk54z", "dd1950"); vvd(r.px, 0, 1e-13, "iauFk54z", "p1950"); vvd(r.rv, 0, 1e-11, "iauFk54z", "v1950"); } /** ** - - - - - - - - - ** t _ a t c c 1 3 ** - - - - - - - - - ** ** Test iauAtcc13 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: iauAtcc13, vvd ** ** This revision: 2021 April 18 */ @Test public void t_atcc13() { double rc, dc, pr, pd, px, rv, date1, date2; rc = 2.71; dc = 0.174; pr = 1e-5; pd = 5e-6; px = 0.1; rv = 55.0; date1 = 2456165.5; date2 = 0.401182685; SphericalCoordinate co = jauAtcc13(rc, dc, pr, pd, px, rv, date1, date2); vvd(co.alpha, 2.710126504531372384, 1e-12, "iauAtcc13", "ra"); vvd(co.delta, 0.1740632537628350152, 1e-12, "iauAtcc13", "da"); } /** ** - - - - - - - - ** t _ a t c c q ** - - - - - - - - ** ** Test iauAtccq function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: iauApcc13, iauAtccq, vvd ** ** This revision: 2021 April 18 */ @Test public void t_atccq() { double date1, date2, eo, rc, dc, pr, pd, px, rv; Astrom astrom = new Astrom(); date1 = 2456165.5; date2 = 0.401182685; eo = jauApci13(date1, date2, astrom); rc = 2.71; dc = 0.174; pr = 1e-5; pd = 5e-6; px = 0.1; rv = 55.0; SphericalCoordinate co = jauAtccq(rc, dc, pr, pd, px, rv, astrom); vvd(co.alpha, 2.710126504531372384, 1e-12, "iauAtccq", "ra"); vvd(co.delta, 0.1740632537628350152, 1e-12, "iauAtccq", "da"); } /** ** - - - - - - - - - ** t _ m o o n 9 8 ** - - - - - - - - - ** ** Test iauMoon98 function. ** ** Returned: ** status int FALSE = success, TRUE = fail ** ** Called: iauMoon98, vvd, viv ** ** This revision: 2021 April 12 */ @Test public void t_moon98() { double pv[][] = jauMoon98(2400000.5, 43999.9); vvd(pv[0][0], -0.2601295959971044180e-2, 1e-11, "iauMoon98", "x 4"); vvd(pv[0][1], 0.6139750944302742189e-3, 1e-11, "iauMoon98", "y 4"); vvd(pv[0][2], 0.2640794528229828909e-3, 1e-11, "iauMoon98", "z 4"); vvd(pv[1][0], -0.1244321506649895021e-3, 1e-11, "iauMoon98", "xd 4"); vvd(pv[1][1], -0.5219076942678119398e-3, 1e-11, "iauMoon98", "yd 4"); vvd(pv[1][2], -0.1716132214378462047e-3, 1e-11, "iauMoon98", "zd 4"); } //end of tests } /* * Copyright © 2018 Paul Harrison, University of Manchester. * * This JSOFA software is derived from the official C release of the "Standards Of Fundamental Astronomy" (SOFA) library * of the International Astronomical Union. The intention is to reproduce the functionality and algorithms of * the official SOFA library in a pure Java form. * * The responsibility for the maintenance and supply of the JSOFA library lies with the author (not the IAU SOFA Board), * However, The JSOFA software is provided "as is" and the author makes no warranty as to its use or performance. * The author does not and cannot warrant the performance or results which the user may obtain by using the JSOFA software. * The author makes no warranties, express or implied, as to non-infringement of third party rights, merchantability, * or fitness for any particular purpose. In no event will the author be liable to the user for any consequential, * incidental, or special damages, including any lost profits or lost savings, even if the author has been advised * of such damages, or for any claim by any third party. * * Other conditions of the original license (reproduced below) are carried over as applicable. */ /*---------------------------------------------------------------------- ** ** Copyright (C) 2018 ** Standards Of Fundamental Astronomy Board ** of the International Astronomical Union. ** ** ===================== ** SOFA Software License ** ===================== ** ** NOTICE TO USER: ** ** BY USING THIS SOFTWARE YOU ACCEPT THE FOLLOWING TERMS AND CONDITIONS ** WHICH APPLY TO ITS USE. ** ** 1. The Software is owned by the IAU SOFA Board ("SOFA"). ** ** 2. Permission is granted to anyone to use the SOFA software for any ** purpose, including commercial applications, free of charge and ** without payment of royalties, subject to the conditions and ** restrictions listed below. ** ** 3. You (the user) may copy and distribute SOFA source code to others, ** and use and adapt its code and algorithms in your own software, ** on a world-wide, royalty-free basis. That portion of your ** distribution that does not consist of intact and unchanged copies ** of SOFA source code files is a "derived work" that must comply ** with the following requirements: ** ** a) Your work shall be marked or carry a statement that it ** (i) uses routines and computations derived by you from ** software provided by SOFA under license to you; and ** (ii) does not itself constitute software provided by and/or ** endorsed by SOFA. ** ** b) The source code of your derived work must contain descriptions ** of how the derived work is based upon, contains and/or differs ** from the original SOFA software. ** ** c) The name(s) of all routine(s) in your derived work shall not ** include the prefix "iau". ** ** d) The origin of the SOFA components of your derived work must ** not be misrepresented; you must not claim that you wrote the ** original software, nor file a patent application for SOFA ** software or algorithms embedded in the SOFA software. ** ** e) These requirements must be reproduced intact in any source ** distribution and shall apply to anyone to whom you have ** granted a further right to modify the source code of your ** derived work. ** ** Note that, as originally distributed, the SOFA software is ** intended to be a definitive implementation of the IAU standards, ** and consequently third-party modifications are discouraged. All ** variations, no matter how minor, must be explicitly marked as ** such, as explained above. ** ** 4. In any published work or commercial products which includes ** results achieved by using the SOFA software, you shall ** acknowledge that the SOFA software was used in obtaining those ** results. ** ** 5. You shall not cause the SOFA software to be brought into ** disrepute, either by misuse, or use for inappropriate tasks, or ** by inappropriate modification. ** ** 6. The SOFA software is provided "as is" and SOFA makes no warranty ** as to its use or performance. SOFA does not and cannot warrant ** the performance or results which the user may obtain by using the ** SOFA software. SOFA makes no warranties, express or implied, as ** to non-infringement of third party rights, merchantability, or ** fitness for any particular purpose. In no event will SOFA be ** liable to the user for any consequential, incidental, or special ** damages, including any lost profits or lost savings, even if a ** SOFA representative has been advised of such damages, or for any ** claim by any third party. ** ** 7. The provision of any version of the SOFA software under the terms ** and conditions specified herein does not imply that future ** versions will also be made available under the same terms and ** conditions. ** ** Correspondence concerning SOFA software should be addressed as ** follows: ** ** By email: sofa@ukho.gov.uk ** By post: IAU SOFA Center ** HM Nautical Almanac Office ** UK Hydrographic Office ** Admiralty Way, Taunton ** Somerset, TA1 2DN ** United Kingdom ** **--------------------------------------------------------------------*/ /* * $Log$ */