| 1 | #include "slalib.h"
|
|---|
| 2 | #include "slamac.h"
|
|---|
| 3 | void slaDjcal ( int ndp, double djm, int iymdf[4], int *j )
|
|---|
| 4 | /*
|
|---|
| 5 | ** - - - - - - - - -
|
|---|
| 6 | ** s l a D j c a l
|
|---|
| 7 | ** - - - - - - - - -
|
|---|
| 8 | **
|
|---|
| 9 | ** Modified Julian Date to Gregorian calendar, expressed
|
|---|
| 10 | ** in a form convenient for formatting messages (namely
|
|---|
| 11 | ** rounded to a specified precision, and with the fields
|
|---|
| 12 | ** stored in a single array).
|
|---|
| 13 | **
|
|---|
| 14 | ** Given:
|
|---|
| 15 | ** ndp int number of decimal places of days in fraction
|
|---|
| 16 | ** djm double Modified Julian Date (JD-2400000.5)
|
|---|
| 17 | **
|
|---|
| 18 | ** Returned:
|
|---|
| 19 | ** iymdf int[4] year, month, day, fraction in Gregorian calendar
|
|---|
| 20 | ** *j int status: nonzero = out of range
|
|---|
| 21 | **
|
|---|
| 22 | ** Any date after 4701BC March 1 is accepted.
|
|---|
| 23 | **
|
|---|
| 24 | ** Large ndp values risk internal overflows. It is typically safe
|
|---|
| 25 | ** to use up to ndp=4.
|
|---|
| 26 | **
|
|---|
| 27 | ** The algorithm is derived from that of Hatcher 1984 (QJRAS 25, 53-55).
|
|---|
| 28 | **
|
|---|
| 29 | ** Defined in slamac.h: dmod
|
|---|
| 30 | **
|
|---|
| 31 | ** Last revision: 17 August 1999
|
|---|
| 32 | **
|
|---|
| 33 | ** Copyright P.T.Wallace. All rights reserved.
|
|---|
| 34 | */
|
|---|
| 35 | {
|
|---|
| 36 | double fd, df, f, d;
|
|---|
| 37 | long jd, n4, nd10;
|
|---|
| 38 |
|
|---|
| 39 | /* Validate */
|
|---|
| 40 | if ( ( djm <= -2395520.0 ) || ( djm >= 1.0e9 ) ) {
|
|---|
| 41 | *j = - 1;
|
|---|
| 42 | return;
|
|---|
| 43 | } else {
|
|---|
| 44 |
|
|---|
| 45 | /* Denominator of fraction */
|
|---|
| 46 | fd = pow ( 10.0, (double) gmax ( ndp, 0 ) );
|
|---|
| 47 | fd = dnint ( fd );
|
|---|
| 48 |
|
|---|
| 49 | /* Round date and express in units of fraction */
|
|---|
| 50 | df = djm * fd;
|
|---|
| 51 | df = dnint ( df );
|
|---|
| 52 |
|
|---|
| 53 | /* Separate day and fraction */
|
|---|
| 54 | f = dmod ( df, fd );
|
|---|
| 55 | if ( f < 0.0 ) f += fd;
|
|---|
| 56 | d = ( df - f ) / fd;
|
|---|
| 57 |
|
|---|
| 58 | /* Express day in Gregorian calendar */
|
|---|
| 59 | jd = (long) dnint ( d ) + 2400001L;
|
|---|
| 60 | n4 = 4L * ( jd + ( ( 2L * ( ( 4L * jd - 17918L ) / 146097L)
|
|---|
| 61 | * 3L ) / 4L + 1L ) / 2L - 37L );
|
|---|
| 62 | nd10 = 10L * ( ( ( n4 - 237L ) % 1461L ) / 4L ) + 5L;
|
|---|
| 63 | iymdf[0] = (int) ( ( n4 / 1461L ) - 4712L );
|
|---|
| 64 | iymdf[1] = (int) ( ( ( nd10 / 306L + 2L ) % 12L ) + 1L );
|
|---|
| 65 | iymdf[2] = (int) ( ( nd10 % 306L ) / 10L + 1L );
|
|---|
| 66 | iymdf[3] = (int) dnint ( f );
|
|---|
| 67 | *j = 0;
|
|---|
| 68 | }
|
|---|
| 69 | }
|
|---|