Skip to content

Commit 5bdea3e

Browse files
Make all magnitude routines support vectors
1 parent dd9fe83 commit 5bdea3e

4 files changed

Lines changed: 64 additions & 25 deletions

File tree

CHANGELOG.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@ Changelog
55
.. TODO After finding how to test TIRS reference frame, add it to changelog.
66
And double-check the constellation boundaries array.
77
8+
v1.39 — ?
9+
---------
10+
11+
* The prototype :func:`~skyfield.magnitudelib.planetary_magnitude()`
12+
function now works not only when given a single position, but when
13+
given a vector of several positions.
14+
815
v1.38 — 2021 April 3
916
--------------------
1017

builders/build_magnitude_tests.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,6 @@ def main(argv):
3939
answer = fields[-1]
4040
tests[planet].append((args, answer))
4141

42-
# from pprint import pprint
43-
# pprint(tests)
44-
4542
for planet, test_list in sorted(tests.items()):
4643
if not test_list:
4744
continue
@@ -51,9 +48,6 @@ def main(argv):
5148
print(f' mag = m._{planet}_magnitude({joined})')
5249
print(f' assert abs({answer} - mag) < 0.0005')
5350

54-
if planet != 'venus':
55-
continue
56-
5751
print()
5852
print(' args = [')
5953
for arg_vector in zip(*[args for args, answer in test_list]):

skyfield/magnitudelib.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -99,23 +99,20 @@ def _earth_magnitude(r, delta, ph_ang):
9999
def _jupiter_magnitude(r, delta, ph_ang):
100100
distance_mag_factor = 5 * log10(r * delta)
101101
geocentric_phase_angle_limit = 12.0
102-
103-
if ph_ang <= geocentric_phase_angle_limit: # TODO: time arrays
104-
ph_ang_factor = -3.7E-04 * ph_ang + 6.16E-04 * ph_ang**2
105-
else:
106-
ph_ang_factor = -2.5 * log10(
107-
1.0 - 1.507 * (ph_ang / 180.)
108-
- 0.363 * (ph_ang / 180.)**2
109-
- 0.062 * (ph_ang / 180.)**3
110-
+ 2.809 * (ph_ang / 180.)**4
111-
- 1.876 * (ph_ang / 180.)**5
112-
)
113-
114-
if ph_ang <= geocentric_phase_angle_limit:
115-
ap_mag = -9.395 + distance_mag_factor + ph_ang_factor
116-
else:
117-
ap_mag = -9.428 + distance_mag_factor + ph_ang_factor
118-
102+
ph_ang_pi = ph_ang / 180.0
103+
ph_ang_factor = where(
104+
ph_ang <= geocentric_phase_angle_limit,
105+
(6.16E-04 * ph_ang - 3.7E-04) * ph_ang,
106+
-2.5 * log10(
107+
((((- 1.876 * ph_ang_pi + 2.809) * ph_ang_pi - 0.062) * ph_ang_pi
108+
- 0.363) * ph_ang_pi - 1.507) * ph_ang_pi + 1.0
109+
),
110+
)
111+
ap_mag = where(
112+
ph_ang <= geocentric_phase_angle_limit,
113+
-9.395 + distance_mag_factor + ph_ang_factor,
114+
-9.428 + distance_mag_factor + ph_ang_factor,
115+
)
119116
return ap_mag
120117

