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 はマイナス。バイナリのファイル名はバージョンによってまちまちだったりするみたい。

プログラム
参考

データ構造

ただし、バージョンによっては異なるかもしれない。 XXX = 405, 406 あたりを想定。

ヘッダ
  • 1行目
    • KSIZE=
      • レコードのワード数(バイナリファイルで使用)
    • NCOEFF=
      • 係数(coefficient)の数
  • GROUP 1010
    • タイトル
  • GROUP 1030
    • 対応する日時の範囲をユリウス日(前2つ)と刻み日数(後ろ)
  • GROUP 1040
    • 定数の数
    • 定数の名前の一覧(GROUP 1041と対応)
  • GROUP 1041
    • 定数の数
    • 定数の値の一覧(GROUP 1040と対応)
    • 数値は18桁の精度をもつ指数表記で記述されている。後述のテキストファイルも同様。倍精度浮動小数点数は約16桁の精度であるため、倍精度以上(ないしは有理数など)で値を解釈できればバイナリよりも高い精度の値が得られる。
  • 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 以降 - パディング領域
  • offset = 1 * 4 * KSIZE
    • 0x0000 (real64 * 400) - 定数の値
      • 400個分
    • 0x0C80 以降 - パディング領域

KSIZE のワードがレコードの単位になっており、ヘッダ部分で 2 つのレコードが使用されている。レコード単位になるようにヘッダの末尾にパディング領域がある。

定数の領域は 400 個分で固定されているようだ。定数領域において使われていない領域にデータが書きこまれているが、ゴミなのか不明。

  • offset = 2 * 4 * KSIZE
    • 0x0000 (real64 * NCONFF)

3 レコード目から係数が記述されている。係数の順番はテキストファイルと同じ。