注:对于时间系统的概念如儒略日等的介绍,请参考时间系统一文时间系统介绍-CSDN博客。
一、已知年月日,求儒略日
在1900年3月1日至2100年2月28间区间内,已会日期和时间求儒略日的公式为[1]:
式中,——只保留
的整数部分(即向零取整),如
。
二、已知儒略日,求年月日
寻找儒略日的过程在算法14中直接得到。但反之已知儒略日找到公历的日期也是必要的。第一步是通过确定一个时代的儒略年数来找到观测的年份。使用1900年作为起点(不是闰年),但是这个历元限制了算法有效的时间跨度(1900-2100)。算法如下[1]:
· Fortran程序
我这里使用vs code 里面的MinGW-w64带的gfortran编译器实现fortran代码的调试。详情可参见
VScode中配置使用fortran-CSDN博客以及https://www.cnblogs.com/luffeverne/p/14659752.html(这个参考的多)
注意:WIndows 选择这个版本 x86_64-win32-seh,Linux选择x86_64-posix-seh。
① main.f90函数(设置年月日时间等信息)
PROGRAM MainProgram
IMPLICIT NONE
INTEGER Year, Mon, Day, Hr, Min
DOUBLE PRECISION Sec, JD
Year = 1995 ! 设置相应的年月日时间值
Mon = 6
Day = 8
Hr = 20
Min = 18
Sec = 3.7036800
CALL JULIANDAY(Year, Mon, Day, Hr, Min, Sec, JD) !调用函数JULIANDAY做运算
! 输出结果
WRITE(*, *) "Calculation Result:"
WRITE(*, *) "Year: ", Year
WRITE(*, *) "Month: ", Mon
WRITE(*, *) "Day: ", Day
WRITE(*, *) "Hour: ", Hr
WRITE(*, *) "Minute: ", Min
WRITE(*, *) "Second: ", Sec
WRITE(*, *) "Julian Day: ", JD
END PROGRAM MainProgram
②JulianDay.f90函数
该文件包含两个子函数JULIANDAY与JULIANDAYALL。JULIANDAY子程序使用了儒略日的基本计算公式。根据给定的年、月、日、小时、分钟和秒钟,它将计算儒略日的值并存储在JD变量中。JULIANDAYALL子程序根据日历类型(WhichType)的不同,采用不同的计算公式来计算儒略日。如果日历类型是 'J',则使用儒略历的计算公式;如果是其他值,则使用格里高利历的计算公式。
儒略历中的普通一年有 365 天,分为12个月。每四年为一次闰年,二月是一年中的最后一个月,闰日是 2 月 24 日。
SUBROUTINE JULIANDAY ( Year,Mon,Day,Hr,Min, Sec, JD )
IMPLICIT NONE
INTEGER Year, Mon, Day, Hr, Min
DOUBLE PRECISION Sec , JD
! ------------------------ Implementation --------------------------
JD = 367.0D0 * Year - INT( (7* (Year+INT ( (Mon+9)/12) ) ) * 0.25D0 ) + &
INT( 275*Mon / 9 ) + Day + 1721013.5D0 + ( (Sec/60.0D0 + Min ) / 60.0D0 + Hr
)/ 24.0D0
RETURN
END
SUBROUTINE JULIANDAYALL( Year,Mon,Day,Hr,Min,Sec, WhichType, JD )
IMPLICIT NONE
INTEGER Year, Mon, Day, Hr, Min
CHARACTER WhichType
DOUBLE PRECISION Sec, JD
! ---------------------------- Locals -------------------------------
REAL*8 B !声明双精度实数类型
! ------------------------ Implementation --------------------------
IF ( Mon .le. 2 ) THEN
Year= Year - 1
Mon = Mon + 12
ENDIF
IF ( WhichType .eq. 'J' ) THEN
! -------- Use for Julian calender, every 4 years ---------
B= 0.0D0 !如果历法类型是儒略历,将变量 B 的值设为 0.0。
ELSE
! --------------------- Use for Gregorian -----------------
B= 2 - DINT(Year*0.01D0) + DINT(DINT(Year*0.01D0)*0.25D0)
ENDIF
JD= DINT( 365.25D0*(Year + 4716) ) + &
DINT( 30.6001D0*(Mon+1) ) + &
Day + B - 1524.5D0 + &
( (Sec/60.0D0 + Min ) / 60.0D0 + Hr ) / 24.0D0
RETURN
END
③launch.json文件(vs code配置调试器,用于支持在 VS Code 中调试 Fortran 代码)
{
"version": "0.0.1",
"configurations": [
{
"name": "Fortran Launch (GDB)",
"type": "cppdbg",
"request": "launch",
"targetArchitecture": "x86",
"program": "${workspaceRoot}\\${fileBasenameNoExtension}.exe",
"MIMode": "gdb",
"miDebuggerPath": "C:/environment/mingw64/bin/gdb.exe",//结合自己的路径!
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceRoot}",
"externalConsole": true,
"preLaunchTask": "gfortran"
},
{
"name": "Intel Debug Attach",
"type": "cppvsdbg",
"request": "attach",
"processId": "${command:pickProcess}"
}
] }
④tasks.json
{
"version": "2.0.0",
"command": "gfortran",
"args": [
"-g",
"${workspaceFolder}\\*.f90",
// 编译命令将会编译所有 .f90 文件,并生成与当前打开文件同名的可执行文件。若是单个文件,则为 "${file}",
"-o",
"${workspaceFolder}\\${fileBasenameNoExtension}.exe"
],
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "new",
"showReuseMessage": true,
"clear": false
}
}
⑤输出结果
在终端中编译并运行程序,并将输出重定向到一个文本文件。执行以下命令:
gfortran -o main.exe main.f90 JulianDay.f90
./main.exe > output.txt
将程序的输出结果保存到名为 output.txt 的文本文件中。
在 Visual Studio Code 中,打开 output.txt 文件以查看计算结果。
结果图如下:
参考文献
[1] Vallado, D.A. Fundamentals of Astrodynamies and Applicntions (4th,Edition),Micyocosm Press,2013;(非常推荐)
[2]《深空探测轨道设计与分析》赵瑞安著,中国宇航出版社;