天体の位置計算 – 章動による赤経、赤緯の変化

「恒星位置のずれ-章動による赤経、赤緯の変化」56-66頁

章動は歳差と同じように自転軸が僅かに周期的に変化する運動のことをいいます。変動量は10″にも満たない量であり、あまり赤経や赤緯に大きななずれを与えるものではありません。ですが、グリニッジ視恒星時や視位置といった計算を行う場合は、必ず必要となってきます。計算量が多いのでコンピュータを使った計算向きといえます。「天体の位置計算 増補版」では、63頁から65頁にかけて章動表が掲載されています。長周期章動23項目、短周期章動が46項目となっていて、これらを計算することになります。

ただし、Sofa(Standars of Fundamental Astronomy)で公開されている章動表では「天体の位置計算 増補版」に掲載されているものよりも遥かに多い計算量となります。

計算式
計算は引数をあらかじめ求めておき、章動表を使って計算していきます。引数の計算桁数が多いため、10桁の関数電卓では不足します。関数付きではなくとも16桁の電卓が欲しいところです。電卓がなくても表計算ソフトがあれば下記のように計算することができます。表はダウンロードできるようにしていますので、どういった計算しているのか見てみるのもいいかもしれません。

#記号が表示されている箇所がありますが、単にセル幅が桁数に合ってないだけです。計算には差し支えありません。

 

時刻引数
1900年1月0日正午からの経過日数\(d\)および経過日数を36525単位としたものを求めます。

\[ \begin{eqnarray} d &=& JD – 2415020.0\\ t &=& (JD – 2415020.0) / 36525 \end{eqnarray} \]

引数
求めた値は360の整数倍を差し引いておきます。

\[ \begin{eqnarray} l &=& 296.104608 + 13.0649924465d + 6.890e^{-12}d^{2} + 29.5e^{-20}d^{3}\\ l^{‘} &=& 358.475833 + 0.9856002669d\,-\,0.112e^{-12}d^{2}\,-\,6.8e^{-20}d^{3}\\ F &=& 11.250889 + 13.2293504490d\,-\,2.407e^{-12}d^{2}\,-\,0.7e^{-20}d^{3}\\ D &=& 350.737486 + 12.1907491914d\,-\,1.076e^{-12}d^{2} + 3.9e^{-20}d^{3}\\ \Omega &=& 259.183275\,-\,0.0529539222d + 1.557e^{-12}d^{2} + 4.6e^{-20}d^{3} \end{eqnarray} \] \[ 引用元:「天体の位置計算 増補版」58頁 式3-16 \]

引数を求めたら、章動表の\(\Delta\phi, \Delta\epsilon\)を下記の式で項目ごとに求め、最後に総和をとることで章動値を求めることができます。

\[ \begin{array}{c|c|c} \hline 引\hspace{20pt}数& \Delta\phi& \Delta\epsilon\\ l\hspace{10pt}l^{‘}\hspace{10pt}F\hspace{10pt}D\hspace{10pt}\Omega & \sinの係数 & \cosの係数\\ \hline a\hspace{10pt}b\hspace{10pt}c\hspace{10pt}e\hspace{10pt}f & A & B\\ \hline \end{array} \] \[ \begin{eqnarray} \Delta\phiに対してA\sin(al + bl^{‘} + cF + eD + f\Omega)\\ \Delta\epsilonに対してA\cos(al + bl^{‘} + cF + eD + f\Omega) \end{eqnarray} \]

平均黄道傾斜角

\[ \epsilon = 84428.2584\,-\,46.8450t\,-\,0.005904t^{2} + 0.0018108t^{3} \]

方向余弦(\(L_{3},M_{3},N_{3}\))

