astro/basic/sun_physical.go

53 lines
1.7 KiB
Go
Raw Normal View History

package basic
import (
"math"
. "b612.me/astro/tools"
)
const (
sunPhysicalInclinationDeg = 7.25
sunPhysicalKBaseDeg = 73.6667
sunPhysicalKRateDeg = 1.3958333
sunCarringtonStartJD = 2398220.0
sunCarringtonRotationDays = 25.38
sunPhysicalKEpochJD = 2396758.0
)
// SunPhysicalInfo 太阳物理观测参数 / physical observing parameters of the Sun.
type SunPhysicalInfo struct {
// P 太阳北极位置角,单位度 / position angle of the solar north pole in degrees.
P float64
// B0 日面中心太阳纬度,单位度 / heliographic latitude of the disk center in degrees.
B0 float64
// L0 日面中心卡林顿经度,单位度 / Carrington heliographic longitude of the disk center in degrees.
L0 float64
}
// SunPhysical 太阳物理观测参数 / physical observing parameters of the Sun.
func SunPhysical(jd float64) SunPhysicalInfo {
return SunPhysicalN(jd, -1)
}
// SunPhysicalN 太阳物理观测参数(截断版) / truncated physical observing parameters of the Sun.
func SunPhysicalN(jd float64, n int) SunPhysicalInfo {
lambda := HSunApparentLoN(jd, n)
epsilon := TrueObliquity(jd)
k := sunPhysicalKBaseDeg + sunPhysicalKRateDeg*(jd-sunPhysicalKEpochJD)/36525.0
theta := (jd - sunCarringtonStartJD) * 360.0 / sunCarringtonRotationDays
x := math.Atan(-Cos(lambda)*Tan(epsilon)) * 180.0 / math.Pi
y := math.Atan(-Cos(lambda-k)*Tan(sunPhysicalInclinationDeg)) * 180.0 / math.Pi
p := Limit360(x + y)
b0 := ArcSin(Sin(lambda-k) * Sin(sunPhysicalInclinationDeg))
eta := ArcTan2(-Sin(lambda-k)*Cos(sunPhysicalInclinationDeg), -Cos(lambda-k))
l0 := Limit360(eta - theta)
return SunPhysicalInfo{
P: p,
B0: b0,
L0: l0,
}
}