JPL DE/LE のファイル構造
JPL DE/LE
JPL のエフェメリス。混乱してきたので記事としてまとめる。
- ダウンロードサイト
- ヘッダ
- ascii/deXXX/header.XXX
- Linux/deXXX/header.XXX
- テキスト形式
- ascii/deXXX/ascSYYYY.XXX
- バイナリ形式
- Linux/deXXX/lnxYYYY.XXX
XXX は DE のバージョン。 405, 406 など。 YYYY は西暦。 S は符号のことで p がプラスで m はマイナス。バイナリのファイル名はバージョンによってまちまちだったりするみたい。
プログラム
- 本家
- JPL天文暦CD-ROM(DE200/405/406)版を"C"で読む
- DE405/406 アクセスライブラリ
参考
- 天文プログラミング
データ構造
ただし、バージョンによっては異なるかもしれない。 XXX = 405, 406 あたりを想定。
ヘッダ
- 1行目
- KSIZE=
- レコードのワード数(バイナリファイルで使用)
- NCOEFF=
- 係数(coefficient)の数
- KSIZE=
- GROUP 1010
- タイトル
- GROUP 1030
- 対応する日時の範囲をユリウス日(前2つ)と刻み日数(後ろ)
- GROUP 1040
- 定数の数
- 定数の名前の一覧(GROUP 1041と対応)
- GROUP 1041
- GROUP 1050
- GROPU 1070
- ヘッダ終了。データ部のはじまり(とみなす)
# header.405 GROUP 1030 2305424.50 2525008.50 32. GROUP 1050 3 171 231 309 342 366 387 405 423 441 753 819 899 14 10 13 11 8 7 6 6 6 13 11 10 10 4 2 2 1 1 1 1 1 1 8 2 4 4
となっているとき、この DE は 305424.5 から 2525008.5 までに対応しており、全区間を 32.0 日ごとのレコードに区切られ、その区間ごとにデータが記述されていることを意味している。水星のオフセットは 3 で、 14 個の係数からなり、 4 個の副区間に分かれている(すなわち 32.0 / 4 = 8.0 日ごとの補間係数が4つ含まれている)。
テキストファイル
- 1 行目
- データのインデックスと係数の数
- インデックスはそのファイルにおけるものなのであまり意味はない
- 2 行目以降((係数の数 / 3.0).ceil 行だけ)
- 係数
- 以下繰り返し
係数の最初の 2 つはその区間における開始日時と終了日時がユリウス日。
水星のデータが 3 つ目(=ヘッダで読み取ったオフセット)から始まる。水星に関する値は係数の数= 14 、副区間= 4 だったとき以下のような順で記述されている。
start, final, # 開始日時と終了日時 x0, x1, x2, ..., x13, # 水星の x 座標に関する係数 y0, y1, y2, ..., y13, # y 座標に関する係数 z0, z1, z2, ..., z13, # z 座標に関する係数 x0, x1, x2, ..., x13, # 水星の 2 つ目のサブ区間 : : z0, z1, z2, ..., z13, # 水星の 4 つ目のサブ区間 x0, x1, x2, ..., x9, # ここから金星のデータ : :
なお、日月惑星は直交座標 x, y, z に関する係数、章動は Δψ, Δε に関する係数で章動のみ 2 要素。秤動はオイラー角の 3 つの角度に関する係数。
バイナリファイル
Linux 用バイナリはリトルエンディアン。整数(32ビット)と浮動小数点数(64ビット)が影響を受ける。
KSIZE が埋め込まれていないので別途与えるか、ヘッダを参照する必要がある。
- offset = 0 * 4 * KSIZE
- 0x0000 (char * 84 * 3) - タイトル
- 1行=84文字として3行分
- 0x00FC (char * 6 * 400) - 定数名
- 1つ=6文字として400個分
- 0x0A5C (real64 * 2) - 開始日時と終了日時(ユリウス日)
- 0x0A6C (real64 * 1) - 刻み日数
- 0x0A74 (int32 * 1) - 定数の数
- 0x0A78 (real64 * 1) - 天文単位 au
- 0x0A80 (real64 * 1) - 地球と月の質量比 emrat
- 0x0A88 (int32 * 3 * 12) - 日月惑星と章動のオフセット等
- 水星のオフセット、係数の数、副区間の数、金星のオフセット、……
- 0x0B18 (int32 * 1) - DE のバージョン
- 0x0B1C (int32 * 3 * 1) - 秤動のオフセット等
- 秤動のオフセット、係数の数、副区間の数
- 0x0B28 以降 - パディング領域
- 0x0000 (char * 84 * 3) - タイトル
- offset = 1 * 4 * KSIZE
- 0x0000 (real64 * 400) - 定数の値
- 400個分
- 0x0C80 以降 - パディング領域
- 0x0000 (real64 * 400) - 定数の値
KSIZE のワードがレコードの単位になっており、ヘッダ部分で 2 つのレコードが使用されている。レコード単位になるようにヘッダの末尾にパディング領域がある。
定数の領域は 400 個分で固定されているようだ。定数領域において使われていない領域にデータが書きこまれているが、ゴミなのか不明。
- offset = 2 * 4 * KSIZE
- 0x0000 (real64 * NCONFF)
3 レコード目から係数が記述されている。係数の順番はテキストファイルと同じ。