JPL の天体暦 DE405/DE406 のバイナリ形式ファイル de405.unx, de406.unx を読み出し、惑星と月の位置・速度を出力します。 また、コマンドラインから呼び出すサンプルも含まれています。 なお、JPL の天体暦配布サイトに置かれている C のリーダは、バイナリ形式の データファイルを扱うことができません。
FreeBSD/i386 (LE/32bit) と MacOS X の gcc (BE/32bit), LSI-C 86 3.30 試食版 (LE/16bit) などで動作確認をしていますが、 他のプラットフォームでも若干の修正で動くと思います。
アーカイブを展開して、作成されたディレクトリ内で make すると de405 という実行形式ができます。
% ./de405 -f <DEファイル> <時刻(ユリウス日)> <天体番号>
とすると6つのフィールドが出力されます。前の三つが位置、後の三つが速度 です。座標系は太陽系重心を原点とする J2000.0 の地球赤道座標で、単位は それぞれ (km) (km/day) です。
testeph.c は天体暦に付属のテストプログラム testeph.f に相当するテスト プログラムです。Makefile の変数 `DE405' に、ファイル de40[56].unx があるディレクトリを指定し、
% make test DE405=<somewhere>
すると、ファイルとプログラムのテストを行います。 利用環境下でコンパイルされたコードが正しく動作しているかどうかを 確認することができます。
de405.c, de405.h には 天体暦読みだしのための API が入っており、適当なプログラムに組み込んで 使うことができます。
名前 de405_open, de405_close, de405_ephem - JPL 天体暦 DE405/406 読みだし関数 書式 DE405 *de405_open(const char *path); void de405_close(DE405 *hp); int de405_ephem(DE405 *hp, double jd, int n, double position[3], double velocity[3]); 説明 de405_openは ファイル名を指定して天体暦ファイルを開き、DE405 構造体のポインタに結びつけます。戻り値のポインタは、 de405_ephem, de405_close の引数になります。 de405_close は DE405 構造体 hp に割り当てられたファイルハンド ルを閉じ、メモリブロックを開放します。 de405_ephem は DE405 構造体に結びつけられた天体暦ファイルのデー タを用いて、指定時刻における天体の位置と速度を計算します。引数 の説明は以下の通りです。 DE405 *hp ..... DE405 構造体へのポインタ。 double jd ..... ユリウス日であらわした TDB (太陽系力学時)。 int n ......... 天体もしくは計算対象を表す番号。 0 : 水星 1 : 金星 2 : 地球・月系の重心 3 : 火星 4 : 木星 5 : 土星 6 : 天王星 7 : 海王星 8 : 冥王星 9 : 月 (地心に対する) 10: 太陽 11: 章動 12: 月の秤動 double position[3] .. 位置 (km)。太陽系重心を原点とする J2000.0 の地球の平均赤道座標に対する値が格納されます。 位置情報が不要なときは NULL を指定することも可。 n に 9 (月)を指定したときは、地球の中心を原点とする J2000.0分 点の赤道座標値が格納されます。 n に 11 (章動) を指定したときは ΔψとΔε (ラジアン) が格納されます。また、position[2] にはゼロが入ります。 n に 12 (月の秤動) を指定したときは、オイラー角 (ラジアン) が格納されます。 double velocity[3] ... 速度 (km/day) 。J2000.0の地球の平均赤道 座標に対する値。速度情報が不要のときは NULL を指定する ことも可。n に 11 (章動) 、12 (月の秤動)を指定したとき も、position[3]の各要素の時間微分値が格納されます。 戻り値 de405_open は、ファイルのオープンに失敗したり、天体暦ファイル の書式に問題が認められたときは NULL を戻します。 de405_ephem は、関数の成功時にはゼロを返します。ファイルからの レコードの読みだしに失敗したり、引数の範囲エラーが検出されたと きには -1 を返します。 エラー [EINVAL] 引数の範囲エラー。 [EFTYPE] ファイル内容の異常。 APIが失敗すると、 errno には、ライブラリ関数が設定したエラーコー ドまたは上の二つのコードが設定されます。 EFTYPE の存在しないプ ラットフォームではどちらのケースでも EINVAL がセットされます。