121118
def _uranus_magnitude(r, delta, ph_ang,
@@ -126,8 +123,11 @@ def _uranus_magnitude(r, delta, ph_ang,
126123
sub_lat_factor = -0.00084 * sub_lat_planetog
127124
geocentric_phase_angle_limit = 3.1
128125
ap_mag = -7.110 + distance_mag_factor + sub_lat_factor
129-
if ph_ang > geocentric_phase_angle_limit: # TODO: time arrays
130-
ap_mag += 6.587e-3 * ph_ang + 1.045e-4 * ph_ang**2
126+
ap_mag += where(
127+
ph_ang > geocentric_phase_angle_limit,
128+
(1.045e-4 * ph_ang + 6.587e-3) * ph_ang,
129+
0.0,
130+
)
131131
return ap_mag
132132

133133
_FUNCTIONS = {

skyfield/tests/test_magnitudes_raw.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@ def test_earth_magnitude_function():
1010
mag = m._earth_magnitude(0.983356467727, 0.62933287342927, 175.6869)
1111
assert abs(1.122 - mag) < 0.0005
1212

13+
args = [
14+
A[0.983331936476, 0.983356079811, 0.983356467727],
15+
A[1.41317594650699, 0.26526856764726, 0.62933287342927],
16+
A[8.7897, 4.1369, 175.6869],
17+
]
18+
magnitudes = m._earth_magnitude(*args)
19+
expected = [-3.269, -6.909, 1.122]
20+
assert all(magnitudes - expected < 0.0005)
21+
1322
def test_jupiter_magnitude_function():
1423
mag = m._jupiter_magnitude(5.446231815414, 6.44985867459088, 0.2446)
1524
assert abs(-1.667 - mag) < 0.0005
@@ -18,6 +27,15 @@ def test_jupiter_magnitude_function():
1827
mag = m._jupiter_magnitude(5.227587855371, 5.23501920009381, 147.0989)
1928
assert abs(0.790 - mag) < 0.0005
2029

30+
args = [
31+
A[5.446231815414, 4.957681473205, 5.227587855371],
32+
A[6.44985867459088, 3.95393078136013, 5.23501920009381],
33+
A[0.2446, 0.3431, 147.0989],
34+
]
35+
magnitudes = m._jupiter_magnitude(*args)
36+
expected = [-1.667, -2.934, 0.790]
37+
assert all(magnitudes - expected < 0.0005)
38+
2139
def test_mercury_magnitude_function():
2240
mag = m._mercury_magnitude(0.310295423552, 1.32182643625754, 1.1677)
2341
assert abs(-2.477 - mag) < 0.0005
@@ -26,6 +44,15 @@ def test_mercury_magnitude_function():
2644
mag = m._mercury_magnitude(0.448947624811, 0.56004973217883, 178.7284)
2745
assert abs(7.167 - mag) < 0.0005
2846

47+
args = [
48+
A[0.310295423552, 0.413629222334, 0.448947624811],
49+
A[1.32182643625754, 0.92644808718613, 0.56004973217883],
50+
A[1.1677, 90.1662, 178.7284],
51+
]
52+
magnitudes = m._mercury_magnitude(*args)
53+
expected = [-2.477, 0.181, 7.167]
54+
assert all(magnitudes - expected < 0.0005)
55+
2956
def test_uranus_magnitude_function():
3057
mag = m._uranus_magnitude(18.321003215845, 17.3229728525108, 0.0410, -20.29, -20.28)
3158
assert abs(5.381 - mag) < 0.0005
@@ -34,6 +61,17 @@ def test_uranus_magnitude_function():
3461
mag = m._uranus_magnitude(19.38003071775, 11.1884243801383, 161.7728, -71.16, 55.11)
3562
assert abs(8.318 - mag) < 0.0005
3663

64+
args = [
65+
A[18.321003215845, 20.096361095266, 19.38003071775],
66+
A[17.3229728525108, 21.0888470145276, 11.1884243801383],
67+
A[0.0410, 0.0568, 161.7728],
68+
A[-20.29, 1.02, -71.16],
69+
A[-20.28, 0.97, 55.11],
70+
]
71+
magnitudes = m._uranus_magnitude(*args)
72+
expected = [5.381, 6.025, 8.318]
73+
assert all(magnitudes - expected < 0.0005)
74+
3775
def test_venus_magnitude_function():
3876
mag = m._venus_magnitude(0.722722540169, 1.71607489554051, 1.3232)
3977
assert abs(-3.917 - mag) < 0.0005

0 commit comments

Comments
 (0)