\[ \begin{pmatrix} L_{3}\\ M_{3}\\ N_{3} \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0\\ 0 & \cos(\epsilon + \Delta\epsilon) & -\sin(\epsilon + \Delta\epsilon)\\ 0 & \sin(\epsilon + \Delta\epsilon) & \cos(\epsilon + \Delta\epsilon) \end{pmatrix} \] \[ \hspace{35pt}\times \begin{pmatrix} \cos\Delta\phi & -sin\Delta\phi & 0\\ \sin\Delta\phi & \cos\Delta\phi & 0\\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} 1 & 0 & 0\\ 0 & cos\,\epsilon & sin\,\epsilon\\ 0 & -\sin\epsilon & \cos\,\epsilon \end{pmatrix} \begin{pmatrix} L_{2}\\ M_{2}\\ N_{2} \end{pmatrix} \] \[ 引用元:「天体の位置計算 増補版」54頁 式3-17 \]

行列を展開した計算式は次のようになります。行列計算をサポートしていない電卓であれば、こちらを使って計算するとよいでしょう。

\[ \begin{eqnarray} L_{3} &=& \cos\Delta\phi L_{2}\,-\,\cos\,\epsilon\sin\Delta\phi M_{2}\,-\,\sin\,\epsilon\sin\Delta\phi N_{2}\\ M_{3} &=& \cos(\epsilon + \Delta\epsilon)\sin\Delta\phi L_{2} + \{\cos(\epsilon + \Delta\epsilon)\cos\,\epsilon\cos\Delta\phi + \sin(\epsilon + \Delta\epsilon)\sin\,\epsilon\}M_{2}\\ & & + \{\cos(\epsilon + \Delta\epsilon)\sin\,\epsilon\cos\Delta\phi\,-\,\sin(\epsilon + \Delta\epsilon)\cos\,\epsilon\}N_{2}\\ N_{3} &=& \sin(\epsilon + \Delta\epsilon)\sin\phi L_{2} + \{\sin(\epsilon + \Delta\epsilon)\cos\,\epsilon\cos\Delta\phi\,-\,\cos(\epsilon + \Delta\epsilon)\sin\,\epsilon \}M_{2}\\ & & + \{\sin(\epsilon + \Delta\epsilon)\sin\,\epsilon\cos\Delta\phi + \cos(\epsilon + \Delta\epsilon)\cos\,\epsilon\}N_{2} \end{eqnarray} \] \[ 引用元:「天体の位置計算 増補版」54頁 式3-18 \]

Fortranによるコード

サブルーチンは従来から2つに分けました。黄経の章動⊿φと黄道傾斜角の章動⊿εを求めるiauNut50と、章動計算するNutationです。こうしておくと、iauNut50からグリニッジ視恒星時の計算に必要な分点差Eqを求めることができます。

