double palDat ( double dju ) { int iy; int im; int id; int status; double fd; double deltat; iauJd2cal( PAL__MJD0, dju, &iy, &im, &id, &fd ); status = iauDat( iy, im, id, fd, &deltat ); return deltat; }
int main() { int iy, im, id, ihour, imin, j, iymdf[4]; double d1, d2, sec, d, fd; printf("\n"); /* Date and time. */ iy = 2008; im = 2; id = 29; ihour = 23; imin = 59; sec = 59.9; printf ( "* Date and time. *\n" ); printf ( "%4d/%2.2d/%2.2d%3d:%2.2d:%4.1f\n", iy, im, id, ihour, imin, sec ); printf("\n"); /* Express as 2-part JD. */ j = iauCal2jd ( iy, im, id, &d1, &d2 ); if ( j ) return 1; j = iauTf2d ( '+', ihour, imin, sec, &d ); if ( j ) return 1; d2 += d; printf("* Express as 2-part JD. *\n"); printf ( "%9.1f +%13.6f =%15.6f\n", d1, d2, d1 + d2 ); printf("\n"); /* Express as calendar date and fraction of a day. */ j = iauJd2cal ( d1, d2, &iy, &im, &id, &fd ); if ( j ) return 1; d = ( (double) id ) + fd; printf("* Express as calendar date and fraction of a day. *\n"); printf ( "%4d/%2.2d/%9.6f\n", iy, im, d ); printf("\n"); /* Round to 0.001 day. */ j = iauJdcalf ( 3, d1, d2, iymdf ); printf("* Round to 0.001 day. *\n"); if ( j ) return 1; printf ( "%4d/%2.2d/%2.2d.%3.3d\n", iymdf[0], iymdf[1], iymdf[2], iymdf[3] ); }
int iauUt1utc(double ut11, double ut12, double dut1, double *utc1, double *utc2) /* ** - - - - - - - - - - ** i a u U t 1 u t c ** - - - - - - - - - - ** ** Time scale transformation: Universal Time, UT1, to Coordinated ** Universal Time, UTC. ** ** Status: canonical. ** ** Given: ** ut11,ut12 double UT1 as a 2-part Julian Date (Note 1) ** dut1 double Delta UT1: UT1-UTC in seconds (Note 2) ** ** Returned: ** utc1,utc2 double 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 iauD2dtf 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 iauDat for further details. ** ** Called: ** iauJd2cal JD to Gregorian calendar ** iauDat delta(AT) = TAI-UTC ** iauCal2jd 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) ** ** This revision: 2011 May 14 ** ** Original version 2012-03-01 ** ** Copyright (C) 2013 Naoki Arita. See notes at end. */ { int big1; int i, iy, im, id, js; 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 = ( ut11 >= 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; if ( iauJd2cal(d1, d2, &iy, &im, &id, &fd) ) return -1; js = iauDat(iy, im, id, 0.0, &dats2); if ( js < 0 ) return -1; if ( i == - 1 ) dats1 = dats2; ddats = dats2 - dats1; if ( fabs(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. */ if ( iauCal2jd(iy, im, id, &d1, &d2) ) return -1; 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; } /* Status. */ return js; /*---------------------------------------------------------------------- ** ** Celes is a wrapper of the SOFA Library for Ruby. ** ** This file is redistributed and relicensed in accordance with ** the SOFA Software License (http://www.iausofa.org/tandc.html). ** ** The original library is available from IAU Standards of ** Fundamental Astronomy (http://www.iausofa.org/). ** ** ** ** ** ** Copyright (C) 2013, Naoki Arita ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions ** are met: ** ** 1 Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** ** 2 Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** ** 3 Neither the name of the Standards Of Fundamental Astronomy Board, ** the International Astronomical Union nor the names of its ** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ** FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ** COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, ** BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ** ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ** POSSIBILITY OF SUCH DAMAGE. ** **--------------------------------------------------------------------*/ }
int iauDtf2d(const char *scale, int iy, int im, int id, int ihr, int imn, double sec, double *d1, double *d2) /* ** - - - - - - - - - ** i a u D t f 2 d ** - - - - - - - - - ** ** 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 part of the International Astronomical Union's ** SOFA (Standards of Fundamental Astronomy) software collection. ** ** Status: support function. ** ** Given: ** scale char[] time scale ID (Note 1) ** iy,im,id int year, month, day in Gregorian calendar (Note 2) ** ihr,imn int hour, minute ** sec double seconds ** ** Returned: ** d1,d2 double 2-part Julian Date (Notes 3,4) ** ** Returned (function value): ** int 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 ** ** This revision: 2013 July 26 ** ** SOFA release 2015-02-09 ** ** Copyright (C) 2015 IAU SOFA Board. See notes at end. */ { int js, iy2, im2, id2; double dj, w, day, seclim, dat0, dat12, dat24, dleap, time; /* Today's Julian Day Number. */ js = iauCal2jd(iy, im, id, &dj, &w); if ( js ) return js; dj += w; /* Day length and final minute length in seconds (provisional). */ day = DAYSEC; seclim = 60.0; /* Deal with the UTC leap second case. */ if ( ! strcmp(scale,"UTC") ) { /* TAI-UTC at 0h today. */ js = iauDat(iy, im, id, 0.0, &dat0); if ( js < 0 ) return js; /* TAI-UTC at 12h today (to detect drift). */ js = iauDat(iy, im, id, 0.5, &dat12); if ( js < 0 ) return js; /* TAI-UTC at 0h tomorrow (to detect jumps). */ js = iauJd2cal ( dj, 1.5, &iy2, &im2, &id2, &w); if ( js ) return js; js = iauDat(iy2, im2, id2, 0.0, &dat24); if ( js < 0 ) return js; /* 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 ) return js; /* The time in days. */ time = ( 60.0 * ( (double) ( 60 * ihr + imn ) ) + sec ) / day; /* Return the date and time. */ *d1 = dj; *d2 = time; /* Status. */ return js; /*---------------------------------------------------------------------- ** ** Copyright (C) 2015 ** 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: [email protected] ** By post: IAU SOFA Center ** HM Nautical Almanac Office ** UK Hydrographic Office ** Admiralty Way, Taunton ** Somerset, TA1 2DN ** United Kingdom ** **--------------------------------------------------------------------*/ }
int iauUtctai(double utc1, double utc2, double *tai1, double *tai2) /* ** - - - - - - - - - - ** i a u U t c t a i ** - - - - - - - - - - ** ** Time scale transformation: Coordinated Universal Time, UTC, to ** International Atomic Time, TAI. ** ** This function is part of the International Astronomical Union's ** SOFA (Standards of Fundamental Astronomy) software collection. ** ** Status: canonical. ** ** Given: ** utc1,utc2 double UTC as a 2-part quasi Julian Date (Notes 1-4) ** ** Returned: ** tai1,tai2 double 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 iauDat for further details. ** ** 4) The function iauDtf2d 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: ** iauJd2cal JD to Gregorian calendar ** iauDat delta(AT) = TAI-UTC ** iauCal2jd 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) ** ** This revision: 2010 September 10 ** ** SOFA release 2012-03-01 ** ** Copyright (C) 2012 IAU SOFA Board. See notes at end. ** */ { int big1; int iy, im, id, js, iyt, imt, idt; double u1, u2, fd, dats, fdt, datst, ddat, z1, z2, a2; /* Put the two parts of the UTC into big-first order. */ big1 = ( utc1 >= utc2 ); if ( big1 ) { u1 = utc1; u2 = utc2; } else { u1 = utc2; u2 = utc1; } /* Get TAI-UTC now. */ if ( iauJd2cal(u1, u2, &iy, &im, &id, &fd) ) return -1; js = iauDat(iy, im, id, fd, &dats); if ( js < 0 ) return -1; /* Get TAI-UTC tomorrow. */ if ( iauJd2cal(u1+1.5, u2-fd, &iyt, &imt, &idt, &fdt) ) return -1; js = iauDat(iyt, imt, idt, fdt, &datst); if ( js < 0 ) return -1; /* If today ends in a leap second, scale the fraction into SI days. */ ddat = datst - dats; if ( fabs(ddat) > 0.5 ) fd += fd * ddat / DAYSEC; /* Today's calendar date to 2-part JD. */ if ( iauCal2jd(iy, im, id, &z1, &z2) ) return -1; /* Assemble the TAI result, preserving the UTC split and order. */ a2 = z1 - u1; a2 += z2; a2 += fd + dats / DAYSEC; if ( big1 ) { *tai1 = u1; *tai2 = a2; } else { *tai1 = a2; *tai2 = u1; } /* Status. */ return js; /*---------------------------------------------------------------------- ** ** Copyright (C) 2012 ** 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: [email protected] ** By post: IAU SOFA Center ** HM Nautical Almanac Office ** UK Hydrographic Office ** Admiralty Way, Taunton ** Somerset, TA1 2DN ** United Kingdom ** **--------------------------------------------------------------------*/ }
int iauJdcalf(int ndp, double dj1, double dj2, int iymdf[4]) /* ** - - - - - - - - - - ** i a u J d c a l f ** - - - - - - - - - - ** ** Julian Date to Gregorian Calendar, expressed in a form convenient ** for formatting messages: rounded to a specified precision. ** ** Status: support function. ** ** Given: ** ndp int number of decimal places of days in fraction ** dj1,dj2 double dj1+dj2 = Julian Date (Note 1) ** ** Returned: ** iymdf int[4] year, month, day, fraction in Gregorian ** calendar ** ** Returned (function value): ** 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 iauJd2cal. ** ** 4) NDP should be 4 or less if internal overflows are to be ** avoided on machines which use 16-bit integers. ** ** Called: ** iauJd2cal JD to Gregorian calendar ** ** Reference: ** ** Explanatory Supplement to the Astronomical Almanac, ** P. Kenneth Seidelmann (ed), University Science Books (1992), ** Section 12.92 (p604). ** ** This revision: 2010 July 27 ** ** Original version 2012-03-01 ** ** Copyright (C) 2013 Naoki Arita. See notes at end. */ { int j, js; double denom, d1, d2, f1, f2, f; /* 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, and realign to midnight. */ if (dj1 >= dj2) { d1 = dj1; d2 = dj2; } else { d1 = dj2; d2 = dj1; } d2 -= 0.5; /* Separate days and fractions. */ f1 = fmod(d1, 1.0); f2 = fmod(d2, 1.0); d1 = floor(d1 - f1); d2 = floor(d2 - f2); /* Round the total fraction to the specified number of places. */ f = floor((f1+f2)*denom + 0.5) / denom; /* Re-assemble the rounded date and re-align to noon. */ d2 += f + 0.5; /* Convert to Gregorian calendar. */ js = iauJd2cal(d1, d2, &iymdf[0], &iymdf[1], &iymdf[2], &f); if (js == 0) { iymdf[3] = (int) (f * denom); } else { j = js; } /* Return the status. */ return j; /*---------------------------------------------------------------------- ** ** Celes is a wrapper of the SOFA Library for Ruby. ** ** This file is redistributed and relicensed in accordance with ** the SOFA Software License (http://www.iausofa.org/tandc.html). ** ** The original library is available from IAU Standards of ** Fundamental Astronomy (http://www.iausofa.org/). ** ** ** ** ** ** Copyright (C) 2013, Naoki Arita ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions ** are met: ** ** 1 Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** ** 2 Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** ** 3 Neither the name of the Standards Of Fundamental Astronomy Board, ** the International Astronomical Union nor the names of its ** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ** FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ** COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, ** BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ** ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ** POSSIBILITY OF SUCH DAMAGE. ** **--------------------------------------------------------------------*/ }
int iauJdcalf(int ndp, double dj1, double dj2, int iymdf[4]) /* ** - - - - - - - - - - ** i a u J d c a l f ** - - - - - - - - - - ** ** Julian Date to Gregorian Calendar, expressed in a form convenient ** for formatting messages: rounded to a specified precision. ** ** This function is part of the International Astronomical Union's ** SOFA (Standards Of Fundamental Astronomy) software collection. ** ** Status: support function. ** ** Given: ** ndp int number of decimal places of days in fraction ** dj1,dj2 double dj1+dj2 = Julian Date (Note 1) ** ** Returned: ** iymdf int[4] year, month, day, fraction in Gregorian ** calendar ** ** Returned (function value): ** 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 iauJd2cal. ** ** 4) NDP should be 4 or less if internal overflows are to be ** avoided on machines which use 16-bit integers. ** ** Called: ** iauJd2cal JD to Gregorian calendar ** ** Reference: ** ** Explanatory Supplement to the Astronomical Almanac, ** P. Kenneth Seidelmann (ed), University Science Books (1992), ** Section 12.92 (p604). ** ** This revision: 2013 June 18 ** ** SOFA release 2013-12-02 ** ** Copyright (C) 2013 IAU SOFA Board. See notes at end. */ { int j, js; double denom, d1, d2, f1, f2, f; /* 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, and realign to midnight. */ if (dj1 >= dj2) { d1 = dj1; d2 = dj2; } else { d1 = dj2; d2 = dj1; } d2 -= 0.5; /* Separate days and fractions. */ f1 = fmod(d1, 1.0); f2 = fmod(d2, 1.0); d1 = floor(d1 - f1); d2 = floor(d2 - f2); /* Round the total fraction to the specified number of places. */ f = floor((f1+f2)*denom + 0.5) / denom; /* Re-assemble the rounded date and re-align to noon. */ d2 += f + 0.5; /* Convert to Gregorian calendar. */ js = iauJd2cal(d1, d2, &iymdf[0], &iymdf[1], &iymdf[2], &f); if (js == 0) { iymdf[3] = (int) (f * denom); } else { j = js; } /* Return the status. */ return j; /*---------------------------------------------------------------------- ** ** Copyright (C) 2013 ** 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: [email protected] ** By post: IAU SOFA Center ** HM Nautical Almanac Office ** UK Hydrographic Office ** Admiralty Way, Taunton ** Somerset, TA1 2DN ** United Kingdom ** **--------------------------------------------------------------------*/ }
int iauUt1utc(double ut11, double ut12, double dut1, double *utc1, double *utc2) /* ** - - - - - - - - - - ** i a u U t 1 u t c ** - - - - - - - - - - ** ** Time scale transformation: Universal Time, UT1, to Coordinated ** Universal Time, UTC. ** ** This function is part of the International Astronomical Union's ** SOFA (Standards of Fundamental Astronomy) software collection. ** ** Status: canonical. ** ** Given: ** ut11,ut12 double UT1 as a 2-part Julian Date (Note 1) ** dut1 double Delta UT1: UT1-UTC in seconds (Note 2) ** ** Returned: ** utc1,utc2 double 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 iauD2dtf 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 or that are too far in the future ** to be trusted. See iauDat for further details. ** ** Called: ** iauJd2cal JD to Gregorian calendar ** iauDat delta(AT) = TAI-UTC ** iauCal2jd 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) ** ** This revision: 2013 June 18 ** ** SOFA release 2017-04-20 ** ** Copyright (C) 2017 IAU SOFA Board. See notes at end. */ { int big1; int i, iy, im, id, js; 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 = ( ut11 >= 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; if ( iauJd2cal(d1, d2, &iy, &im, &id, &fd) ) return -1; js = iauDat(iy, im, id, 0.0, &dats2); if ( js < 0 ) return -1; if ( i == - 1 ) dats1 = dats2; ddats = dats2 - dats1; if ( fabs(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. */ if ( iauCal2jd(iy, im, id, &d1, &d2) ) return -1; 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; } /* Status. */ return js; /*---------------------------------------------------------------------- ** ** Copyright (C) 2017 ** 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: [email protected] ** By post: IAU SOFA Center ** HM Nautical Almanac Office ** UK Hydrographic Office ** Admiralty Way, Taunton ** Somerset, TA1 2DN ** United Kingdom ** **--------------------------------------------------------------------*/ }