详解JPL星历表
JPL历表结构(以DE405为例)
header.405
KSIZE
应该是一个读取的缓冲区的大小,取值与NCOEFF有关,具体就是NCOEFF的2倍,根据历表的不同而不同。
比如DE200取1652,DE405取2036,DE406取1456等。
实际在程序中KSIZE
与RECL
有关,RECL
是Fortran OPEN语句中的参数,即设置每一模块的读取分区长度,不同编译器使用的单位不同,有Bytes
和single precision words
之分,两者相差4倍。
一般来说是使用Bytes
作为单位。
在实际使用的时候我们会调用FSIZER3
函数,这个函数会调用KSIZE
来计算RECL
,即IRECSZ=NRECL*KSIZE
下面请看程序注释:
1 | C 1) The parameter RECL in the OPEN statement is the number of units per |
NCOEFF
NCOEFF(Number of Coefficients)
,一个数据块中包含的切比雪夫多项式系数的个数
GROUP 1010
包含历表名称和版本
起始历元和终止历元,两者均有儒略历和公历的表示
GROUP 1030
包含起始历元和终止历元的儒略日,以及数据文件中每个数据块的时间跨度
GROUP 1040
数字表示历表使用的常数个数
其余文字即常数名称
GROUP 1041
给出相对应GROUP 1040 位置的历表常数的数据
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 |
其中水星、金星、地月系统、火星、木星、土星、天王星、海王星、冥王星、月球、太阳的参数为XYZ三轴的数据;章动包含两个角度数据:黄经章动和交角章动;天平动包含三个欧拉角数据:
下面以水星的数据索引 3、14、4为例讲解:
- 第一项的3表示水星的数据从数据块内第三个数据开始
- 第二项的14表示切比雪夫多项式的系数个数,即水星的XYZ轴每个轴使用14个系数表示
- 第三项的4表示划分的子数据块个数,就是
(171-3)/14/3
,其中的每个子数据块就包含了14+14+14=42
个系数,分别对应XYZ轴
某数据块内水星子块的各个数据的含义如下表所示:
GROUP 1070
可以看到这个下面没东西,不是文件坏了。JPL希望你在用他的程序的时候,先把几个文件合并起来,把header放在第一个,就相当于合并完之后,GROUP 1070下面包含的是真正的天体数据。
ascp****.405(以ascp2020.405为例)
一个ascp****.405
文件称为一个数据文件,DE历表由若干个数据文件构成,而每个数据文件又由若干个数据块构成。在时间上前后相邻的2个数据文件中,前一个数据文件的最后一个数据块,与后一个数据文件的第一个数据块是完全一样的,为重复数据块。
比如ascp2020.405
由229个数据块构成,每个数据块的时间跨度为32天,下面我们以其中的第一个数据块为例讲解。
第一行我们可以看到1 1018
,这表明了数据块的序号和包含系数的个数,即第1个数据块共包含1018个系数,与header中NCOEFF注明的个数相同
之后就是系数部分,前两个系数为数据块的起始历元和终止历元,在我们的例子中是0.245883250000000000D+07 0.245886450000000000D+07
,即公元2019年12月15日00:00:00
到公元2020年1月16日00:00:00
的数据
从后面的系数开始,就对应着header中索引的数据了。