天体の位置計算 – 地方恒星時の計算
「天球座標-恒星時」25頁
恒星時には真春分点を基準にした視恒星時、平均春分点を基準にした平均恒星時、本初子午線を基準としたグリニッジ恒星時に観測地点の経度を加えた地方恒星時があります。それぞれに計算方法がありますが、ここでは、地方恒星時を求めてみることにします。
計算例では、必要な数値をすべて時分秒に換算してから計算しています。また、グリニッジ視恒星時\(\theta_{0}\)が必要なので天体位置表から計算日における世界時0時のグリニッジ視恒星時:17h11m58s.714を求めています。現在は天体位置表や天文観測年表は絶版になっていますので、国立天文台天文情報センター暦計算室にある暦象年表や理科年表や天文年鑑を利用するとよいでしょう。おすすめは国立天文台です。
地方恒星時は以下の式で求めることができます。
\[\theta = \theta_{0} + \lambda + t_{1} + 補正値 \] \[\theta: 地方恒星時 \theta_{0}: グリニッジ視恒星時 \lambda: 観測値の経度 t_{1}: 経過時間\]Fortranによるコード
本来ならグリニッジ視恒星時を計算する必要があります。今回は、計算例や問題に示されているグリニッジ視恒星時を使用して計算することにします。グリニッジ視恒星時については、章動のところで求め、後にメインルーチンに反映させることにします。
▶メインルーチン pcc_lsdt.f90
program pcc_lsdt
use pcclib
implicit none
! 地点
character(21), parameter :: OBS_NAME = 'Tokyo Observatory PZT' ! 地点名
double precision, parameter :: OBS_LG(1:3) = (/9d0, 18d0, 9.936d0/) ! 経度
double precision, parameter :: OBS_LA(1:3) = (/35d0, 40d0, 20.707d0/) ! 緯度
double precision, parameter :: GAST(1:3) = (/17d0, 51d0, 24.267d0/)
! 検証用地点
! character(21), parameter :: OBS_NAME = "Tokyo Ngasawa" ! 地点名
! double precision, parameter :: OBS_LG(1:3) = (/9d0, 18d0, 7.573d0/) ! 経度
! double precision, parameter :: OBS_LA(1:3) = (/35d0, 47d0, 20.0d0/) ! 緯度
! double precision, parameter :: GAST(1:3) = (/17d0, 11d0, 58.714d0/)
double precision :: dy, dt, t, julian
double precision :: year, month, day, hour, minute, second
double precision :: gsdt, lsdt, long, cv
double precision :: sdt_hour, sdt_minute, sdt_second
double precision :: sdt(3), dtime(3)
character(255) :: dfmt
! 日付の入力
write(*,*)
write(*, fmt='(a)', advance='no') 'DATE AND TIME(JST)? '
read(*,*) dy, dt
! 日付と時刻を抽出
year = int(dy / 10000.0d0)
month = mod(int(dy / 100.0d0), 100)
day = mod(dy, 100.0d0)
hour = int(dt / 10000.0d0)
minute = mod(int(dt / 100.0d0), 100)
second = mod(dt, 100.0d0)
! ユリウス日の計算
julian = JulianDay(year, month, day)
julian = julian + (hour / 24d0 + minute / 1440d0 + second / 86400d0)
julian = julian - 0.375
! ユリウス日から年月日を求める
dtime = Julian2date(julian)
year = dtime(1)
month = dtime(2)
day = dtime(3)
! グリニッジ視恒星時を時の小数点に換算
gsdt = dms2deg(GAST(1), GAST(2), GAST(3))
! 経度を時の小数点に換算
long = dms2deg(OBS_LG(1), OBS_LG(2), OBS_LG(3))
! 世界0時からの経過時間を時の小数点に換算
hour = hour - 9d0;
t = dms2deg(hour, minute, second)
! 補正値の計算
cv = (hour * 3600d0 + minute * 60d0 + second) * 0.00273791d0
cv = cv / 3600d0
! 地方恒星時
lsdt = gsdt + long + t + cv
sdt = deg2dms(lsdt)
sdt_hour = sdt(1)
sdt_minute = sdt(2)
sdt_second = sdt(3)
! 恒星時が範囲を超えたときの処理
if (sdt_hour > 24d0) then
sdt_hour = sdt_hour - 24d0
end if
if (sdt_second >= 60d0) then
sdt_second = sdt_second - 60d0
sdt_minute = sdt_minute + 1d0
end if
if (sdt_minute == 60d0) then
sdt_minute = 0d0
sdt_hour = sdt_hour + 1d0
end if
if (sdt_hour == 24d0) then
sdt_hour = 0d0
end if
! 出力
dfmt = '(" ", i4, " ", i2, " ", f8.5, " ", f14.5, " ", i2, " ", i2, " ", f6.3)'
write(*, *)
write(*, *) 'Date/ Julian Date Local Sidereal Time'
write(*, *) '--------------------------------------------------------------'
write(*, *) ' h m s'
write(*, dfmt) int(year), int(month), day, julian, int(sdt_hour), int(sdt_minute), sdt_second
write(*, *)
stop
end program pcc_lsdt
コンパイル
gfortran pcc_lib.f90 pcc_lsdt.f90
実行
./a.out
実行結果
DATE AND TIME(JST)? 19780620,223217 Date/ Julian Date Local Sidereal Time -------------------------------------------------------------- h m s 1978 6 20.56409 2443680.06409 16 44 4.641
グリニッジ地方恒星時から地方恒星時を求める
「マイコン天文学Ⅰ」49頁に掲載されている式2-4-18を使っても求めることができます。
▶ サブルーチン localSDT
function localSDT(julian) result(lsdt)
! グリニッジ地方恒星時
! 「マイコン天文学Ⅰ」49頁 式2-4-18
double precision, parameter :: PI = 3.141592653589793238462643d0
double precision, parameter :: PI2 = 6.283185307179586476925287d0
double precision, intent(in) :: julian
double precision :: lsdt
lsdt = PI2 * Frc(0.7769194d0 + 1.002737909265d0 * (julian - 2415020.0d0))
end function LocalSDT
戻り値はラジアンですので、角度に換算し、経度を加算すれば、その地点の地方恒星時を求めることができます。こちらの方法では、グリニッジ視恒星時を使用しません。
▶ メインルーチン pcc_lsdt_2.f90
program pcc_lsdt_2
use pcclib
implicit none
! 地点
character(21), parameter :: OBS_NAME = 'Tokyo Observatory PZT' ! 地点名
double precision, parameter :: OBS_LG(1:3) = (/9d0, 18d0, 9.936d0/) ! 経度
double precision, parameter :: OBS_LA(1:3) = (/35d0, 40d0, 20.707d0/) ! 緯度
double precision, parameter :: GAST(1:3) = (/17d0, 51d0, 24.267d0/)
! 検証用地点
! character(21), parameter :: OBS_NAME = "Tokyo Ngasawa" ! 地点名
! double precision, parameter :: OBS_LG(1:3) = (/9d0, 18d0, 7.573d0/) ! 経度
! double precision, parameter :: OBS_LA(1:3) = (/35d0, 47d0, 20.0d0/) ! 緯度
! double precision, parameter :: GAST(1:3) = (/17d0, 11d0, 58.714d0/)
double precision :: dy, dt, t, julian
double precision :: year, month, day, hour, minute, second
double precision :: lsdt, lg
double precision :: sdt_hour, sdt_minute, sdt_second
double precision :: sdt(3), dtime(3)
character(255) :: dfmt
! 日付の入力
write(*,*)
write(*, fmt='(a)', advance='no') 'DATE AND TIME(JST)? '
read(*,*) dy, dt
! 日付と時刻を抽出
year = int(dy / 10000.0d0)
month = mod(int(dy / 100.0d0), 100)
day = mod(dy, 100.0d0)
hour = int(dt / 10000.0d0)
minute = mod(int(dt / 100.0d0), 100)
second = mod(dt, 100.0d0)
julian = JulianDay(year, month, day)
julian = julian + (hour / 24d0 + minute / 1440d0 + second / 86400d0)
julian = julian - 0.375
dtime = Julian2date(julian)
year = dtime(1)
month = dtime(2)
day = dtime(3)
! 地方恒星時の計算
lg = hms2deg(OBS_LG(1), OBS_LG(2), OBS_LG(3))
lsdt = rad2deg(localSDT(julian)) + lg
sdt = deg2hms(lsdt)
sdt_hour = sdt(1)
sdt_minute = sdt(2)
sdt_second = sdt(3)
! 恒星時が範囲を超えたときの処理
if (sdt_hour > 24d0) then
sdt_hour = sdt_hour - 24d0
end if
if (sdt_second >= 60d0) then
sdt_second = sdt_second - 60d0
sdt_minute = sdt_minute + 1d0
end if
if (sdt_minute == 60d0) then
sdt_minute = 0d0
sdt_hour = sdt_hour + 1d0
end if
if (sdt_hour == 24d0) then
sdt_hour = 0d0
end if
! 出力
dfmt = '(" ", i4, " ", i2, " ", f8.5, " ", f14.5, " ", i2, " ", i2, " ", f6.3)'
write(*, *)
write(*, *) 'Date/ Julian Date Local Sidereal Time'
write(*, *) '--------------------------------------------------------------'
write(*, *) ' h m s'
write(*, dfmt) int(year), int(month), day, julian, int(sdt_hour), int(sdt_minute), sdt_second
write(*, *)
stop
end program pcc_lsdt_2
実行結果
DATE AND TIME(JST)? 19780620,223217 Date/ Julian Date Local Sidereal Time -------------------------------------------------------------- h m s 1978 6 20.56409 2443680.06409 16 44 4.564