Who am I

我的照片
Hefei, Anhui, China
Research Fields: Satellite Geodesy

2013年1月17日星期四

DE405星历计算天体位置和速度

按照如下步骤根据DE405天文星历计算天体的位置和速度:

1. 下载DE405星历数据和官方程序

fortran文件夹里下载程序,ascii文件夹里下载星历数据。

2.  合并数据文件
在dos下: copy header.405+ascp2000.405+ascp2020.405 infile.405
在Unix下:cat header.405 ascp2000.405 ascp2020.405 > infile.405

3.  将合并后的数据文件转化为二进制文件
利用CV Fortran 编译asc2eph.f文件(由于源程序是用Fortran 77写的,以及平台差异,在Ubuntu编译或运行该程序时可以会有错误,但在CV Fortran下测试没有问题), 生成asc2eph.exe文件,在dos下运行命令:asc2eph < infile.405. 运行的结果会生成二进制文件JPLEPH.

4.  测试源程序(testeph.f)
官方提供了testeph.f程序,测试源程序文件是否正确执行。在测试前需要将该程序文件中的部分参数赋值,具体如下:
在子程序FSIZER3中,将NRECL设为4,将NAMFIL设为JPLEPH,将KSIZE设为2036.在子程序STATE中,将语句CALL FSIZER3取消注释。保存修改后的程序。
继续在CV Fortran下编译程序testeph.f,生成可执行文件testeph.exe
进入dos下,执行命令:testeph < testpo.405
输出结果是一系列常用参数,以及和标准比较的结果,其中对应difference的位置数据全是E-13量级,此时表示程序运行正确;否则会出现"warning: next difference >= ..."字样,此时需要继续修改程序。

5. 将testeph.f文件中子程序“FSIZER3”以下所有的子程序拷贝到'selcon.f文件中',并接下来准备在该文件前编写主函数。

6. 编写主函数
如果要计算星体的位置和速度主要是调用PLEPH函数:
PLEPH(JUD,NTARG,NCTR,R),其中
输入参数为:JUD 儒略日; NTARG 目标星体的编号(参考函数说明);NCTR 中心星体的编号; 
返回参数为:R(6),R(1:3)目标星体的位置(直角坐标),R(4:6)目标星体的速度。
默认结果的单位时AU.

注: 由于编译环境的差别,源程序在Ubuntu下不一定能编译成功,但在CV Fortran下编译没有问题。


GPS时转化为儒略日

GOCE PKI轨道的历元信息是用GPS时来表示的,如何将这些以秒为单位的GPS时转换成儒略日呢?以下将介绍一个简单的方法。

GPS时间系统的原点是1980年1月6日0时,对应的儒略日JUT0:
JUT0=2444244.5;

设GPS时为941068840.82s,则其相对GPS时间原点的间隔d为:
d=941068840.82/86400.0;

对应的JUT为:
JUT=JUT0+941068840.82/86400.


2013年1月11日星期五

fortran中字符和数字之间的相互转换

fortran中自带的ichar和char函数只能处理单个字符和数字之间的转化,在实际应用中经常会遇到多个字符和多位数字之间的转换,如:
  • 字符串'500' 转换为整型500;
  • 整型500转换为字符型'500';
  • 浮点型500.00转换为字符型;
1. 字符型转换为整型
例:'500'----->500
character(len=30) :: a
integer b
a='500'
read(a,*)b
write(*,'(I3)')b

2. 字符型转化为浮点型
例:'500.00'---->500.00
character(len=30) :: a
real b
a='500.00' 
read(a,*)b
write(*,'(F6.2)')b

3. 整型转换为字符型
例:500----->'500'
character(len=3) :: a
integer b
b=500
write(a,'(I3)')b
write(*,*)a

4. 浮点型转换为字符型
例:500.13----->'500.13'
character(len=6) :: a
real b
b=500.13
write(a,'(F6.2)')b
write(*,*)a