-
Notifications
You must be signed in to change notification settings - Fork 81
/
cat_gsoc2020.xml
461 lines (360 loc) · 83.5 KB
/
cat_gsoc2020.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Universe OpenAstronomy (Posts about gsoc2020)</title><link>http://openastronomy.org/Universe_OA/</link><description></description><atom:link href="http://openastronomy.org/Universe_OA/categories/cat_gsoc2020.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><lastBuildDate>Wed, 29 May 2024 01:03:44 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>This is an end of an era</title><link>http://openastronomy.org/Universe_OA/posts/2020/08/20200831_0900_meuge/</link><dc:creator>Meuge</dc:creator><description><p>Contributing to Poliastro has been an incredible experience for me. Since it was the first time, I've participated in GSOC. And the first time I've ever approached to package dedicated to problems arising in Astrodynamics and Orbital Mechanics. Being part of Poliastro was an exciting challenge that I had to surmount and also an unbelievable opportunity to learn about Space, Math and Physics.</p>
<p><img alt="era" src="https://media.giphy.com/media/Vekuh5ATS6oXPVsij7/giphy.gif"></p>
<p>With the thorough knowledge learned, and the feedback from JuanLu and Jorge, I was able to overcome every challenge in my Poliastro's journey. As I had said when I had the opportunity, I am grateful to both of my mentors who accepted me to be part of this exceptional community. :)</p>
<!-- TEASER_END -->
<p><img alt="wall-e" src="https://media.giphy.com/media/2uFLqNEmuOW08/giphy.gif"></p>
<h2>Git-log</h2>
<p>What we have achieved in the past three months:</p>
<ul>
<li><a href="https://github.com/poliastro/poliastro/pulls?q=is%3Apr+author%3A%40me+is%3Aclosed">#965 Stationary and Synchronous Orbit Implementation</a></li>
<li><a href="https://github.com/poliastro/poliastro/pull/969"># 969 Fix for the flaky Horizon Test</a></li>
<li><a href="https://github.com/poliastro/poliastro/pulls?q=is%3Apr+author%3A%40me+is%3Aclosed">#970 Earth Satellite Implementation …</a></li></ul></description><category>poliastro</category><guid>http://openastronomy.org/Universe_OA/posts/2020/08/20200831_0900_meuge/</guid><pubDate>Mon, 31 Aug 2020 08:00:00 GMT</pubDate></item><item><title>GSoC 2020: Blog 5 - Adding Kerr Null Geodesics functionality to EinsteinPy</title><link>http://openastronomy.org/Universe_OA/posts/2020/08/20200830_1733_jes24/</link><dc:creator>Jyotirmaya Shivottam</dc:creator><description><p>Null Geodesics functionality has been implemented into EinsteinPy, with PR<a href="https://github.com/einsteinpy/einsteinpy/pull/527">#527</a>, having been merged 🎉🎉. I apologize for no blogs in the past 3 weeks. There was a COVID situation here, that required multiple tests and isolation and all that it entails. This led to me foregoing an entire week. And, when that had settled, I had to take the call on abandoning the plan of numerically integrating the Geodesics equations, due to the massive error accumulation, as discussed in my last blog. A confusing fact about that, was that <em>Mathematica</em> could still keep the error build-up to a minimum, while <em>Python</em> simply could not, even with adaptive and symplectic schemes. But the symplectic schemes did bring the error down, by around 2 orders of magnitude, which gave me the idea to take a Hamiltonian approach, which would increase the number of ODEs to solve, but drop the order by 1. And, as it turns out, the Kerr Hamiltonian is separable (Carter, 1968a [1]), which makes the implementation even simpler. In this blog, I will be discussing this approach, which has finally led to proper geodesic calculations. I have also included some plots (and a cool animation) for Kerr &amp; Schwarzschild Null-like (and Time-like) geodesics.</p>
<h3>
<!-- TEASER_END -->
<a href="http://openastronomy.org/Universe_OA/posts/2020/08/20200830_1733_jes24/#some-physics" class="anchor">
</a>
Some Physics...
</h3>
<p>In Chapter 33 of <em>Gravitation</em> [2], the authors expound on Carter's seminal paper from 1968, titled, "<em>Global Structure of the Kerr Family of Gravitational Fields</em>", and present some nice results from it, one of which is a derivation of the Kerr (super-)Hamiltonian, which can be written as follows (in the <em>M</em>-Unit system (
<span class="katex-element">
<span class="katex"><span class="katex-mathml">G=c=M=1G = c = M = 1</span><span class="katex-html">
<span class="base"><span class="strut"></span><span class="mord mathdefault">G</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span>
<span class="base"><span class="strut"></span><span class="mord mathdefault">c</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span>
<span class="base"><span class="strut"></span><span class="mord mathdefault">M</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span>
<span class="base"><span class="strut"></span><span class="mord">1</span></span>
</span>
</span>
</span>
):<br>
</p>
<div class="katex-element">
<span class="katex-display"><span class="katex"><span class="katex-mathml">H=−(a4(E2−2pr2)−8aELr−2r(pθ2(−2+r)+pr2(−2+r)2r−E2r3)+a2(2L2−2pθ2−4pr2(−2+r)r+E2r(2+3r))+(a2+(−2+r)r)(a2E2cos2θ−2L2cscθ2)4(a2+(−2+r)r)(r2+a2cosθ2))
\mathcal{H} = -\frac{(a^4 (E^2 - 2 p_r^2) - 8 a E L r - 2 r (p_\theta^2 (-2 + r) + p_r^2 (-2 + r)^2 r - E^2 r^3) + a^2 (2 L^2 - 2 p_\theta^2 - 4 p_r^2 (-2 + r) r + E^2 r (2 + 3 r)) + (a^2 + (-2 + r) r) (a^2 E^2 \cos 2\theta - 2 L^2 \csc\theta^2)}{4 (a^2 + (-2 + r) r) (r^2 + a^2 \cos\theta^2))}
</span><span class="katex-html"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathcal">H</span></span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">−</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="mord"><span class="mord">4</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span>
<span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span><span class="mopen">(</span><span class="mord">−</span><span class="mord">2</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span><span class="mord mathdefault">r</span><span class="mclose">)</span><span class="mord mathdefault">r</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">r</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace"></span><span class="mop">cos</span><span class="mspace"></span><span class="mord"><span class="mord mathdefault">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mclose">)</span></span></span><span><span class="pstrut"></span><span class="frac-line"></span></span><span><span class="pstrut"></span><span class="mord"><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">4</span>
</span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">E</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace"></span><span class="mbin">−</span><span class="mspace"></span><span class="mord">2</span><span class="mord"><span class="mord mathdefault">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">r</span></span></span><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">−</span><span class="mspace"></span><span class="mord">8</span><span class="mord mathdefault">a</span><span class="mord mathdefault">E</span><span class="mord mathdefault">L</span><span class="mord mathdefault">r</span><span class="mspace"></span><span class="mbin">−</span><span class="mspace"></span><span class="mord">2</span><span class="mord mathdefault">r</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">θ</span></span></span><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">−</span><span class="mord">2</span>
<span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span><span class="mord mathdefault">r</span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span><span class="mord"><span class="mord mathdefault">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">r</span></span></span><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">−</span><span class="mord">2</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span><span class="mord mathdefault">r</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mord mathdefault">r</span><span class="mspace"></span><span class="mbin">−</span><span class="mspace"></span><span class="mord"><span class="mord mathdefault">E</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span>
<span class="mord"><span class="mord mathdefault">r</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">2</span><span class="mord"><span class="mord mathdefault">L</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span>
<span class="mspace"></span><span class="mbin">−</span><span class="mspace"></span><span class="mord">2</span><span class="mord"><span class="mord mathdefault">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">θ</span></span></span><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist"><span></span></span></span></span></span></span><span class="mspace"></span><span class="mbin">−</span><span class="mspace"></span><span class="mord">4</span><span class="mord"><span class="mord mathdefault">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">r</span></span></span><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span>
<span class="vlist-r"><span class="vlist"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">−</span><span class="mord">2</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span><span class="mord mathdefault">r</span><span class="mclose">)</span><span class="mord mathdefault">r</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span><span class="mord"><span class="mord mathdefault">E</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mord mathdefault">r</span><span class="mopen">(</span><span class="mord">2</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span><span class="mord">3</span><span class="mord mathdefault">r</span><span class="mclose">)</span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace"></span><span class="mbin">+</span>
<span class="mspace"></span><span class="mopen">(</span><span class="mord">−</span><span class="mord">2</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span><span class="mord mathdefault">r</span><span class="mclose">)</span><span class="mord mathdefault">r</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">E</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace"></span><span class="mop">cos</span><span class="mspace"></span>
<span class="mord">2</span><span class="mord mathdefault">θ</span><span class="mspace"></span><span class="mbin">−</span><span class="mspace"></span><span class="mord">2</span><span class="mord"><span class="mord mathdefault">L</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace"></span><span class="mop">csc</span><span class="mspace"></span><span class="mord"><span class="mord mathdefault">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span>
</div>
<br>
where,
<span class="katex-element">
<span class="katex"><span class="katex-mathml">E=−ptE = -p_t </span><span class="katex-html"><span class="base"><span class="strut"></span><span class="mord mathdefault">E</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">−</span><span class="mord"><span class="mord mathdefault">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist"><span></span></span></span></span></span></span></span></span></span>
</span>
and
<span class="katex-element">
<span class="katex"><span class="katex-mathml">L=pϕL = p_\phi </span><span class="katex-html"><span class="base"><span class="strut"></span><span class="mord mathdefault">L</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathdefault">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">ϕ</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist"><span></span></span></span></span></span></span></span></span></span>
</span>
are the energy and orbital angular momentum of the test particle, respectively. Note that, this Hamiltonian is for a general test particle, i.e., it can be massive or massless. Then, the dynamical equations of motion can be derived easily, using Hamilton's principle, i.e.:<br>
<div class="katex-element">
<span class="katex-display"><span class="katex"><span class="katex-mathml">dqidλ=∂H∂pidpidλ=−∂H∂qi
\frac{\mathrm{d}q_i}{\mathrm{d}\lambda} = \frac{\partial\mathcal{H}}{\partial p_i} \quad
\frac{\mathrm{d}p_i}{\mathrm{d}\lambda} = -\frac{\partial\mathcal{H}}{\partial q_i}
</span><span class="katex-html"><span class="base"><span class="strut"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="mord"><span class="mord"><span class="mord mathrm">d</span></span><span class="mord mathdefault">λ</span></span></span><span><span class="pstrut"></span><span class="frac-line"></span></span><span><span class="pstrut"></span><span class="mord"><span class="mord"><span class="mord mathrm">d</span></span><span class="mord"><span class="mord mathdefault">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span>
<span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="mord"><span class="mord">∂</span><span class="mord"><span class="mord mathdefault">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist"><span></span></span></span></span></span></span></span></span><span><span class="pstrut"></span><span class="frac-line"></span></span><span><span class="pstrut"></span><span class="mord"><span class="mord">∂</span><span class="mord"><span class="mord mathcal">H</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="mord"><span class="mord"><span class="mord mathrm">d</span></span>
<span class="mord mathdefault">λ</span></span></span><span><span class="pstrut"></span><span class="frac-line"></span></span><span><span class="pstrut"></span><span class="mord"><span class="mord"><span class="mord mathrm">d</span></span><span class="mord"><span class="mord mathdefault">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace"></span>
<span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">−</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="mord"><span class="mord">∂</span><span class="mord"><span class="mord mathdefault">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist"><span></span></span></span></span></span></span></span></span><span><span class="pstrut"></span><span class="frac-line"></span></span><span><span class="pstrut"></span><span class="mord"><span class="mord">∂</span><span class="mord"><span class="mord mathcal">H</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span>
</div>
<br>
I calculated these in <em>Mathematica</em>, and the corresponding notebooks and the Python code, making use of these, can be accessed <a href="https://github.com/einsteinpy/GSoC-2020/tree/master/Code">here</a>.
<h3>
<a href="http://openastronomy.org/Universe_OA/posts/2020/08/20200830_1733_jes24/#and-some-plots" class="anchor">
</a>
...and some plots
</h3>
<p>Unfortunately, even with these first order ODEs, the error accumulation issue in Python persisted, as can be observed in the plots below. Note that, these results were obtained with a symplectic leapfrog solver, which should, in principal keep the error build-up to a minimum.</p>
<p>
<a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vO8CNKzj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bb7nxgooagbji7pd99ho.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vO8CNKzj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bb7nxgooagbji7pd99ho.png" alt="Python 1"></a>Kerr Null-like Escape
<br>
Although, for shorter integration durations, the results were good.
</p>
<img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dfQOcrwn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/o6czz4tal0iteqtjjgsz.png" alt="Python 2">Kerr Null-like Capture
<p>After discussions with my mentors, I looked into other languages, that could help and we chose Julia, due to its excellent <a href="https://diffeq.sciml.ai/stable/">DifferentialEquations.jl</a> suite and "closeness" with Python. Another key bit is that, the <em>HamiltonianProblem</em> type, offered by <a href="https://github.com/SciML/DiffEqPhysics.jl"><em>DiffEqPhysics</em></a>, immensely simplifies the process of solving the system, as it uses Forward Mode Automatic Differentiation to automatically calculate the partial derivatives from the Hamiltonian. The separable nature of the Hamiltonian helps here. Considering all this, I implemented a module in Julia and voilà, the results are accurate, even for some quirky geodesics.</p>
<p>
<a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u-loUOA9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nnl1x4g39gtzesaw1467.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u-loUOA9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nnl1x4g39gtzesaw1467.png" alt="Python 1"></a>Kerr Null-like Capture (Plotted using `Plots.jl`)
<br>
<a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4oaFkUBn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oc2qagahf0htkhr1w5pr.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4oaFkUBn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oc2qagahf0htkhr1w5pr.png" alt="Python 2"></a>Schwarzschild Whirl (Plotted using `Plots.jl`)
</p>
<p>Now came the problem of integrating the Julia code with EinsteinPy, for which I looked towards <em>PyJulia</em>. However, it has some issues with <a href="https://pyjulia.readthedocs.io/en/latest/troubleshooting.html">installation on *nix systems</a>. So, I opted to write my own wrapper, using Python's <code>subprocess</code>. and, with the help of my GSoC mentor, Shreyas, packaged the Julia module and the Python wrapper into what is now <a href="https://github.com/einsteinpy/einsteinpy-geodesics"><code>einsteinpy_geodesics</code></a>, an add-on module to EinsteinPy. </p>
<div class="ltag-github-readme-tag">
<div class="readme-overview">
<h3>
<img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo">
<a href="https://github.com/einsteinpy">
einsteinpy
</a> / <a href="https://github.com/einsteinpy/einsteinpy-geodesics">
einsteinpy-geodesics
</a>
</h3>
<h4>
Python wrapper for a Julia solver for geodesics in the Kerr family of spacetimes. Maintainer : <a class="comment-mentioned-user" href="https://dev.to/jes24">@jes24</a>
</h4>
</div>
<div class="ltag-github-body">
<div id="readme" class="rst">
<a href="https://einsteinpy.org/" rel="nofollow"><img alt="EinsteinPy Logo" src="https://camo.githubusercontent.com/fa1ddad33fe74cb5404a0a7e4d1520c905fe001e/68747470733a2f2f626c6f672e65696e737465696e70792e6f72672f696d672f6c6f676f2e706e67"></a>
<div class="table-wrapper-paragraph"><table>
<tbody>
<tr>
<th>Name:</th>
<td>EinsteinPy Geodesics</td>
</tr>
<tr>
<th>Website:</th>
<td><a href="https://docs.geodesics.einsteinpy.org/en/latest/" rel="nofollow">https://docs.geodesics.einsteinpy.org/en/latest/</a></td>
</tr>
<tr>
<th>Version:</th>
<td>0.2.dev0</td>
</tr>
</tbody>
</table></div>
<p><a href="https://groups.io/g/einsteinpy-dev" rel="nofollow"><img alt="mailing" src="https://camo.githubusercontent.com/d2a43e78ff011f2098aa9d07daf700dcdac6a0d2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d61696c696e672532306c6973742d67726f7570732e696f2d3863626364312e7376673f7374796c653d666c61742d737175617265"></a> <a href="https://gitter.im/EinsteinPy-Project/EinsteinPy?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge" rel="nofollow"><img alt="Join the chat at https://gitter.im/EinsteinPy-Project/EinsteinPy" src="https://camo.githubusercontent.com/679ce20047cd21814c1f6b30c9e2837a298e8a86/68747470733a2f2f696d672e736869656c64732e696f2f6769747465722f726f6f6d2f45696e737465696e50792d50726f6a6563742f45696e737465696e50792e7376673f6c6f676f3d676974746572267374796c653d666c61742d737175617265"></a> <a href="https://riot.im/app/#/room/#einsteinpy:matrix.org" rel="nofollow"><img alt="riotchat" src="https://camo.githubusercontent.com/785902ae1e56239d1c3c9de820f88701f095ab2d/68747470733a2f2f696d672e736869656c64732e696f2f6d61747269782f65696e737465696e70793a6d61747269782e6f72672e7376673f6c6f676f3d72696f74267374796c653d666c61742d737175617265"></a> <a href="https://github.com/einsteinpy/einsteinpy-geodesics/blob/master/COPYING"><img alt="license" src="https://camo.githubusercontent.com/4b5966a2a252ee0f241a1e03b13417178eb4964f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e7376673f7374796c653d666c61742d737175617265"></a> <a href="https://docs.geodesics.einsteinpy.org/en/latest/" rel="nofollow"><img alt="docs" src="https://camo.githubusercontent.com/dcb95bea2239d0bafb19511c244e34a567619e66/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646f63732d6c61746573742d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265"></a></p>
<p>EinsteinPy Geodesics is an addon package for EinsteinPy, that wraps over Julia's
excellent <a href="https://diffeq.sciml.ai/stable/" rel="nofollow">DifferentialEquations.jl</a>
suite and provides a python interface to solve for geodesics in Kerr &amp; Schwarzschild spacetime
<a href="https://einsteinpy.org/" rel="nofollow">EinsteinPy</a> is an open source pure Python package, dedicated to problems arising
in General Relativity and Gravitational Physics
As with EinsteinPy, EinsteinPy Geodesics is released under the MIT license.</p>
<h3>
Documentation</h3>
<p><a href="https://docs.geodesics.einsteinpy.org/en/latest/" rel="nofollow"><img alt="docs" src="https://camo.githubusercontent.com/dcb95bea2239d0bafb19511c244e34a567619e66/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646f63732d6c61746573742d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265"></a></p>
<p>Complete documentation for this module can be accessed at <a href="https://docs.geodesics.einsteinpy.org/en/latest/" rel="nofollow">https://docs.geodesics.einsteinpy.org/en/latest/</a> (Courtesy: <a href="https://readthedocs.org/" rel="nofollow">Read the Docs</a>).</p>
<h3>
Requirements</h3>
<p>EinsteinPy Geodesics requires Python &gt;= 3.7, Julia &gt;= 1.5 and the following Julia packages:</p>
<ul>
<li>
<dl>
<dt>Julia</dt>
<dd>
<ul>
<li>DifferentialEquations.jl &gt;= 6.15</li>
<li>ODEInterfaceDiffEq.jl &gt;= 3.7</li>
</ul>
</dd>
</dl>
</li>
</ul>
<h3>
Installation</h3>
<p>First, ensure that, Julia is installed in your system and added to PATH. See <a href="https://julialang.org/downloads/platform/" rel="nofollow">https://julialang.org/downloads/platform/</a>
for platform specific binaries and installation instructions. einsteinpy_geodesics also requires DifferentialEquations.jl
and ODEInterfaceDiffEq.jl. You can add them, like so:</p>
<pre>$ julia
julia&gt; using Pkg
julia&gt; Pkg.add("DifferentialEquations")
julia&gt; Pkg.add("ODEInterfaceDiffEq")
</pre>
<p>Finally, einsteinpy_geodesics can…</p>
</div>
</div>
<div class="gh-btn-container"><a class="gh-btn" href="https://github.com/einsteinpy/einsteinpy-geodesics">View on GitHub</a></div>
</div>
<p>On top of this, I also overhauled the geodesic plotting module and added support for 3D animations, parametric plots and choice of spatial coordinates in 2D plots, in both <code>Static</code> and <code>Interactive</code> modes (that use <code>matplotlib</code> and <code>plotly</code> respectively). I present some of the plots, produced through the final API, below. The plots shown here, have a mix of both <code>Static</code> and <code>Interactive</code> back-ends, as well as time-like and null-like geodesics.</p>
<p>
<br>
<a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p70PRpe2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vlr7wo51pmrv55xhxdx8.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p70PRpe2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vlr7wo51pmrv55xhxdx8.png" alt="Interactive"></a>Kerr Null-like Geodesic
<br>
<a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q4nv3DEX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8xxuz4iem796p7ofoifw.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q4nv3DEX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8xxuz4iem796p7ofoifw.png" alt="Interactive"></a>Kerr Time-like Geodesic
<br>
<a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LCBpOP4x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/aifjnm4ggk59qiur48be.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LCBpOP4x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/aifjnm4ggk59qiur48be.png" alt="2D"></a>Kerr Frame Dragging
<br>
<a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6ID4SoXf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ntdoyu208csz252k2qeo.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6ID4SoXf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ntdoyu208csz252k2qeo.png" alt="2D"></a>Schwarzschild Precession
<br>
<a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e1fXZqA_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oul7ierbcepq76ehb7l8.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e1fXZqA_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oul7ierbcepq76ehb7l8.png" alt="Closed"></a>Schwarzschild Time-like Closed Orbit
<br>
<a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CFxLb1V7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kf1yn7z44090gf18itab.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CFxLb1V7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kf1yn7z44090gf18itab.png" alt="Closed"></a>Schwarzschild Time-like Closed Orbit Parametric Plot
</p>
<h3>
<a href="http://openastronomy.org/Universe_OA/posts/2020/08/20200830_1733_jes24/#until-next-time" class="anchor">
</a>
Until next time...
</h3>
<p>The EinsteinPy geodesics API currently provides a choice of solvers, between a python back-end and a julia back-end, through the optional <code>einsteinpy_geodesics</code> add-on. I will continue to work on improving the python back-end, but for now, <code>einsteinpy_geodesics</code> adds proper &amp; accurate geodesic calculations to EinsteinPy, in the Kerr family of spacetimes (that includes Schwarzschild). Also, a notable aspect of the <code>HamiltonianProblem</code> approach is that, in principle, it should be easily extensible to Kerr-Newman geodesics, which is something, I'd like to explore, as soon as my GSoC commitment is over. I have another short blog coming up, that explains how to use the API (and has more cool plots), that will probably also be the last GSoC blog. Till then, I leave you with a nice animation, created entirely with EinsteinPy.</p>
<p>
<a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hF0GF8ch--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/e47cv7qh0xejnmuaz0qb.gif" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hF0GF8ch--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/e47cv7qh0xejnmuaz0qb.gif" alt="Python 2"></a>(Extremal) Kerr Time-like Constant Orbit
</p>
<h5>
<a href="http://openastronomy.org/Universe_OA/posts/2020/08/20200830_1733_jes24/#references" class="anchor">
</a>
References:
</h5>
<p>[1]: Carter, Brandon; <a href="https://link.aps.org/doi/10.1103/PhysRev.174.1559"><em>Global Structure of the Kerr Family of Gravitational Fields</em></a>, 1968 , Physical Review, 174(5), pp. 1559-1571</p>
<p>[2]: Misner, Charles W. and Thorne, K.S. and Wheeler, J.A; <em>Gravitation</em>, 1973, W. H. Freeman, ISBN: 978-0-7167-0344-0, 978-0-691-17779-3</p></description><category>EinsteinPy</category><guid>http://openastronomy.org/Universe_OA/posts/2020/08/20200830_1733_jes24/</guid><pubDate>Sun, 30 Aug 2020 16:33:57 GMT</pubDate></item><item><title>Week 11 & 12: Last two weeks of GSoC</title><link>http://openastronomy.org/Universe_OA/posts/2020/08/20200830_1113_siddharthlal25/</link><dc:creator>siddharthlal25</dc:creator><description><h3 id="hey-sid-whats-the-progress-what-did-you-do-in-last-2-weeks"><em>Hey Sid! What’s the progress? What did you do in last 2 weeks?</em></h3>
<p>The work was completed on time! I spent the last two weeks coding up the saving versions of <code class="language-plaintext highlighter-rouge">ccds</code>, <code class="language-plaintext highlighter-rouge">arrays</code> and <code class="language-plaintext highlighter-rouge">filenames</code>. With these, one can apply a function on the desired object (i.e. ccd or array or filename) and can also save it to FITS file. There are various options available for saving, like the prefix name of the saved file, suffix name of saved file and also the location at which to save, check out the repo for more info!</p>
<!-- TEASER_END -->
<h3 id="awesome-can-you-show-some-work-samples"><em>Awesome, Can you show some work samples?</em></h3>
<p>Sure, here it is!</p>
<p>This is a bias frame as captured:</p>
<p align="center">
<img src="https://raw.githubusercontent.com/siddharthlal25/blog/master/_images/bias/sample.png">
</p>
<p>When the frame undergoes overscan subtraction followed by trimming the overscan region, it turns out to be:</p>
<p align="center">
<img src="https://raw.githubusercontent.com/siddharthlal25/blog/master/_images/bias/processed.png">
</p>
<p>Several bias frames after overscan subtraction and trimming are stacked together and combined, this is the master bias frame used for subsequent processing of images. This is how it looks:</p>
<p align="center">
<img src="https://raw.githubusercontent.com/siddharthlal25/blog/master/_images/bias/master.png">
</p>
<p>Next comes the processing of flat frames, this is a <em>dome flat r</em> frame as captured:</p>
<p align="center">
<img src="https://raw.githubusercontent.com/siddharthlal25/blog/master/_images/dome_flat/r/sample.png">
</p>
<p>When the frame undergoes bias subtraction (by <em>master_bias</em>) followed by overscan subtraction and trimming, it looks something like:</p>
<p align="center">
<img src="https://raw.githubusercontent.com/siddharthlal25/blog/master/_images/dome_flat/r/processed.png">
</p>
<p>Several <em>dome_flat_r</em> frames are stacked together and combined by mean, this results in:</p>
<p align="center">
<img src="https://raw.githubusercontent.com/siddharthlal25/blog/master/_images/dome_flat/r/master.png">
</p>
<p>Similarly, below are processed and combined frames (i.e. master frame) of <em>dome_flat_i</em> and <em>dome_flat_z</em>:</p>
<p><img src="https://raw.githubusercontent.com/siddharthlal25/blog/master/_images/dome_flat/i/master.png" width="390" height="260" style="float:left"> <img src="https://raw.githubusercontent.com/siddharthlal25/blog/master/_images/dome_flat/z/master.png" width="390" height="260" style="float:right"></p>
<p>Now comes the most interesting part, processing of science. The raw image of scienc looks like (this one is <em>NEP2581-r</em>):</p>
<p align="center">
<img src="https://raw.githubusercontent.com/siddharthlal25/blog/master/_images/science/r/sample.png">
</p>
<p>This frame when undergoes bias subtraction, overscan subtraction, trimming and flat correction (by the corresponding flat frame), looks like:</p>
<p align="center">
<img src="https://raw.githubusercontent.com/siddharthlal25/blog/master/_images/science/r/processed.png">
</p>
<p>Finally these frames are stacked and combined by mean, so the final processed image looks like:</p>
<p align="center">
<img src="https://raw.githubusercontent.com/siddharthlal25/blog/master/_images/science/r/master.png">
</p>
<p>Similarly, below are processed and combined frames (i.e. master_frame) of <em>NEP2581-i</em> and <em>NEP2581-z</em>:</p>
<p><img src="https://raw.githubusercontent.com/siddharthlal25/blog/master/_images/science/i/master.png" width="390" height="260" style="float:left"> <img src="https://raw.githubusercontent.com/siddharthlal25/blog/master/_images/science/z/master.png" width="390" height="260" style="float:right"></p>
<h3 id="thats-awesome-so-what-are-your-future-plans-about-the-package"><em>That’s awesome! So what are your future plans about the package?</em></h3>
<p>There are some more advanced algorithms (i.e. cosmic ray detection, part of my future goals) left to be implemented, I have my next 2 weeks completed packed, so will implement these after the next two weeks!</p>
<p>At the end, I would like to thank my mentors for being so kind and cooperative, thanks for guiding me at every step of this project! This project wouldn’t be possible without you guys, thanks a lot!</p>
<p>-sl</p></description><category>JuliaAstro</category><guid>http://openastronomy.org/Universe_OA/posts/2020/08/20200830_1113_siddharthlal25/</guid><pubDate>Sun, 30 Aug 2020 10:13:56 GMT</pubDate></item><item><title>Final Chapter: The Road Goes Ever On</title><link>http://openastronomy.org/Universe_OA/posts/2020/08/20200828_1223_raahul-singh/</link><dc:creator>Raahul Singh</dc:creator><description><h5>The Autumn of my GSoC project.</h5><figure><img alt="" src="https://cdn-images-1.medium.com/max/810/1*9YtpATtGuoLUSIEOasTixQ.jpeg"><figcaption>The Doon Valley, my home.</figcaption></figure><blockquote>“Roads go ever ever on,<br>
Over rock and under tree,<br>
By caves where never sun has shone,<br>
<!-- TEASER_END -->
By streams that never find the sea;<br>
Over snow by winter sown,<br>
And through the merry flowers of June,<br>
Over grass and over stone,<br>
And under mountains in the moon.”</blockquote><blockquote>~ The Hobbit, J.R.R. Tolkien</blockquote><p>When I first read the Hobbit, I always wondered what going on an adventure would feel like.<br>
Would I be fighting goblins, striding through enchanted forests with wizards?<br>
Would there be a treasure? Would there be a Dragon? <br>
And as I grew older, would or could there be a happy ending?</p>
<p>Well, an adventure it indeed was.<br>
Building a domain specific Deep Learning Toolkit, learning about packaging, testing, and the best practices, all to just set the package up!</p>
<p>I did fight goblins that were the bugs in my PyTorch pipelines. Those NaNs, oh those pesky NaNs! They really were like goblins that popped up in the input data when I least expected them.<br>
Though I did enlist the help of my wizard mentors, <a href="https://github.com/dpshelio">David</a>, <a href="https://github.com/drsophiemurray">Sophie</a>, and <a href="https://github.com/mbobra">Monica,</a> and together we marched through the enchanted (or were they cursed?) forests of SWPC and HEK to get the data we wanted.</p>
<p>It was a fascinating experience. One that I will cherish forever.<br>
I wish I could extend this summer, but my time is up, and all our goals for this project have been completed.</p>
<p>After all, all adventures must come to an end.</p>
<blockquote>“The Road goes ever on and on <br>
Out from the door where it began.<br>
Now far ahead the Road has gone,<br>
Let others follow it who can!<br>
Let them a journey new begin,<br>
But I at last with weary feet<br>
Will turn towards the lighted inn,<br>
My evening-rest and sleep to meet”</blockquote><p>And so we come to the end of my GSoC journey, let’s talk about the treasure!</p>
<h4>The Treasure</h4><h5>1 ) The Search Events Object</h5><p>Often we find data representing the same observed physical phenomenon to have slightly different values when the data comes from different sources.<br>
This could be due to noise or different choices of parameters for the preprocessing techniques employed.<br>
This creates problems when the two datasets need to be compared, and /or may data exclusive to them.<br>
We faced this problem when the data from NOAA that characterizes the Active Regions was not available in the Sunspotter dataset.<br>
Although the observations were identical, they were not exact. <br>
Their multidimensional nature also prevented matching by simple sorting.</p>
<p>In my repository, <a href="https://github.com/Raahul-Singh/pythia">Pythia,</a> we created a general Search Events Table Matching algorithm that would solve this problem.<br>
Although it is general enough to be used with any tabular dataset, we do plan on making it more ‘intelligent’ so as to require minimal preprocessing from the user.</p>
<h5><strong>2) The Flare Forecasting</strong></h5><p>After significant preprocessing, we were able to get a good enough dataset to feed to our deep learning pipeline. <br>
We wanted to predict if an Active Region would flare in the first six hours from its observation or not.<br>
We were inspired by architectures, popular in academia in the domain of flare forecasting, Though our approach was the first to combine modern Deep Learning techniques for building our Convolutional Nets.</p>
<p>With some PyTorch magic, we were able to get a prediction accuracy of around 84% on the test set in the binary classification of whether an active region would flare or not. A study of flare forecasting using Machine learning in a fixed time frame from observation is unique in itself.</p>
<p>We implemented an Autoencoder to get a low dimensional representation of the Active Regions, so that they may be used with other scalar measurements.</p>
<p>We also were curious to see if the absolute orientation of the Active regions with respect to the sun was of any significance in the Active Region’s flaring activity.<br>
While we were expecting a connection, we were surprised to see that the orientation mattered more in the case where the Active Region did flare than in the case where it did not. More work is required before we can quantitatively state our findings on this front.</p>
<h5>3) <a href="https://github.com/Raahul-Singh/pythia">Pythia</a></h5><p>What began as a project to analyze the Sunspotter dataset, has grown way beyond its original scope.<br>
With the power of Pytorch Lightning and SunPy, Pythia is shaping out be a general-purpose Deep learning Toolkit for Solar Physics.</p>
<p>The barrier to entry for using Deep Learning in Solar Physics Research is quite high for people without the technical knowledge of Deep Learning and without the time to invest heavily into learning the many nuances of modern Deep Learning frameworks.</p>
<p>With Pythia, we plan on providing a SciKit Learn like interface, with the power and muscle of PyTorch and the elegance and order of Pytorch Lightning.<br>
Although the expansion and generalization are still underway, with more use cases and help from the community, Pythia will surely help in making modern Deep Learning more accessible to the Solar Physics community.</p>
<h4>The Dragon</h4><blockquote>“Roads go ever ever on<br>
Under cloud and under star,<br>
Yet feet that wandering have gone<br>
Turn at last to home afar.<br>
Eyes that fire and sword have seen<br>
And horror in the halls of stone<br>
Look at last on meadows green<br>
And trees and hills they long have known.”</blockquote><p>Unlike Bilbo, my Dragon isn’t evil like Smaug. <br>
It isn’t greedy of gold, nor too large or too scary.<br>
It tells me it prefers gardening over desolating lands as a hobby. <br>
And has so far been fairly consistent in his participation in our friendship.</p>
<p>A little secret that not many know is that my dragon doesn’t have a physical existence.<br>
I confide in my reader and trust them to keep this secret, a secret.</p>
<p>The Dragon I am talking about, of course, is this newfound sense of spirit and the freedom that I have acquired over this summer.</p>
<p>This summer has been magical for me.</p>
<p>This summer, I worked on what I would call a dream project, using AI in Natural Sciences.<br>
I interacted with scientists from NASA, UCL, Trinity, etc., all of whom are heroes to me.</p>
<p>I co-founded an Open Source organization, <a href="https://github.com/wildfirepy">The WildfirePy Project,</a> for doing my part in studying, understanding, and preventing wildfires.</p>
<p>And finally, I got my first job! Becoming financially independent, and working on projects that make a difference!</p>
<p>Even in my wildest dreams, I never imagined such fortune and serendipity.<br>
In all honesty, I’m not sure if the Dragon will stay, or fly away.<br>
I am yet to start counting on it for its company when I need it.</p>
<p>But I hope it stays. :)</p>
<p>GSoC and Open Source in general, have been life-changing for me.<br>
More than anything, it has given me a way to express myself, my love for science, my love for code and my desire to be part of something bigger than myself.<br>
And act on it.<br>
Open source is nourishment to my soul, and I shall forever be grateful to Google Summer of Code for helping me get started with it.</p>
<p>And to SunPy for making my life more luminous!</p>
<h4><strong>Happy Ending?</strong></h4><blockquote>“The Road goes ever on and on<br>
Down from the door where it began.<br>
Now far ahead the Road has gone,<br>
And I must follow, if I can,<br>
Pursuing it with eager feet,<br>
Until it joins some larger way<br>
Where many paths and errands meet.<br>
And whither then? I cannot say.”</blockquote><p>Happy Ending? <br>
Well, I wouldn’t know.<br>
I am just getting started!</p>
<p><strong>:)</strong></p>
<img src="https://medium.com/_/stat?event=post.clientViewed&amp;referrerSource=full_rss&amp;postId=53fb35e650f4" width="1" height="1"></description><category>SunPy</category><guid>http://openastronomy.org/Universe_OA/posts/2020/08/20200828_1223_raahul-singh/</guid><pubDate>Fri, 28 Aug 2020 11:23:27 GMT</pubDate></item><item><title>Google Summer of Code - The End!</title><link>http://openastronomy.org/Universe_OA/posts/2020/08/20200827_0614_pkj-m/</link><dc:creator>pkj-m</dc:creator><description><p>Hello everyone! It has been a while since my last blog, and for a good reason. The past few weeks have been quite productive, and I thought it might be a good idea to present one final report of the work that I did over this past month instead of breaking it into subparts. With this blog, I will also be marking the end of my journey through the Google Summer of Code program. This blog will talk about some of the changes that the work I did as a part of GSoC brought to RADIS, and how you, the user can and will benefit from it.</p>
<p>In my last blog, I briefly mentioned what I was planning to do with the GPU code and how to integrate it with RADIS. The current RADIS code performs calculation of spectra at thermal equilibrium (and even in non-equilibrium conditions) in primarily two ways:</p>
<!-- TEASER_END -->
<ol>
<li>by defining a <code class="language-plaintext highlighter-rouge">SpectrumFactory</code> object, and then calling the method <code class="language-plaintext highlighter-rouge">sf.eq_spectrum(Tgas=T)</code></li>
<li>by passing the necessary parameters in the method <code class="language-plaintext highlighter-rouge">calc_spectrum</code>, which returns a Spectrum object directly</li>
</ol>
<p>In our attempt to add support for GPU accelerated spectrum calculation, we wanted to keep the interface as similar to the original one as possible. Thus, the new method which we introduced to calculate the spectrum using GPU was naturally called <code class="language-plaintext highlighter-rouge">eq_spectrum_gpu</code>. The <code class="language-plaintext highlighter-rouge">calc_spectrum</code> method, which is actually a wrapper that makes of the <code class="language-plaintext highlighter-rouge">eq_spectrum</code> method underneath, was also modified and a new parameter called <code class="language-plaintext highlighter-rouge">mode</code> was added. Depending on what the value of <code class="language-plaintext highlighter-rouge">mode</code> is, the calculation of spectrum could be performed either on the GPU or on the CPU.</p>
<p>Now coming to the implementation of <code class="language-plaintext highlighter-rouge">eq_spectrum_gpu</code>, I tried to keep the structure of the code as similar to the current CPU implementation as possible. What it meant was that the preprocessing done was in a way quite similar to the CPU version of the method. The difference actually came in during the broadening step. Initially our implementation was different from the CPU version when it came to loading the data, primarily because the data being loaded in the GPU method was in the ‘npy’ format. This made it necessary to implement another method for loading this data, as the data loader in RADIS did not support npy files. While implementing this was not difficult, it was not seen as a very good design decision, as this type of loading and handling of data was very isolated and not compatible with the rest of RADIS’ features. Therefore, ultimately it was to keep this mpy2df method as an additional, helper method, and instead of using it as the primary source of data, we use the dataframe which RADIS already generates instead. This allowed us to keep things compatible with the current implementation to a great extent, and the only downside, if it can be considered that, was the need to now compute the parameters before the spectrum is calculated, which in case of npy files were already present for us. This however, was virtually a non-problem since this step was not even remotely close to the bottleneck, and the flexiblity it provided in terms of loading and preprocessing data outweighed this extra computation easily. At this point we had the data loaded in memory, either through the legacy data loader using the dataframe, or by passing the location of the npy files in the system and loading them directly. After this, we had to pass this data to the GPU module. The GPU module, titled py_cuFFS, is actually a Cython file with some CuPy, which serves as the complete host+device code for the computation of the spectra. Using Cython over Python allows us to compile the module prior to using it, which gives an added performance boost. The compilation however, is a machine-specific process and cannot have a single-file-handles-all kind of implementation. Thus, instead of sharing the binary file with the users, we instead share the source code. Whenever the user calls the GPU accelerated methods on their system for the first time, RADIS automatically compiles the source code into the binary, which then gets compiled according to the system environment of the user. Now, the compiled binary is imported by RADIS, and the input parameters such as the temperature, pressure and the partition function are passed on to the GPU.</p>
<p>The GPU module returns the spectrum to RADIS, which then computes other quantities, such as the absorbance and transmittance from this. From this stage onwards the code for <code class="language-plaintext highlighter-rouge">eq_spectrum</code> and <code class="language-plaintext highlighter-rouge">eq_spectrum_gpu</code> is identical. Both the methods update the metainformation such as the calculation time, number of lines calculated, etc. In order to read more about the GPU module and how to use it, I highly recommend the users to go through the <a href="https://radis.readthedocs.io/en/latest/lbl/gpu.html">documentation</a> which has not just examples but also a guide on how to setup your system in order to make use of these GPU accelerated methods. If you’d just like to observe for now, I would recommend going through this <a href="https://github.com/radis/radis-benchmark/blob/master/TEST1.ipynb">notebook</a> on radis-benchmark which gives an example of how to use these methods to calculate the spectrum on the GPU, and an impressive speed test between the GPU and the CPU methods when calculating spectra with 5M lines.</p>
<p>This wraps up my journey with RADIS a Google Summer of Code participant. It has been an excellent experience with a great deal of learning involved. I had prior experience of working with CUDA for deep learning pipelines but this was a completely new domain. In addition to the programming itself, I got exposed to the world of spectroscopy which was also very interesting. While my contribution to RADIS under the GSoC aegis comes to an end with this blog, I am still really excited to be a part of RADIS as it grows further. My GSoC project started what would hopefully end with a completely GPU-accelerated RADIS, but there is still plenty of work before we can say that. My GSoC project implemented the thermal equilibrium variant of the spectrum calculation method, but we still need to work on non-equilibrium methods. In addition, we also need to modify the GPU code itself to allow support for weighted air- and self-collision factors, among other things. There’s a lot to do, but I think we’ve had a good start. Most importantly, I am happy with the way I am ending this project. The code is ready and we have proper guide, documentation and examples in place so any new user can easily try this feature out themselves! I am really excited about the feedback and what users have to say about this GPU implementation. Finally, none of this would have been possible without the constant support and assistance from my amazing mentors, Erwan ( <a href="https://github.com/erwanp">@erwanp</a> ) and Dirk ( <a href="https://github.com/dcmvdbekerom/">@dcmvdbekerom</a> ). It would be hard to understate the contribution they’ve made to my project, helping constantly not just with the code but also in designing and planning the next steps. My lack of knowledge in the domain of spectroscopy was a huge pain at times which led to extremely long periods of slow progress due to painful debugging, but they always took out time from their packed schedules to help me out. Once again, thank you! It has been a wonderful experience, working with RADIS and I am really excited to see what how RADIS grows in the future!</p>
<p>P.S. for anyone who’d like to go through the code of the project, you can find the pull request here: https://github.com/radis/radis/pull/117. And more importantly, if you’d like to know more, want to contribute, or just talk to the team, feel free to join us at our slack <a href="https://radis.github.io/slack-invite/">here</a>.</p></description><category>radis</category><guid>http://openastronomy.org/Universe_OA/posts/2020/08/20200827_0614_pkj-m/</guid><pubDate>Thu, 27 Aug 2020 05:14:12 GMT</pubDate></item><item><title>Week 10 & 11: The End…</title><link>http://openastronomy.org/Universe_OA/posts/2020/08/20200826_0322_sahilyadav27/</link><dc:creator>Sahil Yadav</dc:creator><description><p>The past 3 months have been really amazing. I’ve learned a lot about working on a collaborative project and working with deadlines.</p>
<p>In the past two weeks, I polished off the work done for the project in the PR, so that it is ready to merge. There were a few merge conflicts that needed to be addressed.</p>
<p>Then, I worked on a generate_runlist file to make runlists for converting MAGIC ROOT data to HDF5 data. In a few days, training will start on the approximately 5000 MAGIC data runs using CTLearn’s models.</p>
<!-- TEASER_END -->
<p>I’ll be continuing to work and contribute to this project in the future as required as well. Hopefully this will be useful for researchers working on related problems in the future.</p>
<p>I’m grateful for my mentors, Google, and OpenAstronomy for this amazing GSoC 2020 experience. Signing off!</p>
<img src="https://medium.com/_/stat?event=post.clientViewed&amp;referrerSource=full_rss&amp;postId=a4a1414cd574" width="1" height="1"></description><category>CTLearn</category><guid>http://openastronomy.org/Universe_OA/posts/2020/08/20200826_0322_sahilyadav27/</guid><pubDate>Wed, 26 Aug 2020 02:22:12 GMT</pubDate></item><item><title>GSoC 2020: Thus Ending</title><link>http://openastronomy.org/Universe_OA/posts/2020/08/20200825_2118_abhijeetmanhas/</link><dc:creator>Abhijeet Manhas</dc:creator><description><figure><img alt="" src="https://cdn-images-1.medium.com/max/680/0*NtL-M7ydCU35SOqY.jpg"></figure><p>This post marks the end of the summer of Code with Google. A lot I learned from the community; a lot I contributed to it. What I took back from GSoC is way more than what I put forward for it. So let’s see what I did in the last weeks.</p>
<p>I have now added a guide on how to Add “Attrs” to the registry in <a href="https://github.com/sunpy/sunpy/pull/4387">PR #4387</a>. It is part of the developer guide for Fido.<br>
I have added tests to check metadata queries in <a href="https://github.com/sunpy/sunpy/pull/4385">#4385</a> and ways to index the results using the client’s name. It eases to retrieve individual provider responses from a Fido result.<br>
<!-- TEASER_END -->
I resolved all reviews so far on PR <a href="https://github.com/sunpy/sunpy/pull/4419">#4419</a>, so now it will ease the merging of <a href="https://github.com/sunpy/sunpy/pull/4321">PR #4321</a>.<br>
They await review as of now, maybe merged within this week. In short, almost all the proposed goals were achieved in the project. I experienced a more “pythonic” way of coding. Discovered new heights of the language, learned some solar physics, and what matters most, became part of a great community. Hopefully I made <em>Fido Great Again!</em></p>
<p><strong>CAPRE NOCTEM!</strong></p>
<img src="https://medium.com/_/stat?event=post.clientViewed&amp;referrerSource=full_rss&amp;postId=acd30ed987ae" width="1" height="1"></description><category>SunPy</category><guid>http://openastronomy.org/Universe_OA/posts/2020/08/20200825_2118_abhijeetmanhas/</guid><pubDate>Tue, 25 Aug 2020 20:18:36 GMT</pubDate></item><item><title>Season Finale!</title><link>http://openastronomy.org/Universe_OA/posts/2020/08/20200825_1908_raahul-singh/</link><dc:creator>Raahul Singh</dc:creator><description><img src="https://medium.com/_/stat?event=post.clientViewed&amp;referrerSource=full_rss&amp;postId=99bc18aedadc" width="1" height="1">
<!-- TEASER_END --></description><category>SunPy</category><guid>http://openastronomy.org/Universe_OA/posts/2020/08/20200825_1908_raahul-singh/</guid><pubDate>Tue, 25 Aug 2020 18:08:08 GMT</pubDate></item><item><title>GSoC 2020: glue-solar project 3.2</title><link>http://openastronomy.org/Universe_OA/posts/2020/08/20200823_0807_kakirastern/</link><dc:creator>Kris Stern</dc:creator><description><p>It is finally nearing the end of the project for me, as far as coding is concerned. Over the past few weeks I have spent some time on some last-ditch effort to debug with my mentors and to squeeze as much as I possibly could given the time constraint I have been under. These include but not limited to sorting out some generalisation issues that previously prevented glue <a href="https://github.com/glue-viz/glue/pull/2167">PR #2167</a> from being usable for general FITS files, some type as well as wcs linkages issues in glue <a href="https://github.com/glue-viz/glue/pull/2161">PR #2161</a> that cropped up after applying changes suggested in code review that have not been properly checked on my part. The pull requests started or completed for the project include but are not limited to the following list:</p>
<ol><li>glue <a href="https://github.com/glue-viz/glue/pull/2167">PR #2167</a> for updating 1D Profile viewer to use wcsaxes for plotting and add sliders</li><li>glue <a href="https://github.com/glue-viz/glue/pull/2161">PR #2161</a> for updating ‘wcs_autolinking’ code to handle N-D cases using a generalised approach conforming to <a href="https://docs.astropy.org/en/stable/wcs/wcsapi.html">APE 14: Shared Python interface for World Coordinate Systems</a></li><li>glue <a href="https://github.com/glue-viz/glue/pull/2164">PR #2164</a> for adding support to NDData for astropy package</li><li>glue <a href="https://github.com/glue-viz/glue/pull/2131">PR #2131</a> for adding a preferred_cmap attribute to introduce a color coding scheme for different glue-solar data types (for example to distinguish the IRIS raster data cubes from its companion IRIS SJI data cubes</li><li>glue-solar <a href="https://github.com/glue-viz/glue-solar/pull/15">PR #15</a> for adding to open with “SunPy Map” GUI option</li><li>glue-solar <a href="https://github.com/glue-viz/glue-solar/pull/17">PR #17</a> for adding “Loading and Overplotting AIA and HMI files as SunPy Maps” docs as a user guide</li><li>glue-solar <a href="https://github.com/glue-viz/glue-solar/pull/18">PR #18</a> for adding “loading IRIS level 2 raster and sji data together docs” as a user guide</li><li>glue-solar <a href="https://github.com/glue-viz/glue-solar/pull/23">PR #23</a> for updating IRIS data labels with OBSIDs for filtering</li><li>glue-solar <a href="https://github.com/glue-viz/glue-solar/pull/28">PR #28</a>, <a href="https://github.com/glue-viz/glue-solar/pull/29">PR #29</a> as core glue-solar documentation</li></ol><p>I have actually been using our work on the glue 1D profile tool for my current doctoral studies on studies of planetary nebulae using integral field spectroscopy (IFS) involving the handling of a large number of data cubes from some Australian telescopes (data collected by my PhD supervisor Prof. Quentin Parker). Turned out this tool made the process of investigating the different spectra, which could run up to hundreds in number per data cube or observation, as it allows me to load in my data cube only once, and then to inspect the variation across spatial dimensions to see if the signal-to-noise of a particular observation is too high, or if the opposite is true so that the spectra will then be further processed into full-optical integrated spectra with flux calibration or de-reddening as necessary.</p>
<p>I am grateful for Google, my mentors, other org members as well as my GSoC peers to make this a particular fun-filled and memorable project! I have learned so much from the experience that even money cannot buy in terms of programming and soft skills. I wish Google will continue this program or initiate some similar program to continue cultivating new generations of open-source software developers / development enthusiasts to further our aim to make open-source approachable and usable for all.</p>
<!-- TEASER_END -->
<img src="https://medium.com/_/stat?event=post.clientViewed&amp;referrerSource=full_rss&amp;postId=eb6b2bccce85" width="1" height="1"></description><category>SunPy</category><guid>http://openastronomy.org/Universe_OA/posts/2020/08/20200823_0807_kakirastern/</guid><pubDate>Sun, 23 Aug 2020 07:07:23 GMT</pubDate></item><item><title>Looking for the answers!</title><link>http://openastronomy.org/Universe_OA/posts/2020/08/20200820_1000_meuge/</link><dc:creator>Meuge</dc:creator><description><p>Hey, folks! The last weeks were really exciting getting done an algorithm for ground-track orbit. After long days trying to find the perfect approach for Poliastro, we decided to give it a go bringing to life this <a href="http://openastronomy.org/Universe_OA/posts/2020/08/20200820_1000_meuge/[https:/www.researchgate.net/publication/287869810_Daily_repeat-groundtrack_Mars_orbits">paper</a></p>
<p><img alt="wow" src="https://media.giphy.com/media/gZBYbXHtVcYKs/giphy.gif"></p>
<h2>But everything it's not what it seems</h2>
<!-- TEASER_END -->
<p>Well, we thought it will be quite straightforward but much too learn still I have , right Master Yoda? </p>
<p><img alt="do-or-do-not" src="https://media.giphy.com/media/pvDp7Ewpzt0o8/giphy.gif"></p>
<p>So I am not gonna lie to you folks, it wasn't that easy, but as Rocky says, "Every champion was once a contender who refused to give up". So now you are gonna know how we solve it. Game on! First things first, we needed to apply numerical analysis in order to obtain the roots of the equation, because given the complexity of the function, there was no other way around. </p>
<p><img alt="oh-no" src="https://media.giphy.com/media/xT5LMLMPdRh2VRNVLi/giphy.gif"></p>
<p>So we had to come up …</p></description><category>poliastro</category><guid>http://openastronomy.org/Universe_OA/posts/2020/08/20200820_1000_meuge/</guid><pubDate>Thu, 20 Aug 2020 09:00:00 GMT</pubDate></item></channel></rss>