サブルーチン iauNut50

    function iauNut50(dt, t) result(eps)
    ! 章動の計算
    ! 「天体の位置計算 増補版」63-65頁

        double precision, intent(in) :: dt, t

        double precision :: xpl(69, 9)
        double precision :: arg, s, c, dt2, dt3
        double precision :: dp             ! 黄経の章動
        double precision :: de             ! 黄道傾斜角の章動
        double precision :: el             ! 月の平均近点角
        double precision :: elp            ! 太陽の平均近点角
        double precision :: f              ! 昇交点から測った月の平均黄経
        double precision :: d              ! 太陽と月の平均離角
        double precision :: om             ! 月の平均昇交点黄経
        double precision :: eps(2)
        integer :: i
 
        xpl( 1, 1:9) = (/ 0d0,  0d0,  0d0,  0d0,  1d0, -17.2327d0, -0.01737d0,  9.2100d0,  0.00091d0/)
        xpl( 2, 1:9) = (/ 0d0,  0d0,  2d0, -2d0,  2d0,  -1.2729d0, -0.00013d0,  0.5522d0, -0.00029d0/)
        xpl( 3, 1:9) = (/ 0d0,  0d0,  0d0,  0d0,  2d0,   0.2088d0,  0.00002d0, -0.0904d0,  0.00004d0/)
        xpl( 4, 1:9) = (/ 0d0,  1d0,  0d0,  0d0,  0d0,   0.1261d0, -0.00031d0,  0.0000d0,  0.00000d0/)
        xpl( 5, 1:9) = (/ 0d0,  1d0,  2d0, -2d0,  2d0,  -0.0497d0,  0.00012d0,  0.0216d0, -0.00006d0/)
        xpl( 6, 1:9) = (/ 0d0, -1d0,  2d0, -2d0,  2d0,   0.0214d0, -0.00005d0, -0.0093d0,  0.00003d0/)
        xpl( 7, 1:9) = (/ 0d0,  0d0,  2d0, -2d0,  1d0,   0.0124d0,  0.00001d0, -0.0066d0,  0.00000d0/)
        xpl( 8, 1:9) = (/-2d0,  0d0,  2d0,  0d0,  1d0,   0.0045d0,  0.00000d0, -0.0024d0,  0.00000d0/)
        xpl( 9, 1:9) = (/ 2d0,  0d0,  0d0, -2d0,  0d0,   0.0045d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(10, 1:9) = (/ 0d0,  0d0,  2d0, -2d0,  0d0,  -0.0021d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(11, 1:9) = (/ 0d0,  2d0,  0d0,  0d0,  0d0,   0.0016d0, -0.00001d0,  0.0000d0,  0.00000d0/)
        xpl(12, 1:9) = (/ 0d0,  2d0,  2d0, -2d0,  2d0,  -0.0015d0,  0.00001d0,  0.0007d0,  0.00000d0/)
        xpl(13, 1:9) = (/ 0d0,  1d0,  0d0,  0d0,  1d0,  -0.0015d0,  0.00000d0,  0.0008d0,  0.00000d0/)
        xpl(14, 1:9) = (/ 0d0, -1d0,  0d0,  0d0,  1d0,  -0.0010d0,  0.00000d0,  0.0005d0,  0.00000d0/)
        xpl(15, 1:9) = (/ 2d0,  0d0, -2d0,  0d0,  0d0,   0.0010d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(16, 1:9) = (/-2d0,  0d0,  0d0,  2d0,  1d0,  -0.0005d0,  0.00000d0,  0.0003d0,  0.00000d0/)
        xpl(17, 1:9) = (/ 0d0, -1d0,  2d0, -2d0,  1d0,  -0.0005d0,  0.00000d0,  0.0003d0,  0.00000d0/)
        xpl(18, 1:9) = (/ 0d0, -2d0,  2d0, -2d0,  1d0,  -0.0004d0,  0.00000d0,  0.0002d0,  0.00000d0/)
        xpl(19, 1:9) = (/ 2d0,  0d0,  0d0, -2d0,  1d0,   0.0004d0,  0.00000d0, -0.0002d0,  0.00000d0/)
        xpl(20, 1:9) = (/ 0d0,  1d0,  2d0, -2d0,  1d0,   0.0003d0,  0.00000d0, -0.0002d0,  0.00000d0/)
        xpl(21, 1:9) = (/-2d0,  0d0,  2d0,  0d0,  2d0,  -0.0003d0,  0.00000d0,  0.0002d0,  0.00000d0/)
        xpl(22, 1:9) = (/ 1d0,  0d0,  0d0, -1d0,  0d0,  -0.0003d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(23, 1:9) = (/ 1d0, -1d0,  0d0, -1d0,  0d0,  -0.0002d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(24, 1:9) = (/ 0d0,  0d0,  2d0,  0d0,  2d0,  -0.2037d0, -0.00002d0,  0.0884d0, -0.00005d0/)
        xpl(25, 1:9) = (/ 1d0,  0d0,  0d0,  0d0,  0d0,   0.0675d0,  0.00001d0,  0.0000d0,  0.00000d0/)
        xpl(26, 1:9) = (/ 0d0,  0d0,  2d0,  0d0,  1d0,  -0.0342d0, -0.00004d0,  0.0183d0,  0.00000d0/)
        xpl(27, 1:9) = (/ 1d0,  0d0,  2d0,  0d0,  2d0,  -0.0261d0,  0.00000d0,  0.0113d0, -0.00001d0/)
        xpl(28, 1:9) = (/ 1d0,  0d0,  0d0, -2d0,  0d0,  -0.0149d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(29, 1:9) = (/-1d0,  0d0,  2d0,  0d0,  2d0,   0.0114d0,  0.00000d0, -0.0050d0,  0.00000d0/)
        xpl(30, 1:9) = (/ 0d0,  0d0,  0d0,  2d0,  0d0,   0.0060d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(31, 1:9) = (/ 1d0,  0d0,  0d0,  0d0,  1d0,   0.0058d0,  0.00000d0, -0.0031d0,  0.00000d0/)
        xpl(32, 1:9) = (/-1d0,  0d0,  0d0,  0d0,  1d0,  -0.0057d0,  0.00000d0,  0.0030d0,  0.00000d0/)
        xpl(33, 1:9) = (/-1d0,  0d0,  2d0,  2d0,  2d0,  -0.0052d0,  0.00000d0,  0.0022d0,  0.00000d0/)
        xpl(34, 1:9) = (/ 1d0,  0d0,  2d0,  0d0,  1d0,  -0.0044d0,  0.00000d0,  0.0023d0,  0.00000d0/)
        xpl(35, 1:9) = (/ 0d0,  0d0,  2d0,  2d0,  2d0,  -0.0032d0,  0.00000d0,  0.0014d0,  0.00000d0/)
        xpl(36, 1:9) = (/ 2d0,  0d0,  0d0,  0d0,  0d0,   0.0028d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(37, 1:9) = (/ 1d0,  0d0,  2d0, -2d0,  2d0,   0.0026d0,  0.00000d0, -0.0011d0,  0.00000d0/)
        xpl(38, 1:9) = (/ 2d0,  0d0,  2d0,  0d0,  2d0,  -0.0026d0,  0.00000d0,  0.0011d0,  0.00000d0/)
        xpl(39, 1:9) = (/ 0d0,  0d0,  2d0,  0d0,  0d0,   0.0025d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(40, 1:9) = (/-1d0,  0d0,  2d0,  0d0,  1d0,   0.0019d0,  0.00000d0, -0.0010d0,  0.00000d0/)
        xpl(41, 1:9) = (/-1d0,  0d0,  0d0,  2d0,  1d0,   0.0014d0,  0.00000d0, -0.0007d0,  0.00000d0/)
        xpl(42, 1:9) = (/ 1d0,  0d0,  0d0, -2d0,  1d0,  -0.0013d0,  0.00000d0,  0.0007d0,  0.00000d0/)
        xpl(43, 1:9) = (/-1d0,  0d0,  2d0,  2d0,  1d0,  -0.0009d0,  0.00000d0,  0.0005d0,  0.00000d0/)
        xpl(44, 1:9) = (/ 1d0,  1d0,  0d0, -2d0,  0d0,  -0.0007d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(45, 1:9) = (/ 0d0,  1d0,  2d0,  0d0,  2d0,   0.0007d0,  0.00000d0, -0.0003d0,  0.00000d0/)
        xpl(46, 1:9) = (/ 1d0,  0d0,  0d0,  2d0,  0d0,   0.0006d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(47, 1:9) = (/ 0d0,  0d0,  0d0,  2d0,  1d0,  -0.0006d0,  0.00000d0,  0.0003d0,  0.00000d0/)
        xpl(48, 1:9) = (/ 0d0, -1d0,  2d0,  0d0,  2d0,  -0.0006d0,  0.00000d0,  0.0003d0,  0.00000d0/)
        xpl(49, 1:9) = (/ 1d0,  0d0,  2d0,  2d0,  2d0,  -0.0006d0,  0.00000d0,  0.0003d0,  0.00000d0/)
        xpl(50, 1:9) = (/ 2d0,  0d0,  2d0, -2d0,  2d0,   0.0006d0,  0.00000d0, -0.0002d0,  0.00000d0/)
        xpl(51, 1:9) = (/ 0d0,  0d0,  0d0, -2d0,  1d0,  -0.0005d0,  0.00000d0,  0.0003d0,  0.00000d0/)
        xpl(52, 1:9) = (/ 0d0,  0d0,  2d0,  2d0,  1d0,  -0.0005d0,  0.00000d0,  0.0003d0,  0.00000d0/)
        xpl(53, 1:9) = (/ 1d0,  0d0,  2d0, -2d0,  1d0,   0.0005d0,  0.00000d0, -0.0003d0,  0.00000d0/)
        xpl(54, 1:9) = (/ 0d0,  0d0,  0d0,  1d0,  0d0,  -0.0004d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(55, 1:9) = (/ 0d0,  1d0,  0d0, -2d0,  0d0,  -0.0004d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(56, 1:9) = (/ 1d0, -1d0,  0d0,  0d0,  0d0,   0.0004d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(57, 1:9) = (/ 1d0,  0d0, -2d0,  0d0,  0d0,   0.0004d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(58, 1:9) = (/ 2d0,  0d0,  2d0,  0d0,  1d0,  -0.0004d0,  0.00000d0,  0.0002d0,  0.00000d0/)
        xpl(59, 1:9) = (/ 1d0,  0d0,  2d0,  0d0,  0d0,   0.0003d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(60, 1:9) = (/ 1d0,  1d0,  0d0,  0d0,  0d0,  -0.0003d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(61, 1:9) = (/ 1d0, -1d0,  2d0,  0d0,  2d0,  -0.0003d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(62, 1:9) = (/-2d0,  0d0,  0d0,  0d0,  1d0,  -0.0002d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(63, 1:9) = (/-1d0,  0d0,  2d0, -2d0,  1d0,  -0.0002d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(64, 1:9) = (/ 2d0,  0d0,  0d0,  0d0,  1d0,   0.0002d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(65, 1:9) = (/-1d0, -1d0,  2d0,  2d0,  2d0,  -0.0002d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(66, 1:9) = (/ 0d0, -1d0,  2d0,  2d0,  2d0,  -0.0002d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(67, 1:9) = (/ 1d0,  0d0,  0d0,  0d0,  2d0,  -0.0002d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(68, 1:9) = (/ 1d0,  1d0,  2d0,  0d0,  2d0,   0.0002d0,  0.00000d0,  0.0000d0,  0.00000d0/)
        xpl(69, 1:9) = (/ 3d0,  0d0,  2d0,  0d0,  2d0,  -0.0002d0,  0.00000d0,  0.0000d0,  0.00000d0/)

        dt2 = dt * dt
        dt3 = dt2 * dt
        el  = 296.104608d0 + 13.0649924465d0 * dt + 6.890d-12 * dt2 + 2.95d-20 * dt3
        elp = 358.475833d0 +  0.9856002669d0 * dt - 0.112d-12 * dt2 - 6.80d-20 * dt3
        f   =  11.250889d0 + 13.2293504490d0 * dt - 2.407d-12 * dt2 - 0.70d-20 * dt3
        d   = 350.737486d0 + 12.1907491914d0 * dt - 1.076d-12 * dt2 + 3.90d-20 * dt3
        om  = 259.183275d0 -  0.0529539222d0 * dt + 1.557d-12 * dt2 + 4.60d-20 * dt3
        
        ! 360°の整数倍を差し引く
        el  = Mla2(el)
        elp = Mla2(elp)
        f   = Mla2(f)
        d   = Mla2(d) 
        om  = Mla2(om)

        ! Standards of Fundamental Astronomy
        ! http:!www.iausofa.org/2019_0722_C/CompleteList.html
        ! from nut80.c
        dp = 0d0
        de = 0d0
        do i = 1, 69
            arg = el * xpl(i, 1) + elp * xpl(i, 2) + f * xpl(i, 3) + d * xpl(i, 4) + om * xpl(i, 5)
            s = (xpl(i, 6) + (xpl(i, 7) * t))
            c = (xpl(i, 8) + (xpl(i, 9) * t))
            if (s /= 0d0) then
                 dp = dp + s * sin(deg2rad(arg))
            end if
            if (c /= 0d0) then
                de = de + c * cos(deg2rad(arg))
            end if
        end do
        ! end of nut80.c

        eps(1) = dp
        eps(2) = de
    end function iauNut50    

サブルーチン Nutation

    function Nutation(dt, t, ra, dc) result(star_position)
    ! 章動による赤経・赤緯の変化
    ! 「天体の位置計算 増補版」 58-66頁

        double precision, intent(in) :: dt
        double precision, intent(in) :: t
        double precision, intent(in) :: ra, dc

        double precision :: ecl, dp, de
        double precision:: star_position(3), eps(2)
        double precision :: l, m, n, l3, m3, n3
        double precision :: ma(3, 3), mb(3, 3), mc(3, 3), md(3, 1), me(3, 1)

        ! 章動の計算
        eps = iauNut50(dt, t)

        dp = deg2rad(eps(1) / 3600d0)
        de = deg2rad(eps(2) / 3600d0)

        ! 平均黄道傾斜角の計算(1950)
        ecl = deg2rad(iauMOE50(t))

        ! 赤経・赤緯から方向余弦を計算する
        l = cos(dc) * cos(ra)
        m = cos(dc) * sin(ra)
        n = sin(dc)

        ! 方向余弦の計算
        ma(1, 1:3) = (/1d0, 0d0,            0d0/)
        ma(2, 1:3) = (/0d0, cos(ecl + de), -sin(ecl + de)/)
        ma(3, 1:3) = (/0d0, sin(ecl + de),  cos(ecl + de)/)

        mb(1, 1:3) = (/cos(dp), -sin(dp), 0d0/)
        mb(2, 1:3) = (/sin(dp),  cos(dp), 0d0/)
        mb(3, 1:3) = (/0d0,      0d0,     1d0/)

        mc(1, 1:3) = (/1d0,  0d0,      0d0/)
        mc(2, 1:3) = (/0d0,  cos(ecl), sin(ecl)/)
        mc(3, 1:3) = (/0d0, -sin(ecl), cos(ecl)/)

        md(1, 1) = l
        md(2, 1) = m
        md(3, 1) = n

        me = matmul(matmul(ma, mb), matmul(mc, md))
        l3 = me(1, 1)
        m3 = me(2, 1)
        n3 = me(3, 1)

        star_position(1) = l3
        star_position(2) = m3
        star_position(3) = n3
    end function Nutation

メインルーチン pcc_nutation.f90

program pcc_nutation
    use pcclib

    implicit none

    ! 恒星データ
    character(16), parameter :: SNM = 'α CMa  Sirius  '              ! 恒星名
    double precision, parameter :: SRA(1:3) = (/6d0, 42d0, 56.714d0/)   ! 赤経
    double precision, parameter :: SDC(1:3) = (/-16d0, 38d0, 46.36d0/)  ! 赤緯
    double precision, parameter :: SRA_PROPER_MOTION = -0.03791d0     ! 赤経方向の固有運動量
    double precision, parameter :: SDC_PROPER_MOTION = -1.2114d0      ! 赤緯方向の固有運動量
    double precision, parameter :: SRV = -7.6d0                       ! 視線速度
    double precision, parameter :: SAP = 0.377d0                      ! 年周視差

    !検証用恒星データ
    ! character(16), parameter :: SNM = '61 Cyg          ';           ! 恒星名
    ! double precision, parameter :: SRA(1:3) = (/21d0, 4d0, 39.935d0/) ! 赤経
    ! double precision, parameter :: SDC(1:3) = (/38d0, 29d0, 59.10d0/) ! 赤緯
    ! double precision, parameter :: SRA_PROPER_MOTION = 0.35227d0    ! 赤経方向の固有運動量
    ! double precision, parameter :: SDC_PROPER_MOTION = 3.1847d0     ! 赤緯方向の固有運動量
    ! double precision, parameter :: SRV = -64.3d0                    ! 視線速度
    ! double precision, parameter :: SAP = 0.296d0                    ! 年周視差

    double precision :: dy, dt, julian, t, t0, t1
    double precision :: year, month, day, hour, minute, second
    double precision :: ra_proper_motion, dc_proper_motion
    double precision :: ra_deg, dc_deg, ra_rad, dc_rad, ap
    double precision :: ra_tmp, dc_tmp
    double precision :: l, m, n, ss, cc, tt
    double precision :: star_position(3)
    character(255) :: sfmt, dfmt
    character(1) :: sg, sgr

    ! 日付と時刻の入力
    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.375d0

    ! 1959年ベッセル年初からの経過年数
    t = BesselianYear(julian)
    t = t * 100d0

    ! 固有運動補正
    ra_rad = deg2rad(hms2deg(SRA(1), SRA(2), SRA(3)))
    dc_rad = deg2rad(dms2deg(SDC(1), SDC(2),SDC(3)))
    ra_proper_motion = SRA_PROPER_MOTION / 3600d0 * 15d0;
    dc_proper_motion = SDC_PROPER_MOTION / 3600d0;
    ap = deg2rad(SAP / 3600d0)
    star_position =  ProperMotion(t, ra_rad, dc_rad, ra_proper_motion, dc_proper_motion, ap, SRV)
    l = star_position(1)
    m = star_position(2)
    n = star_position(3)

    ! 固有運動の方向余弦から赤経・赤緯に換算する
    ss = m
    cc = l
    tt = Quadrant(ss, cc)
    ra_deg = rad2deg(tt)
    dc_deg = rad2deg(asin(n))

    ! 歳差による赤経・赤緯の変化
    t = t / 100d0
    ra_rad = deg2rad(ra_deg)
    dc_rad = deg2rad(dc_deg)
    star_position = Precession(t, ra_rad, dc_rad);
    l = star_position(1)
    m = star_position(2)
    n = star_position(3)

    ! 歳差の方向余弦から赤経・赤緯の計算
    ss = m
    cc = l
    tt = quadrant(ss, cc);
    ra_deg = rad2deg(tt);
    dc_deg = rad2deg(asin(n));
    ra_tmp = ra_deg
    dc_tmp = dc_deg

    ! 章動補正
    t0 = julian - 2415020d0
    t1 = t0 / 36525d0
    ra_rad = deg2rad(ra_deg)
    dc_rad = deg2rad(dc_deg)
    star_position = Nutation(t0, t1, ra_rad, dc_rad)
    l = star_position(1)
    m = star_position(2)
    n = star_position(3)

    ! 章動の方向余弦から赤経・赤緯の計算
    ss = m
    cc = l
    tt = quadrant(ss, cc);
    ra_deg = rad2deg(tt);
    dc_deg = rad2deg(asin(n));

    sgr = '+'
    if (SDC(1) < 0.0d0) then
        sgr = '-'
    end if
    sg = '+'
    if (dc_deg < 0.0d0) then
        sg = '-'
    end if

    ! 出力
    ! 角度の譚雨を表す°記号は出力に合わせて調整すること
    sfmt = '(i4, "年 ", i2, "月 ", i2, "日 ", i2, "時 ", i2, "分 ", i2, "秒 (JST)")'
    dfmt = '(a16, "        ", f10.6, "    ", a1, f9.6, "        ", f10.6, "     ", a1, f9.6)'
    write(*, *)
    write(*, sfmt) int(year), int(month), int(day), int(hour), int(minute), int(second)
    write(*, '("Julian Date = ", f14.5, " UTC")') julian
    write(*, *)
    write(*, *) '星名                   赤経α (歳差補正) 赤緯δ          赤経α (章動補正) 赤緯δ'
    write(*, *) '--------------------------------------------------------------------------------'
    write(*, *) '                         。           。                。             。'
    write(*, dfmt) SNM, ra_tmp, sgr, abs(dc_tmp), ra_deg, sg, abs(dc_deg)
    write(*, *)

    stop
end program pcc_nutation

コンパイル

gfortran pcc_lib.f90 pcc_nutation.f90

実行

./a.out

実行結果

DATE AND TIME(JST) ? 19781010,203500

1978年 10月 10日 20時 35分  0秒 (JST)
Julian Date =  2443791.98264 UTC

 星名                   赤経α (歳差補正) 赤緯δ          赤経α (章動補正) 赤緯δ
 --------------------------------------------------------------------------------
                           。           。                。             。
α CMa  Sirius          101.053151    -16.686164        101.052835     -16.688532