Practical Astronomy Algorithms in .NET/C#
Loading...
Searching...
No Matches
PAMacros.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using PALib.Data;
5using PALib.Helpers;
6
7namespace PALib;
8
12public static class PAMacros
13{
20 public static double HMStoDH(double hours, double minutes, double seconds)
21 {
22 double fHours = hours;
23 double fMinutes = minutes;
24 double fSeconds = seconds;
25
26 double a = Math.Abs(fSeconds) / 60;
27 double b = (Math.Abs(fMinutes) + a) / 60;
28 double c = Math.Abs(fHours) + b;
29
30 return (fHours < 0 || fMinutes < 0 || fSeconds < 0) ? -c : c;
31 }
32
39 public static int DecimalHoursHour(double decimalHours)
40 {
41 double a = Math.Abs(decimalHours);
42 double b = a * 3600;
43 double c = Math.Round(b - 60 * (b / 60).Floor(), 2);
44 double e = (c == 60) ? b + 60 : b;
45
46 return (decimalHours < 0) ? (int)-(e / 3600).Floor() : (int)(e / 3600).Floor();
47 }
48
55 public static int DecimalHoursMinute(double decimalHours)
56 {
57 double a = Math.Abs(decimalHours);
58 double b = a * 3600;
59 double c = Math.Round(b - 60 * (b / 60).Floor(), 2);
60 double e = (c == 60) ? b + 60 : b;
61
62 return (int)(e / 60).Floor() % 60;
63 }
64
71 public static double DecimalHoursSecond(double decimalHours)
72 {
73 double a = Math.Abs(decimalHours);
74 double b = a * 3600;
75 double c = Math.Round(b - 60 * (b / 60).Floor(), 2);
76 double d = (c == 60) ? 0 : c;
77
78 return d;
79 }
80
87 public static double CivilDateToJulianDate(double day, double month, double year)
88 {
89 double fDay = (double)day;
90 double fMonth = (double)month;
91 double fYear = (double)year;
92
93 double y = (fMonth < 3) ? fYear - 1 : fYear;
94 double m = (fMonth < 3) ? fMonth + 12 : fMonth;
95
96 double b;
97
98 if (fYear > 1582)
99 {
100 double a = (y / 100).Floor();
101 b = 2 - a + (a / 4).Floor();
102 }
103 else
104 {
105 if (fYear == 1582 && fMonth > 10)
106 {
107 double a = (y / 100).Floor();
108 b = 2 - a + (a / 4).Floor();
109 }
110 else
111 {
112 if (fYear == 1582 && fMonth == 10 && fDay >= 15)
113 {
114 double a = (y / 100).Floor();
115 b = 2 - a + (a / 4).Floor();
116 }
117 else
118 b = 0;
119 }
120 }
121
122 double c = (y < 0) ? ((365.25 * y) - 0.75).Floor() : (365.25 * y).Floor();
123 double d = (30.6001 * (m + 1.0)).Floor();
124
125 return b + c + d + fDay + 1720994.5;
126 }
127
134 public static double JulianDateDay(double julianDate)
135 {
136 double i = (julianDate + 0.5).Floor();
137 double f = julianDate + 0.5 - i;
138 double a = ((i - 1867216.25) / 36524.25).Floor();
139 double b = (i > 2299160) ? i + 1 + a - (a / 4).Floor() : i;
140 double c = b + 1524;
141 double d = ((c - 122.1) / 365.25).Floor();
142 double e = (365.25 * d).Floor();
143 double g = ((c - e) / 30.6001).Floor();
144
145 return c - e + f - (30.6001 * g).Floor();
146 }
147
154 public static int JulianDateMonth(double julianDate)
155 {
156 double i = (julianDate + 0.5).Floor();
157 double a = ((i - 1867216.25) / 36524.25).Floor();
158 double b = (i > 2299160) ? i + 1 + a - (a / 4).Floor() : i;
159 double c = b + 1524;
160 double d = ((c - 122.1) / 365.25).Floor();
161 double e = (365.25 * d).Floor();
162 double g = ((c - e) / 30.6001).Floor();
163
164 double returnValue = (g < 13.5) ? g - 1 : g - 13;
165
166 return (int)returnValue;
167 }
168
175 public static int JulianDateYear(double julianDate)
176 {
177 double i = (julianDate + 0.5).Floor();
178 double a = ((i - 1867216.25) / 36524.25).Floor();
179 double b = (i > 2299160) ? i + 1.0 + a - (a / 4.0).Floor() : i;
180 double c = b + 1524;
181 double d = ((c - 122.1) / 365.25).Floor();
182 double e = (365.25 * d).Floor();
183 double g = ((c - e) / 30.6001).Floor();
184 double h = (g < 13.5) ? g - 1 : g - 13;
185
186 double returnValue = (h > 2.5) ? d - 4716 : d - 4715;
187
188 return (int)returnValue;
189 }
190
197 public static double RightAscensionToHourAngle(double raHours, double raMinutes, double raSeconds, double lctHours, double lctMinutes, double lctSeconds, int daylightSaving, int zoneCorrection, double localDay, int localMonth, int localYear, double geographicalLongitude)
198 {
199 double a = LocalCivilTimeToUniversalTime(lctHours, lctMinutes, lctSeconds, daylightSaving, zoneCorrection, localDay, localMonth, localYear);
200 double b = LocalCivilTimeGreenwichDay(lctHours, lctMinutes, lctSeconds, daylightSaving, zoneCorrection, localDay, localMonth, localYear);
201 int c = LocalCivilTimeGreenwichMonth(lctHours, lctMinutes, lctSeconds, daylightSaving, zoneCorrection, localDay, localMonth, localYear);
202 int d = LocalCivilTimeGreenwichYear(lctHours, lctMinutes, lctSeconds, daylightSaving, zoneCorrection, localDay, localMonth, localYear);
203 double e = UniversalTimeToGreenwichSiderealTime(a, 0, 0, b, c, d);
204 double f = GreenwichSiderealTimeToLocalSiderealTime(e, 0, 0, geographicalLongitude);
205 double g = HMStoDH(raHours, raMinutes, raSeconds);
206 double h = f - g;
207
208 return (h < 0) ? 24 + h : h;
209 }
210
217 public static double HourAngleToRightAscension(double hourAngleHours, double hourAngleMinutes, double hourAngleSeconds, double lctHours, double lctMinutes, double lctSeconds, int daylightSaving, int zoneCorrection, double localDay, int localMonth, int localYear, double geographicalLongitude)
218 {
219 double a = LocalCivilTimeToUniversalTime(lctHours, lctMinutes, lctSeconds, daylightSaving, zoneCorrection, localDay, localMonth, localYear);
220 double b = LocalCivilTimeGreenwichDay(lctHours, lctMinutes, lctSeconds, daylightSaving, zoneCorrection, localDay, localMonth, localYear);
221 int c = LocalCivilTimeGreenwichMonth(lctHours, lctMinutes, lctSeconds, daylightSaving, zoneCorrection, localDay, localMonth, localYear);
222 int d = LocalCivilTimeGreenwichYear(lctHours, lctMinutes, lctSeconds, daylightSaving, zoneCorrection, localDay, localMonth, localYear);
223 double e = UniversalTimeToGreenwichSiderealTime(a, 0, 0, b, c, d);
224 double f = GreenwichSiderealTimeToLocalSiderealTime(e, 0, 00, geographicalLongitude);
225 double g = HMStoDH(hourAngleHours, hourAngleMinutes, hourAngleSeconds);
226 double h = f - g;
227
228 return (h < 0) ? 24 + h : h;
229 }
230
237 public static double LocalCivilTimeToUniversalTime(double lctHours, double lctMinutes, double lctSeconds, int daylightSaving, int zoneCorrection, double localDay, int localMonth, int localYear)
238 {
239 double a = HMStoDH(lctHours, lctMinutes, lctSeconds);
240 double b = a - daylightSaving - zoneCorrection;
241 double c = localDay + (b / 24);
242 double d = CivilDateToJulianDate(c, localMonth, localYear);
243 double e = JulianDateDay(d);
244 double e1 = e.Floor();
245
246 return 24 * (e - e1);
247 }
248
255 public static double UniversalTimeToLocalCivilTime(double uHours, double uMinutes, double uSeconds, int daylightSaving, int zoneCorrection, double greenwichDay, int greenwichMonth, int greenwichYear)
256 {
257 double a = HMStoDH(uHours, uMinutes, uSeconds);
258 double b = a + zoneCorrection;
259 double c = b + daylightSaving;
260 double d = CivilDateToJulianDate(greenwichDay, greenwichMonth, greenwichYear) + (c / 24);
261 double e = JulianDateDay(d);
262 double e1 = e.Floor();
263
264 return 24 * (e - e1);
265 }
266
273 public static double UniversalTime_LocalCivilDay(double uHours, double uMinutes, double uSeconds, int daylightSaving, int zoneCorrection, double greenwichDay, int greenwichMonth, int greenwichYear)
274 {
275 double a = HMStoDH(uHours, uMinutes, uSeconds);
276 double b = a + zoneCorrection;
277 double c = b + daylightSaving;
278 double d = CivilDateToJulianDate(greenwichDay, greenwichMonth, greenwichYear) + (c / 24.0);
279 double e = JulianDateDay(d);
280 double e1 = e.Floor();
281
282 return e1;
283 }
284
291 public static int UniversalTime_LocalCivilMonth(double uHours, double uMinutes, double uSeconds, int daylightSaving, int zoneCorrection, double greenwichDay, int greenwichMonth, int greenwichYear)
292 {
293 double a = HMStoDH(uHours, uMinutes, uSeconds);
294 double b = a + zoneCorrection;
295 double c = b + daylightSaving;
296 double d = CivilDateToJulianDate(greenwichDay, greenwichMonth, greenwichYear) + (c / 24.0);
297
298 return JulianDateMonth(d);
299 }
300
307 public static int UniversalTime_LocalCivilYear(double uHours, double uMinutes, double uSeconds, int daylightSaving, int zoneCorrection, double greenwichDay, int greenwichMonth, int greenwichYear)
308 {
309 double a = HMStoDH(uHours, uMinutes, uSeconds);
310 double b = a + zoneCorrection;
311 double c = b + daylightSaving;
312 double d = CivilDateToJulianDate(greenwichDay, greenwichMonth, greenwichYear) + (c / 24.0);
313
314 return JulianDateYear(d);
315 }
316
323 public static double LocalCivilTimeGreenwichDay(double lctHours, double lctMinutes, double lctSeconds, int daylightSaving, int zoneCorrection, double localDay, int localMonth, int localYear)
324 {
325 double a = HMStoDH(lctHours, lctMinutes, lctSeconds);
326 double b = a - daylightSaving - zoneCorrection;
327 double c = localDay + (b / 24);
328 double d = CivilDateToJulianDate(c, localMonth, localYear);
329 double e = JulianDateDay(d);
330
331 return e.Floor();
332 }
333
340 public static int LocalCivilTimeGreenwichMonth(double lctHours, double lctMinutes, double lctSeconds, int daylightSaving, int zoneCorrection, double localDay, int localMonth, int localYear)
341 {
342 double a = HMStoDH(lctHours, lctMinutes, lctSeconds);
343 double b = a - daylightSaving - zoneCorrection;
344 double c = localDay + (b / 24);
345 double d = CivilDateToJulianDate(c, localMonth, localYear);
346
347 return JulianDateMonth(d);
348 }
349
356 public static int LocalCivilTimeGreenwichYear(double lctHours, double lctMinutes, double lctSeconds, int daylightSaving, int zoneCorrection, double localDay, int localMonth, int localYear)
357 {
358 double a = HMStoDH(lctHours, lctMinutes, lctSeconds);
359 double b = a - daylightSaving - zoneCorrection;
360 double c = localDay + (b / 24);
361 double d = CivilDateToJulianDate(c, localMonth, localYear);
362
363 return JulianDateYear(d);
364 }
365
372 public static double UniversalTimeToGreenwichSiderealTime(double uHours, double uMinutes, double uSeconds, double greenwichDay, int greenwichMonth, int greenwichYear)
373 {
374 double a = CivilDateToJulianDate(greenwichDay, greenwichMonth, greenwichYear);
375 double b = a - 2451545;
376 double c = b / 36525;
377 double d = 6.697374558 + (2400.051336 * c) + (0.000025862 * c * c);
378 double e = d - (24 * (d / 24).Floor());
379 double f = HMStoDH(uHours, uMinutes, uSeconds);
380 double g = f * 1.002737909;
381 double h = e + g;
382
383 return h - (24 * (h / 24).Floor());
384 }
385
392 public static double GreenwichSiderealTimeToLocalSiderealTime(double greenwichHours, double greenwichMinutes, double greenwichSeconds, double geographicalLongitude)
393 {
394 double a = HMStoDH(greenwichHours, greenwichMinutes, greenwichSeconds);
395 double b = geographicalLongitude / 15;
396 double c = a + b;
397
398 return c - (24 * (c / 24).Floor());
399 }
400
407 public static double EquatorialCoordinatesToAzimuth(double hourAngleHours, double hourAngleMinutes, double hourAngleSeconds, double declinationDegrees, double declinationMinutes, double declinationSeconds, double geographicalLatitude)
408 {
409 double a = HMStoDH(hourAngleHours, hourAngleMinutes, hourAngleSeconds);
410 double b = a * 15;
411 double c = b.ToRadians();
412 double d = DegreesMinutesSecondsToDecimalDegrees(declinationDegrees, declinationMinutes, declinationSeconds);
413 double e = d.ToRadians();
414 double f = geographicalLatitude.ToRadians();
415 double g = e.Sine() * f.Sine() + e.Cosine() * f.Cosine() * c.Cosine();
416 double h = -e.Cosine() * f.Cosine() * c.Sine();
417 double i = e.Sine() - (f.Sine() * g);
418 double j = Degrees(h.AngleTangent2(i));
419
420 return j - 360.0 * (j / 360).Floor();
421 }
422
429 public static double EquatorialCoordinatesToAltitude(double hourAngleHours, double hourAngleMinutes, double hourAngleSeconds, double declinationDegrees, double declinationMinutes, double declinationSeconds, double geographicalLatitude)
430 {
431 double a = HMStoDH(hourAngleHours, hourAngleMinutes, hourAngleSeconds);
432 double b = a * 15;
433 double c = b.ToRadians();
434 double d = DegreesMinutesSecondsToDecimalDegrees(declinationDegrees, declinationMinutes, declinationSeconds);
435 double e = d.ToRadians();
436 double f = geographicalLatitude.ToRadians();
437 double g = e.Sine() * f.Sine() + e.Cosine() * f.Cosine() * c.Cosine();
438
439 return Degrees(g.ASine());
440 }
441
448 public static double DegreesMinutesSecondsToDecimalDegrees(double degrees, double minutes, double seconds)
449 {
450 double a = Math.Abs(seconds) / 60;
451 double b = (Math.Abs(minutes) + a) / 60;
452 double c = Math.Abs(degrees) + b;
453
454 return (degrees < 0 || minutes < 0 || seconds < 0) ? -c : c;
455 }
456
463 public static double Degrees(double w)
464 {
465 return w * 57.29577951;
466 }
467
474 public static double DecimalDegreesDegrees(double decimalDegrees)
475 {
476 double a = Math.Abs(decimalDegrees);
477 double b = a * 3600;
478 double c = Math.Round(b - 60 * (b / 60).Floor(), 2);
479 double e = (c == 60) ? 60 : b;
480
481 return (decimalDegrees < 0) ? -(e / 3600).Floor() : (e / 3600).Floor();
482 }
483
490 public static double DecimalDegreesMinutes(double decimalDegrees)
491 {
492 double a = Math.Abs(decimalDegrees);
493 double b = a * 3600;
494 double c = Math.Round(b - 60 * (b / 60).Floor(), 2);
495 double e = (c == 60) ? b + 60 : b;
496
497 return (e / 60).Floor() % 60;
498 }
499
506 public static double DecimalDegreesSeconds(double decimalDegrees)
507 {
508 double a = Math.Abs(decimalDegrees);
509 double b = a * 3600;
510 double c = Math.Round(b - 60 * (b / 60).Floor(), 2);
511 double d = (c == 60) ? 0 : c;
512
513 return d;
514 }
515
522 public static double DecimalDegreesToDegreeHours(double decimalDegrees)
523 {
524 return decimalDegrees / 15;
525 }
526
533 public static double DegreeHoursToDecimalDegrees(double degreeHours)
534 {
535 return degreeHours * 15;
536 }
537
544 public static double HorizonCoordinatesToDeclination(double azimuthDegrees, double azimuthMinutes, double azimuthSeconds, double altitudeDegrees, double altitudeMinutes, double altitudeSeconds, double geographicalLatitude)
545 {
546 double a = DegreesMinutesSecondsToDecimalDegrees(azimuthDegrees, azimuthMinutes, azimuthSeconds);
547 double b = DegreesMinutesSecondsToDecimalDegrees(altitudeDegrees, altitudeMinutes, altitudeSeconds);
548 double c = a.ToRadians();
549 double d = b.ToRadians();
550 double e = geographicalLatitude.ToRadians();
551 double f = d.Sine() * e.Sine() + d.Cosine() * e.Cosine() * c.Cosine();
552
553 return Degrees(f.ASine());
554 }
555
562 public static double HorizonCoordinatesToHourAngle(double azimuthDegrees, double azimuthMinutes, double azimuthSeconds, double altitudeDegrees, double altitudeMinutes, double altitudeSeconds, double geographicalLatitude)
563 {
564 double a = DegreesMinutesSecondsToDecimalDegrees(azimuthDegrees, azimuthMinutes, azimuthSeconds);
565 double b = DegreesMinutesSecondsToDecimalDegrees(altitudeDegrees, altitudeMinutes, altitudeSeconds);
566 double c = a.ToRadians();
567 double d = b.ToRadians();
568 double e = geographicalLatitude.ToRadians();
569 double f = d.Sine() * e.Sine() + d.Cosine() * e.Cosine() * c.Cosine();
570 double g = -d.Cosine() * e.Cosine() * c.Sine();
571 double h = d.Sine() - e.Sine() * f;
572 double i = DecimalDegreesToDegreeHours(Degrees(g.AngleTangent2(h)));
573
574 return i - 24 * (i / 24).Floor();
575 }
576
583 public static double Obliq(double greenwichDay, int greenwichMonth, int greenwichYear)
584 {
585 double a = CivilDateToJulianDate(greenwichDay, greenwichMonth, greenwichYear);
586 double b = a - 2415020;
587 double c = (b / 36525) - 1;
588 double d = c * (46.815 + c * (0.0006 - (c * 0.00181)));
589 double e = d / 3600;
590
591 return 23.43929167 - e + NutatObl(greenwichDay, greenwichMonth, greenwichYear);
592 }
593
600 public static double NutatLong(double gd, int gm, int gy)
601 {
602 double dj = CivilDateToJulianDate(gd, gm, gy) - 2415020;
603 double t = dj / 36525;
604 double t2 = t * t;
605
606 double a = 100.0021358 * t;
607 double b = 360 * (a - a.Floor());
608
609 double l1 = 279.6967 + 0.000303 * t2 + b;
610 double l2 = 2 * l1.ToRadians();
611
612 a = 1336.855231 * t;
613 b = 360 * (a - a.Floor());
614
615 double d1 = 270.4342 - 0.001133 * t2 + b;
616 double d2 = 2 * d1.ToRadians();
617
618 a = 99.99736056 * t;
619 b = 360 * (a - a.Floor());
620
621 double m1 = 358.4758 - 0.00015 * t2 + b;
622 m1 = m1.ToRadians();
623
624 a = 1325.552359 * t;
625 b = 360 * (a - a.Floor());
626
627 double m2 = 296.1046 + 0.009192 * t2 + b;
628 m2 = m2.ToRadians();
629
630 a = 5.372616667 * t;
631 b = 360 * (a - a.Floor());
632
633 double n1 = 259.1833 + 0.002078 * t2 - b;
634 n1 = n1.ToRadians();
635
636 double n2 = 2.0 * n1;
637
638 double dp = (-17.2327 - 0.01737 * t) * n1.Sine();
639 dp = dp + (-1.2729 - 0.00013 * t) * l2.Sine() + 0.2088 * n2.Sine();
640 dp = dp - 0.2037 * d2.Sine() + (0.1261 - 0.00031 * t) * m1.Sine();
641 dp = dp + 0.0675 * m2.Sine() - (0.0497 - 0.00012 * t) * (l2 + m1).Sine();
642 dp = dp - 0.0342 * (d2 - n1).Sine() - 0.0261 * (d2 + m2).Sine();
643 dp = dp + 0.0214 * (l2 - m1).Sine() - 0.0149 * (l2 - d2 + m2).Sine();
644 dp = dp + 0.0124 * (l2 - n1).Sine() + 0.0114 * (d2 - m2).Sine();
645
646 return dp / 3600;
647 }
648
655 public static double NutatObl(double greenwichDay, int greenwichMonth, int greenwichYear)
656 {
657 double dj = CivilDateToJulianDate(greenwichDay, greenwichMonth, greenwichYear) - 2415020;
658 double t = dj / 36525;
659 double t2 = t * t;
660
661 double a = 100.0021358 * t;
662 double b = 360 * (a - a.Floor());
663
664 double l1 = 279.6967 + 0.000303 * t2 + b;
665 double l2 = 2 * l1.ToRadians();
666
667 a = 1336.855231 * t;
668 b = 360 * (a - a.Floor());
669
670 double d1 = 270.4342 - 0.001133 * t2 + b;
671 double d2 = 2 * d1.ToRadians();
672
673 a = 99.99736056 * t;
674 b = 360 * (a - a.Floor());
675
676 double m1 = (358.4758 - 0.00015 * t2 + b).ToRadians();
677
678 a = 1325.552359 * t;
679 b = 360 * (a - a.Floor());
680
681 double m2 = (296.1046 + 0.009192 * t2 + b).ToRadians();
682
683 a = 5.372616667 * t;
684 b = 360 * (a - a.Floor());
685
686 double n1 = (259.1833 + 0.002078 * t2 - b).ToRadians();
687
688 double n2 = 2 * n1;
689
690 double ddo = (9.21 + 0.00091 * t) * n1.Cosine();
691 ddo = ddo + (0.5522 - 0.00029 * t) * l2.Cosine() - 0.0904 * n2.Cosine();
692 ddo = ddo + 0.0884 * d2.Cosine() + 0.0216 * (l2 + m1).Cosine();
693 ddo = ddo + 0.0183 * (d2 - n1).Cosine() + 0.0113 * (d2 + m2).Cosine();
694 ddo = ddo - 0.0093 * (l2 - m1).Cosine() - 0.0066 * (l2 - n1).Cosine();
695
696 return ddo / 3600;
697 }
698
705 public static double LocalSiderealTimeToGreenwichSiderealTime(double localHours, double localMinutes, double localSeconds, double longitude)
706 {
707 double a = HMStoDH(localHours, localMinutes, localSeconds);
708 double b = longitude / 15;
709 double c = a - b;
710
711 return c - (24 * (c / 24).Floor());
712 }
713
720 public static double GreenwichSiderealTimeToUniversalTime(double greenwichSiderealHours, double greenwichSiderealMinutes, double greenwichSiderealSeconds, double greenwichDay, int greenwichMonth, int greenwichYear)
721 {
722 double a = CivilDateToJulianDate(greenwichDay, greenwichMonth, greenwichYear);
723 double b = a - 2451545;
724 double c = b / 36525;
725 double d = 6.697374558 + (2400.051336 * c) + (0.000025862 * c * c);
726 double e = d - (24 * (d / 24).Floor());
727 double f = HMStoDH(greenwichSiderealHours, greenwichSiderealMinutes, greenwichSiderealSeconds);
728 double g = f - e;
729 double h = g - (24 * (g / 24).Floor());
730
731 return h * 0.9972695663;
732 }
733
740 public static PAWarningFlag EGstUt(double gsh, double gsm, double gss, double gd, int gm, int gy)
741 {
742 double a = CivilDateToJulianDate(gd, gm, gy);
743 double b = a - 2451545;
744 double c = b / 36525;
745 double d = 6.697374558 + (2400.051336 * c) + (0.000025862 * c * c);
746 double e = d - (24 * (d / 24).Floor());
747 double f = HMStoDH(gsh, gsm, gss);
748 double g = f - e;
749 double h = g - (24 * (g / 24).Floor());
750
751 return ((h * 0.9972695663) < (4.0 / 60.0)) ? PAWarningFlag.Warning : PAWarningFlag.OK;
752 }
753
760 public static double SunLong(double lch, double lcm, double lcs, int ds, int zc, double ld, int lm, int ly)
761 {
762 double aa = LocalCivilTimeGreenwichDay(lch, lcm, lcs, ds, zc, ld, lm, ly);
763 int bb = LocalCivilTimeGreenwichMonth(lch, lcm, lcs, ds, zc, ld, lm, ly);
764 int cc = LocalCivilTimeGreenwichYear(lch, lcm, lcs, ds, zc, ld, lm, ly);
765 double ut = LocalCivilTimeToUniversalTime(lch, lcm, lcs, ds, zc, ld, lm, ly);
766 double dj = CivilDateToJulianDate(aa, bb, cc) - 2415020;
767 double t = (dj / 36525) + (ut / 876600);
768 double t2 = t * t;
769 double a = 100.0021359 * t;
770 double b = 360.0 * (a - a.Floor());
771
772 double l = 279.69668 + 0.0003025 * t2 + b;
773 a = 99.99736042 * t;
774 b = 360 * (a - a.Floor());
775
776 double m1 = 358.47583 - (0.00015 + 0.0000033 * t) * t2 + b;
777 double ec = 0.01675104 - 0.0000418 * t - 0.000000126 * t2;
778
779 double am = m1.ToRadians();
780 double at = TrueAnomaly(am, ec);
781
782 a = 62.55209472 * t;
783 b = 360 * (a - a.Floor());
784
785 double a1 = (153.23 + b).ToRadians();
786 a = 125.1041894 * t;
787 b = 360 * (a - a.Floor());
788
789 double b1 = (216.57 + b).ToRadians();
790 a = 91.56766028 * t;
791 b = 360.0 * (a - a.Floor());
792
793 double c1 = (312.69 + b).ToRadians();
794 a = 1236.853095 * t;
795 b = 360.0 * (a - a.Floor());
796
797 double d1 = (350.74 - 0.00144 * t2 + b).ToRadians();
798 double e1 = (231.19 + 20.2 * t).ToRadians();
799 a = 183.1353208 * t;
800 b = 360.0 * (a - a.Floor());
801 double h1 = (353.4 + b).ToRadians();
802
803 double d2 = 0.00134 * a1.Cosine() + 0.00154 * b1.Cosine() + 0.002 * c1.Cosine();
804 d2 = d2 + 0.00179 * d1.Sine() + 0.00178 * e1.Sine();
805 double d3 = 0.00000543 * a1.Sine() + 0.00001575 * b1.Sine();
806 d3 = d3 + 0.00001627 * c1.Sine() + 0.00003076 * d1.Cosine();
807
808 double sr = at + (l - m1 + d2).ToRadians();
809 double tp = 6.283185308;
810
811 sr -= tp * (sr / tp).Floor();
812
813 return Degrees(sr);
814 }
815
822 public static double TrueAnomaly(double am, double ec)
823 {
824 double tp = 6.283185308;
825 double m = am - tp * (am / tp).Floor();
826 double ae = m;
827
828 while (1 == 1)
829 {
830 double d = ae - (ec * ae.Sine()) - m;
831 if (Math.Abs(d) < 0.000001)
832 {
833 break;
834 }
835 d /= (1.0 - (ec * ae.Cosine()));
836 ae -= d;
837 }
838 double a = ((1 + ec) / (1 - ec)).SquareRoot() * (ae / 2).Tangent();
839 double at = 2.0 * a.AngleTangent();
840
841 return at;
842 }
843
850 public static double EccentricAnomaly(double am, double ec)
851 {
852 double tp = 6.283185308;
853 double m = am - tp * (am / tp).Floor();
854 double ae = m;
855
856 while (1 == 1)
857 {
858 double d = ae - (ec * ae.Sine()) - m;
859
860 if (Math.Abs(d) < 0.000001)
861 {
862 break;
863 }
864
865 d /= (1 - (ec * ae.Cosine()));
866 ae -= d;
867 }
868
869 return ae;
870 }
871
878 public static double Refract(double y2, PACoordinateType sw, double pr, double tr)
879 {
880 double y = y2.ToRadians();
881
882 double d = (sw == PACoordinateType.True) ? -1.0 : 1.0;
883
884 if (d == -1)
885 {
886 double y3 = y;
887 double y1 = y;
888 double r1 = 0.0;
889
890 while (1 == 1)
891 {
892 double yNew = y1 + r1;
893 double rfNew = RefractL3035(pr, tr, yNew, d);
894
895 if (y < -0.087)
896 return 0;
897
898 double r2 = rfNew;
899
900 if ((r2 == 0) || (Math.Abs(r2 - r1) < 0.000001))
901 {
902 double qNew = y3;
903
904 return Degrees(qNew + rfNew);
905 }
906
907 r1 = r2;
908 }
909 }
910
911 double rf = RefractL3035(pr, tr, y, d);
912
913 if (y < -0.087)
914 return 0;
915
916 double q = y;
917
918 return Degrees(q + rf);
919 }
920
924 public static double RefractL3035(double pr, double tr, double y, double d)
925 {
926 if (y < 0.2617994)
927 {
928 if (y < -0.087)
929 return 0;
930
931 double yd = Degrees(y);
932 double a = ((0.00002 * yd + 0.0196) * yd + 0.1594) * pr;
933 double b = (273.0 + tr) * ((0.0845 * yd + 0.505) * yd + 1);
934
935 return (-(a / b) * d).ToRadians();
936 }
937
938 return -d * 0.00007888888 * pr / ((273.0 + tr) * y.Tangent());
939 }
940
947 public static double ParallaxHA(double hh, double hm, double hs, double dd, double dm, double ds, PACoordinateType sw, double gp, double ht, double hp)
948 {
949 double a = gp.ToRadians();
950 double c1 = a.Cosine();
951 double s1 = a.Sine();
952
953 double u = (0.996647 * s1 / c1).AngleTangent();
954 double c2 = u.Cosine();
955 double s2 = u.Sine();
956 double b = ht / 6378160;
957
958 double rs = (0.996647 * s2) + (b * s1);
959
960 double rc = c2 + (b * c1);
961 double tp = 6.283185308;
962
963 double rp = 1.0 / hp.ToRadians().Sine();
964
965 double x = DegreeHoursToDecimalDegrees(HMStoDH(hh, hm, hs)).ToRadians();
966 double x1 = x;
967 double y = DegreesMinutesSecondsToDecimalDegrees(dd, dm, ds).ToRadians();
968 double y1 = y;
969
970 double d = sw.Equals(PACoordinateType.True) ? 1.0 : -1.0;
971
972 if (d == 1)
973 {
974 (double p, double q) result = ParallaxHAL2870(x, y, rc, rp, rs, tp);
975 return DecimalDegreesToDegreeHours(Degrees(result.p));
976 }
977
978 double p1 = 0.0;
979 double q1 = 0.0;
980 double xLoop = x;
981 double yLoop = y;
982
983 while (1 == 1)
984 {
985 (double p, double q) result = ParallaxHAL2870(xLoop, yLoop, rc, rp, rs, tp);
986 double p2 = result.p - xLoop;
987 double q2 = result.q - yLoop;
988
989 double aa = Math.Abs(p2 - p1);
990 double bb = Math.Abs(q2 - q1);
991
992 if ((aa < 0.000001) && (bb < 0.000001))
993 {
994 double p = x1 - p2;
995
997 }
998
999 xLoop = x1 - p2;
1000 yLoop = y1 - q2;
1001 p1 = p2;
1002 q1 = q2;
1003 }
1004
1005 // return DecimalDegreesToDegreeHours(Degrees(0));
1006 }
1007
1011 public static (double p, double q) ParallaxHAL2870(double x, double y, double rc, double rp, double rs, double tp)
1012 {
1013 double cx = x.Cosine();
1014 double sy = y.Sine();
1015 double cy = y.Cosine();
1016
1017 double aa = rc * x.Sine() / ((rp * cy) - (rc * cx));
1018
1019 double dx = aa.AngleTangent();
1020 double p = x + dx;
1021 double cp = p.Cosine();
1022
1023 p -= tp * (p / tp).Floor();
1024 double q = (cp * (rp * sy - rs) / (rp * cy * cx - rc)).AngleTangent();
1025
1026 return (p, q);
1027 }
1028
1040 public static double ParallaxDec(double hh, double hm, double hs, double dd, double dm, double ds, PACoordinateType sw, double gp, double ht, double hp)
1041 {
1042 double a = gp.ToRadians();
1043 double c1 = a.Cosine();
1044 double s1 = a.Sine();
1045
1046 double u = (0.996647 * s1 / c1).AngleTangent();
1047
1048 double c2 = u.Cosine();
1049 double s2 = u.Sine();
1050 double b = ht / 6378160;
1051 double rs = (0.996647 * s2) + (b * s1);
1052
1053 double rc = c2 + (b * c1);
1054 double tp = 6.283185308;
1055
1056 double rp = 1.0 / hp.ToRadians().Sine();
1057
1058 double x = DegreeHoursToDecimalDegrees(HMStoDH(hh, hm, hs)).ToRadians();
1059 double x1 = x;
1060
1061 double y = DegreesMinutesSecondsToDecimalDegrees(dd, dm, ds).ToRadians();
1062 double y1 = y;
1063
1064 double d = sw.Equals(PACoordinateType.True) ? 1.0 : -1.0;
1065
1066 if (d == 1)
1067 {
1068 (double p, double q) result = ParallaxDecL2870(x, y, rc, rp, rs, tp);
1069
1070 return Degrees(result.q);
1071 }
1072
1073 double p1 = 0.0;
1074 double q1 = 0.0;
1075
1076 double xLoop = x;
1077 double yLoop = y;
1078
1079 while (1 == 1)
1080 {
1081 (double p, double q) result = ParallaxDecL2870(xLoop, yLoop, rc, rp, rs, tp);
1082 double p2 = result.p - xLoop;
1083 double q2 = result.q - yLoop;
1084 double aa = Math.Abs(p2 - p1);
1085
1086 if ((aa < 0.000001) && (b < 0.000001))
1087 {
1088 double q = y1 - q2;
1089
1090 return Degrees(q);
1091 }
1092 xLoop = x1 - p2;
1093 yLoop = y1 - q2;
1094 p1 = p2;
1095 q1 = q2;
1096 }
1097
1098 // return Degrees(0.0);
1099 }
1100
1104 public static (double p, double q) ParallaxDecL2870(double x, double y, double rc, double rp, double rs, double tp)
1105 {
1106 double cx = x.Cosine();
1107 double sy = y.Sine();
1108 double cy = y.Cosine();
1109
1110 double aa = rc * x.Sine() / ((rp * cy) - (rc * cx));
1111 double dx = aa.AngleTangent();
1112 double p = x + dx;
1113 double cp = p.Cosine();
1114
1115 p -= tp * (p / tp).Floor();
1116 double q = (cp * (rp * sy - rs) / (rp * cy * cx - rc)).AngleTangent();
1117
1118 return (p, q);
1119 }
1120
1127 public static double SunDia(double lch, double lcm, double lcs, int ds, int zc, double ld, int lm, int ly)
1128 {
1129 double a = SunDist(lch, lcm, lcs, ds, zc, ld, lm, ly);
1130
1131 return 0.533128 / a;
1132 }
1133
1140 public static double SunDist(double lch, double lcm, double lcs, int ds, int zc, double ld, int lm, int ly)
1141 {
1142 double aa = LocalCivilTimeGreenwichDay(lch, lcm, lcs, ds, zc, ld, lm, ly);
1143 int bb = LocalCivilTimeGreenwichMonth(lch, lcm, lcs, ds, zc, ld, lm, ly);
1144 int cc = LocalCivilTimeGreenwichYear(lch, lcm, lcs, ds, zc, ld, lm, ly);
1145 double ut = LocalCivilTimeToUniversalTime(lch, lcm, lcs, ds, zc, ld, lm, ly);
1146 double dj = CivilDateToJulianDate(aa, bb, cc) - 2415020;
1147
1148 double t = (dj / 36525) + (ut / 876600);
1149 double t2 = t * t;
1150
1151 double a = 100.0021359 * t;
1152 double b = 360 * (a - a.Floor());
1153 a = 99.99736042 * t;
1154 b = 360 * (a - a.Floor());
1155 double m1 = 358.47583 - (0.00015 + 0.0000033 * t) * t2 + b;
1156 double ec = 0.01675104 - 0.0000418 * t - 0.000000126 * t2;
1157
1158 double am = m1.ToRadians();
1159 double ae = EccentricAnomaly(am, ec);
1160
1161 a = 62.55209472 * t;
1162 b = 360 * (a - a.Floor());
1163 double a1 = (153.23 + b).ToRadians();
1164 a = 125.1041894 * t;
1165 b = 360 * (a - a.Floor());
1166 double b1 = (216.57 + b).ToRadians();
1167 a = 91.56766028 * t;
1168 b = 360 * (a - a.Floor());
1169 double c1 = (312.69 + b).ToRadians();
1170 a = 1236.853095 * t;
1171 b = 360 * (a - a.Floor());
1172 double d1 = (350.74 - 0.00144 * t2 + b).ToRadians();
1173 double e1 = (231.19 + 20.2 * t).ToRadians();
1174 a = 183.1353208 * t;
1175 b = 360 * (a - a.Floor());
1176 double h1 = (353.4 + b).ToRadians();
1177
1178 double d3 = 0.00000543 * a1.Sine() + 0.00001575 * b1.Sine() + (0.00001627 * c1.Sine() + 0.00003076 * d1.Cosine()) + (0.00000927 * h1.Sine());
1179
1180 return 1.0000002 * (1 - ec * ae.Cosine()) + d3;
1181 }
1182
1189 public static double MoonLong(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr)
1190 {
1191 double ut = LocalCivilTimeToUniversalTime(lh, lm, ls, ds, zc, dy, mn, yr);
1192 double gd = LocalCivilTimeGreenwichDay(lh, lm, ls, ds, zc, dy, mn, yr);
1193 int gm = LocalCivilTimeGreenwichMonth(lh, lm, ls, ds, zc, dy, mn, yr);
1194 int gy = LocalCivilTimeGreenwichYear(lh, lm, ls, ds, zc, dy, mn, yr);
1195 double t = ((CivilDateToJulianDate(gd, gm, gy) - 2415020) / 36525) + (ut / 876600);
1196 double t2 = t * t;
1197
1198 double m1 = 27.32158213;
1199 double m2 = 365.2596407;
1200 double m3 = 27.55455094;
1201 double m4 = 29.53058868;
1202 double m5 = 27.21222039;
1203 double m6 = 6798.363307;
1204 double q = CivilDateToJulianDate(gd, gm, gy) - 2415020 + (ut / 24);
1205 m1 = q / m1;
1206 m2 = q / m2;
1207 m3 = q / m3;
1208 m4 = q / m4;
1209 m5 = q / m5;
1210 m6 = q / m6;
1211 m1 = 360 * (m1 - m1.Floor());
1212 m2 = 360 * (m2 - m2.Floor());
1213 m3 = 360 * (m3 - m3.Floor());
1214 m4 = 360 * (m4 - m4.Floor());
1215 m5 = 360 * (m5 - m5.Floor());
1216 m6 = 360 * (m6 - m6.Floor());
1217
1218 double ml = 270.434164 + m1 - (0.001133 - 0.0000019 * t) * t2;
1219 double ms = 358.475833 + m2 - (0.00015 + 0.0000033 * t) * t2;
1220 double md = 296.104608 + m3 + (0.009192 + 0.0000144 * t) * t2;
1221 double me1 = 350.737486 + m4 - (0.001436 - 0.0000019 * t) * t2;
1222 double mf = 11.250889 + m5 - (0.003211 + 0.0000003 * t) * t2;
1223 double na = 259.183275 - m6 + (0.002078 + 0.0000022 * t) * t2;
1224 double a = (51.2 + 20.2 * t).ToRadians();
1225 double s1 = a.Sine();
1226 double s2 = na.ToRadians().Sine();
1227 double b = 346.56 + (132.87 - 0.0091731 * t) * t;
1228 double s3 = 0.003964 * b.ToRadians().Sine();
1229 double c = (na + 275.05 - 2.3 * t).ToRadians();
1230 double s4 = c.Sine();
1231 ml = ml + 0.000233 * s1 + s3 + 0.001964 * s2;
1232 ms -= 0.001778 * s1;
1233 md = md + 0.000817 * s1 + s3 + 0.002541 * s2;
1234 mf = mf + s3 - 0.024691 * s2 - 0.004328 * s4;
1235 me1 = me1 + 0.002011 * s1 + s3 + 0.001964 * s2;
1236 double e = 1.0 - (0.002495 + 0.00000752 * t) * t;
1237 double e2 = e * e;
1238 ml = ml.ToRadians();
1239 ms = ms.ToRadians();
1240 me1 = me1.ToRadians();
1241 mf = mf.ToRadians();
1242 md = md.ToRadians();
1243
1244 double l = 6.28875 * md.Sine() + 1.274018 * (2.0 * me1 - md).Sine();
1245 l = l + 0.658309 * (2.0 * me1).Sine() + 0.213616 * (2.0 * md).Sine();
1246 l = l - e * 0.185596 * ms.Sine() - 0.114336 * (2.0 * mf).Sine();
1247 l += 0.058793 * (2.0 * (me1 - md)).Sine();
1248 l = l + 0.057212 * e * (2.0 * me1 - ms - md).Sine() + 0.05332 * (2.0 * me1 + md).Sine();
1249 l = l + 0.045874 * e * (2.0 * me1 - ms).Sine() + 0.041024 * e * (md - ms).Sine();
1250 l = l - 0.034718 * me1.Sine() - e * 0.030465 * (ms + md).Sine();
1251 l = l + 0.015326 * (2.0 * (me1 - mf)).Sine() - 0.012528 * (2.0 * mf + md).Sine();
1252 l = l - 0.01098 * (2.0 * mf - md).Sine() + 0.010674 * (4.0 * me1 - md).Sine();
1253 l = l + 0.010034 * (3.0 * md).Sine() + 0.008548 * (4.0 * me1 - 2.0 * md).Sine();
1254 l = l - e * 0.00791 * (ms - md + 2.0 * me1).Sine() - e * 0.006783 * (2.0 * me1 + ms).Sine();
1255 l = l + 0.005162 * (md - me1).Sine() + e * 0.005 * (ms + me1).Sine();
1256 l = l + 0.003862 * (4.0 * me1).Sine() + e * 0.004049 * (md - ms + 2.0 * me1).Sine();
1257 l = l + 0.003996 * (2.0 * (md + me1)).Sine() + 0.003665 * (2.0 * me1 - 3.0 * md).Sine();
1258 l = l + e * 0.002695 * (2.0 * md - ms).Sine() + 0.002602 * (md - 2.0 * (mf + me1)).Sine();
1259 l = l + e * 0.002396 * (2.0 * (me1 - md) - ms).Sine() - 0.002349 * (md + me1).Sine();
1260 l = l + e2 * 0.002249 * (2.0 * (me1 - ms)).Sine() - e * 0.002125 * (2.0 * md + ms).Sine();
1261 l = l - e2 * 0.002079 * (2.0 * ms).Sine() + e2 * 0.002059 * (2.0 * (me1 - ms) - md).Sine();
1262 l = l - 0.001773 * (md + 2.0 * (me1 - mf)).Sine() - 0.001595 * (2.0 * (mf + me1)).Sine();
1263 l = l + e * 0.00122 * (4.0 * me1 - ms - md).Sine() - 0.00111 * (2.0 * (md + mf)).Sine();
1264 l = l + 0.000892 * (md - 3.0 * me1).Sine() - e * 0.000811 * (ms + md + 2.0 * me1).Sine();
1265 l += e * 0.000761 * (4.0 * me1 - ms - 2.0 * md).Sine();
1266 l += e2 * 0.000704 * (md - 2.0 * (ms + me1)).Sine();
1267 l += e * 0.000693 * (ms - 2.0 * (md - me1)).Sine();
1268 l += e * 0.000598 * (2.0 * (me1 - mf) - ms).Sine();
1269 l = l + 0.00055 * (md + 4.0 * me1).Sine() + 0.000538 * (4.0 * md).Sine();
1270 l = l + e * 0.000521 * (4.0 * me1 - ms).Sine() + 0.000486 * (2.0 * md - me1).Sine();
1271 l += e2 * 0.000717 * (md - 2.0 * ms).Sine();
1272 double mm = Unwind(ml + l.ToRadians());
1273
1274 return Degrees(mm);
1275 }
1276
1283 public static double MoonLat(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr)
1284 {
1285 double ut = LocalCivilTimeToUniversalTime(lh, lm, ls, ds, zc, dy, mn, yr);
1286 double gd = LocalCivilTimeGreenwichDay(lh, lm, ls, ds, zc, dy, mn, yr);
1287 int gm = LocalCivilTimeGreenwichMonth(lh, lm, ls, ds, zc, dy, mn, yr);
1288 int gy = LocalCivilTimeGreenwichYear(lh, lm, ls, ds, zc, dy, mn, yr);
1289 double t = ((CivilDateToJulianDate(gd, gm, gy) - 2415020) / 36525) + (ut / 876600);
1290 double t2 = t * t;
1291
1292 double m1 = 27.32158213;
1293 double m2 = 365.2596407;
1294 double m3 = 27.55455094;
1295 double m4 = 29.53058868;
1296 double m5 = 27.21222039;
1297 double m6 = 6798.363307;
1298 double q = CivilDateToJulianDate(gd, gm, gy) - 2415020 + (ut / 24);
1299 m1 = q / m1;
1300 m2 = q / m2;
1301 m3 = q / m3;
1302 m4 = q / m4;
1303 m5 = q / m5;
1304 m6 = q / m6;
1305 m1 = 360 * (m1 - m1.Floor());
1306 m2 = 360 * (m2 - m2.Floor());
1307 m3 = 360 * (m3 - m3.Floor());
1308 m4 = 360 * (m4 - m4.Floor());
1309 m5 = 360 * (m5 - m5.Floor());
1310 m6 = 360 * (m6 - m6.Floor());
1311
1312 double ml = 270.434164 + m1 - (0.001133 - 0.0000019 * t) * t2;
1313 double ms = 358.475833 + m2 - (0.00015 + 0.0000033 * t) * t2;
1314 double md = 296.104608 + m3 + (0.009192 + 0.0000144 * t) * t2;
1315 double me1 = 350.737486 + m4 - (0.001436 - 0.0000019 * t) * t2;
1316 double mf = 11.250889 + m5 - (0.003211 + 0.0000003 * t) * t2;
1317 double na = 259.183275 - m6 + (0.002078 + 0.0000022 * t) * t2;
1318 double a = (51.2 + 20.2 * t).ToRadians();
1319 double s1 = a.Sine();
1320 double s2 = na.ToRadians().Sine();
1321 double b = 346.56 + (132.87 - 0.0091731 * t) * t;
1322 double s3 = 0.003964 * b.ToRadians().Sine();
1323 double c = (na + 275.05 - 2.3 * t).ToRadians();
1324 double s4 = c.Sine();
1325 ml = ml + 0.000233 * s1 + s3 + 0.001964 * s2;
1326 ms -= 0.001778 * s1;
1327 md = md + 0.000817 * s1 + s3 + 0.002541 * s2;
1328 mf = mf + s3 - 0.024691 * s2 - 0.004328 * s4;
1329 me1 = me1 + 0.002011 * s1 + s3 + 0.001964 * s2;
1330 double e = 1.0 - (0.002495 + 0.00000752 * t) * t;
1331 double e2 = e * e;
1332 ms = ms.ToRadians();
1333 na = na.ToRadians();
1334 me1 = me1.ToRadians();
1335 mf = mf.ToRadians();
1336 md = md.ToRadians();
1337
1338 double g = 5.128189 * mf.Sine() + 0.280606 * (md + mf).Sine();
1339 g = g + 0.277693 * (md - mf).Sine() + 0.173238 * (2.0 * me1 - mf).Sine();
1340 g = g + 0.055413 * (2.0 * me1 + mf - md).Sine() + 0.046272 * (2.0 * me1 - mf - md).Sine();
1341 g = g + 0.032573 * (2.0 * me1 + mf).Sine() + 0.017198 * (2.0 * md + mf).Sine();
1342 g = g + 0.009267 * (2.0 * me1 + md - mf).Sine() + 0.008823 * (2.0 * md - mf).Sine();
1343 g = g + e * 0.008247 * (2.0 * me1 - ms - mf).Sine() + 0.004323 * (2.0 * (me1 - md) - mf).Sine();
1344 g = g + 0.0042 * (2.0 * me1 + mf + md).Sine() + e * 0.003372 * (mf - ms - 2.0 * me1).Sine();
1345 g += e * 0.002472 * (2.0 * me1 + mf - ms - md).Sine();
1346 g += e * 0.002222 * (2.0 * me1 + mf - ms).Sine();
1347 g += e * 0.002072 * (2.0 * me1 - mf - ms - md).Sine();
1348 g = g + e * 0.001877 * (mf - ms + md).Sine() + 0.001828 * (4.0 * me1 - mf - md).Sine();
1349 g = g - e * 0.001803 * (mf + ms).Sine() - 0.00175 * (3.0 * mf).Sine();
1350 g = g + e * 0.00157 * (md - ms - mf).Sine() - 0.001487 * (mf + me1).Sine();
1351 g = g - e * 0.001481 * (mf + ms + md).Sine() + e * 0.001417 * (mf - ms - md).Sine();
1352 g = g + e * 0.00135 * (mf - ms).Sine() + 0.00133 * (mf - me1).Sine();
1353 g = g + 0.001106 * (mf + 3.0 * md).Sine() + 0.00102 * (4.0 * me1 - mf).Sine();
1354 g = g + 0.000833 * (mf + 4.0 * me1 - md).Sine() + 0.000781 * (md - 3.0 * mf).Sine();
1355 g = g + 0.00067 * (mf + 4.0 * me1 - 2.0 * md).Sine() + 0.000606 * (2.0 * me1 - 3.0 * mf).Sine();
1356 g += 0.000597 * (2.0 * (me1 + md) - mf).Sine();
1357 g = g + e * 0.000492 * (2.0 * me1 + md - ms - mf).Sine() + 0.00045 * (2.0 * (md - me1) - mf).Sine();
1358 g = g + 0.000439 * (3.0 * md - mf).Sine() + 0.000423 * (mf + 2.0 * (me1 + md)).Sine();
1359 g = g + 0.000422 * (2.0 * me1 - mf - 3.0 * md).Sine() - e * 0.000367 * (ms + mf + 2.0 * me1 - md).Sine();
1360 g = g - e * 0.000353 * (ms + mf + 2.0 * me1).Sine() + 0.000331 * (mf + 4.0 * me1).Sine();
1361 g += e * 0.000317 * (2.0 * me1 + mf - ms + md).Sine();
1362 g = g + e2 * 0.000306 * (2.0 * (me1 - ms) - mf).Sine() - 0.000283 * (md + 3.0 * mf).Sine();
1363 double w1 = 0.0004664 * na.Cosine();
1364 double w2 = 0.0000754 * c.Cosine();
1365 double bm = g.ToRadians() * (1.0 - w1 - w2);
1366
1367 return Degrees(bm);
1368 }
1369
1376 public static double MoonHP(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr)
1377 {
1378 double ut = LocalCivilTimeToUniversalTime(lh, lm, ls, ds, zc, dy, mn, yr);
1379 double gd = LocalCivilTimeGreenwichDay(lh, lm, ls, ds, zc, dy, mn, yr);
1380 int gm = LocalCivilTimeGreenwichMonth(lh, lm, ls, ds, zc, dy, mn, yr);
1381 int gy = LocalCivilTimeGreenwichYear(lh, lm, ls, ds, zc, dy, mn, yr);
1382 double t = ((CivilDateToJulianDate(gd, gm, gy) - 2415020) / 36525) + (ut / 876600);
1383 double t2 = t * t;
1384
1385 double m1 = 27.32158213;
1386 double m2 = 365.2596407;
1387 double m3 = 27.55455094;
1388 double m4 = 29.53058868;
1389 double m5 = 27.21222039;
1390 double m6 = 6798.363307;
1391 double q = CivilDateToJulianDate(gd, gm, gy) - 2415020 + (ut / 24);
1392 m1 = q / m1;
1393 m2 = q / m2;
1394 m3 = q / m3;
1395 m4 = q / m4;
1396 m5 = q / m5;
1397 m6 = q / m6;
1398 m1 = 360 * (m1 - m1.Floor());
1399 m2 = 360 * (m2 - m2.Floor());
1400 m3 = 360 * (m3 - m3.Floor());
1401 m4 = 360 * (m4 - m4.Floor());
1402 m5 = 360 * (m5 - m5.Floor());
1403 m6 = 360 * (m6 - m6.Floor());
1404
1405 double ml = 270.434164 + m1 - (0.001133 - 0.0000019 * t) * t2;
1406 double ms = 358.475833 + m2 - (0.00015 + 0.0000033 * t) * t2;
1407 double md = 296.104608 + m3 + (0.009192 + 0.0000144 * t) * t2;
1408 double me1 = 350.737486 + m4 - (0.001436 - 0.0000019 * t) * t2;
1409 double mf = 11.250889 + m5 - (0.003211 + 0.0000003 * t) * t2;
1410 double na = 259.183275 - m6 + (0.002078 + 0.0000022 * t) * t2;
1411 double a = (51.2 + 20.2 * t).ToRadians();
1412 double s1 = a.Sine();
1413 double s2 = na.ToRadians().Sine();
1414 double b = 346.56 + (132.87 - 0.0091731 * t) * t;
1415 double s3 = 0.003964 * b.ToRadians().Sine();
1416 double c = (na + 275.05 - 2.3 * t).ToRadians();
1417 double s4 = c.Sine();
1418 ml = ml + 0.000233 * s1 + s3 + 0.001964 * s2;
1419 ms -= 0.001778 * s1;
1420 md = md + 0.000817 * s1 + s3 + 0.002541 * s2;
1421 mf = mf + s3 - 0.024691 * s2 - 0.004328 * s4;
1422 me1 = me1 + 0.002011 * s1 + s3 + 0.001964 * s2;
1423 double e = 1.0 - (0.002495 + 0.00000752 * t) * t;
1424 double e2 = e * e;
1425 ms = ms.ToRadians();
1426 me1 = me1.ToRadians();
1427 mf = mf.ToRadians();
1428 md = md.ToRadians();
1429
1430 double pm = 0.950724 + 0.051818 * md.Cosine() + 0.009531 * (2.0 * me1 - md).Cosine();
1431 pm = pm + 0.007843 * (2.0 * me1).Cosine() + 0.002824 * (2.0 * md).Cosine();
1432 pm = pm + 0.000857 * (2.0 * me1 + md).Cosine() + e * 0.000533 * (2.0 * me1 - ms).Cosine();
1433 pm += e * 0.000401 * (2.0 * me1 - md - ms).Cosine();
1434 pm = pm + e * 0.00032 * (md - ms).Cosine() - 0.000271 * me1.Cosine();
1435 pm = pm - e * 0.000264 * (ms + md).Cosine() - 0.000198 * (2.0 * mf - md).Cosine();
1436 pm = pm + 0.000173 * (3.0 * md).Cosine() + 0.000167 * (4.0 * me1 - md).Cosine();
1437 pm = pm - e * 0.000111 * ms.Cosine() + 0.000103 * (4.0 * me1 - 2.0 * md).Cosine();
1438 pm = pm - 0.000084 * (2.0 * md - 2.0 * me1).Cosine() - e * 0.000083 * (2.0 * me1 + ms).Cosine();
1439 pm = pm + 0.000079 * (2.0 * me1 + 2.0 * md).Cosine() + 0.000072 * (4.0 * me1).Cosine();
1440 pm = pm + e * 0.000064 * (2.0 * me1 - ms + md).Cosine() - e * 0.000063 * (2.0 * me1 + ms - md).Cosine();
1441 pm = pm + e * 0.000041 * (ms + me1).Cosine() + e * 0.000035 * (2.0 * md - ms).Cosine();
1442 pm = pm - 0.000033 * (3.0 * md - 2.0 * me1).Cosine() - 0.00003 * (md + me1).Cosine();
1443 pm = pm - 0.000029 * (2.0 * (mf - me1)).Cosine() - e * 0.000029 * (2.0 * md + ms).Cosine();
1444 pm = pm + e2 * 0.000026 * (2.0 * (me1 - ms)).Cosine() - 0.000023 * (2.0 * (mf - me1) + md).Cosine();
1445 pm += e * 0.000019 * (4.0 * me1 - ms - md).Cosine();
1446
1447 return pm;
1448 }
1449
1456 public static double MoonDist(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr)
1457 {
1458 double hp = MoonHP(lh, lm, ls, ds, zc, dy, mn, yr).ToRadians();
1459 double r = 6378.14 / hp.Sine();
1460
1461 return r;
1462 }
1463
1470 public static double MoonSize(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr)
1471 {
1472 double hp = MoonHP(lh, lm, ls, ds, zc, dy, mn, yr).ToRadians();
1473 double r = 6378.14 / hp.Sine();
1474 double th = 384401.0 * 0.5181 / r;
1475
1476 return th;
1477 }
1478
1485 public static double Unwind(double w)
1486 {
1487 return w - 6.283185308 * (w / 6.283185308).Floor();
1488 }
1489
1496 public static double UnwindDeg(double w)
1497 {
1498 return w - 360 * (w / 360).Floor();
1499 }
1500
1507 public static double SunELong(double gd, int gm, int gy)
1508 {
1509 double t = (CivilDateToJulianDate(gd, gm, gy) - 2415020) / 36525;
1510 double t2 = t * t;
1511 double x = 279.6966778 + 36000.76892 * t + 0.0003025 * t2;
1512
1513 return x - 360 * (x / 360).Floor();
1514 }
1515
1522 public static double SunPeri(double gd, int gm, int gy)
1523 {
1524 double t = (CivilDateToJulianDate(gd, gm, gy) - 2415020) / 36525;
1525 double t2 = t * t;
1526 double x = 281.2208444 + 1.719175 * t + 0.000452778 * t2;
1527
1528 return x - 360 * (x / 360).Floor();
1529 }
1530
1537 public static double SunEcc(double gd, int gm, int gy)
1538 {
1539 double t = (CivilDateToJulianDate(gd, gm, gy) - 2415020) / 36525;
1540 double t2 = t * t;
1541
1542 return 0.01675104 - 0.0000418 * t - 0.000000126 * t2;
1543 }
1544
1551 public static double EcDec(double eld, double elm, double els, double bd, double bm, double bs, double gd, int gm, int gy)
1552 {
1553 double a = DegreesMinutesSecondsToDecimalDegrees(eld, elm, els).ToRadians();
1554 double b = DegreesMinutesSecondsToDecimalDegrees(bd, bm, bs).ToRadians();
1555 double c = Obliq(gd, gm, gy).ToRadians();
1556 double d = b.Sine() * c.Cosine() + b.Cosine() * c.Sine() * a.Sine();
1557
1558 return Degrees(d.ASine());
1559 }
1560
1567 public static double EcRA(double eld, double elm, double els, double bd, double bm, double bs, double gd, int gm, int gy)
1568 {
1569 double a = DegreesMinutesSecondsToDecimalDegrees(eld, elm, els).ToRadians();
1570 double b = DegreesMinutesSecondsToDecimalDegrees(bd, bm, bs).ToRadians();
1571 double c = Obliq(gd, gm, gy).ToRadians();
1572 double d = a.Sine() * c.Cosine() - b.Tangent() * c.Sine();
1573 double e = a.Cosine();
1574 double f = Degrees(d.AngleTangent2(e));
1575
1576 return f - 360 * (f / 360).Floor();
1577 }
1578
1585 public static double SunTrueAnomaly(double lch, double lcm, double lcs, int ds, int zc, double ld, int lm, int ly)
1586 {
1587 double aa = LocalCivilTimeGreenwichDay(lch, lcm, lcs, ds, zc, ld, lm, ly);
1588 int bb = LocalCivilTimeGreenwichMonth(lch, lcm, lcs, ds, zc, ld, lm, ly);
1589 int cc = LocalCivilTimeGreenwichYear(lch, lcm, lcs, ds, zc, ld, lm, ly);
1590 double ut = LocalCivilTimeToUniversalTime(lch, lcm, lcs, ds, zc, ld, lm, ly);
1591 double dj = CivilDateToJulianDate(aa, bb, cc) - 2415020;
1592
1593 double t = (dj / 36525) + (ut / 876600);
1594 double t2 = t * t;
1595
1596 double a = 99.99736042 * t;
1597 double b = 360 * (a - a.Floor());
1598
1599 double m1 = 358.47583 - (0.00015 + 0.0000033 * t) * t2 + b;
1600 double ec = 0.01675104 - 0.0000418 * t - 0.000000126 * t2;
1601
1602 double am = m1.ToRadians();
1603
1604 return Degrees(TrueAnomaly(am, ec));
1605 }
1606
1613 public static double SunMeanAnomaly(double lch, double lcm, double lcs, int ds, int zc, double ld, int lm, int ly)
1614 {
1615 double aa = LocalCivilTimeGreenwichDay(lch, lcm, lcs, ds, zc, ld, lm, ly);
1616 int bb = LocalCivilTimeGreenwichMonth(lch, lcm, lcs, ds, zc, ld, lm, ly);
1617 int cc = LocalCivilTimeGreenwichYear(lch, lcm, lcs, ds, zc, ld, lm, ly);
1618 double ut = LocalCivilTimeToUniversalTime(lch, lcm, lcs, ds, zc, ld, lm, ly);
1619 double dj = CivilDateToJulianDate(aa, bb, cc) - 2415020;
1620 double t = (dj / 36525) + (ut / 876600);
1621 double t2 = t * t;
1622 double a = 100.0021359 * t;
1623 double b = 360 * (a - a.Floor());
1624 double m1 = 358.47583 - (0.00015 + 0.0000033 * t) * t2 + b;
1625 double am = Unwind(m1.ToRadians());
1626
1627 return am;
1628 }
1629
1636 public static double SunriseLCT(double ld, int lm, int ly, int ds, int zc, double gl, double gp)
1637 {
1638 double di = 0.8333333;
1639 double gd = LocalCivilTimeGreenwichDay(12, 0, 0, ds, zc, ld, lm, ly);
1640 int gm = LocalCivilTimeGreenwichMonth(12, 0, 0, ds, zc, ld, lm, ly);
1641 int gy = LocalCivilTimeGreenwichYear(12, 0, 0, ds, zc, ld, lm, ly);
1642 double sr = SunLong(12, 0, 0, ds, zc, ld, lm, ly);
1643
1644 (double a, double x, double y, double la, string s) result1 = SunriseLCTL3710(gd, gm, gy, sr, di, gp);
1645
1646 double xx;
1647 if (!result1.s.Equals("OK"))
1648 {
1649 xx = -99.0;
1650 }
1651 else
1652 {
1653 double x = LocalSiderealTimeToGreenwichSiderealTime(result1.la, 0, 0, gl);
1654 double ut = GreenwichSiderealTimeToUniversalTime(x, 0, 0, gd, gm, gy);
1655
1656 if (!EGstUt(x, 0, 0, gd, gm, gy).Equals(PAWarningFlag.OK))
1657 {
1658 xx = -99.0;
1659 }
1660 else
1661 {
1662 sr = SunLong(ut, 0, 0, 0, 0, gd, gm, gy);
1663 (double a, double x, double y, double la, string s) result2 = SunriseLCTL3710(gd, gm, gy, sr, di, gp);
1664
1665 if (!result2.s.Equals("OK"))
1666 {
1667 xx = -99.0;
1668 }
1669 else
1670 {
1671 x = LocalSiderealTimeToGreenwichSiderealTime(result2.la, 0, 0, gl);
1672 ut = GreenwichSiderealTimeToUniversalTime(x, 0, 0, gd, gm, gy);
1673 xx = UniversalTimeToLocalCivilTime(ut, 0, 0, ds, zc, gd, gm, gy);
1674 }
1675 }
1676 }
1677
1678 return xx;
1679 }
1680
1684 public static (double a, double x, double y, double la, string s) SunriseLCTL3710(double gd, int gm, int gy, double sr, double di, double gp)
1685 {
1686 double a = sr + NutatLong(gd, gm, gy) - 0.005694;
1687 double x = EcRA(a, 0, 0, 0, 0, 0, gd, gm, gy);
1688 double y = EcDec(a, 0, 0, 0, 0, 0, gd, gm, gy);
1689 double la = RiseSetLocalSiderealTimeRise(DecimalDegreesToDegreeHours(x), 0, 0, y, 0, 0, di, gp);
1690 string s = ERS(DecimalDegreesToDegreeHours(x), 0.0, 0.0, y, 0.0, 0.0, di, gp);
1691
1692 return (a, x, y, la, s);
1693 }
1694
1698 public static double SunsetLCT(double ld, int lm, int ly, int ds, int zc, double gl, double gp)
1699 {
1700 double di = 0.8333333;
1701 double gd = LocalCivilTimeGreenwichDay(12, 0, 0, ds, zc, ld, lm, ly);
1702 int gm = LocalCivilTimeGreenwichMonth(12, 0, 0, ds, zc, ld, lm, ly);
1703 int gy = LocalCivilTimeGreenwichYear(12, 0, 0, ds, zc, ld, lm, ly);
1704 double sr = SunLong(12, 0, 0, ds, zc, ld, lm, ly);
1705
1706 (double a, double x, double y, double la, string s) result1 = SunsetLCTL3710(gd, gm, gy, sr, di, gp);
1707
1708 double xx;
1709 if (!result1.s.Equals("OK"))
1710 {
1711 xx = -99.0;
1712 }
1713 else
1714 {
1715 double x = LocalSiderealTimeToGreenwichSiderealTime(result1.la, 0, 0, gl);
1716 double ut = GreenwichSiderealTimeToUniversalTime(x, 0, 0, gd, gm, gy);
1717
1718 if (!EGstUt(x, 0, 0, gd, gm, gy).Equals(PAWarningFlag.OK))
1719 {
1720 xx = -99.0;
1721 }
1722 else
1723 {
1724 sr = SunLong(ut, 0, 0, 0, 0, gd, gm, gy);
1725 (double a, double x, double y, double la, string s) result2 = SunsetLCTL3710(gd, gm, gy, sr, di, gp);
1726
1727 if (!result2.s.Equals("OK"))
1728 {
1729 xx = -99;
1730 }
1731 else
1732 {
1733 x = LocalSiderealTimeToGreenwichSiderealTime(result2.la, 0, 0, gl);
1734 ut = GreenwichSiderealTimeToUniversalTime(x, 0, 0, gd, gm, gy);
1735 xx = UniversalTimeToLocalCivilTime(ut, 0, 0, ds, zc, gd, gm, gy);
1736 }
1737 }
1738 }
1739 return xx;
1740 }
1741
1745 public static (double a, double x, double y, double la, string s) SunsetLCTL3710(double gd, int gm, int gy, double sr, double di, double gp)
1746 {
1747 double a = sr + NutatLong(gd, gm, gy) - 0.005694;
1748 double x = EcRA(a, 0.0, 0.0, 0.0, 0.0, 0.0, gd, gm, gy);
1749 double y = EcDec(a, 0.0, 0.0, 0.0, 0.0, 0.0, gd, gm, gy);
1750 double la = RiseSetLocalSiderealTimeSet(DecimalDegreesToDegreeHours(x), 0, 0, y, 0, 0, di, gp);
1751 string s = ERS(DecimalDegreesToDegreeHours(x), 0, 0, y, 0, 0, di, gp);
1752
1753 return (a, x, y, la, s);
1754 }
1755
1762 public static double RiseSetLocalSiderealTimeRise(double rah, double ram, double ras, double dd, double dm, double ds, double vd, double g)
1763 {
1764 double a = HMStoDH(rah, ram, ras);
1765 double b = DegreeHoursToDecimalDegrees(a).ToRadians();
1766 double c = DegreesMinutesSecondsToDecimalDegrees(dd, dm, ds).ToRadians();
1767 double d = vd.ToRadians();
1768 double e = g.ToRadians();
1769 double f = -(d.Sine() + e.Sine() * c.Sine()) / (e.Cosine() * c.Cosine());
1770 double h = (Math.Abs(f) < 1) ? f.ACosine() : 0;
1771 double i = DecimalDegreesToDegreeHours(Degrees(b - h));
1772
1773 return i - 24 * (i / 24).Floor();
1774 }
1775
1782 public static double RiseSetLocalSiderealTimeSet(double rah, double ram, double ras, double dd, double dm, double ds, double vd, double g)
1783 {
1784 double a = HMStoDH(rah, ram, ras);
1785 double b = DegreeHoursToDecimalDegrees(a).ToRadians();
1786 double c = DegreesMinutesSecondsToDecimalDegrees(dd, dm, ds).ToRadians();
1787 double d = vd.ToRadians();
1788 double e = g.ToRadians();
1789 double f = -(d.Sine() + e.Sine() * c.Sine()) / (e.Cosine() * c.Cosine());
1790 double h = (Math.Abs(f) < 1) ? f.ACosine() : 0;
1791 double i = DecimalDegreesToDegreeHours(Degrees(b + h));
1792
1793 return i - 24 * (i / 24).Floor();
1794 }
1795
1802 public static double RiseSetAzimuthRise(double rah, double ram, double ras, double dd, double dm, double ds, double vd, double g)
1803 {
1804 double a = HMStoDH(rah, ram, ras);
1805 double c = DegreesMinutesSecondsToDecimalDegrees(dd, dm, ds).ToRadians();
1806 double d = vd.ToRadians();
1807 double e = g.ToRadians();
1808 double f = (c.Sine() + d.Sine() * e.Sine()) / (d.Cosine() * e.Cosine());
1809 double h = ERS(rah, ram, ras, dd, dm, ds, vd, g).Equals("OK") ? f.ACosine() : 0;
1810 double i = Degrees(h);
1811
1812 return i - 360 * (i / 360).Floor();
1813 }
1814
1821 public static double RiseSetAzimuthSet(double rah, double ram, double ras, double dd, double dm, double ds, double vd, double g)
1822 {
1823 double a = HMStoDH(rah, ram, ras);
1824 double c = DegreesMinutesSecondsToDecimalDegrees(dd, dm, ds).ToRadians();
1825 double d = vd.ToRadians();
1826 double e = g.ToRadians();
1827 double f = (c.Sine() + d.Sine() * e.Sine()) / (d.Cosine() * e.Cosine());
1828 double h = ERS(rah, ram, ras, dd, dm, ds, vd, g).Equals("OK") ? f.ACosine() : 0;
1829 double i = 360 - Degrees(h);
1830
1831 return i - 360 * (i / 360).Floor();
1832 }
1833
1841 public static string ERS(double rah, double ram, double ras, double dd, double dm, double ds, double vd, double g)
1842 {
1843 double a = HMStoDH(rah, ram, ras);
1844 double c = DegreesMinutesSecondsToDecimalDegrees(dd, dm, ds).ToRadians();
1845 double d = vd.ToRadians();
1846 double e = g.ToRadians();
1847 double f = -(d.Sine() + e.Sine() * c.Sine()) / (e.Cosine() * c.Cosine());
1848
1849 string returnValue = "OK";
1850 if (f >= 1)
1851 returnValue = "** never rises";
1852 if (f <= -1)
1853 returnValue = "** circumpolar";
1854
1855 return returnValue;
1856 }
1857
1858
1862 public static string ESunRS(double ld, int lm, int ly, int ds, int zc, double gl, double gp)
1863 {
1864 double di = 0.8333333;
1865 double gd = LocalCivilTimeGreenwichDay(12, 0, 0, ds, zc, ld, lm, ly);
1866 int gm = LocalCivilTimeGreenwichMonth(12, 0, 0, ds, zc, ld, lm, ly);
1867 int gy = LocalCivilTimeGreenwichYear(12, 0, 0, ds, zc, ld, lm, ly);
1868 double sr = SunLong(12, 0, 0, ds, zc, ld, lm, ly);
1869
1870 (double a, double x, double y, double la, string s) result1 = ESunRS_L3710(gd, gm, gy, sr, di, gp);
1871
1872 if (!result1.s.Equals("OK"))
1873 {
1874 return result1.s;
1875 }
1876 else
1877 {
1878 double x = LocalSiderealTimeToGreenwichSiderealTime(result1.la, 0, 0, gl);
1879 double ut = GreenwichSiderealTimeToUniversalTime(x, 0, 0, gd, gm, gy);
1880 sr = SunLong(ut, 0, 0, 0, 0, gd, gm, gy);
1881 (double a, double x, double y, double la, string s) result2 = ESunRS_L3710(gd, gm, gy, sr, di, gp);
1882 if (!result2.s.Equals("OK"))
1883 {
1884 return result2.s;
1885 }
1886 else
1887 {
1888 x = LocalSiderealTimeToGreenwichSiderealTime(result2.la, 0, 0, gl);
1889
1890 if (!EGstUt(x, 0, 0, gd, gm, gy).Equals(PAWarningFlag.OK))
1891 {
1892 string s = result2.s + " GST to UT conversion warning";
1893
1894 return s;
1895 }
1896
1897 return result2.s;
1898 }
1899 }
1900 }
1901
1905 public static (double a, double x, double y, double la, string s) ESunRS_L3710(double gd, int gm, int gy, double sr, double di, double gp)
1906 {
1907 double a = sr + NutatLong(gd, gm, gy) - 0.005694;
1908 double x = EcRA(a, 0, 0, 0, 0, 0, gd, gm, gy);
1909 double y = EcDec(a, 0, 0, 0, 0, 0, gd, gm, gy);
1910 double la = RiseSetLocalSiderealTimeRise(DecimalDegreesToDegreeHours(x), 0, 0, y, 0, 0, di, gp);
1911 string s = ERS(DecimalDegreesToDegreeHours(x), 0, 0, y, 0, 0, di, gp);
1912
1913 return (a, x, y, la, s);
1914 }
1915
1919 public static double SunriseAZ(double ld, int lm, int ly, int ds, int zc, double gl, double gp)
1920 {
1921 double di = 0.8333333;
1922 double gd = LocalCivilTimeGreenwichDay(12, 0, 0, ds, zc, ld, lm, ly);
1923 int gm = LocalCivilTimeGreenwichMonth(12, 0, 0, ds, zc, ld, lm, ly);
1924 int gy = LocalCivilTimeGreenwichYear(12, 0, 0, ds, zc, ld, lm, ly);
1925 double sr = SunLong(12, 0, 0, ds, zc, ld, lm, ly);
1926
1927 (double a, double x, double y, double la, string s) result1 = SunriseAZ_L3710(gd, gm, gy, sr, di, gp);
1928
1929 if (!result1.s.Equals("OK"))
1930 {
1931 return -99.0;
1932 }
1933
1934 double x = LocalSiderealTimeToGreenwichSiderealTime(result1.la, 0, 0, gl);
1935 double ut = GreenwichSiderealTimeToUniversalTime(x, 0, 0, gd, gm, gy);
1936
1937 if (!EGstUt(x, 0, 0, gd, gm, gy).Equals(PAWarningFlag.OK))
1938 {
1939 return -99.0;
1940 }
1941
1942 sr = SunLong(ut, 0, 0, 0, 0, gd, gm, gy);
1943 (double a, double x, double y, double la, string s) result2 = SunriseAZ_L3710(gd, gm, gy, sr, di, gp);
1944
1945 if (!result2.s.Equals("OK"))
1946 {
1947 return -99.0;
1948 }
1949
1950 return RiseSetAzimuthRise(DecimalDegreesToDegreeHours(x), 0, 0, result2.y, 0.0, 0.0, di, gp);
1951 }
1952
1956 public static (double a, double x, double y, double la, string s) SunriseAZ_L3710(double gd, int gm, int gy, double sr, double di, double gp)
1957 {
1958 double a = sr + NutatLong(gd, gm, gy) - 0.005694;
1959 double x = EcRA(a, 0, 0, 0, 0, 0, gd, gm, gy);
1960 double y = EcDec(a, 0, 0, 0, 0, 0, gd, gm, gy);
1961 double la = RiseSetLocalSiderealTimeRise(DecimalDegreesToDegreeHours(x), 0, 0, y, 0, 0, di, gp);
1962 string s = ERS(DecimalDegreesToDegreeHours(x), 0, 0, y, 0, 0, di, gp);
1963
1964 return (a, x, y, la, s);
1965 }
1966
1973 public static double SunsetAZ(double ld, int lm, int ly, int ds, int zc, double gl, double gp)
1974 {
1975 double di = 0.8333333;
1976 double gd = LocalCivilTimeGreenwichDay(12, 0, 0, ds, zc, ld, lm, ly);
1977 int gm = LocalCivilTimeGreenwichMonth(12, 0, 0, ds, zc, ld, lm, ly);
1978 int gy = LocalCivilTimeGreenwichYear(12, 0, 0, ds, zc, ld, lm, ly);
1979 double sr = SunLong(12, 0, 0, ds, zc, ld, lm, ly);
1980
1981 (double a, double x, double y, double la, string s) result1 = SunsetAZ_L3710(gd, gm, gy, sr, di, gp);
1982
1983 if (!result1.s.Equals("OK"))
1984 {
1985 return -99.0;
1986 }
1987
1988 double x = LocalSiderealTimeToGreenwichSiderealTime(result1.la, 0, 0, gl);
1989 double ut = GreenwichSiderealTimeToUniversalTime(x, 0, 0, gd, gm, gy);
1990
1991 if (!EGstUt(x, 0, 0, gd, gm, gy).Equals(PAWarningFlag.OK))
1992 {
1993 return -99.0;
1994 }
1995
1996 sr = SunLong(ut, 0, 0, 0, 0, gd, gm, gy);
1997
1998 (double a, double x, double y, double la, string s) result2 = SunsetAZ_L3710(gd, gm, gy, sr, di, gp);
1999
2000 if (!result2.s.Equals("OK"))
2001 {
2002 return -99.0;
2003 }
2004 return RiseSetAzimuthSet(DecimalDegreesToDegreeHours(x), 0, 0, result2.y, 0, 0, di, gp);
2005 }
2006
2010 public static (double a, double x, double y, double la, string s) SunsetAZ_L3710(double gd, int gm, int gy, double sr, double di, double gp)
2011 {
2012 double a = sr + NutatLong(gd, gm, gy) - 0.005694;
2013 double x = EcRA(a, 0, 0, 0, 0, 0, gd, gm, gy);
2014 double y = EcDec(a, 0, 0, 0, 0, 0, gd, gm, gy);
2015 double la = RiseSetLocalSiderealTimeSet(DecimalDegreesToDegreeHours(x), 0, 0, y, 0, 0, di, gp);
2016 string s = ERS(DecimalDegreesToDegreeHours(x), 0, 0, y, 0, 0, di, gp);
2017
2018 return (a, x, y, la, s);
2019 }
2020
2028 public static double TwilightAMLCT(double ld, int lm, int ly, int ds, int zc, double gl, double gp, PATwilightType tt)
2029 {
2030 double di = (double)tt;
2031
2032 double gd = LocalCivilTimeGreenwichDay(12, 0, 0, ds, zc, ld, lm, ly);
2033 int gm = LocalCivilTimeGreenwichMonth(12, 0, 0, ds, zc, ld, lm, ly);
2034 int gy = LocalCivilTimeGreenwichYear(12, 0, 0, ds, zc, ld, lm, ly);
2035 double sr = SunLong(12, 0, 0, ds, zc, ld, lm, ly);
2036
2037 (double a, double x, double y, double la, string s) result1 = TwilightAMLCT_L3710(gd, gm, gy, sr, di, gp);
2038
2039 if (!result1.s.Equals("OK"))
2040 return -99.0;
2041
2042 double x = LocalSiderealTimeToGreenwichSiderealTime(result1.la, 0, 0, gl);
2043 double ut = GreenwichSiderealTimeToUniversalTime(x, 0, 0, gd, gm, gy);
2044
2045 if (!EGstUt(x, 0, 0, gd, gm, gy).Equals(PAWarningFlag.OK))
2046 return -99.0;
2047
2048 sr = SunLong(ut, 0, 0, 0, 0, gd, gm, gy);
2049
2050 (double a, double x, double y, double la, string s) result2 = TwilightAMLCT_L3710(gd, gm, gy, sr, di, gp);
2051
2052 if (!result2.s.Equals("OK"))
2053 return -99.0;
2054
2055 x = LocalSiderealTimeToGreenwichSiderealTime(result2.la, 0, 0, gl);
2056 ut = GreenwichSiderealTimeToUniversalTime(x, 0, 0, gd, gm, gy);
2057
2058 double xx = UniversalTimeToLocalCivilTime(ut, 0, 0, ds, zc, gd, gm, gy);
2059
2060 return xx;
2061 }
2062
2066 public static (double a, double x, double y, double la, string s) TwilightAMLCT_L3710(double gd, int gm, int gy, double sr, double di, double gp)
2067 {
2068 double a = sr + NutatLong(gd, gm, gy) - 0.005694;
2069 double x = EcRA(a, 0, 0, 0, 0, 0, gd, gm, gy);
2070 double y = EcDec(a, 0, 0, 0, 0, 0, gd, gm, gy);
2071 double la = RiseSetLocalSiderealTimeRise(DecimalDegreesToDegreeHours(x), 0, 0, y, 0, 0, di, gp);
2072 string s = ERS(DecimalDegreesToDegreeHours(x), 0, 0, y, 0, 0, di, gp);
2073
2074 return (a, x, y, la, s);
2075 }
2076
2084 public static double TwilightPMLCT(double ld, int lm, int ly, int ds, int zc, double gl, double gp, PATwilightType tt)
2085 {
2086 double di = (double)tt;
2087
2088 double gd = LocalCivilTimeGreenwichDay(12, 0, 0, ds, zc, ld, lm, ly);
2089 int gm = LocalCivilTimeGreenwichMonth(12, 0, 0, ds, zc, ld, lm, ly);
2090 int gy = LocalCivilTimeGreenwichYear(12, 0, 0, ds, zc, ld, lm, ly);
2091 double sr = SunLong(12, 0, 0, ds, zc, ld, lm, ly);
2092
2093 (double a, double x, double y, double la, string s) result1 = TwilightPMLCT_L3710(gd, gm, gy, sr, di, gp);
2094
2095 if (!result1.s.Equals("OK"))
2096 return 0.0;
2097
2098 double x = LocalSiderealTimeToGreenwichSiderealTime(result1.la, 0, 0, gl);
2099 double ut = GreenwichSiderealTimeToUniversalTime(x, 0, 0, gd, gm, gy);
2100
2101 if (!EGstUt(x, 0, 0, gd, gm, gy).Equals(PAWarningFlag.OK))
2102 return 0.0;
2103
2104 sr = SunLong(ut, 0, 0, 0, 0, gd, gm, gy);
2105
2106 (double a, double x, double y, double la, string s) result2 = TwilightPMLCT_L3710(gd, gm, gy, sr, di, gp);
2107
2108 if (!result2.s.Equals("OK"))
2109 return 0.0;
2110
2111 x = LocalSiderealTimeToGreenwichSiderealTime(result2.la, 0, 0, gl);
2112 ut = GreenwichSiderealTimeToUniversalTime(x, 0, 0, gd, gm, gy);
2113
2114 return UniversalTimeToLocalCivilTime(ut, 0, 0, ds, zc, gd, gm, gy);
2115 }
2116
2120 public static (double a, double x, double y, double la, string s) TwilightPMLCT_L3710(double gd, int gm, int gy, double sr, double di, double gp)
2121 {
2122 double a = sr + NutatLong(gd, gm, gy) - 0.005694;
2123 double x = EcRA(a, 0, 0, 0, 0, 0, gd, gm, gy);
2124 double y = EcDec(a, 0, 0, 0, 0, 0, gd, gm, gy);
2125 double la = RiseSetLocalSiderealTimeSet(DecimalDegreesToDegreeHours(x), 0, 0, y, 0, 0, di, gp);
2126 string s = ERS(DecimalDegreesToDegreeHours(x), 0, 0, y, 0, 0, di, gp);
2127
2128 return (a, x, y, la, s);
2129 }
2130
2139 public static string ETwilight(double ld, int lm, int ly, int ds, int zc, double gl, double gp, PATwilightType tt)
2140 {
2141 double di = (double)tt;
2142
2143 double gd = LocalCivilTimeGreenwichDay(12, 0, 0, ds, zc, ld, lm, ly);
2144 int gm = LocalCivilTimeGreenwichMonth(12, 0, 0, ds, zc, ld, lm, ly);
2145 int gy = LocalCivilTimeGreenwichYear(12, 0, 0, ds, zc, ld, lm, ly);
2146 double sr = SunLong(12, 0, 0, ds, zc, ld, lm, ly);
2147
2148 (double a, double x, double y, double la, string s) result1 = ETwilight_L3710(gd, gm, gy, sr, di, gp);
2149
2150 if (!result1.s.Equals("OK"))
2151 {
2152 return result1.s;
2153 }
2154
2155 double x = LocalSiderealTimeToGreenwichSiderealTime(result1.la, 0, 0, gl);
2156 double ut = GreenwichSiderealTimeToUniversalTime(x, 0, 0, gd, gm, gy);
2157 sr = SunLong(ut, 0, 0, 0, 0, gd, gm, gy);
2158
2159 (double a, double x, double y, double la, string s) result2 = ETwilight_L3710(gd, gm, gy, sr, di, gp);
2160
2161 if (!result2.s.Equals("OK"))
2162 {
2163 return result2.s;
2164 }
2165
2166 x = LocalSiderealTimeToGreenwichSiderealTime(result2.la, 0, 0, gl);
2167
2168 if (!EGstUt(x, 0, 0, gd, gm, gy).Equals(PAWarningFlag.OK))
2169 {
2170 result2.s = $"{result2.s} GST to UT conversion warning";
2171
2172 return result2.s;
2173 }
2174
2175 return result2.s;
2176 }
2177
2181 public static (double a, double x, double y, double la, string s) ETwilight_L3710(double gd, int gm, int gy, double sr, double di, double gp)
2182 {
2183 double a = sr + NutatLong(gd, gm, gy) - 0.005694;
2184 double x = EcRA(a, 0, 0, 0, 0, 0, gd, gm, gy);
2185 double y = EcDec(a, 0, 0, 0, 0, 0, gd, gm, gy);
2186 double la = RiseSetLocalSiderealTimeRise(DecimalDegreesToDegreeHours(x), 0, 0, y, 0, 0, di, gp);
2187 string s = ERS(DecimalDegreesToDegreeHours(x), 0, 0, y, 0, 0, di, gp);
2188
2189 if (s.Length > 2)
2190 {
2191 if (s.Substring(0, 3).Equals("** c"))
2192 {
2193 s = "** lasts all night";
2194 }
2195 else
2196 {
2197 if (s.Substring(0, 3).Equals("** n"))
2198 {
2199 s = "** Sun too far below horizon";
2200 }
2201 }
2202 }
2203
2204 return (a, x, y, la, s);
2205 }
2206
2213 public static double Angle(double xx1, double xm1, double xs1, double dd1, double dm1, double ds1, double xx2, double xm2, double xs2, double dd2, double dm2, double ds2, PAAngleMeasure s
2214 )
2215 {
2216 double a = s.Equals(PAAngleMeasure.Hours) ? DegreeHoursToDecimalDegrees(HMStoDH(xx1, xm1, xs1)) : DegreesMinutesSecondsToDecimalDegrees(xx1, xm1, xs1);
2217 double b = a.ToRadians();
2218 double c = DegreesMinutesSecondsToDecimalDegrees(dd1, dm1, ds1);
2219 double d = c.ToRadians();
2220 double e = s.Equals(PAAngleMeasure.Hours) ? DegreeHoursToDecimalDegrees(HMStoDH(xx2, xm2, xs2)) : DegreesMinutesSecondsToDecimalDegrees(xx2, xm2, xs2);
2221 double f = e.ToRadians();
2222 double g = DegreesMinutesSecondsToDecimalDegrees(dd2, dm2, ds2);
2223 double h = g.ToRadians();
2224 double i = (d.Sine() * h.Sine() + d.Cosine() * h.Cosine() * (b - f).Cosine()).ACosine();
2225
2226 return Degrees(i);
2227 }
2228
2253 public static (double planetLongitude, double planetLatitude, double planetDistanceAU, double planetHLong1, double planetHLong2, double planetHLat, double planetRVect) PlanetCoordinates(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr, string s)
2254 {
2255 double a11 = 178.179078;
2256 double a12 = 415.2057519;
2257 double a13 = 0.0003011;
2258 double a14 = 0.0;
2259 double a21 = 75.899697;
2260 double a22 = 1.5554889;
2261 double a23 = 0.0002947;
2262 double a24 = 0.0;
2263 double a31 = 0.20561421;
2264 double a32 = 0.00002046;
2265 double a33 = -0.00000003;
2266 double a34 = 0.0;
2267 double a41 = 7.002881;
2268 double a42 = 0.0018608;
2269 double a43 = -0.0000183;
2270 double a44 = 0.0;
2271 double a51 = 47.145944;
2272 double a52 = 1.1852083;
2273 double a53 = 0.0001739;
2274 double a54 = 0.0;
2275 double a61 = 0.3870986;
2276 double a62 = 6.74;
2277 double a63 = -0.42;
2278
2279 double b11 = 342.767053;
2280 double b12 = 162.5533664;
2281 double b13 = 0.0003097;
2282 double b14 = 0.0;
2283 double b21 = 130.163833;
2284 double b22 = 1.4080361;
2285 double b23 = -0.0009764;
2286 double b24 = 0.0;
2287 double b31 = 0.00682069;
2288 double b32 = -0.00004774;
2289 double b33 = 0.000000091;
2290 double b34 = 0.0;
2291 double b41 = 3.393631;
2292 double b42 = 0.0010058;
2293 double b43 = -0.000001;
2294 double b44 = 0.0;
2295 double b51 = 75.779647;
2296 double b52 = 0.89985;
2297 double b53 = 0.00041;
2298 double b54 = 0.0;
2299 double b61 = 0.7233316;
2300 double b62 = 16.92;
2301 double b63 = -4.4;
2302
2303 double c11 = 293.737334;
2304 double c12 = 53.17137642;
2305 double c13 = 0.0003107;
2306 double c14 = 0.0;
2307 double c21 = 334.218203;
2308 double c22 = 1.8407584;
2309 double c23 = 0.0001299;
2310 double c24 = -0.00000119;
2311 double c31 = 0.0933129;
2312 double c32 = 0.000092064;
2313 double c33 = -0.000000077;
2314 double c34 = 0.0;
2315 double c41 = 1.850333;
2316 double c42 = -0.000675;
2317 double c43 = 0.0000126;
2318 double c44 = 0.0;
2319 double c51 = 48.786442;
2320 double c52 = 0.7709917;
2321 double c53 = -0.0000014;
2322 double c54 = -0.00000533;
2323 double c61 = 1.5236883;
2324 double c62 = 9.36;
2325 double c63 = -1.52;
2326
2327 double d11 = 238.049257;
2328 double d12 = 8.434172183;
2329 double d13 = 0.0003347;
2330 double d14 = -0.00000165;
2331 double d21 = 12.720972;
2332 double d22 = 1.6099617;
2333 double d23 = 0.00105627;
2334 double d24 = -0.00000343;
2335 double d31 = 0.04833475;
2336 double d32 = 0.00016418;
2337 double d33 = -0.0000004676;
2338 double d34 = -0.0000000017;
2339 double d41 = 1.308736;
2340 double d42 = -0.0056961;
2341 double d43 = 0.0000039;
2342 double d44 = 0.0;
2343 double d51 = 99.443414;
2344 double d52 = 1.01053;
2345 double d53 = 0.00035222;
2346 double d54 = -0.00000851;
2347 double d61 = 5.202561;
2348 double d62 = 196.74;
2349 double d63 = -9.4;
2350
2351 double e11 = 266.564377;
2352 double e12 = 3.398638567;
2353 double e13 = 0.0003245;
2354 double e14 = -0.0000058;
2355 double e21 = 91.098214;
2356 double e22 = 1.9584158;
2357 double e23 = 0.00082636;
2358 double e24 = 0.00000461;
2359 double e31 = 0.05589232;
2360 double e32 = -0.0003455;
2361 double e33 = -0.000000728;
2362 double e34 = 0.00000000074;
2363 double e41 = 2.492519;
2364 double e42 = -0.0039189;
2365 double e43 = -0.00001549;
2366 double e44 = 0.00000004;
2367 double e51 = 112.790414;
2368 double e52 = 0.8731951;
2369 double e53 = -0.00015218;
2370 double e54 = -0.00000531;
2371 double e61 = 9.554747;
2372 double e62 = 165.6;
2373 double e63 = -8.88;
2374
2375 double f11 = 244.19747;
2376 double f12 = 1.194065406;
2377 double f13 = 0.000316;
2378 double f14 = -0.0000006;
2379 double f21 = 171.548692;
2380 double f22 = 1.4844328;
2381 double f23 = 0.0002372;
2382 double f24 = -0.00000061;
2383 double f31 = 0.0463444;
2384 double f32a = -0.00002658;
2385 double f33 = 0.000000077;
2386 double f34 = 0.0;
2387 double f41 = 0.772464;
2388 double f42 = 0.0006253;
2389 double f43 = 0.0000395;
2390 double f44 = 0.0;
2391 double f51 = 73.477111;
2392 double f52 = 0.4986678;
2393 double f53 = 0.0013117;
2394 double f54 = 0.0;
2395 double f61 = 19.21814;
2396 double f62 = 65.8;
2397 double f63 = -7.19;
2398
2399 double g11 = 84.457994;
2400 double g12 = 0.6107942056;
2401 double g13 = 0.0003205;
2402 double g14 = -0.0000006;
2403 double g21 = 46.727364;
2404 double g22 = 1.4245744;
2405 double g23 = 0.00039082;
2406 double g24 = -0.000000605;
2407 double g31 = 0.00899704;
2408 double g32 = 0.00000633;
2409 double g33 = -0.000000002;
2410 double g34 = 0.0;
2411 double g41 = 1.779242;
2412 double g42 = -0.0095436;
2413 double g43 = -0.0000091;
2414 double g44 = 0.0;
2415 double g51 = 130.681389;
2416 double g52 = 1.098935;
2417 double g53 = 0.00024987;
2418 double g54 = -0.000004718;
2419 double g61 = 30.10957;
2420 double g62 = 62.2;
2421 double g63 = -6.87;
2422
2423 List<PlanetDataPrecise> pl = new List<PlanetDataPrecise>();
2424
2425 pl.Add(new PlanetDataPrecise() { Name = "", Value1 = 0, Value2 = 0, Value3 = 0, Value4 = 0, Value5 = 0, Value6 = 0, Value7 = 0, Value8 = 0, Value9 = 0 });
2426
2427 int ip = 0;
2428 double b = LocalCivilTimeToUniversalTime(lh, lm, ls, ds, zc, dy, mn, yr);
2429 double gd = LocalCivilTimeGreenwichDay(lh, lm, ls, ds, zc, dy, mn, yr);
2430 int gm = LocalCivilTimeGreenwichMonth(lh, lm, ls, ds, zc, dy, mn, yr);
2431 int gy = LocalCivilTimeGreenwichYear(lh, lm, ls, ds, zc, dy, mn, yr);
2432 double a = CivilDateToJulianDate(gd, gm, gy);
2433 double t = ((a - 2415020.0) / 36525.0) + (b / 876600.0);
2434
2435 double a0 = a11;
2436 double a1 = a12;
2437 double a2 = a13;
2438 double a3 = a14;
2439 double b0 = a21;
2440 double b1 = a22;
2441 double b2 = a23;
2442 double b3 = a24;
2443 double c0 = a31;
2444 double c1 = a32;
2445 double c2 = a33;
2446 double c3 = a34;
2447 double d0 = a41;
2448 double d1 = a42;
2449 double d2 = a43;
2450 double d3 = a44;
2451 double e0 = a51;
2452 double e1 = a52;
2453 double e2 = a53;
2454 double e3 = a54;
2455 double f = a61;
2456 double g = a62;
2457 double h = a63;
2458 double aa = a1 * t;
2459 b = 360.0 * (aa - aa.Floor());
2460 double c = a0 + b + (a3 * t + a2) * t * t;
2461
2462 pl.Add(new PlanetDataPrecise()
2463 {
2464 Name = "Mercury",
2465 Value1 = c - 360.0 * (c / 360.0).Floor(),
2466 Value2 = (a1 * 0.009856263) + (a2 + a3) / 36525.0,
2467 Value3 = ((b3 * t + b2) * t + b1) * t + b0,
2468 Value4 = ((c3 * t + c2) * t + c1) * t + c0,
2469 Value5 = ((d3 * t + d2) * t + d1) * t + d0,
2470 Value6 = ((e3 * t + e2) * t + e1) * t + e0,
2471 Value7 = f,
2472 Value8 = g,
2473 Value9 = h
2474 });
2475
2476 a0 = b11;
2477 a1 = b12;
2478 a2 = b13;
2479 a3 = b14;
2480 b0 = b21;
2481 b1 = b22;
2482 b2 = b23;
2483 b3 = b24;
2484 c0 = b31;
2485 c1 = b32;
2486 c2 = b33;
2487 c3 = b34;
2488 d0 = b41;
2489 d1 = b42;
2490 d2 = b43;
2491 d3 = b44;
2492 e0 = b51;
2493 e1 = b52;
2494 e2 = b53;
2495 e3 = b54;
2496 f = b61;
2497 g = b62;
2498 h = b63;
2499 aa = a1 * t;
2500 b = 360.0 * (aa - aa.Floor());
2501 c = a0 + b + (a3 * t + a2) * t * t;
2502
2503 pl.Add(new PlanetDataPrecise()
2504 {
2505 Name = "Venus",
2506 Value1 = c - 360.0 * (c / 360.0).Floor(),
2507 Value2 = (a1 * 0.009856263) + (a2 + a3) / 36525.0,
2508 Value3 = ((b3 * t + b2) * t + b1) * t + b0,
2509 Value4 = ((c3 * t + c2) * t + c1) * t + c0,
2510 Value5 = ((d3 * t + d2) * t + d1) * t + d0,
2511 Value6 = ((e3 * t + e2) * t + e1) * t + e0,
2512 Value7 = f,
2513 Value8 = g,
2514 Value9 = h
2515 });
2516
2517 a0 = c11;
2518 a1 = c12;
2519 a2 = c13;
2520 a3 = c14;
2521 b0 = c21;
2522 b1 = c22;
2523 b2 = c23;
2524 b3 = c24;
2525 c0 = c31;
2526 c1 = c32;
2527 c2 = c33;
2528 c3 = c34;
2529 d0 = c41;
2530 d1 = c42;
2531 d2 = c43;
2532 d3 = c44;
2533 e0 = c51;
2534 e1 = c52;
2535 e2 = c53;
2536 e3 = c54;
2537 f = c61;
2538 g = c62;
2539 h = c63;
2540
2541 aa = a1 * t;
2542 b = 360.0 * (aa - aa.Floor());
2543 c = a0 + b + (a3 * t + a2) * t * t;
2544
2545 pl.Add(new PlanetDataPrecise()
2546 {
2547 Name = "Mars",
2548 Value1 = c - 360.0 * (c / 360.0).Floor(),
2549 Value2 = (a1 * 0.009856263) + (a2 + a3) / 36525.0,
2550 Value3 = ((b3 * t + b2) * t + b1) * t + b0,
2551 Value4 = ((c3 * t + c2) * t + c1) * t + c0,
2552 Value5 = ((d3 * t + d2) * t + d1) * t + d0,
2553 Value6 = ((e3 * t + e2) * t + e1) * t + e0,
2554 Value7 = f,
2555 Value8 = g,
2556 Value9 = h
2557 });
2558
2559 a0 = d11;
2560 a1 = d12;
2561 a2 = d13;
2562 a3 = d14;
2563 b0 = d21;
2564 b1 = d22;
2565 b2 = d23;
2566 b3 = d24;
2567 c0 = d31;
2568 c1 = d32;
2569 c2 = d33;
2570 c3 = d34;
2571 d0 = d41;
2572 d1 = d42;
2573 d2 = d43;
2574 d3 = d44;
2575 e0 = d51;
2576 e1 = d52;
2577 e2 = d53;
2578 e3 = d54;
2579 f = d61;
2580 g = d62;
2581 h = d63;
2582
2583 aa = a1 * t;
2584 b = 360.0 * (aa - aa.Floor());
2585 c = a0 + b + (a3 * t + a2) * t * t;
2586
2587 pl.Add(new PlanetDataPrecise()
2588 {
2589 Name = "Jupiter",
2590 Value1 = c - 360.0 * (c / 360.0).Floor(),
2591 Value2 = (a1 * 0.009856263) + (a2 + a3) / 36525.0,
2592 Value3 = ((b3 * t + b2) * t + b1) * t + b0,
2593 Value4 = ((c3 * t + c2) * t + c1) * t + c0,
2594 Value5 = ((d3 * t + d2) * t + d1) * t + d0,
2595 Value6 = ((e3 * t + e2) * t + e1) * t + e0,
2596 Value7 = f,
2597 Value8 = g,
2598 Value9 = h
2599 });
2600
2601 a0 = e11;
2602 a1 = e12;
2603 a2 = e13;
2604 a3 = e14;
2605 b0 = e21;
2606 b1 = e22;
2607 b2 = e23;
2608 b3 = e24;
2609 c0 = e31;
2610 c1 = e32;
2611 c2 = e33;
2612 c3 = e34;
2613 d0 = e41;
2614 d1 = e42;
2615 d2 = e43;
2616 d3 = e44;
2617 e0 = e51;
2618 e1 = e52;
2619 e2 = e53;
2620 e3 = e54;
2621 f = e61;
2622 g = e62;
2623 h = e63;
2624
2625 aa = a1 * t;
2626 b = 360.0 * (aa - aa.Floor());
2627 c = a0 + b + (a3 * t + a2) * t * t;
2628
2629 pl.Add(new PlanetDataPrecise()
2630 {
2631 Name = "Saturn",
2632 Value1 = c - 360.0 * (c / 360.0).Floor(),
2633 Value2 = (a1 * 0.009856263) + (a2 + a3) / 36525.0,
2634 Value3 = ((b3 * t + b2) * t + b1) * t + b0,
2635 Value4 = ((c3 * t + c2) * t + c1) * t + c0,
2636 Value5 = ((d3 * t + d2) * t + d1) * t + d0,
2637 Value6 = ((e3 * t + e2) * t + e1) * t + e0,
2638 Value7 = f,
2639 Value8 = g,
2640 Value9 = h
2641 });
2642
2643 a0 = f11;
2644 a1 = f12;
2645 a2 = f13;
2646 a3 = f14;
2647 b0 = f21;
2648 b1 = f22;
2649 b2 = f23;
2650 b3 = f24;
2651 c0 = f31;
2652 c1 = f32a;
2653 c2 = f33;
2654 c3 = f34;
2655 d0 = f41;
2656 d1 = f42;
2657 d2 = f43;
2658 d3 = f44;
2659 e0 = f51;
2660 e1 = f52;
2661 e2 = f53;
2662 e3 = f54;
2663 f = f61;
2664 g = f62;
2665 h = f63;
2666
2667 aa = a1 * t;
2668 b = 360.0 * (aa - aa.Floor());
2669 c = a0 + b + (a3 * t + a2) * t * t;
2670
2671 pl.Add(new PlanetDataPrecise()
2672 {
2673 Name = "Uranus",
2674 Value1 = c - 360.0 * (c / 360.0).Floor(),
2675 Value2 = (a1 * 0.009856263) + (a2 + a3) / 36525.0,
2676 Value3 = ((b3 * t + b2) * t + b1) * t + b0,
2677 Value4 = ((c3 * t + c2) * t + c1) * t + c0,
2678 Value5 = ((d3 * t + d2) * t + d1) * t + d0,
2679 Value6 = ((e3 * t + e2) * t + e1) * t + e0,
2680 Value7 = f,
2681 Value8 = g,
2682 Value9 = h
2683 });
2684
2685 a0 = g11;
2686 a1 = g12;
2687 a2 = g13;
2688 a3 = g14;
2689 b0 = g21;
2690 b1 = g22;
2691 b2 = g23;
2692 b3 = g24;
2693 c0 = g31;
2694 c1 = g32;
2695 c2 = g33;
2696 c3 = g34;
2697 d0 = g41;
2698 d1 = g42;
2699 d2 = g43;
2700 d3 = g44;
2701 e0 = g51;
2702 e1 = g52;
2703 e2 = g53;
2704 e3 = g54;
2705 f = g61;
2706 g = g62;
2707 h = g63;
2708
2709 aa = a1 * t;
2710 b = 360.0 * (aa - aa.Floor());
2711 c = a0 + b + (a3 * t + a2) * t * t;
2712
2713 pl.Add(new PlanetDataPrecise()
2714 {
2715 Name = "Neptune",
2716 Value1 = c - 360.0 * (c / 360.0).Floor(),
2717 Value2 = (a1 * 0.009856263) + (a2 + a3) / 36525.0,
2718 Value3 = ((b3 * t + b2) * t + b1) * t + b0,
2719 Value4 = ((c3 * t + c2) * t + c1) * t + c0,
2720 Value5 = ((d3 * t + d2) * t + d1) * t + d0,
2721 Value6 = ((e3 * t + e2) * t + e1) * t + e0,
2722 Value7 = f,
2723 Value8 = g,
2724 Value9 = h
2725 });
2726
2727 PlanetDataPrecise checkPlanet = pl.Where(x => x.Name.ToLower() == s.ToLower()).Select(x => x).FirstOrDefault();
2728 if (checkPlanet == null)
2729 return (Degrees(Unwind(0)), Degrees(Unwind(0)), Degrees(Unwind(0)), Degrees(Unwind(0)), Degrees(Unwind(0)), Degrees(Unwind(0)), Degrees(Unwind(0)));
2730
2731 double li = 0.0;
2732 double ms = SunMeanAnomaly(lh, lm, ls, ds, zc, dy, mn, yr);
2733 double sr = SunLong(lh, lm, ls, ds, zc, dy, mn, yr).ToRadians();
2734 double re = SunDist(lh, lm, ls, ds, zc, dy, mn, yr);
2735 double lg = sr + Math.PI;
2736
2737 double l0 = 0.0;
2738 double s0 = 0.0;
2739 double p0 = 0.0;
2740 double vo = 0.0;
2741 double lp1 = 0.0;
2742 double ll = 0.0;
2743 double rd = 0.0;
2744 double pd = 0.0;
2745 double sp = 0.0;
2746 double ci = 0.0;
2747
2748 for (int k = 1; k <= 3; k++)
2749 {
2750 foreach (PlanetDataPrecise planet in pl)
2751 planet.APValue = (planet.Value1 - planet.Value3 - li * planet.Value2).ToRadians();
2752
2753 double qa = 0.0;
2754 double qb = 0.0;
2755 double qc = 0.0;
2756 double qd = 0.0;
2757 double qe = 0.0;
2758 double qf = 0.0;
2759 double qg = 0.0;
2760
2761 if (s == "Mercury")
2762 (qa, qb) = PlanetLong_L4685(pl);
2763
2764 if (s == "Venus")
2765 (qa, qb, qc, qe) = PlanetLong_L4735(pl, ms, t);
2766
2767 if (s == "Mars")
2768 {
2769 (double a, double sa, double ca, double qc, double qe, double qa, double qb) returnValue = PlanetLong_L4810(pl, ms);
2770
2771 qc = returnValue.qc;
2772 qe = returnValue.qe;
2773 qa = returnValue.qa;
2774 qb = returnValue.qb;
2775 }
2776
2777 PlanetDataPrecise matchPlanet = pl.Where(x => x.Name.ToLower() == s.ToLower()).Select(x => x).FirstOrDefault();
2778
2779 if (new string[] { "Jupiter", "Saturn", "Uranus", "Neptune" }.Contains(s))
2780 (qa, qb, qc, qd, qe, qf, qg) = PlanetLong_L4945(t, matchPlanet);
2781
2782 double ec = matchPlanet.Value4 + qd;
2783 double am = matchPlanet.APValue + qe;
2784 double at = TrueAnomaly(am, ec);
2785 double pvv = (matchPlanet.Value7 + qf) * (1.0 - ec * ec) / (1.0 + ec * at.Cosine());
2786 double lp = Degrees(at) + matchPlanet.Value3 + Degrees(qc - qe);
2787 lp = lp.ToRadians();
2788 double om = matchPlanet.Value6.ToRadians();
2789 double lo = lp - om;
2790 double so = lo.Sine();
2791 double co = lo.Cosine();
2792 double inn = matchPlanet.Value5.ToRadians();
2793 pvv += qb;
2794 sp = so * inn.Sine();
2795 double y = so * inn.Cosine();
2796 double ps = sp.ASine() + qg;
2797 sp = ps.Sine();
2798 pd = y.AngleTangent2(co) + om + qa.ToRadians();
2799 pd = Unwind(pd);
2800 ci = ps.Cosine();
2801 rd = pvv * ci;
2802 ll = pd - lg;
2803 double rh = re * re + pvv * pvv - 2.0 * re * pvv * ci * ll.Cosine();
2804 rh = rh.SquareRoot();
2805 li = rh * 0.005775518;
2806
2807 if (k == 1)
2808 {
2809 l0 = pd;
2810 s0 = ps;
2811 p0 = pvv;
2812 vo = rh;
2813 lp1 = lp;
2814 }
2815 }
2816
2817 double l1 = ll.Sine();
2818 double l2 = ll.Cosine();
2819
2820 double ep = (ip < 3) ? (-1.0 * rd * l1 / (re - rd * l2)).AngleTangent() + lg + Math.PI : (re * l1 / (rd - re * l2)).AngleTangent() + pd;
2821 ep = Unwind(ep);
2822
2823 double bp = (rd * sp * (ep - pd).Sine() / (ci * re * l1)).AngleTangent();
2824
2825 double planetLongitude = Degrees(Unwind(ep));
2826 double planetLatitude = Degrees(Unwind(bp));
2827 double planetDistanceAU = vo;
2828 double planetHLong1 = Degrees(lp1);
2829 double planetHLong2 = Degrees(l0);
2830 double planetHLat = Degrees(s0);
2831 double planetRVect = p0;
2832
2834 }
2835
2839 public static (double qa, double qb) PlanetLong_L4685(List<PlanetDataPrecise> pl)
2840 {
2841 double qa = 0.00204 * (5.0 * pl[2].APValue - 2.0 * pl[1].APValue + 0.21328).Cosine();
2842 qa += 0.00103 * (2.0 * pl[2].APValue - pl[1].APValue - 2.8046).Cosine();
2843 qa += 0.00091 * (2.0 * pl[4].APValue - pl[1].APValue - 0.64582).Cosine();
2844 qa += 0.00078 * (5.0 * pl[2].APValue - 3.0 * pl[1].APValue + 0.17692).Cosine();
2845
2846 double qb = 0.000007525 * (2.0 * pl[4].APValue - pl[1].APValue + 0.925251).Cosine();
2847 qb += 0.000006802 * (5.0 * pl[2].APValue - 3.0 * pl[1].APValue - 4.53642).Cosine();
2848 qb += 0.000005457 * (2.0 * pl[2].APValue - 2.0 * pl[1].APValue - 1.24246).Cosine();
2849 qb += 0.000003569 * (5.0 * pl[2].APValue - pl[1].APValue - 1.35699).Cosine();
2850
2851 return (qa, qb);
2852 }
2853
2857 public static (double qa, double qb, double qc, double qe) PlanetLong_L4735(List<PlanetDataPrecise> pl, double ms, double t)
2858 {
2859 double qc = 0.00077 * (4.1406 + t * 2.6227).Sine();
2860 qc = qc.ToRadians();
2861 double qe = qc;
2862
2863 double qa = 0.00313 * (2.0 * ms - 2.0 * pl[2].APValue - 2.587).Cosine();
2864 qa += 0.00198 * (3.0 * ms - 3.0 * pl[2].APValue + 0.044768).Cosine();
2865 qa += 0.00136 * (ms - pl[2].APValue - 2.0788).Cosine();
2866 qa += 0.00096 * (3.0 * ms - 2.0 * pl[2].APValue - 2.3721).Cosine();
2867 qa += 0.00082 * (pl[4].APValue - pl[2].APValue - 3.6318).Cosine();
2868
2869 double qb = 0.000022501 * (2.0 * ms - 2.0 * pl[2].APValue - 1.01592).Cosine();
2870 qb += 0.000019045 * (3.0 * ms - 3.0 * pl[2].APValue + 1.61577).Cosine();
2871 qb += 0.000006887 * (pl[4].APValue - pl[2].APValue - 2.06106).Cosine();
2872 qb += 0.000005172 * (ms - pl[2].APValue - 0.508065).Cosine();
2873 qb += 0.00000362 * (5.0 * ms - 4.0 * pl[2].APValue - 1.81877).Cosine();
2874 qb += 0.000003283 * (4.0 * ms - 4.0 * pl[2].APValue + 1.10851).Cosine();
2875 qb += 0.000003074 * (2.0 * pl[4].APValue - 2.0 * pl[2].APValue - 0.962846).Cosine();
2876
2877 return (qa, qb, qc, qe);
2878 }
2879
2883 public static (double a, double sa, double ca, double qc, double qe, double qa, double qb) PlanetLong_L4810(List<PlanetDataPrecise> pl, double ms)
2884 {
2885 double a = 3.0 * pl[4].APValue - 8.0 * pl[3].APValue + 4.0 * ms;
2886 double sa = a.Sine();
2887 double ca = a.Cosine();
2888 double qc = -(0.01133 * sa + 0.00933 * ca);
2889 qc = qc.ToRadians();
2890 double qe = qc;
2891
2892 double qa = 0.00705 * (pl[4].APValue - pl[3].APValue - 0.85448).Cosine();
2893 qa += 0.00607 * (2.0 * pl[4].APValue - pl[3].APValue - 3.2873).Cosine();
2894 qa += 0.00445 * (2.0 * pl[4].APValue - 2.0 * pl[3].APValue - 3.3492).Cosine();
2895 qa += 0.00388 * (ms - 2.0 * pl[3].APValue + 0.35771).Cosine();
2896 qa += 0.00238 * (ms - pl[3].APValue + 0.61256).Cosine();
2897 qa += 0.00204 * (2.0 * ms - 3.0 * pl[3].APValue + 2.7688).Cosine();
2898 qa += 0.00177 * (3.0 * pl[3].APValue - pl[2].APValue - 1.0053).Cosine();
2899 qa += 0.00136 * (2.0 * ms - 4.0 * pl[3].APValue + 2.6894).Cosine();
2900 qa += 0.00104 * (pl[4].APValue + 0.30749).Cosine();
2901
2902 double qb = 0.000053227 * (pl[4].APValue - pl[3].APValue + 0.717864).Cosine();
2903 qb += 0.000050989 * (2.0 * pl[4].APValue - 2.0 * pl[3].APValue - 1.77997).Cosine();
2904 qb += 0.000038278 * (2.0 * pl[4].APValue - pl[3].APValue - 1.71617).Cosine();
2905 qb += 0.000015996 * (ms - pl[3].APValue - 0.969618).Cosine();
2906 qb += 0.000014764 * (2.0 * ms - 3.0 * pl[3].APValue + 1.19768).Cosine();
2907 qb += 0.000008966 * (pl[4].APValue - 2.0 * pl[3].APValue + 0.761225).Cosine();
2908 qb += 0.000007914 * (3.0 * pl[4].APValue - 2.0 * pl[3].APValue - 2.43887).Cosine();
2909 qb += 0.000007004 * (2.0 * pl[4].APValue - 3.0 * pl[3].APValue - 1.79573).Cosine();
2910 qb += 0.00000662 * (ms - 2.0 * pl[3].APValue + 1.97575).Cosine();
2911 qb += 0.00000493 * (3.0 * pl[4].APValue - 3.0 * pl[3].APValue - 1.33069).Cosine();
2912 qb += 0.000004693 * (3.0 * ms - 5.0 * pl[3].APValue + 3.32665).Cosine();
2913 qb += 0.000004571 * (2.0 * ms - 4.0 * pl[3].APValue + 4.27086).Cosine();
2914 qb += 0.000004409 * (3.0 * pl[4].APValue - pl[3].APValue - 2.02158).Cosine();
2915
2916 return (a, sa, ca, qc, qe, qa, qb);
2917 }
2918
2922 public static (double qa, double qb, double qc, double qd, double qe, double qf, double qg) PlanetLong_L4945(double t, PlanetDataPrecise planet)
2923 {
2924 double qa = 0.0;
2925 double qb = 0.0;
2926 double qc = 0.0;
2927 double qd = 0.0;
2928 double qe = 0.0;
2929 double qf = 0.0;
2930 double qg = 0.0;
2931 double vk = 0.0;
2932 double ja = 0.0;
2933 double jb = 0.0;
2934 double jc = 0.0;
2935
2936 double j1 = t / 5.0 + 0.1;
2937 double j2 = Unwind(4.14473 + 52.9691 * t);
2938 double j3 = Unwind(4.641118 + 21.32991 * t);
2939 double j4 = Unwind(4.250177 + 7.478172 * t);
2940 double j5 = 5.0 * j3 - 2.0 * j2;
2941 double j6 = 2.0 * j2 - 6.0 * j3 + 3.0 * j4;
2942
2943 if (new string[] { "Mercury", "Venus", "Mars" }.Contains(planet.Name))
2944 return (qa, qb, qc, qd, qe, qf, qg);
2945
2946 if (new string[] { "Jupiter", "Saturn" }.Contains(planet.Name))
2947 {
2948 double j7 = j3 - j2;
2949 double u1 = j3.Sine();
2950 double u2 = j3.Cosine();
2951 double u3 = (2.0 * j3).Sine();
2952 double u4 = (2.0 * j3).Cosine();
2953 double u5 = j5.Sine();
2954 double u6 = j5.Cosine();
2955 double u7 = (2.0 * j5).Sine();
2956 double u8a = j6.Sine();
2957 double u9 = j7.Sine();
2958 double ua = j7.Cosine();
2959 double ub = (2.0 * j7).Sine();
2960 double uc = (2.0 * j7).Cosine();
2961 double ud = (3.0 * j7).Sine();
2962 double ue = (3.0 * j7).Cosine();
2963 double uf = (4.0 * j7).Sine();
2964 double ug = (4.0 * j7).Cosine();
2965 double vh = (5.0 * j7).Cosine();
2966
2967 if (planet.Name == "Saturn")
2968 {
2969 double ui = (3.0 * j3).Sine();
2970 double uj = (3.0 * j3).Cosine();
2971 double uk = (4.0 * j3).Sine();
2972 double ul = (4.0 * j3).Cosine();
2973 double vi = (2.0 * j5).Cosine();
2974 double un = (5.0 * j7).Sine();
2975 double j8 = j4 - j3;
2976 double uo = (2.0 * j8).Sine();
2977 double up = (2.0 * j8).Cosine();
2978 double uq = (3.0 * j8).Sine();
2979 double ur = (3.0 * j8).Cosine();
2980
2981 qc = 0.007581 * u7 - 0.007986 * u8a - 0.148811 * u9;
2982 qc -= (0.814181 - (0.01815 - 0.016714 * j1) * j1) * u5;
2983 qc -= (0.010497 - (0.160906 - 0.0041 * j1) * j1) * u6;
2984 qc = qc - 0.015208 * ud - 0.006339 * uf - 0.006244 * u1;
2985 qc = qc - 0.0165 * ub * u1 - 0.040786 * ub;
2986 qc = qc + (0.008931 + 0.002728 * j1) * u9 * u1 - 0.005775 * ud * u1;
2987 qc = qc + (0.081344 + 0.003206 * j1) * ua * u1 + 0.015019 * uc * u1;
2988 qc = qc + (0.085581 + 0.002494 * j1) * u9 * u2 + 0.014394 * uc * u2;
2989 qc = qc + (0.025328 - 0.003117 * j1) * ua * u2 + 0.006319 * ue * u2;
2990 qc = qc + 0.006369 * u9 * u3 + 0.009156 * ub * u3 + 0.007525 * uq * u3;
2991 qc = qc - 0.005236 * ua * u4 - 0.007736 * uc * u4 - 0.007528 * ur * u4;
2992 qc = qc.ToRadians();
2993
2994 qd = (-7927.0 + (2548.0 + 91.0 * j1) * j1) * u5;
2995 qd = qd + (13381.0 + (1226.0 - 253.0 * j1) * j1) * u6 + (248.0 - 121.0 * j1) * u7;
2996 qd = qd - (305.0 + 91.0 * j1) * vi + 412.0 * ub + 12415.0 * u1;
2997 qd = qd + (390.0 - 617.0 * j1) * u9 * u1 + (165.0 - 204.0 * j1) * ub * u1;
2998 qd = qd + 26599.0 * ua * u1 - 4687.0 * uc * u1 - 1870.0 * ue * u1 - 821.0 * ug * u1;
2999 qd = qd - 377.0 * vh * u1 + 497.0 * up * u1 + (163.0 - 611.0 * j1) * u2;
3000 qd = qd - 12696.0 * u9 * u2 - 4200.0 * ub * u2 - 1503.0 * ud * u2 - 619.0 * uf * u2;
3001 qd = qd - 268.0 * un * u2 - (282.0 + 1306.0 * j1) * ua * u2;
3002 qd = qd + (-86.0 + 230.0 * j1) * uc * u2 + 461.0 * uo * u2 - 350.0 * u3;
3003 qd = qd + (2211.0 - 286.0 * j1) * u9 * u3 - 2208.0 * ub * u3 - 568.0 * ud * u3;
3004 qd = qd - 346.0 * uf * u3 - (2780.0 + 222.0 * j1) * ua * u3;
3005 qd = qd + (2022.0 + 263.0 * j1) * uc * u3 + 248.0 * ue * u3 + 242.0 * uq * u3;
3006 qd = qd + 467.0 * ur * u3 - 490.0 * u4 - (2842.0 + 279.0 * j1) * u9 * u4;
3007 qd = qd + (128.0 + 226.0 * j1) * ub * u4 + 224.0 * ud * u4;
3008 qd = qd + (-1594.0 + 282.0 * j1) * ua * u4 + (2162.0 - 207.0 * j1) * uc * u4;
3009 qd = qd + 561.0 * ue * u4 + 343.0 * ug * u4 + 469.0 * uq * u4 - 242.0 * ur * u4;
3010 qd = qd - 205.0 * u9 * ui + 262.0 * ud * ui + 208.0 * ua * uj - 271.0 * ue * uj;
3011 qd = qd - 382.0 * ue * uk - 376.0 * ud * ul;
3012 qd *= 0.0000001;
3013
3014 vk = (0.077108 + (0.007186 - 0.001533 * j1) * j1) * u5;
3015 vk -= 0.007075 * u9;
3016 vk += (0.045803 - (0.014766 + 0.000536 * j1) * j1) * u6;
3017 vk = vk - 0.072586 * u2 - 0.075825 * u9 * u1 - 0.024839 * ub * u1;
3018 vk = vk - 0.008631 * ud * u1 - 0.150383 * ua * u2;
3019 vk = vk + 0.026897 * uc * u2 + 0.010053 * ue * u2;
3020 vk = vk - (0.013597 + 0.001719 * j1) * u9 * u3 + 0.011981 * ub * u4;
3021 vk -= (0.007742 - 0.001517 * j1) * ua * u3;
3022 vk += (0.013586 - 0.001375 * j1) * uc * u3;
3023 vk -= (0.013667 - 0.001239 * j1) * u9 * u4;
3024 vk += (0.014861 + 0.001136 * j1) * ua * u4;
3025 vk -= (0.013064 + 0.001628 * j1) * uc * u4;
3026 qe = qc - (vk.ToRadians() / planet.Value4);
3027
3028 qf = 572.0 * u5 - 1590.0 * ub * u2 + 2933.0 * u6 - 647.0 * ud * u2;
3029 qf = qf + 33629.0 * ua - 344.0 * uf * u2 - 3081.0 * uc + 2885.0 * ua * u2;
3030 qf = qf - 1423.0 * ue + (2172.0 + 102.0 * j1) * uc * u2 - 671.0 * ug;
3031 qf = qf + 296.0 * ue * u2 - 320.0 * vh - 267.0 * ub * u3 + 1098.0 * u1;
3032 qf = qf - 778.0 * ua * u3 - 2812.0 * u9 * u1 + 495.0 * uc * u3 + 688.0 * ub * u1;
3033 qf = qf + 250.0 * ue * u3 - 393.0 * ud * u1 - 856.0 * u9 * u4 - 228.0 * uf * u1;
3034 qf = qf + 441.0 * ub * u4 + 2138.0 * ua * u1 + 296.0 * uc * u4 - 999.0 * uc * u1;
3035 qf = qf + 211.0 * ue * u4 - 642.0 * ue * u1 - 427.0 * u9 * ui - 325.0 * ug * u1;
3036 qf = qf + 398.0 * ud * ui - 890.0 * u2 + 344.0 * ua * uj + 2206.0 * u9 * u2;
3037 qf -= 427.0 * ue * uj;
3038 qf *= 0.000001;
3039
3040 qg = 0.000747 * ua * u1 + 0.001069 * ua * u2 + 0.002108 * ub * u3;
3041 qg = qg + 0.001261 * uc * u3 + 0.001236 * ub * u4 - 0.002075 * uc * u4;
3042 qg = qg.ToRadians();
3043
3044 return (qa, qb, qc, qd, qe, qf, qg);
3045 }
3046
3047 qc = (0.331364 - (0.010281 + 0.004692 * j1) * j1) * u5;
3048 qc += (0.003228 - (0.064436 - 0.002075 * j1) * j1) * u6;
3049 qc -= (0.003083 + (0.000275 - 0.000489 * j1) * j1) * u7;
3050 qc = qc + 0.002472 * u8a + 0.013619 * u9 + 0.018472 * ub;
3051 qc = qc + 0.006717 * ud + 0.002775 * uf + 0.006417 * ub * u1;
3052 qc = qc + (0.007275 - 0.001253 * j1) * u9 * u1 + 0.002439 * ud * u1;
3053 qc = qc - (0.035681 + 0.001208 * j1) * u9 * u2 - 0.003767 * uc * u1;
3054 qc = qc - (0.033839 + 0.001125 * j1) * ua * u1 - 0.004261 * ub * u2;
3055 qc = qc + (0.001161 * j1 - 0.006333) * ua * u2 + 0.002178 * u2;
3056 qc = qc - 0.006675 * uc * u2 - 0.002664 * ue * u2 - 0.002572 * u9 * u3;
3057 qc = qc - 0.003567 * ub * u3 + 0.002094 * ua * u4 + 0.003342 * uc * u4;
3058 qc = qc.ToRadians();
3059
3060 qd = (3606.0 + (130.0 - 43.0 * j1) * j1) * u5 + (1289.0 - 580.0 * j1) * u6;
3061 qd = qd - 6764.0 * u9 * u1 - 1110.0 * ub * u1 - 224.0 * ud * u1 - 204.0 * u1;
3062 qd = qd + (1284.0 + 116.0 * j1) * ua * u1 + 188.0 * uc * u1;
3063 qd = qd + (1460.0 + 130.0 * j1) * u9 * u2 + 224.0 * ub * u2 - 817.0 * u2;
3064 qd = qd + 6074.0 * u2 * ua + 992.0 * uc * u2 + 508.0 * ue * u2 + 230.0 * ug * u2;
3065 qd = qd + 108.0 * vh * u2 - (956.0 + 73.0 * j1) * u9 * u3 + 448.0 * ub * u3;
3066 qd = qd + 137.0 * ud * u3 + (108.0 * j1 - 997.0) * ua * u3 + 480.0 * uc * u3;
3067 qd = qd + 148.0 * ue * u3 + (99.0 * j1 - 956.0) * u9 * u4 + 490.0 * ub * u4;
3068 qd = qd + 158.0 * ud * u4 + 179.0 * u4 + (1024.0 + 75.0 * j1) * ua * u4;
3069 qd = qd - 437.0 * uc * u4 - 132.0 * ue * u4;
3070 qd *= 0.0000001;
3071
3072 vk = (0.007192 - 0.003147 * j1) * u5 - 0.004344 * u1;
3073 vk += (j1 * (0.000197 * j1 - 0.000675) - 0.020428) * u6;
3074 vk = vk + 0.034036 * ua * u1 + (0.007269 + 0.000672 * j1) * u9 * u1;
3075 vk = vk + 0.005614 * uc * u1 + 0.002964 * ue * u1 + 0.037761 * u9 * u2;
3076 vk = vk + 0.006158 * ub * u2 - 0.006603 * ua * u2 - 0.005356 * u9 * u3;
3077 vk = vk + 0.002722 * ub * u3 + 0.004483 * ua * u3;
3078 vk = vk - 0.002642 * uc * u3 + 0.004403 * u9 * u4;
3079 vk = vk - 0.002536 * ub * u4 + 0.005547 * ua * u4 - 0.002689 * uc * u4;
3080 qe = qc - (vk.ToRadians() / planet.Value4);
3081
3082 qf = 205.0 * ua - 263.0 * u6 + 693.0 * uc + 312.0 * ue + 147.0 * ug + 299.0 * u9 * u1;
3083 qf = qf + 181.0 * uc * u1 + 204.0 * ub * u2 + 111.0 * ud * u2 - 337.0 * ua * u2;
3084 qf -= 111.0 * uc * u2;
3085 qf *= 0.000001;
3086
3087 return (qa, qb, qc, qd, qe, qf, qg);
3088 }
3089
3090 if (new string[] { "Uranus", "Neptune" }.Contains(planet.Name))
3091 {
3092 double j8 = Unwind(1.46205 + 3.81337 * t);
3093 double j9 = 2.0 * j8 - j4;
3094 double vj = j9.Sine();
3095 double uu = j9.Cosine();
3096 double uv = (2.0 * j9).Sine();
3097 double uw = (2.0 * j9).Cosine();
3098
3099 if (planet.Name == "Neptune")
3100 {
3101 ja = j8 - j2;
3102 jb = j8 - j3;
3103 jc = j8 - j4;
3104 qc = (0.001089 * j1 - 0.589833) * vj;
3105 qc = qc + (0.004658 * j1 - 0.056094) * uu - 0.024286 * uv;
3106 qc = qc.ToRadians();
3107
3108 vk = 0.024039 * vj - 0.025303 * uu + 0.006206 * uv;
3109 vk -= 0.005992 * uw;
3110 qe = qc - (vk.ToRadians() / planet.Value4);
3111
3112 qd = 4389.0 * vj + 1129.0 * uv + 4262.0 * uu + 1089.0 * uw;
3113 qd *= 0.0000001;
3114
3115 qf = 8189.0 * uu - 817.0 * vj + 781.0 * uw;
3116 qf *= 0.000001;
3117
3118 double vd = (2.0 * jc).Sine();
3119 double ve = (2.0 * jc).Cosine();
3120 double vf = j8.Sine();
3121 double vg = j8.Cosine();
3122 qa = -0.009556 * ja.Sine() - 0.005178 * jb.Sine();
3123 qa = qa + 0.002572 * vd - 0.002972 * ve * vf - 0.002833 * vd * vg;
3124
3125 qg = 0.000336 * ve * vf + 0.000364 * vd * vg;
3126 qg = qg.ToRadians();
3127
3128 qb = -40596.0 + 4992.0 * ja.Cosine() + 2744.0 * jb.Cosine();
3129 qb = qb + 2044.0 * jc.Cosine() + 1051.0 * ve;
3130 qb *= 0.000001;
3131
3132 return (qa, qb, qc, qd, qe, qf, qg);
3133 }
3134
3135 ja = j4 - j2;
3136 jb = j4 - j3;
3137 jc = j8 - j4;
3138 qc = (0.864319 - 0.001583 * j1) * vj;
3139 qc = qc + (0.082222 - 0.006833 * j1) * uu + 0.036017 * uv;
3140 qc = qc - 0.003019 * uw + 0.008122 * j6.Sine();
3141 qc = qc.ToRadians();
3142
3143 vk = 0.120303 * vj + 0.006197 * uv;
3144 vk += (0.019472 - 0.000947 * j1) * uu;
3145 qe = qc - (vk.ToRadians() / planet.Value4);
3146
3147 qd = (163.0 * j1 - 3349.0) * vj + 20981.0 * uu + 1311.0 * uw;
3148 qd *= 0.0000001;
3149
3150 qf = -0.003825 * uu;
3151
3152 qa = (-0.038581 + (0.002031 - 0.00191 * j1) * j1) * (j4 + jb).Cosine();
3153 qa += (0.010122 - 0.000988 * j1) * (j4 + jb).Sine();
3154 double a = (0.034964 - (0.001038 - 0.000868 * j1) * j1) * (2.0 * j4 + jb).Cosine();
3155 qa = a + qa + 0.005594 * (j4 + 3.0 * jc).Sine() - 0.014808 * ja.Sine();
3156 qa = qa - 0.005794 * jb.Sine() + 0.002347 * jb.Cosine();
3157 qa = qa + 0.009872 * jc.Sine() + 0.008803 * (2.0 * jc).Sine();
3158 qa -= 0.004308 * (3.0 * jc).Sine();
3159
3160 double ux = jb.Sine();
3161 double uy = jb.Cosine();
3162 double uz = j4.Sine();
3163 double va = j4.Cosine();
3164 double vb = (2.0 * j4).Sine();
3165 double vc = (2.0 * j4).Cosine();
3166 qg = (0.000458 * ux - 0.000642 * uy - 0.000517 * (4.0 * jc).Cosine()) * uz;
3167 qg -= (0.000347 * ux + 0.000853 * uy + 0.000517 * (4.0 * jb).Sine()) * va;
3168 qg += 0.000403 * ((2.0 * jc).Cosine() * vb + (2.0 * jc).Sine() * vc);
3169 qg = qg.ToRadians();
3170
3171 qb = -25948.0 + 4985.0 * ja.Cosine() - 1230.0 * va + 3354.0 * uy;
3172 qb = qb + 904.0 * (2.0 * jc).Cosine() + 894.0 * (jc.Cosine() - (3.0 * jc).Cosine());
3173 qb += (5795.0 * va - 1165.0 * uz + 1388.0 * vc) * ux;
3174 qb += (1351.0 * va + 5702.0 * uz + 1388.0 * vb) * uy;
3175 qb *= 0.000001;
3176
3177 return (qa, qb, qc, qd, qe, qf, qg);
3178 }
3179
3180 return (qa, qb, qc, qd, qe, qf, qg);
3181 }
3182
3189 public static double SolveCubic(double w)
3190 {
3191 double s = w / 3.0;
3192
3193 while (1 == 1)
3194 {
3195 double s2 = s * s;
3196 double d = (s2 + 3.0) * s - w;
3197
3198 if (Math.Abs(d) < 0.000001)
3199 {
3200 return s;
3201 }
3202
3203 s = ((2.0 * s * s2) + w) / (3.0 * (s2 + 1.0));
3204 }
3205 }
3206
3233 public static (double cometLongDeg, double cometLatDeg, double cometDistAU) PCometLongLatDist(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr, double td, int tm, int ty, double q, double i, double p, double n)
3234 {
3235 double gd = LocalCivilTimeGreenwichDay(lh, lm, ls, ds, zc, dy, mn, yr);
3236 int gm = LocalCivilTimeGreenwichMonth(lh, lm, ls, ds, zc, dy, mn, yr);
3237 int gy = LocalCivilTimeGreenwichYear(lh, lm, ls, ds, zc, dy, mn, yr);
3238 double ut = LocalCivilTimeToUniversalTime(lh, lm, ls, ds, zc, dy, mn, yr);
3239 double tpe = (ut / 365.242191) + CivilDateToJulianDate(gd, gm, gy) - CivilDateToJulianDate(td, tm, ty);
3240 double lg = (SunLong(lh, lm, ls, ds, zc, dy, mn, yr) + 180.0).ToRadians();
3241 double re = SunDist(lh, lm, ls, ds, zc, dy, mn, yr);
3242
3243 double rh2 = 0.0;
3244 double rd = 0.0;
3245 double s3 = 0.0;
3246 double c3 = 0.0;
3247 double lc = 0.0;
3248 double s2 = 0.0;
3249 double c2 = 0.0;
3250
3251 for (int k = 1; k < 3; k++)
3252 {
3253 double s = SolveCubic(0.0364911624 * tpe / (q * q.SquareRoot()));
3254 double nu = 2.0 * s.AngleTangent();
3255 double r = q * (1.0 + s * s);
3256 double l = nu + p.ToRadians();
3257 double s1 = l.Sine();
3258 double c1 = l.Cosine();
3259 double i1 = i.ToRadians();
3260 s2 = s1 * i1.Sine();
3261 double ps = s2.ASine();
3262 double y = s1 * i1.Cosine();
3263 lc = y.AngleTangent2(c1) + n.ToRadians();
3264 c2 = ps.Cosine();
3265 rd = r * c2;
3266 double ll = lc - lg;
3267 c3 = ll.Cosine();
3268 s3 = ll.Sine();
3269 double rh = ((re * re) + (r * r) - (2.0 * re * rd * c3 * ps.Cosine())).SquareRoot();
3270 if (k == 1)
3271 {
3272 rh2 = ((re * re) + (r * r) - (2.0 * re * r * ps.Cosine() * (l + n.ToRadians() - lg).Cosine())).SquareRoot();
3273 }
3274 }
3275
3276 double ep;
3277
3278 ep = (rd < re) ? (-rd * s3 / (re - (rd * c3))).AngleTangent() + lg + 3.141592654 : (re * s3 / (rd - (re * c3))).AngleTangent() + lc;
3279 ep = Unwind(ep);
3280
3281 double tb = rd * s2 * (ep - lc).Sine() / (c2 * re * s3);
3282 double bp = tb.AngleTangent();
3283
3284 double cometLongDeg = Degrees(ep);
3285 double cometLatDeg = Degrees(bp);
3286 double cometDistAU = rh2;
3287
3288 return (cometLongDeg, cometLatDeg, cometDistAU);
3289 }
3290
3310 public static (double moonLongDeg, double moonLatDeg, double moonHorPara) MoonLongLatHP(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr)
3311 {
3312 double ut = LocalCivilTimeToUniversalTime(lh, lm, ls, ds, zc, dy, mn, yr);
3313 double gd = LocalCivilTimeGreenwichDay(lh, lm, ls, ds, zc, dy, mn, yr);
3314 int gm = LocalCivilTimeGreenwichMonth(lh, lm, ls, ds, zc, dy, mn, yr);
3315 int gy = LocalCivilTimeGreenwichYear(lh, lm, ls, ds, zc, dy, mn, yr);
3316 double t = ((CivilDateToJulianDate(gd, gm, gy) - 2415020.0) / 36525.0) + (ut / 876600.0);
3317 double t2 = t * t;
3318
3319 double m1 = 27.32158213;
3320 double m2 = 365.2596407;
3321 double m3 = 27.55455094;
3322 double m4 = 29.53058868;
3323 double m5 = 27.21222039;
3324 double m6 = 6798.363307;
3325 double q = CivilDateToJulianDate(gd, gm, gy) - 2415020.0 + (ut / 24.0);
3326 m1 = q / m1;
3327 m2 = q / m2;
3328 m3 = q / m3;
3329 m4 = q / m4;
3330 m5 = q / m5;
3331 m6 = q / m6;
3332 m1 = 360.0 * (m1 - m1.Floor());
3333 m2 = 360.0 * (m2 - m2.Floor());
3334 m3 = 360.0 * (m3 - m3.Floor());
3335 m4 = 360.0 * (m4 - m4.Floor());
3336 m5 = 360.0 * (m5 - m5.Floor());
3337 m6 = 360.0 * (m6 - m6.Floor());
3338
3339 double ml = 270.434164 + m1 - (0.001133 - 0.0000019 * t) * t2;
3340 double ms = 358.475833 + m2 - (0.00015 + 0.0000033 * t) * t2;
3341 double md = 296.104608 + m3 + (0.009192 + 0.0000144 * t) * t2;
3342 double me1 = 350.737486 + m4 - (0.001436 - 0.0000019 * t) * t2;
3343 double mf = 11.250889 + m5 - (0.003211 + 0.0000003 * t) * t2;
3344 double na = 259.183275 - m6 + (0.002078 + 0.0000022 * t) * t2;
3345 double a = (51.2 + 20.2 * t).ToRadians();
3346 double s1 = a.Sine();
3347 double s2 = na.ToRadians().Sine();
3348 double b = 346.56 + (132.87 - 0.0091731 * t) * t;
3349 double s3 = 0.003964 * b.ToRadians().Sine();
3350 double c = (na + 275.05 - 2.3 * t).ToRadians();
3351 double s4 = c.Sine();
3352 ml = ml + 0.000233 * s1 + s3 + 0.001964 * s2;
3353 ms -= 0.001778 * s1;
3354 md = md + 0.000817 * s1 + s3 + 0.002541 * s2;
3355 mf = mf + s3 - 0.024691 * s2 - 0.004328 * s4;
3356 me1 = me1 + 0.002011 * s1 + s3 + 0.001964 * s2;
3357 double e = 1.0 - (0.002495 + 0.00000752 * t) * t;
3358 double e2 = e * e;
3359 ml = ml.ToRadians();
3360 ms = ms.ToRadians();
3361 na = na.ToRadians();
3362 me1 = me1.ToRadians();
3363 mf = mf.ToRadians();
3364 md = md.ToRadians();
3365
3366 // Longitude-specific
3367 double l = 6.28875 * md.Sine() + 1.274018 * (2.0 * me1 - md).Sine();
3368 l = l + 0.658309 * (2.0 * me1).Sine() + 0.213616 * (2.0 * md).Sine();
3369 l = l - e * 0.185596 * ms.Sine() - 0.114336 * (2.0 * mf).Sine();
3370 l += 0.058793 * (2.0 * (me1 - md)).Sine();
3371 l = l + 0.057212 * e * (2.0 * me1 - ms - md).Sine() + 0.05332 * (2.0 * me1 + md).Sine();
3372 l = l + 0.045874 * e * (2.0 * me1 - ms).Sine() + 0.041024 * e * (md - ms).Sine();
3373 l = l - 0.034718 * me1.Sine() - e * 0.030465 * (ms + md).Sine();
3374 l = l + 0.015326 * (2.0 * (me1 - mf)).Sine() - 0.012528 * (2.0 * mf + md).Sine();
3375 l = l - 0.01098 * (2.0 * mf - md).Sine() + 0.010674 * (4.0 * me1 - md).Sine();
3376 l = l + 0.010034 * (3.0 * md).Sine() + 0.008548 * (4.0 * me1 - 2.0 * md).Sine();
3377 l = l - e * 0.00791 * (ms - md + 2.0 * me1).Sine() - e * 0.006783 * (2.0 * me1 + ms).Sine();
3378 l = l + 0.005162 * (md - me1).Sine() + e * 0.005 * (ms + me1).Sine();
3379 l = l + 0.003862 * (4.0 * me1).Sine() + e * 0.004049 * (md - ms + 2.0 * me1).Sine();
3380 l = l + 0.003996 * (2.0 * (md + me1)).Sine() + 0.003665 * (2.0 * me1 - 3.0 * md).Sine();
3381 l = l + e * 0.002695 * (2.0 * md - ms).Sine() + 0.002602 * (md - 2.0 * (mf + me1)).Sine();
3382 l = l + e * 0.002396 * (2.0 * (me1 - md) - ms).Sine() - 0.002349 * (md + me1).Sine();
3383 l = l + e2 * 0.002249 * (2.0 * (me1 - ms)).Sine() - e * 0.002125 * (2.0 * md + ms).Sine();
3384 l = l - e2 * 0.002079 * (2.0 * ms).Sine() + e2 * 0.002059 * (2.0 * (me1 - ms) - md).Sine();
3385 l = l - 0.001773 * (md + 2.0 * (me1 - mf)).Sine() - 0.001595 * (2.0 * (mf + me1)).Sine();
3386 l = l + e * 0.00122 * (4.0 * me1 - ms - md).Sine() - 0.00111 * (2.0 * (md + mf)).Sine();
3387 l = l + 0.000892 * (md - 3.0 * me1).Sine() - e * 0.000811 * (ms + md + 2.0 * me1).Sine();
3388 l += e * 0.000761 * (4.0 * me1 - ms - 2.0 * md).Sine();
3389 l += e2 * 0.000704 * (md - 2.0 * (ms + me1)).Sine();
3390 l += e * 0.000693 * (ms - 2.0 * (md - me1)).Sine();
3391 l += e * 0.000598 * (2.0 * (me1 - mf) - ms).Sine();
3392 l = l + 0.00055 * (md + 4.0 * me1).Sine() + 0.000538 * (4.0 * md).Sine();
3393 l = l + e * 0.000521 * (4.0 * me1 - ms).Sine() + 0.000486 * (2.0 * md - me1).Sine();
3394 l += e2 * 0.000717 * (md - 2.0 * ms).Sine();
3395 double mm = Unwind(ml + l.ToRadians());
3396
3397 // Latitude-specific
3398 double g = 5.128189 * mf.Sine() + 0.280606 * (md + mf).Sine();
3399 g = g + 0.277693 * (md - mf).Sine() + 0.173238 * (2.0 * me1 - mf).Sine();
3400 g = g + 0.055413 * (2.0 * me1 + mf - md).Sine() + 0.046272 * (2.0 * me1 - mf - md).Sine();
3401 g = g + 0.032573 * (2.0 * me1 + mf).Sine() + 0.017198 * (2.0 * md + mf).Sine();
3402 g = g + 0.009267 * (2.0 * me1 + md - mf).Sine() + 0.008823 * (2.0 * md - mf).Sine();
3403 g = g + e * 0.008247 * (2.0 * me1 - ms - mf).Sine() + 0.004323 * (2.0 * (me1 - md) - mf).Sine();
3404 g = g + 0.0042 * (2.0 * me1 + mf + md).Sine() + e * 0.003372 * (mf - ms - 2.0 * me1).Sine();
3405 g += e * 0.002472 * (2.0 * me1 + mf - ms - md).Sine();
3406 g += e * 0.002222 * (2.0 * me1 + mf - ms).Sine();
3407 g += e * 0.002072 * (2.0 * me1 - mf - ms - md).Sine();
3408 g = g + e * 0.001877 * (mf - ms + md).Sine() + 0.001828 * (4.0 * me1 - mf - md).Sine();
3409 g = g - e * 0.001803 * (mf + ms).Sine() - 0.00175 * (3.0 * mf).Sine();
3410 g = g + e * 0.00157 * (md - ms - mf).Sine() - 0.001487 * (mf + me1).Sine();
3411 g = g - e * 0.001481 * (mf + ms + md).Sine() + e * 0.001417 * (mf - ms - md).Sine();
3412 g = g + e * 0.00135 * (mf - ms).Sine() + 0.00133 * (mf - me1).Sine();
3413 g = g + 0.001106 * (mf + 3.0 * md).Sine() + 0.00102 * (4.0 * me1 - mf).Sine();
3414 g = g + 0.000833 * (mf + 4.0 * me1 - md).Sine() + 0.000781 * (md - 3.0 * mf).Sine();
3415 g = g + 0.00067 * (mf + 4.0 * me1 - 2.0 * md).Sine() + 0.000606 * (2.0 * me1 - 3.0 * mf).Sine();
3416 g += 0.000597 * (2.0 * (me1 + md) - mf).Sine();
3417 g = g + e * 0.000492 * (2.0 * me1 + md - ms - mf).Sine() + 0.00045 * (2.0 * (md - me1) - mf).Sine();
3418 g = g + 0.000439 * (3.0 * md - mf).Sine() + 0.000423 * (mf + 2.0 * (me1 + md)).Sine();
3419 g = g + 0.000422 * (2.0 * me1 - mf - 3.0 * md).Sine() - e * 0.000367 * (ms + mf + 2.0 * me1 - md).Sine();
3420 g = g - e * 0.000353 * (ms + mf + 2.0 * me1).Sine() + 0.000331 * (mf + 4.0 * me1).Sine();
3421 g += e * 0.000317 * (2.0 * me1 + mf - ms + md).Sine();
3422 g = g + e2 * 0.000306 * (2.0 * (me1 - ms) - mf).Sine() - 0.000283 * (md + 3.0 * mf).Sine();
3423 double w1 = 0.0004664 * na.Cosine();
3424 double w2 = 0.0000754 * c.Cosine();
3425 double bm = g.ToRadians() * (1.0 - w1 - w2);
3426
3427 // Horizontal parallax-specific
3428 double pm = 0.950724 + 0.051818 * md.Cosine() + 0.009531 * (2.0 * me1 - md).Cosine();
3429 pm = pm + 0.007843 * (2.0 * me1).Cosine() + 0.002824 * (2.0 * md).Cosine();
3430 pm = pm + 0.000857 * (2.0 * me1 + md).Cosine() + e * 0.000533 * (2.0 * me1 - ms).Cosine();
3431 pm += e * 0.000401 * (2.0 * me1 - md - ms).Cosine();
3432 pm = pm + e * 0.00032 * (md - ms).Cosine() - 0.000271 * me1.Cosine();
3433 pm = pm - e * 0.000264 * (ms + md).Cosine() - 0.000198 * (2.0 * mf - md).Cosine();
3434 pm = pm + 0.000173 * (3.0 * md).Cosine() + 0.000167 * (4.0 * me1 - md).Cosine();
3435 pm = pm - e * 0.000111 * ms.Cosine() + 0.000103 * (4.0 * me1 - 2.0 * md).Cosine();
3436 pm = pm - 0.000084 * (2.0 * md - 2.0 * me1).Cosine() - e * 0.000083 * (2.0 * me1 + ms).Cosine();
3437 pm = pm + 0.000079 * (2.0 * me1 + 2.0 * md).Cosine() + 0.000072 * (4.0 * me1).Cosine();
3438 pm = pm + e * 0.000064 * (2.0 * me1 - ms + md).Cosine() - e * 0.000063 * (2.0 * me1 + ms - md).Cosine();
3439 pm = pm + e * 0.000041 * (ms + me1).Cosine() + e * 0.000035 * (2.0 * md - ms).Cosine();
3440 pm = pm - 0.000033 * (3.0 * md - 2.0 * me1).Cosine() - 0.00003 * (md + me1).Cosine();
3441 pm = pm - 0.000029 * (2.0 * (mf - me1)).Cosine() - e * 0.000029 * (2.0 * md + ms).Cosine();
3442 pm = pm + e2 * 0.000026 * (2.0 * (me1 - ms)).Cosine() - 0.000023 * (2.0 * (mf - me1) + md).Cosine();
3443 pm += e * 0.000019 * (4.0 * me1 - ms - md).Cosine();
3444
3445 double moonLongDeg = Degrees(mm);
3446 double moonLatDeg = Degrees(bm);
3447 double moonHorPara = pm;
3448
3449 return (moonLongDeg, moonLatDeg, moonHorPara);
3450 }
3451
3458 public static double MoonPhase(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr)
3459 {
3460 (double moonLongDeg, double moonLatDeg, double moonHorPara) moonResult = MoonLongLatHP(lh, lm, ls, ds, zc, dy, mn, yr);
3461
3462 double cd = (moonResult.moonLongDeg - SunLong(lh, lm, ls, ds, zc, dy, mn, yr)).ToRadians().Cosine() * moonResult.moonLatDeg.ToRadians().Cosine();
3463 double d = cd.ACosine();
3464 double sd = d.Sine();
3465 double i = 0.1468 * sd * (1.0 - 0.0549 * MoonMeanAnomaly(lh, lm, ls, ds, zc, dy, mn, yr).Sine());
3466 i /= (1.0 - 0.0167 * SunMeanAnomaly(lh, lm, ls, ds, zc, dy, mn, yr).Sine());
3467 i = 3.141592654 - d - i.ToRadians();
3468 double k = (1.0 + i.Cosine()) / 2.0;
3469
3470 return Math.Round(k, 2);
3471 }
3472
3479 public static double MoonMeanAnomaly(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr)
3480 {
3481 double ut = LocalCivilTimeToUniversalTime(lh, lm, ls, ds, zc, dy, mn, yr);
3482 double gd = LocalCivilTimeGreenwichDay(lh, lm, ls, ds, zc, dy, mn, yr);
3483 int gm = LocalCivilTimeGreenwichMonth(lh, lm, ls, ds, zc, dy, mn, yr);
3484 int gy = LocalCivilTimeGreenwichYear(lh, lm, ls, ds, zc, dy, mn, yr);
3485 double t = ((CivilDateToJulianDate(gd, gm, gy) - 2415020.0) / 36525.0) + (ut / 876600.0);
3486 double t2 = t * t;
3487
3488 double m1 = 27.32158213;
3489 double m2 = 365.2596407;
3490 double m3 = 27.55455094;
3491 double m4 = 29.53058868;
3492 double m5 = 27.21222039;
3493 double m6 = 6798.363307;
3494 double q = CivilDateToJulianDate(gd, gm, gy) - 2415020.0 + (ut / 24.0);
3495 m1 = q / m1;
3496 m2 = q / m2;
3497 m3 = q / m3;
3498 m4 = q / m4;
3499 m5 = q / m5;
3500 m6 = q / m6;
3501 m1 = 360.0 * (m1 - m1.Floor());
3502 m2 = 360.0 * (m2 - m2.Floor());
3503 m3 = 360.0 * (m3 - m3.Floor());
3504 m4 = 360.0 * (m4 - m4.Floor());
3505 m5 = 360.0 * (m5 - m5.Floor());
3506 m6 = 360.0 * (m6 - m6.Floor());
3507
3508 double ml = 270.434164 + m1 - (0.001133 - 0.0000019 * t) * t2;
3509 double ms = 358.475833 + m2 - (0.00015 + 0.0000033 * t) * t2;
3510 double md = 296.104608 + m3 + (0.009192 + 0.0000144 * t) * t2;
3511 double na = 259.183275 - m6 + (0.002078 + 0.0000022 * t) * t2;
3512 double a = (51.2 + 20.2 * t).ToRadians();
3513 double s1 = a.Sine();
3514 double s2 = na.ToRadians().Sine();
3515 double b = 346.56 + (132.87 - 0.0091731 * t) * t;
3516 double s3 = 0.003964 * b.ToRadians().Sine();
3517 double c = (na + 275.05 - 2.3 * t).ToRadians();
3518 md = md + 0.000817 * s1 + s3 + 0.002541 * s2;
3519
3520 return md.ToRadians();
3521 }
3522
3534 public static double NewMoon(int ds, int zc, double dy, int mn, int yr)
3535 {
3536 double d0 = LocalCivilTimeGreenwichDay(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
3537 int m0 = LocalCivilTimeGreenwichMonth(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
3538 int y0 = LocalCivilTimeGreenwichYear(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
3539
3540 double j0 = CivilDateToJulianDate(0.0, 1, y0) - 2415020.0;
3541 double dj = CivilDateToJulianDate(d0, m0, y0) - 2415020.0;
3542 double k = Lint(((y0 - 1900.0 + ((dj - j0) / 365.0)) * 12.3685) + 0.5);
3543 double tn = k / 1236.85;
3544 double tf = (k + 0.5) / 1236.85;
3545 double t = tn;
3546 (double a, double b, double f) nmfmResult1 = NewMoonFullMoon_L6855(k, t);
3547 double ni = nmfmResult1.a;
3548 double nf = nmfmResult1.b;
3549 t = tf;
3550 k += 0.5;
3551 (double a, double b, double f) nmfmResult2 = NewMoonFullMoon_L6855(k, t);
3552
3553 return ni + 2415020.0 + nf;
3554 }
3555
3567 public static double FullMoon(int ds, int zc, double dy, int mn, int yr)
3568 {
3569 double d0 = LocalCivilTimeGreenwichDay(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
3570 int m0 = LocalCivilTimeGreenwichMonth(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
3571 int y0 = LocalCivilTimeGreenwichYear(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
3572
3573 double j0 = CivilDateToJulianDate(0.0, 1, y0) - 2415020.0;
3574 double dj = CivilDateToJulianDate(d0, m0, y0) - 2415020.0;
3575 double k = Lint(((y0 - 1900.0 + ((dj - j0) / 365.0)) * 12.3685) + 0.5);
3576 double tn = k / 1236.85;
3577 double tf = (k + 0.5) / 1236.85;
3578 double t = tn;
3579 (double a, double b, double f) nmfnResult1 = NewMoonFullMoon_L6855(k, t);
3580 t = tf;
3581 k += 0.5;
3582 (double a, double b, double f) nmfnResult2 = NewMoonFullMoon_L6855(k, t);
3583 double fi = nmfnResult2.a;
3584 double ff = nmfnResult2.b;
3585
3586 return fi + 2415020.0 + ff;
3587 }
3588
3592 public static (double a, double b, double f) NewMoonFullMoon_L6855(double k, double t)
3593 {
3594 double t2 = t * t;
3595 double e = 29.53 * k;
3596 double c = 166.56 + (132.87 - 0.009173 * t) * t;
3597 c = c.ToRadians();
3598 double b = 0.00058868 * k + (0.0001178 - 0.000000155 * t) * t2;
3599 b = b + 0.00033 * c.Sine() + 0.75933;
3600 double a = k / 12.36886;
3601 double a1 = 359.2242 + 360.0 * Fract(a) - (0.0000333 + 0.00000347 * t) * t2;
3602 double a2 = 306.0253 + 360.0 * Fract(k / 0.9330851);
3603 a2 += (0.0107306 + 0.00001236 * t) * t2;
3604 a = k / 0.9214926;
3605 double f = 21.2964 + 360.0 * Fract(a) - (0.0016528 + 0.00000239 * t) * t2;
3606 a1 = UnwindDeg(a1);
3607 a2 = UnwindDeg(a2);
3608 f = UnwindDeg(f);
3609 a1 = a1.ToRadians();
3610 a2 = a2.ToRadians();
3611 f = f.ToRadians();
3612
3613 double dd = (0.1734 - 0.000393 * t) * a1.Sine() + 0.0021 * (2.0 * a1).Sine();
3614 dd = dd - 0.4068 * a2.Sine() + 0.0161 * (2.0 * a2).Sine() - 0.0004 * (3.0 * a2).Sine();
3615 dd = dd + 0.0104 * (2.0 * f).Sine() - 0.0051 * (a1 + a2).Sine();
3616 dd = dd - 0.0074 * (a1 - a2).Sine() + 0.0004 * (2.0 * f + a1).Sine();
3617 dd = dd - 0.0004 * (2.0 * f - a1).Sine() - 0.0006 * (2.0 * f + a2).Sine() + 0.001 * (2.0 * f - a2).Sine();
3618 dd += 0.0005 * (a1 + 2.0 * a2).Sine();
3619 double e1 = e.Floor();
3620 b = b + dd + (e - e1);
3621 double b1 = b.Floor();
3622 a = e1 + b1;
3623 b -= b1;
3624
3625 return (a, b, f);
3626 }
3627
3631 public static double Fract(double w)
3632 {
3633 return w - Lint(w);
3634 }
3635
3639 public static double Lint(double w)
3640 {
3641 return IInt(w) + IInt(((1.0 * Sign(w)) - 1.0) / 2.0);
3642 }
3643
3647 public static double IInt(double w)
3648 {
3649 return Sign(w) * Math.Abs(w).Floor();
3650 }
3651
3657 public static double Sign(double numberToCheck)
3658 {
3659 double signValue = 0.0;
3660
3661 if (numberToCheck < 0.0)
3662 signValue = -1.0;
3663
3664 if (numberToCheck > 0.0)
3665 signValue = 1.0;
3666
3667 return signValue;
3668 }
3669
3673 public static double UTDayAdjust(double ut, double g1)
3674 {
3675 double returnValue = ut;
3676
3677 if ((ut - g1) < -6.0)
3678 returnValue = ut + 24.0;
3679
3680 if ((ut - g1) > 6.0)
3681 returnValue = ut - 24.0;
3682
3683 return returnValue;
3684 }
3685
3689 public static double FPart(double w)
3690 {
3691 return w - Lint(w);
3692 }
3693
3697 public static double EQELat(double rah, double ram, double ras, double dd, double dm, double ds, double gd, int gm, int gy)
3698 {
3699 double a = DegreeHoursToDecimalDegrees(HMStoDH(rah, ram, ras)).ToRadians();
3700 double b = DegreesMinutesSecondsToDecimalDegrees(dd, dm, ds).ToRadians();
3701 double c = Obliq(gd, gm, gy).ToRadians();
3702 double d = b.Sine() * c.Cosine() - b.Cosine() * c.Sine() * a.Sine();
3703
3704 return Degrees(d.ASine());
3705 }
3706
3710 public static double EQELong(double rah, double ram, double ras, double dd, double dm, double ds, double gd, int gm, int gy)
3711 {
3712 double a = DegreeHoursToDecimalDegrees(HMStoDH(rah, ram, ras)).ToRadians();
3713 double b = DegreesMinutesSecondsToDecimalDegrees(dd, dm, ds).ToRadians();
3714 double c = Obliq(gd, gm, gy).ToRadians();
3715 double d = a.Sine() * c.Cosine() + b.Tangent() * c.Sine();
3716 double e = a.Cosine();
3717 double f = Degrees(d.AngleTangent2(e));
3718
3719 return f - 360.0 * (f / 360.0).Floor();
3720 }
3721
3729 public static double MoonRiseLCT(double dy, int mn, int yr, int ds, int zc, double gLong, double gLat)
3730 {
3731 double gdy = LocalCivilTimeGreenwichDay(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
3732 int gmn = LocalCivilTimeGreenwichMonth(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
3733 int gyr = LocalCivilTimeGreenwichYear(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
3734 double lct = 12.0;
3735 double dy1 = dy;
3736 int mn1 = mn;
3737 int yr1 = yr;
3738
3739 (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct) lct6700result1 = MoonRiseLCT_L6700(lct, ds, zc, dy1, mn1, yr1, gdy, gmn, gyr, gLat);
3740 double lu = lct6700result1.lu;
3741 lct = lct6700result1.lct;
3742
3743 if (lct == -99.0)
3744 return lct;
3745
3746 double la = lu;
3747
3748 double x;
3749 double ut;
3750 double g1 = 0.0;
3751 double gu = 0.0;
3752
3753 for (int k = 1; k < 9; k++)
3754 {
3755 x = LocalSiderealTimeToGreenwichSiderealTime(la, 0.0, 0.0, gLong);
3756 ut = GreenwichSiderealTimeToUniversalTime(x, 0.0, 0.0, gdy, gmn, gyr);
3757
3758 g1 = (k == 1) ? ut : gu;
3759
3760 gu = ut;
3761 ut = gu;
3762
3763 (double ut, double lct, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr) lct6680result = MoonRiseLCT_L6680(x, ds, zc, gdy, gmn, gyr, g1, ut);
3764 lct = lct6680result.lct;
3765 dy1 = lct6680result.dy1;
3766 mn1 = lct6680result.mn1;
3767 yr1 = lct6680result.yr1;
3768 gdy = lct6680result.gdy;
3769 gmn = lct6680result.gmn;
3770 gyr = lct6680result.gyr;
3771
3772 (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct) lct6700result2 = MoonRiseLCT_L6700(lct, ds, zc, dy1, mn1, yr1, gdy, gmn, gyr, gLat);
3773 lu = lct6700result2.lu;
3774 lct = lct6700result2.lct;
3775
3776 if (lct == -99.0)
3777 return lct;
3778
3779 la = lu;
3780 }
3781
3782 x = LocalSiderealTimeToGreenwichSiderealTime(la, 0.0, 0.0, gLong);
3783 ut = GreenwichSiderealTimeToUniversalTime(x, 0.0, 0.0, gdy, gmn, gyr);
3784
3785 if (!EGstUt(x, 0.0, 0.0, gdy, gmn, gyr).Equals(PAWarningFlag.OK))
3786 if (Math.Abs(g1 - ut) > 0.5)
3787 ut += 23.93447;
3788
3789 ut = UTDayAdjust(ut, g1);
3790 lct = UniversalTimeToLocalCivilTime(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
3791
3792 return lct;
3793 }
3794
3798 public static (double ut, double lct, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr) MoonRiseLCT_L6680(double x, int ds, int zc, double gdy, int gmn, int gyr, double g1, double ut)
3799 {
3800 if (!EGstUt(x, 0.0, 0.0, gdy, gmn, gyr).Equals(PAWarningFlag.OK))
3801 if (Math.Abs(g1 - ut) > 0.5)
3802 ut += 23.93447;
3803
3804 ut = UTDayAdjust(ut, g1);
3805 double lct = UniversalTimeToLocalCivilTime(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
3806 double dy1 = UniversalTime_LocalCivilDay(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
3807 int mn1 = UniversalTime_LocalCivilMonth(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
3808 int yr1 = UniversalTime_LocalCivilYear(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
3809 gdy = LocalCivilTimeGreenwichDay(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
3810 gmn = LocalCivilTimeGreenwichMonth(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
3811 gyr = LocalCivilTimeGreenwichYear(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
3812 ut -= 24.0 * (ut / 24.0).Floor();
3813
3814 return (ut, lct, dy1, mn1, yr1, gdy, gmn, gyr);
3815 }
3816
3820 public static (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct) MoonRiseLCT_L6700(double lct, int ds, int zc, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr, double gLat)
3821 {
3822 double mm = MoonLong(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
3823 double bm = MoonLat(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
3824 double pm = MoonHP(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1).ToRadians();
3825 double dp = NutatLong(gdy, gmn, gyr);
3826 double th = 0.27249 * pm.Sine();
3827 double di = th + 0.0098902 - pm;
3828 double p = DecimalDegreesToDegreeHours(EcRA(mm + dp, 0.0, 0.0, bm, 0.0, 0.0, gdy, gmn, gyr));
3829 double q = EcDec(mm + dp, 0.0, 0.0, bm, 0.0, 0.0, gdy, gmn, gyr);
3830 double lu = RiseSetLocalSiderealTimeRise(p, 0.0, 0.0, q, 0.0, 0.0, Degrees(di), gLat);
3831
3832 if (!ERS(p, 0.0, 0.0, q, 0.0, 0.0, Degrees(di), gLat).Equals("OK"))
3833 lct = -99.0;
3834
3835 return (mm, bm, pm, dp, th, di, p, q, lu, lct);
3836 }
3837
3849 public static (double dy1, int mn1, int yr1) MoonRiseLcDMY(double dy, int mn, int yr, int ds, int zc, double gLong, double gLat)
3850 {
3851 double gdy = LocalCivilTimeGreenwichDay(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
3852 int gmn = LocalCivilTimeGreenwichMonth(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
3853 int gyr = LocalCivilTimeGreenwichYear(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
3854 double lct = 12.0;
3855 double dy1 = dy;
3856 int mn1 = mn;
3857 int yr1 = yr;
3858
3859 (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct) lct6700result1 = MoonRiseLcDMY_L6700(lct, ds, zc, dy1, mn1, yr1, gdy, gmn, gyr, gLat);
3860 double lu = lct6700result1.lu;
3861 lct = lct6700result1.lct;
3862
3863 if (lct == -99.0)
3864 return (lct, (int)lct, (int)lct);
3865
3866 double la = lu;
3867
3868 double x;
3869 double ut;
3870 double g1 = 0.0;
3871 double gu = 0.0;
3872 for (int k = 1; k < 9; k++)
3873 {
3874 x = LocalSiderealTimeToGreenwichSiderealTime(la, 0.0, 0.0, gLong);
3875 ut = GreenwichSiderealTimeToUniversalTime(x, 0.0, 0.0, gdy, gmn, gyr);
3876
3877 g1 = (k == 1) ? ut : gu;
3878
3879 gu = ut;
3880 ut = gu;
3881
3882 (double ut, double lct, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr) lct6680result1 = MoonRiseLcDMY_L6680(x, ds, zc, gdy, gmn, gyr, g1, ut);
3883 lct = lct6680result1.lct;
3884 dy1 = lct6680result1.dy1;
3885 mn1 = lct6680result1.mn1;
3886 yr1 = lct6680result1.yr1;
3887 gdy = lct6680result1.gdy;
3888 gmn = lct6680result1.gmn;
3889 gyr = lct6680result1.gyr;
3890
3891 (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct) lct6700result2 = MoonRiseLcDMY_L6700(lct, ds, zc, dy1, mn1, yr1, gdy, gmn, gyr, gLat);
3892
3893 lu = lct6700result2.lu;
3894 lct = lct6700result2.lct;
3895
3896 if (lct == -99.0)
3897 return (lct, (int)lct, (int)lct);
3898
3899 la = lu;
3900 }
3901
3902 x = LocalSiderealTimeToGreenwichSiderealTime(la, 0.0, 0.0, gLong);
3903 ut = GreenwichSiderealTimeToUniversalTime(x, 0.0, 0.0, gdy, gmn, gyr);
3904
3905 if (!EGstUt(x, 0.0, 0.0, gdy, gmn, gyr).Equals(PAWarningFlag.OK))
3906 if (Math.Abs(g1 - ut) > 0.5)
3907 ut += 23.93447;
3908
3909 ut = UTDayAdjust(ut, g1);
3910 dy1 = UniversalTime_LocalCivilDay(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
3911 mn1 = UniversalTime_LocalCivilMonth(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
3912 yr1 = UniversalTime_LocalCivilYear(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
3913
3914 return (dy1, mn1, yr1);
3915 }
3916
3920 public static (double ut, double lct, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr) MoonRiseLcDMY_L6680(double x, int ds, int zc, double gdy, int gmn, int gyr, double g1, double ut)
3921 {
3922 if (!EGstUt(x, 0.0, 0.0, gdy, gmn, gyr).Equals(PAWarningFlag.OK))
3923 if (Math.Abs(g1 - ut) > 0.5)
3924 ut += 23.93447;
3925
3926 ut = UTDayAdjust(ut, g1);
3927 double lct = UniversalTimeToLocalCivilTime(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
3928 double dy1 = UniversalTime_LocalCivilDay(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
3929 int mn1 = UniversalTime_LocalCivilMonth(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
3930 int yr1 = UniversalTime_LocalCivilYear(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
3931 gdy = LocalCivilTimeGreenwichDay(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
3932 gmn = LocalCivilTimeGreenwichMonth(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
3933 gyr = LocalCivilTimeGreenwichYear(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
3934 ut -= 24.0 * (ut / 24.0).Floor();
3935
3936 return (ut, lct, dy1, mn1, yr1, gdy, gmn, gyr);
3937 }
3938
3942 public static (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct) MoonRiseLcDMY_L6700(double lct, int ds, int zc, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr, double gLat)
3943 {
3944 double mm = MoonLong(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
3945 double bm = MoonLat(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
3946 double pm = MoonHP(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1).ToRadians();
3947 double dp = NutatLong(gdy, gmn, gyr);
3948 double th = 0.27249 * pm.Sine();
3949 double di = th + 0.0098902 - pm;
3950 double p = DecimalDegreesToDegreeHours(EcRA(mm + dp, 0.0, 0.0, bm, 0.0, 0.0, gdy, gmn, gyr));
3951 double q = EcDec(mm + dp, 0.0, 0.0, bm, 0.0, 0.0, gdy, gmn, gyr);
3952 double lu = RiseSetLocalSiderealTimeRise(p, 0.0, 0.0, q, 0.0, 0.0, Degrees(di), gLat);
3953
3954 return (mm, bm, pm, dp, th, di, p, q, lu, lct);
3955 }
3956
3964 public static double MoonRiseAz(double dy, int mn, int yr, int ds, int zc, double gLong, double gLat)
3965 {
3966 double gdy = LocalCivilTimeGreenwichDay(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
3967 int gmn = LocalCivilTimeGreenwichMonth(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
3968 int gyr = LocalCivilTimeGreenwichYear(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
3969 double lct = 12.0;
3970 double dy1 = dy;
3971 int mn1 = mn;
3972 int yr1 = yr;
3973
3974 (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct, double au) az6700result1 = MoonRiseAz_L6700(lct, ds, zc, dy1, mn1, yr1, gdy, gmn, gyr, gLat);
3975 double lu = az6700result1.lu;
3976 lct = az6700result1.lct;
3977 double au;
3978
3979 if (lct == -99.0)
3980 return lct;
3981
3982 double la = lu;
3983
3984 double x;
3985 double ut;
3986 double g1;
3987 double gu = 0.0;
3988 double aa = 0.0;
3989 for (int k = 1; k < 9; k++)
3990 {
3991 x = LocalSiderealTimeToGreenwichSiderealTime(la, 0.0, 0.0, gLong);
3992 ut = GreenwichSiderealTimeToUniversalTime(x, 0.0, 0.0, gdy, gmn, gyr);
3993
3994 g1 = (k == 1) ? ut : gu;
3995
3996 gu = ut;
3997 ut = gu;
3998
3999 (double ut, double lct, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr) az6680result1 = MoonRiseAz_L6680(x, ds, zc, gdy, gmn, gyr, g1, ut);
4000 lct = az6680result1.lct;
4001 dy1 = az6680result1.dy1;
4002 mn1 = az6680result1.mn1;
4003 yr1 = az6680result1.yr1;
4004 gdy = az6680result1.gdy;
4005 gmn = az6680result1.gmn;
4006 gyr = az6680result1.gyr;
4007
4008 (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct, double au) az6700result2 = MoonRiseAz_L6700(lct, ds, zc, dy1, mn1, yr1, gdy, gmn, gyr, gLat);
4009 lu = az6700result2.lu;
4010 lct = az6700result2.lct;
4011 au = az6700result2.au;
4012
4013 if (lct == -99.0)
4014 return lct;
4015
4016 la = lu;
4017 aa = au;
4018 }
4019
4020 au = aa;
4021
4022 return au;
4023 }
4024
4028 public static (double ut, double lct, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr) MoonRiseAz_L6680(double x, int ds, int zc, double gdy, int gmn, int gyr, double g1, double ut)
4029 {
4030 if (!EGstUt(x, 0.0, 0.0, gdy, gmn, gyr).Equals(PAWarningFlag.OK))
4031 if (Math.Abs(g1 - ut) > 0.5)
4032 ut += 23.93447;
4033
4034 ut = UTDayAdjust(ut, g1);
4035 double lct = UniversalTimeToLocalCivilTime(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4036 double dy1 = UniversalTime_LocalCivilDay(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4037 int mn1 = UniversalTime_LocalCivilMonth(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4038 int yr1 = UniversalTime_LocalCivilYear(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4039 gdy = LocalCivilTimeGreenwichDay(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4040 gmn = LocalCivilTimeGreenwichMonth(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4041 gyr = LocalCivilTimeGreenwichYear(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4042 ut -= 24.0 * (ut / 24.0).Floor();
4043
4044 return (ut, lct, dy1, mn1, yr1, gdy, gmn, gyr);
4045 }
4046
4050 public static (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct, double au) MoonRiseAz_L6700(double lct, int ds, int zc, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr, double gLat)
4051 {
4052 double mm = MoonLong(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4053 double bm = MoonLat(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4054 double pm = MoonHP(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1).ToRadians();
4055 double dp = NutatLong(gdy, gmn, gyr);
4056 double th = 0.27249 * pm.Sine();
4057 double di = th + 0.0098902 - pm;
4058 double p = DecimalDegreesToDegreeHours(EcRA(mm + dp, 0.0, 0.0, bm, 0.0, 0.0, gdy, gmn, gyr));
4059 double q = EcDec(mm + dp, 0.0, 0.0, bm, 0.0, 0.0, gdy, gmn, gyr);
4060 double lu = RiseSetLocalSiderealTimeRise(p, 0.0, 0.0, q, 0.0, 0.0, Degrees(di), gLat);
4061 double au = RiseSetAzimuthRise(p, 0.0, 0.0, q, 0.0, 0.0, Degrees(di), gLat);
4062
4063 return (mm, bm, pm, dp, th, di, p, q, lu, lct, au);
4064 }
4065
4073 public static double MoonSetLCT(double dy, int mn, int yr, int ds, int zc, double gLong, double gLat)
4074 {
4075 double gdy = LocalCivilTimeGreenwichDay(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
4076 int gmn = LocalCivilTimeGreenwichMonth(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
4077 int gyr = LocalCivilTimeGreenwichYear(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
4078 double lct = 12.0;
4079 double dy1 = dy;
4080 int mn1 = mn;
4081 int yr1 = yr;
4082
4083 (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct) lct6700result1 = MoonSetLCT_L6700(lct, ds, zc, dy1, mn1, yr1, gdy, gmn, gyr, gLat);
4084 double lu = lct6700result1.lu;
4085 lct = lct6700result1.lct;
4086
4087 if (lct == -99.0)
4088 return lct;
4089
4090 double la = lu;
4091
4092 double x;
4093 double ut;
4094 double g1 = 0.0;
4095 double gu = 0.0;
4096 for (int k = 1; k < 9; k++)
4097 {
4098 x = LocalSiderealTimeToGreenwichSiderealTime(la, 0.0, 0.0, gLong);
4099 ut = GreenwichSiderealTimeToUniversalTime(x, 0.0, 0.0, gdy, gmn, gyr);
4100
4101 g1 = (k == 1) ? ut : gu;
4102
4103 gu = ut;
4104 ut = gu;
4105
4106 (double ut, double lct, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr) lct6680result1 = MoonSetLCT_L6680(x, ds, zc, gdy, gmn, gyr, g1, ut);
4107 lct = lct6680result1.lct;
4108 dy1 = lct6680result1.dy1;
4109 mn1 = lct6680result1.mn1;
4110 yr1 = lct6680result1.yr1;
4111 gdy = lct6680result1.gdy;
4112 gmn = lct6680result1.gmn;
4113 gyr = lct6680result1.gyr;
4114
4115 (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct) lct6700result2 = MoonSetLCT_L6700(lct, ds, zc, dy1, mn1, yr1, gdy, gmn, gyr, gLat);
4116 lu = lct6700result2.lu;
4117 lct = lct6700result2.lct;
4118
4119 if (lct == -99.0)
4120 return lct;
4121
4122 la = lu;
4123 }
4124
4125 x = LocalSiderealTimeToGreenwichSiderealTime(la, 0.0, 0.0, gLong);
4126 ut = GreenwichSiderealTimeToUniversalTime(x, 0.0, 0.0, gdy, gmn, gyr);
4127
4128 if (!EGstUt(x, 0.0, 0.0, gdy, gmn, gyr).Equals(PAWarningFlag.OK))
4129 if (Math.Abs(g1 - ut) > 0.5)
4130 ut += 23.93447;
4131
4132 ut = UTDayAdjust(ut, g1);
4133 lct = UniversalTimeToLocalCivilTime(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4134
4135 return lct;
4136 }
4137
4141 public static (double ut, double lct, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr) MoonSetLCT_L6680(double x, int ds, int zc, double gdy, int gmn, int gyr, double g1, double ut)
4142 {
4143 if (!EGstUt(x, 0.0, 0.0, gdy, gmn, gyr).Equals(PAWarningFlag.OK))
4144 if (Math.Abs(g1 - ut) > 0.5)
4145 ut += 23.93447;
4146
4147 ut = UTDayAdjust(ut, g1);
4148 double lct = UniversalTimeToLocalCivilTime(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4149 double dy1 = UniversalTime_LocalCivilDay(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4150 int mn1 = UniversalTime_LocalCivilMonth(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4151 int yr1 = UniversalTime_LocalCivilYear(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4152 gdy = LocalCivilTimeGreenwichDay(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4153 gmn = LocalCivilTimeGreenwichMonth(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4154 gyr = LocalCivilTimeGreenwichYear(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4155 ut -= 24.0 * (ut / 24.0).Floor();
4156
4157 return (ut, lct, dy1, mn1, yr1, gdy, gmn, gyr);
4158 }
4159
4163 public static (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct) MoonSetLCT_L6700(double lct, int ds, int zc, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr, double gLat)
4164 {
4165 double mm = MoonLong(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4166 double bm = MoonLat(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4167 double pm = MoonHP(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1).ToRadians();
4168 double dp = NutatLong(gdy, gmn, gyr);
4169 double th = 0.27249 * pm.Sine();
4170 double di = th + 0.0098902 - pm;
4171 double p = DecimalDegreesToDegreeHours(EcRA(mm + dp, 0.0, 0.0, bm, 0.0, 0.0, gdy, gmn, gyr));
4172 double q = EcDec(mm + dp, 0.0, 0.0, bm, 0.0, 0.0, gdy, gmn, gyr);
4173 double lu = RiseSetLocalSiderealTimeSet(p, 0.0, 0.0, q, 0.0, 0.0, Degrees(di), gLat);
4174
4175 if (!ERS(p, 0.0, 0.0, q, 0.0, 0.0, Degrees(di), gLat).Equals("OK"))
4176 lct = -99.0;
4177
4178 return (mm, bm, pm, dp, th, di, p, q, lu, lct);
4179 }
4180
4192 public static (double dy1, int mn1, int yr1) MoonSetLcDMY(double dy, int mn, int yr, int ds, int zc, double gLong, double gLat)
4193 {
4194 double gdy = LocalCivilTimeGreenwichDay(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
4195 int gmn = LocalCivilTimeGreenwichMonth(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
4196 int gyr = LocalCivilTimeGreenwichYear(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
4197 double lct = 12.0;
4198 double dy1 = dy;
4199 int mn1 = mn;
4200 int yr1 = yr;
4201
4202 (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct) dmy6700result1 = MoonSetLcDMY_L6700(lct, ds, zc, dy1, mn1, yr1, gdy, gmn, gyr, gLat);
4203 double lu = dmy6700result1.lu;
4204 lct = dmy6700result1.lct;
4205
4206 if (lct == -99.0)
4207 return (lct, (int)lct, (int)lct);
4208
4209 double la = lu;
4210
4211 double x;
4212 double ut;
4213 double g1 = 0.0;
4214 double gu = 0.0;
4215 for (int k = 1; k < 9; k++)
4216 {
4217 x = LocalSiderealTimeToGreenwichSiderealTime(la, 0.0, 0.0, gLong);
4218 ut = GreenwichSiderealTimeToUniversalTime(x, 0.0, 0.0, gdy, gmn, gyr);
4219
4220 g1 = (k == 1) ? ut : gu;
4221
4222 gu = ut;
4223 ut = gu;
4224
4225 (double ut, double lct, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr) dmy6680result1 = MoonSetLcDMY_L6680(x, ds, zc, gdy, gmn, gyr, g1, ut);
4226 lct = dmy6680result1.lct;
4227 dy1 = dmy6680result1.dy1;
4228 mn1 = dmy6680result1.mn1;
4229 yr1 = dmy6680result1.yr1;
4230 gdy = dmy6680result1.gdy;
4231 gmn = dmy6680result1.gmn;
4232 gyr = dmy6680result1.gyr;
4233
4234 (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct) dmy6700result2 = MoonSetLcDMY_L6700(lct, ds, zc, dy1, mn1, yr1, gdy, gmn, gyr, gLat);
4235 lu = dmy6700result2.lu;
4236 lct = dmy6700result2.lct;
4237
4238 if (lct == -99.0)
4239 return (lct, (int)lct, (int)lct);
4240
4241 la = lu;
4242 }
4243
4244 x = LocalSiderealTimeToGreenwichSiderealTime(la, 0.0, 0.0, gLong);
4245 ut = GreenwichSiderealTimeToUniversalTime(x, 0.0, 0.0, gdy, gmn, gyr);
4246
4247 if (!EGstUt(x, 0.0, 0.0, gdy, gmn, gyr).Equals(PAWarningFlag.OK))
4248 if (Math.Abs(g1 - ut) > 0.5)
4249 ut += 23.93447;
4250
4251 ut = UTDayAdjust(ut, g1);
4252 dy1 = UniversalTime_LocalCivilDay(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4253 mn1 = UniversalTime_LocalCivilMonth(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4254 yr1 = UniversalTime_LocalCivilYear(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4255
4256 return (dy1, mn1, yr1);
4257 }
4258
4262 public static (double ut, double lct, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr) MoonSetLcDMY_L6680(double x, int ds, int zc, double gdy, int gmn, int gyr, double g1, double ut)
4263 {
4264 if (!EGstUt(x, 0.0, 0.0, gdy, gmn, gyr).Equals(PAWarningFlag.OK))
4265 if (Math.Abs(g1 - ut) > 0.5)
4266 ut += 23.93447;
4267
4268 ut = UTDayAdjust(ut, g1);
4269 double lct = UniversalTimeToLocalCivilTime(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4270 double dy1 = UniversalTime_LocalCivilDay(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4271 int mn1 = UniversalTime_LocalCivilMonth(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4272 int yr1 = UniversalTime_LocalCivilYear(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4273 gdy = LocalCivilTimeGreenwichDay(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4274 gmn = LocalCivilTimeGreenwichMonth(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4275 gyr = LocalCivilTimeGreenwichYear(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4276 ut -= 24.0 * (ut / 24.0).Floor();
4277
4278 return (ut, lct, dy1, mn1, yr1, gdy, gmn, gyr);
4279 }
4280
4284 public static (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct) MoonSetLcDMY_L6700(double lct, int ds, int zc, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr, double gLat)
4285 {
4286 double mm = MoonLong(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4287 double bm = MoonLat(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4288 double pm = MoonHP(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1).ToRadians();
4289 double dp = NutatLong(gdy, gmn, gyr);
4290 double th = 0.27249 * pm.Sine();
4291 double di = th + 0.0098902 - pm;
4292 double p = DecimalDegreesToDegreeHours(EcRA(mm + dp, 0.0, 0.0, bm, 0.0, 0.0, gdy, gmn, gyr));
4293 double q = EcDec(mm + dp, 0.0, 0.0, bm, 0.0, 0.0, gdy, gmn, gyr);
4294 double lu = RiseSetLocalSiderealTimeSet(p, 0.0, 0.0, q, 0.0, 0.0, Degrees(di), gLat);
4295
4296 return (mm, bm, pm, dp, th, di, p, q, lu, lct);
4297 }
4298
4306 public static double MoonSetAz(double dy, int mn, int yr, int ds, int zc, double gLong, double gLat)
4307 {
4308 double gdy = LocalCivilTimeGreenwichDay(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
4309 int gmn = LocalCivilTimeGreenwichMonth(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
4310 int gyr = LocalCivilTimeGreenwichYear(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
4311 double lct = 12.0;
4312 double dy1 = dy;
4313 int mn1 = mn;
4314 int yr1 = yr;
4315
4316 (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct, double au) az6700result1 = MoonSetAz_L6700(lct, ds, zc, dy1, mn1, yr1, gdy, gmn, gyr, gLat);
4317 double lu = az6700result1.lu;
4318 lct = az6700result1.lct;
4319
4320 double au;
4321
4322 if (lct == -99.0)
4323 return lct;
4324
4325 double la = lu;
4326
4327 double x;
4328 double ut;
4329 double g1;
4330 double gu = 0.0;
4331 double aa = 0.0;
4332 for (int k = 1; k < 9; k++)
4333 {
4334 x = LocalSiderealTimeToGreenwichSiderealTime(la, 0.0, 0.0, gLong);
4335 ut = GreenwichSiderealTimeToUniversalTime(x, 0.0, 0.0, gdy, gmn, gyr);
4336
4337 g1 = (k == 1) ? ut : gu;
4338
4339 gu = ut;
4340 ut = gu;
4341
4342 (double ut, double lct, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr) az6680result1 = MoonSetAz_L6680(x, ds, zc, gdy, gmn, gyr, g1, ut);
4343 lct = az6680result1.lct;
4344 dy1 = az6680result1.dy1;
4345 mn1 = az6680result1.mn1;
4346 yr1 = az6680result1.yr1;
4347 gdy = az6680result1.gdy;
4348 gmn = az6680result1.gmn;
4349 gyr = az6680result1.gyr;
4350
4351 (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct, double au) az6700result2 = MoonSetAz_L6700(lct, ds, zc, dy1, mn1, yr1, gdy, gmn, gyr, gLat);
4352 lu = az6700result2.lu;
4353 lct = az6700result2.lct;
4354 au = az6700result2.au;
4355
4356 if (lct == -99.0)
4357 return lct;
4358
4359 la = lu;
4360 aa = au;
4361 }
4362
4363 au = aa;
4364
4365 return au;
4366 }
4367
4371 public static (double ut, double lct, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr) MoonSetAz_L6680(double x, int ds, int zc, double gdy, int gmn, int gyr, double g1, double ut)
4372 {
4373 if (!EGstUt(x, 0.0, 0.0, gdy, gmn, gyr).Equals(PAWarningFlag.OK))
4374 if (Math.Abs(g1 - ut) > 0.5)
4375 ut += 23.93447;
4376
4377 ut = UTDayAdjust(ut, g1);
4378 double lct = UniversalTimeToLocalCivilTime(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4379 double dy1 = UniversalTime_LocalCivilDay(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4380 int mn1 = UniversalTime_LocalCivilMonth(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4381 int yr1 = UniversalTime_LocalCivilYear(ut, 0.0, 0.0, ds, zc, gdy, gmn, gyr);
4382 gdy = LocalCivilTimeGreenwichDay(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4383 gmn = LocalCivilTimeGreenwichMonth(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4384 gyr = LocalCivilTimeGreenwichYear(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4385 ut -= 24.0 * (ut / 24.0).Floor();
4386
4387 return (ut, lct, dy1, mn1, yr1, gdy, gmn, gyr);
4388 }
4389
4393 public static (double mm, double bm, double pm, double dp, double th, double di, double p, double q, double lu, double lct, double au) MoonSetAz_L6700(double lct, int ds, int zc, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr, double gLat)
4394 {
4395 double mm = MoonLong(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4396 double bm = MoonLat(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1);
4397 double pm = MoonHP(lct, 0.0, 0.0, ds, zc, dy1, mn1, yr1).ToRadians();
4398 double dp = NutatLong(gdy, gmn, gyr);
4399 double th = 0.27249 * pm.Sine();
4400 double di = th + 0.0098902 - pm;
4401 double p = DecimalDegreesToDegreeHours(EcRA(mm + dp, 0.0, 0.0, bm, 0.0, 0.0, gdy, gmn, gyr));
4402 double q = EcDec(mm + dp, 0.0, 0.0, bm, 0.0, 0.0, gdy, gmn, gyr);
4403 double lu = RiseSetLocalSiderealTimeSet(p, 0.0, 0.0, q, 0.0, 0.0, Degrees(di), gLat);
4404 double au = RiseSetAzimuthSet(p, 0.0, 0.0, q, 0.0, 0.0, Degrees(di), gLat);
4405
4406 return (mm, bm, pm, dp, th, di, p, q, lu, lct, au);
4407 }
4408
4415 public static string LunarEclipseOccurrence(int ds, int zc, double dy, int mn, int yr)
4416 {
4417 double d0 = LocalCivilTimeGreenwichDay(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
4418 int m0 = LocalCivilTimeGreenwichMonth(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
4419 int y0 = LocalCivilTimeGreenwichYear(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
4420
4421 double j0 = CivilDateToJulianDate(0.0, 1, y0);
4422 double dj = CivilDateToJulianDate(d0, m0, y0);
4423 double k = (y0 - 1900.0 + ((dj - j0) * 1.0 / 365.0)) * 12.3685;
4424 k = Lint(k + 0.5);
4425 double tn = k / 1236.85;
4426 double tf = (k + 0.5) / 1236.85;
4427 double t = tn;
4428 (double f, double dd, double e1, double b1, double a, double b) l6855result1 = LunarEclipseOccurrence_L6855(t, k);
4429 t = tf;
4430 k += 0.5;
4431 (double f, double dd, double e1, double b1, double a, double b) l6855result2 = LunarEclipseOccurrence_L6855(t, k);
4432 double fb = l6855result2.f;
4433
4434 double df = Math.Abs(fb - 3.141592654 * Lint(fb / 3.141592654));
4435
4436 if (df > 0.37)
4437 df = 3.141592654 - df;
4438
4439 string s = "Lunar eclipse certain";
4440 if (df >= 0.242600766)
4441 {
4442 s = "Lunar eclipse possible";
4443
4444 if (df > 0.37)
4445 s = "No lunar eclipse";
4446 }
4447
4448 return s;
4449 }
4450
4454 public static (double f, double dd, double e1, double b1, double a, double b) LunarEclipseOccurrence_L6855(double t, double k)
4455 {
4456 double t2 = t * t;
4457 double e = 29.53 * k;
4458 double c = 166.56 + (132.87 - 0.009173 * t) * t;
4459 c = c.ToRadians();
4460 double b = 0.00058868 * k + (0.0001178 - 0.000000155 * t) * t2;
4461 b = b + 0.00033 * c.Sine() + 0.75933;
4462 double a = k / 12.36886;
4463 double a1 = 359.2242 + 360.0 * FPart(a) - (0.0000333 + 0.00000347 * t) * t2;
4464 double a2 = 306.0253 + 360.0 * FPart(k / 0.9330851);
4465 a2 += (0.0107306 + 0.00001236 * t) * t2;
4466 a = k / 0.9214926;
4467 double f = 21.2964 + 360.0 * FPart(a) - (0.0016528 + 0.00000239 * t) * t2;
4468 a1 = UnwindDeg(a1);
4469 a2 = UnwindDeg(a2);
4470 f = UnwindDeg(f);
4471 a1 = a1.ToRadians();
4472 a2 = a2.ToRadians();
4473 f = f.ToRadians();
4474
4475 double dd = (0.1734 - 0.000393 * t) * a1.Sine() + 0.0021 * (2.0 * a1).Sine();
4476 dd = dd - 0.4068 * a2.Sine() + 0.0161 * (2.0 * a2).Sine() - 0.0004 * (3.0 * a2).Sine();
4477 dd = dd + 0.0104 * (2.0 * f).Sine() - 0.0051 * (a1 + a2).Sine();
4478 dd = dd - 0.0074 * (a1 - a2).Sine() + 0.0004 * (2.0 * f + a1).Sine();
4479 dd = dd - 0.0004 * (2.0 * f - a1).Sine() - 0.0006 * (2.0 * f + a2).Sine() + 0.001 * (2.0 * f - a2).Sine();
4480 dd += 0.0005 * (a1 + 2.0 * a2).Sine();
4481 double e1 = e.Floor();
4482 b = b + dd + (e - e1);
4483 double b1 = b.Floor();
4484 a = e1 + b1;
4485 b -= b1;
4486
4487 return (f, dd, e1, b1, a, b);
4488 }
4489
4496 public static double UTMaxLunarEclipse(double dy, int mn, int yr, int ds, int zc)
4497 {
4498 double tp = 2.0 * Math.PI;
4499
4500 if (LunarEclipseOccurrence(ds, zc, dy, mn, yr).Equals("No lunar eclipse"))
4501 return -99.0;
4502
4503 double dj = FullMoon(ds, zc, dy, mn, yr);
4504 double gday = JulianDateDay(dj);
4505 int gmonth = JulianDateMonth(dj);
4506 int gyear = JulianDateYear(dj);
4507 double igday = gday.Floor();
4508 double xi = gday - igday;
4509 double utfm = xi * 24.0;
4510 double ut = utfm - 1.0;
4511 double ly = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4512 double my = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4513 double by = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4514 double hy = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4515 ut = utfm + 1.0;
4516 double sb = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians() - ly;
4517 double mz = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4518 double bz = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4519 double hz = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4520
4521 if (sb < 0.0)
4522 sb += tp;
4523
4524 double xh = utfm;
4525 double x0 = xh + 1.0 - (2.0 * bz / (bz - by));
4526 double dm = mz - my;
4527
4528 if (dm < 0.0)
4529 dm += tp;
4530
4531 double lj = (dm - sb) / 2.0;
4532 double q = 0.0;
4533 double mr = my + (dm * (x0 - xh + 1.0) / 2.0);
4534 ut = x0 - 0.13851852;
4535 double rr = SunDist(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear);
4536 double sr = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4537 sr += (NutatLong(igday, gmonth, gyear) - 0.00569).ToRadians();
4538 sr = sr + Math.PI - Lint((sr + Math.PI) / tp) * tp;
4539 by -= q;
4540 bz -= q;
4541 double p3 = 0.00004263;
4542 double zh = (sr - mr) / lj;
4543 double tc = x0 + zh;
4544 double sh = (((bz - by) * (tc - xh - 1.0) / 2.0) + bz) / lj;
4545 double s2 = sh * sh;
4546 double z2 = zh * zh;
4547 double ps = p3 / (rr * lj);
4548 double z1 = (zh * z2 / (z2 + s2)) + x0;
4549 double h0 = (hy + hz) / (2.0 * lj);
4550 double rm = 0.272446 * h0;
4551 double rn = 0.00465242 / (lj * rr);
4552 double hd = h0 * 0.99834;
4553 double rp = (hd + rn + ps) * 1.02;
4554 double r = rm + rp;
4555 double dd = z1 - x0;
4556 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
4557
4558 if (dd < 0.0)
4559 return -99.0;
4560
4561 return z1;
4562 }
4563
4570 public static double UTFirstContactLunarEclipse(double dy, int mn, int yr, int ds, int zc)
4571 {
4572 double tp = 2.0 * Math.PI;
4573
4574 if (LunarEclipseOccurrence(ds, zc, dy, mn, yr).Equals("No lunar eclipse"))
4575 return -99.0;
4576
4577 double dj = FullMoon(ds, zc, dy, mn, yr);
4578 double gday = JulianDateDay(dj);
4579 int gmonth = JulianDateMonth(dj);
4580 int gyear = JulianDateYear(dj);
4581 double igday = gday.Floor();
4582 double xi = gday - igday;
4583 double utfm = xi * 24.0;
4584 double ut = utfm - 1.0;
4585 double ly = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4586 double my = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4587 double by = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4588 double hy = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4589 ut = utfm + 1.0;
4590 double sb = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians() - ly;
4591 double mz = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4592 double bz = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4593 double hz = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4594
4595 if (sb < 0.0)
4596 sb += tp;
4597
4598 double xh = utfm;
4599 double x0 = xh + 1.0 - (2.0 * bz / (bz - by));
4600 double dm = mz - my;
4601
4602 if (dm < 0.0)
4603 dm += tp;
4604
4605 double lj = (dm - sb) / 2.0;
4606 double q = 0.0;
4607 double mr = my + (dm * (x0 - xh + 1.0) / 2.0);
4608 ut = x0 - 0.13851852;
4609 double rr = SunDist(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear);
4610 double sr = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4611 sr += (NutatLong(igday, gmonth, gyear) - 0.00569).ToRadians();
4612 sr = sr + Math.PI - Lint((sr + Math.PI) / tp) * tp;
4613 by -= q;
4614 bz -= q;
4615 double p3 = 0.00004263;
4616 double zh = (sr - mr) / lj;
4617 double tc = x0 + zh;
4618 double sh = (((bz - by) * (tc - xh - 1.0) / 2.0) + bz) / lj;
4619 double s2 = sh * sh;
4620 double z2 = zh * zh;
4621 double ps = p3 / (rr * lj);
4622 double z1 = (zh * z2 / (z2 + s2)) + x0;
4623 double h0 = (hy + hz) / (2.0 * lj);
4624 double rm = 0.272446 * h0;
4625 double rn = 0.00465242 / (lj * rr);
4626 double hd = h0 * 0.99834;
4627 double rp = (hd + rn + ps) * 1.02;
4628 double r = rm + rp;
4629 double dd = z1 - x0;
4630 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
4631
4632 if (dd < 0.0)
4633 return -99.0;
4634
4635 double zd = dd.SquareRoot();
4636 double z6 = z1 - zd;
4637
4638 if (z6 < 0.0)
4639 z6 += 24.0;
4640
4641 return z6;
4642 }
4643
4650 public static double UTLastContactLunarEclipse(double dy, int mn, int yr, int ds, int zc)
4651 {
4652 double tp = 2.0 * Math.PI;
4653
4654 if (LunarEclipseOccurrence(ds, zc, dy, mn, yr).Equals("No lunar eclipse"))
4655 return -99.0;
4656
4657 double dj = FullMoon(ds, zc, dy, mn, yr);
4658 double gday = JulianDateDay(dj);
4659 int gmonth = JulianDateMonth(dj);
4660 int gyear = JulianDateYear(dj);
4661 double igday = gday.Floor();
4662 double xi = gday - igday;
4663 double utfm = xi * 24.0;
4664 double ut = utfm - 1.0;
4665 double ly = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4666 double my = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4667 double by = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4668 double hy = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4669 ut = utfm + 1.0;
4670 double sb = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians() - ly;
4671 double mz = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4672 double bz = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4673 double hz = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4674
4675 if (sb < 0.0)
4676 sb += tp;
4677
4678 double xh = utfm;
4679 double x0 = xh + 1.0 - (2.0 * bz / (bz - by));
4680 double dm = mz - my;
4681
4682 if (dm < 0.0)
4683 dm += tp;
4684
4685 double lj = (dm - sb) / 2.0;
4686 double q = 0.0;
4687 double mr = my + (dm * (x0 - xh + 1.0) / 2.0);
4688 ut = x0 - 0.13851852;
4689 double rr = SunDist(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear);
4690 double sr = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4691 sr += (NutatLong(igday, gmonth, gyear) - 0.00569).ToRadians();
4692 sr = sr + Math.PI - Lint((sr + Math.PI) / tp) * tp;
4693 by -= q;
4694 bz -= q;
4695 double p3 = 0.00004263;
4696 double zh = (sr - mr) / lj;
4697 double tc = x0 + zh;
4698 double sh = (((bz - by) * (tc - xh - 1.0) / 2.0) + bz) / lj;
4699 double s2 = sh * sh;
4700 double z2 = zh * zh;
4701 double ps = p3 / (rr * lj);
4702 double z1 = (zh * z2 / (z2 + s2)) + x0;
4703 double h0 = (hy + hz) / (2.0 * lj);
4704 double rm = 0.272446 * h0;
4705 double rn = 0.00465242 / (lj * rr);
4706 double hd = h0 * 0.99834;
4707 double rp = (hd + rn + ps) * 1.02;
4708 double r = rm + rp;
4709 double dd = z1 - x0;
4710 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
4711
4712 if (dd < 0.0)
4713 return -99.0;
4714
4715 double zd = dd.SquareRoot();
4716 double z7 = z1 + zd - Lint((z1 + zd) / 24.0) * 24.0;
4717
4718 return z7;
4719 }
4720
4727 public static double UTStartUmbraLunarEclipse(double dy, int mn, int yr, int ds, int zc)
4728 {
4729 double tp = 2.0 * Math.PI;
4730
4731 if (LunarEclipseOccurrence(ds, zc, dy, mn, yr).Equals("No lunar eclipse"))
4732 return -99.0;
4733
4734 double dj = FullMoon(ds, zc, dy, mn, yr);
4735 double gday = JulianDateDay(dj);
4736 int gmonth = JulianDateMonth(dj);
4737 int gyear = JulianDateYear(dj);
4738 double igday = gday.Floor();
4739 double xi = gday - igday;
4740 double utfm = xi * 24.0;
4741 double ut = utfm - 1.0;
4742 double ly = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4743 double my = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4744 double by = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4745 double hy = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4746 ut = utfm + 1.0;
4747 double sb = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians() - ly;
4748 double mz = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4749 double bz = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4750 double hz = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4751
4752 if (sb < 0.0)
4753 sb += tp;
4754
4755 double xh = utfm;
4756 double x0 = xh + 1.0 - (2.0 * bz / (bz - by));
4757 double dm = mz - my;
4758
4759 if (dm < 0.0)
4760 dm += tp;
4761
4762 double lj = (dm - sb) / 2.0;
4763 double q = 0.0;
4764 double mr = my + (dm * (x0 - xh + 1.0) / 2.0);
4765 ut = x0 - 0.13851852;
4766 double rr = SunDist(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear);
4767 double sr = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4768 sr += (NutatLong(igday, gmonth, gyear) - 0.00569).ToRadians();
4769 sr = sr + Math.PI - Lint((sr + Math.PI) / tp) * tp;
4770 by -= q;
4771 bz -= q;
4772 double p3 = 0.00004263;
4773 double zh = (sr - mr) / lj;
4774 double tc = x0 + zh;
4775 double sh = (((bz - by) * (tc - xh - 1.0) / 2.0) + bz) / lj;
4776 double s2 = sh * sh;
4777 double z2 = zh * zh;
4778 double ps = p3 / (rr * lj);
4779 double z1 = (zh * z2 / (z2 + s2)) + x0;
4780 double h0 = (hy + hz) / (2.0 * lj);
4781 double rm = 0.272446 * h0;
4782 double rn = 0.00465242 / (lj * rr);
4783 double hd = h0 * 0.99834;
4784 double ru = (hd - rn + ps) * 1.02;
4785 double rp = (hd + rn + ps) * 1.02;
4786 double pj = Math.Abs(sh * zh / (s2 + z2).SquareRoot());
4787 double r = rm + rp;
4788 double dd = z1 - x0;
4789 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
4790
4791 if (dd < 0.0)
4792 return -99.0;
4793
4794 double zd = dd.SquareRoot();
4795 double z6 = z1 - zd;
4796
4797 r = rm + ru;
4798 dd = z1 - x0;
4799 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
4800
4801 if (dd < 0.0)
4802 return -99.0;
4803
4804 zd = dd.SquareRoot();
4805 double z8 = z1 - zd;
4806
4807 if (z8 < 0.0)
4808 z8 += 24.0;
4809
4810 return z8;
4811 }
4812
4819 public static double UTEndUmbraLunarEclipse(double dy, int mn, int yr, int ds, int zc)
4820 {
4821 double tp = 2.0 * Math.PI;
4822
4823 if (LunarEclipseOccurrence(ds, zc, dy, mn, yr).Equals("No lunar eclipse"))
4824 return -99.0;
4825
4826 double dj = FullMoon(ds, zc, dy, mn, yr);
4827 double gday = JulianDateDay(dj);
4828 int gmonth = JulianDateMonth(dj);
4829 int gyear = JulianDateYear(dj);
4830 double igday = gday.Floor();
4831 double xi = gday - igday;
4832 double utfm = xi * 24.0;
4833 double ut = utfm - 1.0;
4834 double ly = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4835 double my = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4836 double by = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4837 double hy = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4838 ut = utfm + 1.0;
4839 double sb = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians() - ly;
4840 double mz = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4841 double bz = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4842 double hz = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4843
4844 if (sb < 0.0)
4845 sb += tp;
4846
4847 double xh = utfm;
4848 double x0 = xh + 1.0 - (2.0 * bz / (bz - by));
4849 double dm = mz - my;
4850
4851 if (dm < 0.0)
4852 dm += tp;
4853
4854 double lj = (dm - sb) / 2.0;
4855 double q = 0.0;
4856 double mr = my + (dm * (x0 - xh + 1.0) / 2.0);
4857 ut = x0 - 0.13851852;
4858 double rr = SunDist(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear);
4859 double sr = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4860 sr += (NutatLong(igday, gmonth, gyear) - 0.00569).ToRadians();
4861 sr = sr + Math.PI - Lint((sr + Math.PI) / tp) * tp;
4862 by -= q;
4863 bz -= q;
4864 double p3 = 0.00004263;
4865 double zh = (sr - mr) / lj;
4866 double tc = x0 + zh;
4867 double sh = (((bz - by) * (tc - xh - 1.0) / 2.0) + bz) / lj;
4868 double s2 = sh * sh;
4869 double z2 = zh * zh;
4870 double ps = p3 / (rr * lj);
4871 double z1 = (zh * z2 / (z2 + s2)) + x0;
4872 double h0 = (hy + hz) / (2.0 * lj);
4873 double rm = 0.272446 * h0;
4874 double rn = 0.00465242 / (lj * rr);
4875 double hd = h0 * 0.99834;
4876 double ru = (hd - rn + ps) * 1.02;
4877 double rp = (hd + rn + ps) * 1.02;
4878 double pj = Math.Abs(sh * zh / (s2 + z2).SquareRoot());
4879 double r = rm + rp;
4880 double dd = z1 - x0;
4881 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
4882
4883 if (dd < 0.0)
4884 return -99.0;
4885
4886 double zd = dd.SquareRoot();
4887 double z6 = z1 - zd;
4888
4889 r = rm + ru;
4890 dd = z1 - x0;
4891 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
4892
4893 if (dd < 0.0)
4894 return -99.0;
4895
4896 zd = dd.SquareRoot();
4897 double z9 = z1 + zd - Lint((z1 + zd) / 24.0) * 24.0;
4898
4899 return z9;
4900 }
4901
4908 public static double UTStartTotalLunarEclipse(double dy, int mn, int yr, int ds, int zc)
4909 {
4910 double tp = 2.0 * Math.PI;
4911
4912 if (LunarEclipseOccurrence(ds, zc, dy, mn, yr).Equals("No lunar eclipse"))
4913 return -99.0;
4914
4915 double dj = FullMoon(ds, zc, dy, mn, yr);
4916 double gday = JulianDateDay(dj);
4917 int gmonth = JulianDateMonth(dj);
4918 int gyear = JulianDateYear(dj);
4919 double igday = gday.Floor();
4920 double xi = gday - igday;
4921 double utfm = xi * 24.0;
4922 double ut = utfm - 1.0;
4923 double ly = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4924 double my = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4925 double by = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4926 double hy = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4927 ut = utfm + 1.0;
4928 double sb = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians() - ly;
4929 double mz = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4930 double bz = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4931 double hz = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4932
4933 if (sb < 0.0)
4934 sb += tp;
4935
4936 double xh = utfm;
4937 double x0 = xh + 1.0 - (2.0 * bz / (bz - by));
4938 double dm = mz - my;
4939
4940 if (dm < 0.0)
4941 dm += tp;
4942
4943 double lj = (dm - sb) / 2.0;
4944 double q = 0.0;
4945 double mr = my + (dm * (x0 - xh + 1.0) / 2.0);
4946 ut = x0 - 0.13851852;
4947 double rr = SunDist(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear);
4948 double sr = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
4949 sr += (NutatLong(igday, gmonth, gyear) - 0.00569).ToRadians();
4950 sr = sr + Math.PI - Lint((sr + Math.PI) / tp) * tp;
4951 by -= q;
4952 bz -= q;
4953 double p3 = 0.00004263;
4954 double zh = (sr - mr) / lj;
4955 double tc = x0 + zh;
4956 double sh = (((bz - by) * (tc - xh - 1.0) / 2.0) + bz) / lj;
4957 double s2 = sh * sh;
4958 double z2 = zh * zh;
4959 double ps = p3 / (rr * lj);
4960 double z1 = (zh * z2 / (z2 + s2)) + x0;
4961 double h0 = (hy + hz) / (2.0 * lj);
4962 double rm = 0.272446 * h0;
4963 double rn = 0.00465242 / (lj * rr);
4964 double hd = h0 * 0.99834;
4965 double ru = (hd - rn + ps) * 1.02;
4966 double rp = (hd + rn + ps) * 1.02;
4967 double pj = Math.Abs(sh * zh / (s2 + z2).SquareRoot());
4968 double r = rm + rp;
4969 double dd = z1 - x0;
4970 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
4971
4972 if (dd < 0.0)
4973 return -99.0;
4974
4975 double zd = dd.SquareRoot();
4976 double z6 = z1 - zd;
4977
4978 r = rm + ru;
4979 dd = z1 - x0;
4980 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
4981
4982 if (dd < 0.0)
4983 return -99.0;
4984
4985 zd = dd.SquareRoot();
4986 double z8 = z1 - zd;
4987
4988 r = ru - rm;
4989 dd = z1 - x0;
4990 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
4991
4992 if (dd < 0.0)
4993 return -99.0;
4994
4995 zd = dd.SquareRoot();
4996 double zcc = z1 - zd;
4997
4998 if (zcc < 0.0)
4999 zcc = zc + 24.0;
5000
5001 return zcc;
5002 }
5003
5010 public static double UTEndTotalLunarEclipse(double dy, int mn, int yr, int ds, int zc)
5011 {
5012 double tp = 2.0 * Math.PI;
5013
5014 if (LunarEclipseOccurrence(ds, zc, dy, mn, yr).Equals("No lunar eclipse"))
5015 return -99.0;
5016
5017 double dj = FullMoon(ds, zc, dy, mn, yr);
5018 double gday = JulianDateDay(dj);
5019 int gmonth = JulianDateMonth(dj);
5020 int gyear = JulianDateYear(dj);
5021 double igday = gday.Floor();
5022 double xi = gday - igday;
5023 double utfm = xi * 24.0;
5024 double ut = utfm - 1.0;
5025 double ly = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5026 double my = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5027 double by = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5028 double hy = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5029 ut = utfm + 1.0;
5030 double sb = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians() - ly;
5031 double mz = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5032 double bz = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5033 double hz = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5034
5035 if (sb < 0.0)
5036 sb += tp;
5037
5038 double xh = utfm;
5039 double x0 = xh + 1.0 - (2.0 * bz / (bz - by));
5040 double dm = mz - my;
5041
5042 if (dm < 0.0)
5043 dm += tp;
5044
5045 double lj = (dm - sb) / 2.0;
5046 double q = 0.0;
5047 double mr = my + (dm * (x0 - xh + 1.0) / 2.0);
5048 ut = x0 - 0.13851852;
5049 double rr = SunDist(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear);
5050 double sr = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5051 sr += (NutatLong(igday, gmonth, gyear) - 0.00569).ToRadians();
5052 sr = sr + Math.PI - Lint((sr + Math.PI) / tp) * tp;
5053 by -= q;
5054 bz -= q;
5055 double p3 = 0.00004263;
5056 double zh = (sr - mr) / lj;
5057 double tc = x0 + zh;
5058 double sh = (((bz - by) * (tc - xh - 1.0) / 2.0) + bz) / lj;
5059 double s2 = sh * sh;
5060 double z2 = zh * zh;
5061 double ps = p3 / (rr * lj);
5062 double z1 = (zh * z2 / (z2 + s2)) + x0;
5063 double h0 = (hy + hz) / (2.0 * lj);
5064 double rm = 0.272446 * h0;
5065 double rn = 0.00465242 / (lj * rr);
5066 double hd = h0 * 0.99834;
5067 double ru = (hd - rn + ps) * 1.02;
5068 double rp = (hd + rn + ps) * 1.02;
5069 double pj = Math.Abs(sh * zh / (s2 + z2).SquareRoot());
5070 double r = rm + rp;
5071 double dd = z1 - x0;
5072 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
5073
5074 if (dd < 0.0)
5075 return -99.0;
5076
5077 double zd = dd.SquareRoot();
5078 double z6 = z1 - zd;
5079
5080 r = rm + ru;
5081 dd = z1 - x0;
5082 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
5083
5084 if (dd < 0.0)
5085 return -99.0;
5086
5087 zd = dd.SquareRoot();
5088 double z8 = z1 - zd;
5089
5090 r = ru - rm;
5091 dd = z1 - x0;
5092 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
5093
5094 if (dd < 0.0)
5095 return -99.0;
5096
5097 zd = dd.SquareRoot();
5098 double zb = z1 + zd - Lint((z1 + zd) / 24.0) * 24.0;
5099
5100 return zb;
5101 }
5102
5109 public static double MagLunarEclipse(double dy, int mn, int yr, int ds, int zc)
5110 {
5111 double tp = 2.0 * Math.PI;
5112
5113 if (LunarEclipseOccurrence(ds, zc, dy, mn, yr).Equals("No lunar eclipse"))
5114 return -99.0;
5115
5116 double dj = FullMoon(ds, zc, dy, mn, yr);
5117 double gday = JulianDateDay(dj);
5118 int gmonth = JulianDateMonth(dj);
5119 int gyear = JulianDateYear(dj);
5120 double igday = gday.Floor();
5121 double xi = gday - igday;
5122 double utfm = xi * 24.0;
5123 double ut = utfm - 1.0;
5124 double ly = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5125 double my = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5126 double by = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5127 double hy = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5128 ut = utfm + 1.0;
5129 double sb = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians() - ly;
5130 double mz = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5131 double bz = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5132 double hz = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5133
5134 if (sb < 0.0)
5135 sb += tp;
5136
5137 double xh = utfm;
5138 double x0 = xh + 1.0 - (2.0 * bz / (bz - by));
5139 double dm = mz - my;
5140
5141 if (dm < 0.0)
5142 dm += tp;
5143
5144 double lj = (dm - sb) / 2.0;
5145 double q = 0.0;
5146 double mr = my + (dm * (x0 - xh + 1.0) / 2.0);
5147 ut = x0 - 0.13851852;
5148 double rr = SunDist(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear);
5149 double sr = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5150 sr += (NutatLong(igday, gmonth, gyear) - 0.00569).ToRadians();
5151 sr = sr + Math.PI - Lint((sr + Math.PI) / tp) * tp;
5152 by -= q;
5153 bz -= q;
5154 double p3 = 0.00004263;
5155 double zh = (sr - mr) / lj;
5156 double tc = x0 + zh;
5157 double sh = (((bz - by) * (tc - xh - 1.0) / 2.0) + bz) / lj;
5158 double s2 = sh * sh;
5159 double z2 = zh * zh;
5160 double ps = p3 / (rr * lj);
5161 double z1 = (zh * z2 / (z2 + s2)) + x0;
5162 double h0 = (hy + hz) / (2.0 * lj);
5163 double rm = 0.272446 * h0;
5164 double rn = 0.00465242 / (lj * rr);
5165 double hd = h0 * 0.99834;
5166 double ru = (hd - rn + ps) * 1.02;
5167 double rp = (hd + rn + ps) * 1.02;
5168 double pj = Math.Abs(sh * zh / (s2 + z2).SquareRoot());
5169 double r = rm + rp;
5170 double dd = z1 - x0;
5171 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
5172
5173 if (dd < 0.0)
5174 return -99.0;
5175
5176 double zd = dd.SquareRoot();
5177 double z6 = z1 - zd;
5178
5179 r = rm + ru;
5180 dd = z1 - x0;
5181 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
5182 double mg = (rm + rp - pj) / (2.0 * rm);
5183
5184 if (dd < 0.0)
5185 return mg;
5186
5187 zd = dd.SquareRoot();
5188 double z8 = z1 - zd;
5189
5190
5191 r = ru - rm;
5192 dd = z1 - x0;
5193 mg = (rm + ru - pj) / (2.0 * rm);
5194
5195 return mg;
5196 }
5197
5204 public static string SolarEclipseOccurrence(int ds, int zc, double dy, int mn, int yr)
5205 {
5206 double d0 = LocalCivilTimeGreenwichDay(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
5207 int m0 = LocalCivilTimeGreenwichMonth(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
5208 int y0 = LocalCivilTimeGreenwichYear(12.0, 0.0, 0.0, ds, zc, dy, mn, yr);
5209
5210 double j0 = CivilDateToJulianDate(0.0, 1, y0);
5211 double dj = CivilDateToJulianDate(d0, m0, y0);
5212 double k = (y0 - 1900.0 + ((dj - j0) * 1.0 / 365.0)) * 12.3685;
5213 k = Lint(k + 0.5);
5214 double tn = k / 1236.85;
5215 double tf = (k + 0.5) / 1236.85;
5216 double t = tn;
5217 (double f, double dd, double e1, double b1, double a, double b) l6855result1 = SolarEclipseOccurrence_L6855(t, k);
5218 double nb = l6855result1.f;
5219 t = tf;
5220 k += 0.5;
5221 (double f, double dd, double e1, double b1, double a, double b) l6855result2 = SolarEclipseOccurrence_L6855(t, k);
5222
5223 double df = Math.Abs(nb - 3.141592654 * Lint(nb / 3.141592654));
5224
5225 if (df > 0.37)
5226 df = 3.141592654 - df;
5227
5228 string s = "Solar eclipse certain";
5229 if (df >= 0.242600766)
5230 {
5231 s = "Solar eclipse possible";
5232 if (df > 0.37)
5233 s = "No solar eclipse";
5234 }
5235
5236 return s;
5237 }
5238
5242 public static (double f, double dd, double e1, double b1, double a, double b) SolarEclipseOccurrence_L6855(double t, double k)
5243 {
5244 double t2 = t * t;
5245 double e = 29.53 * k;
5246 double c = 166.56 + (132.87 - 0.009173 * t) * t;
5247 c = c.ToRadians();
5248 double b = 0.00058868 * k + (0.0001178 - 0.000000155 * t) * t2;
5249 b = b + 0.00033 * c.Sine() + 0.75933;
5250 double a = k / 12.36886;
5251 double a1 = 359.2242 + 360.0 * FPart(a) - (0.0000333 + 0.00000347 * t) * t2;
5252 double a2 = 306.0253 + 360.0 * FPart(k / 0.9330851);
5253 a2 += (0.0107306 + 0.00001236 * t) * t2;
5254 a = k / 0.9214926;
5255 double f = 21.2964 + 360.0 * FPart(a) - (0.0016528 + 0.00000239 * t) * t2;
5256 a1 = UnwindDeg(a1);
5257 a2 = UnwindDeg(a2);
5258 f = UnwindDeg(f);
5259 a1 = a1.ToRadians();
5260 a2 = a2.ToRadians();
5261 f = f.ToRadians();
5262
5263 double dd = (0.1734 - 0.000393 * t) * a1.Sine() + 0.0021 * (2.0 * a1).Sine();
5264 dd = dd - 0.4068 * a2.Sine() + 0.0161 * (2.0 * a2).Sine() - 0.0004 * (3.0 * a2).Sine();
5265 dd = dd + 0.0104 * (2.0 * f).Sine() - 0.0051 * (a1 + a2).Sine();
5266 dd = dd - 0.0074 * (a1 - a2).Sine() + 0.0004 * (2.0 * f + a1).Sine();
5267 dd = dd - 0.0004 * (2.0 * f - a1).Sine() - 0.0006 * (2.0 * f + a2).Sine() + 0.001 * (2.0 * f - a2).Sine();
5268 dd += 0.0005 * (a1 + 2.0 * a2).Sine();
5269 double e1 = e.Floor();
5270 b = b + dd + (e - e1);
5271 double b1 = b.Floor();
5272 a = e1 + b1;
5273 b -= b1;
5274
5275 return (f, dd, e1, b1, a, b);
5276 }
5277
5284 public static double UTMaxSolarEclipse(double dy, int mn, int yr, int ds, int zc, double glong, double glat)
5285 {
5286 double tp = 2.0 * Math.PI;
5287
5288 if (SolarEclipseOccurrence(ds, zc, dy, mn, yr).Equals("No solar eclipse"))
5289 return -99.0;
5290
5291 double dj = NewMoon(ds, zc, dy, mn, yr);
5292 double gday = JulianDateDay(dj);
5293 int gmonth = JulianDateMonth(dj);
5294 int gyear = JulianDateYear(dj);
5295 double igday = gday.Floor();
5296 double xi = gday - igday;
5297 double utnm = xi * 24.0;
5298 double ut = utnm - 1.0;
5299 double ly = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5300 double my = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5301 double by = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5302 double hy = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5303 ut = utnm + 1.0;
5304 double sb = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians() - ly;
5305 double mz = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5306 double bz = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5307 double hz = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5308
5309 if (sb < 0.0)
5310 sb += tp;
5311
5312 double xh = utnm;
5313 double x = my;
5314 double y = by;
5315 double tm = xh - 1.0;
5316 double hp = hy;
5317 (double paa, double qaa, double xaa, double pbb, double qbb, double xbb, double p, double q) l7390result1 = UTMaxSolarEclipse_L7390(x, y, igday, gmonth, gyear, tm, glong, glat, hp);
5318 my = l7390result1.p;
5319 by = l7390result1.q;
5320 x = mz;
5321 y = bz;
5322 tm = xh + 1.0;
5323 hp = hz;
5324 (double paa, double qaa, double xaa, double pbb, double qbb, double xbb, double p, double q) l7390result2 = UTMaxSolarEclipse_L7390(x, y, igday, gmonth, gyear, tm, glong, glat, hp);
5325 mz = l7390result2.p;
5326 bz = l7390result2.q;
5327
5328 double x0 = xh + 1.0 - (2.0 * bz / (bz - by));
5329 double dm = mz - my;
5330
5331 if (dm < 0.0)
5332 dm += tp;
5333
5334 double lj = (dm - sb) / 2.0;
5335 double mr = my + (dm * (x0 - xh + 1.0) / 2.0);
5336 ut = x0 - 0.13851852;
5337 double rr = SunDist(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear);
5338 double sr = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5339 sr += (NutatLong(igday, gmonth, gyear) - 0.00569).ToRadians();
5340 x = sr;
5341 y = 0.0;
5342 tm = ut;
5343 hp = 0.00004263452 / rr;
5344 (double paa, double qaa, double xaa, double pbb, double qbb, double xbb, double p, double q) l7390result3 = UTMaxSolarEclipse_L7390(x, y, igday, gmonth, gyear, tm, glong, glat, hp);
5345 // let(_paa, _qaa, _xaa, _pbb, _qbb, _xbb, p, q) =
5346 sr = l7390result3.p;
5347 by -= l7390result3.q;
5348 bz -= l7390result3.q;
5349 double p3 = 0.00004263;
5350 double zh = (sr - mr) / lj;
5351 double tc = x0 + zh;
5352 double sh = (((bz - by) * (tc - xh - 1.0) / 2.0) + bz) / lj;
5353 double s2 = sh * sh;
5354 double z2 = zh * zh;
5355 double ps = p3 / (rr * lj);
5356 double z1 = (zh * z2 / (z2 + s2)) + x0;
5357 double h0 = (hy + hz) / (2.0 * lj);
5358 double rm = 0.272446 * h0;
5359 double rn = 0.00465242 / (lj * rr);
5360 double hd = h0 * 0.99834;
5361 double _ru = (hd - rn + ps) * 1.02;
5362 double _rp = (hd + rn + ps) * 1.02;
5363 double pj = Math.Abs(sh * zh / (s2 + z2).SquareRoot());
5364 double r = rm + rn;
5365 double dd = z1 - x0;
5366 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
5367
5368 if (dd < 0.0)
5369 return -99.0;
5370
5371 double zd = dd.SquareRoot();
5372
5373 return z1;
5374 }
5375
5379 public static (double paa, double qaa, double xaa, double pbb, double qbb, double xbb, double p, double q) UTMaxSolarEclipse_L7390(double x, double y, double igday, int gmonth, int gyear, double tm, double glong, double glat, double hp)
5380 {
5381 double paa = EcRA(Degrees(x), 0.0, 0.0, Degrees(y), 0.0, 0.0, igday, gmonth, gyear);
5382 double qaa = EcDec(Degrees(x), 0.0, 0.0, Degrees(y), 0.0, 0.0, igday, gmonth, gyear);
5383 double xaa = RightAscensionToHourAngle(DecimalDegreesToDegreeHours(paa), 0.0, 0.0, tm, 0.0, 0.0, 0, 0, igday, gmonth, gyear, glong);
5384 double pbb = ParallaxHA(xaa, 0.0, 0.0, qaa, 0.0, 0.0, PACoordinateType.True, glat, 0.0, Degrees(hp));
5385 double qbb = ParallaxDec(xaa, 0.0, 0.0, qaa, 0.0, 0.0, PACoordinateType.True, glat, 0.0, Degrees(hp));
5386 double xbb = HourAngleToRightAscension(pbb, 0.0, 0.0, tm, 0.0, 0.0, 0, 0, igday, gmonth, gyear, glong);
5387 double p = EQELong(xbb, 0.0, 0.0, qbb, 0.0, 0.0, igday, gmonth, gyear).ToRadians();
5388 double q = EQELat(xbb, 0.0, 0.0, qbb, 0.0, 0.0, igday, gmonth, gyear).ToRadians();
5389
5390 return (paa, qaa, xaa, pbb, qbb, xbb, p, q);
5391 }
5392
5399 public static double UTFirstContactSolarEclipse(double dy, int mn, int yr, int ds, int zc, double glong, double glat)
5400 {
5401 double tp = 2.0 * Math.PI;
5402
5403 if (SolarEclipseOccurrence(ds, zc, dy, mn, yr).Equals("No solar eclipse"))
5404 return -99.0;
5405
5406 double dj = NewMoon(ds, zc, dy, mn, yr);
5407 double gday = JulianDateDay(dj);
5408 int gmonth = JulianDateMonth(dj);
5409 int gyear = JulianDateYear(dj);
5410 double igday = gday.Floor();
5411 double xi = gday - igday;
5412 double utnm = xi * 24.0;
5413 double ut = utnm - 1.0;
5414 double ly = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5415 double my = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5416 double by = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5417 double hy = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5418 ut = utnm + 1.0;
5419 double sb = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians() - ly;
5420 double mz = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5421 double bz = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5422 double hz = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5423
5424 if (sb < 0.0)
5425 sb += tp;
5426
5427 double xh = utnm;
5428 double x = my;
5429 double y = by;
5430 double tm = xh - 1.0;
5431 double hp = hy;
5432 (double paa, double qaa, double xaa, double pbb, double qbb, double xbb, double p, double q) l7390result1 = UTFirstContactSolarEclipse_L7390(x, y, igday, gmonth, gyear, tm, glong, glat, hp);
5433 my = l7390result1.p;
5434 by = l7390result1.q;
5435 x = mz;
5436 y = bz;
5437 tm = xh + 1.0;
5438 hp = hz;
5439 (double paa, double qaa, double xaa, double pbb, double qbb, double xbb, double p, double q) l7390result2 = UTFirstContactSolarEclipse_L7390(x, y, igday, gmonth, gyear, tm, glong, glat, hp);
5440 mz = l7390result2.p;
5441 bz = l7390result2.q;
5442
5443 double x0 = xh + 1.0 - (2.0 * bz / (bz - by));
5444 double dm = mz - my;
5445
5446 if (dm < 0.0)
5447 dm += tp;
5448
5449 double lj = (dm - sb) / 2.0;
5450 double mr = my + (dm * (x0 - xh + 1.0) / 2.0);
5451 ut = x0 - 0.13851852;
5452 double rr = SunDist(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear);
5453 double sr = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5454 sr += (NutatLong(igday, gmonth, gyear) - 0.00569).ToRadians();
5455 x = sr;
5456 y = 0.0;
5457 tm = ut;
5458 hp = 0.00004263452 / rr;
5459 (double paa, double qaa, double xaa, double pbb, double qbb, double xbb, double p, double q) l7390result3 = UTFirstContactSolarEclipse_L7390(x, y, igday, gmonth, gyear, tm, glong, glat, hp);
5460 sr = l7390result3.p;
5461 by -= l7390result3.q;
5462 bz -= l7390result3.q;
5463 double p3 = 0.00004263;
5464 double zh = (sr - mr) / lj;
5465 double tc = x0 + zh;
5466 double sh = (((bz - by) * (tc - xh - 1.0) / 2.0) + bz) / lj;
5467 double s2 = sh * sh;
5468 double z2 = zh * zh;
5469 double ps = p3 / (rr * lj);
5470 double z1 = (zh * z2 / (z2 + s2)) + x0;
5471 double h0 = (hy + hz) / (2.0 * lj);
5472 double rm = 0.272446 * h0;
5473 double rn = 0.00465242 / (lj * rr);
5474 double hd = h0 * 0.99834;
5475 double _ru = (hd - rn + ps) * 1.02;
5476 double _rp = (hd + rn + ps) * 1.02;
5477 double pj = Math.Abs(sh * zh / (s2 + z2).SquareRoot());
5478 double r = rm + rn;
5479 double dd = z1 - x0;
5480 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
5481
5482 if (dd < 0.0)
5483 return -99.0;
5484
5485 double zd = dd.SquareRoot();
5486 double z6 = z1 - zd;
5487
5488 if (z6 < 0.0)
5489 z6 += 24.0;
5490
5491 return z6;
5492 }
5493
5497 public static (double paa, double qaa, double xaa, double pbb, double qbb, double xbb, double p, double q) UTFirstContactSolarEclipse_L7390(double x, double y, double igday, int gmonth, int gyear, double tm, double glong, double glat, double hp)
5498 {
5499 double paa = EcRA(Degrees(x), 0.0, 0.0, Degrees(y), 0.0, 0.0, igday, gmonth, gyear);
5500 double qaa = EcDec(Degrees(x), 0.0, 0.0, Degrees(y), 0.0, 0.0, igday, gmonth, gyear);
5501 double xaa = RightAscensionToHourAngle(DecimalDegreesToDegreeHours(paa), 0.0, 0.0, tm, 0.0, 0.0, 0, 0, igday, gmonth, gyear, glong);
5502 double pbb = ParallaxHA(xaa, 0.0, 0.0, qaa, 0.0, 0.0, PACoordinateType.True, glat, 0.0, Degrees(hp));
5503 double qbb = ParallaxDec(xaa, 0.0, 0.0, qaa, 0.0, 0.0, PACoordinateType.True, glat, 0.0, Degrees(hp));
5504 double xbb = HourAngleToRightAscension(pbb, 0.0, 0.0, tm, 0.0, 0.0, 0, 0, igday, gmonth, gyear, glong);
5505 double p = EQELong(xbb, 0.0, 0.0, qbb, 0.0, 0.0, igday, gmonth, gyear).ToRadians();
5506 double q = EQELat(xbb, 0.0, 0.0, qbb, 0.0, 0.0, igday, gmonth, gyear).ToRadians();
5507
5508 return (paa, qaa, xaa, pbb, qbb, xbb, p, q);
5509 }
5510
5517 public static double UTLastContactSolarEclipse(double dy, int mn, int yr, int ds, int zc, double glong, double glat)
5518 {
5519 double tp = 2.0 * Math.PI;
5520
5521 if (SolarEclipseOccurrence(ds, zc, dy, mn, yr).Equals("No solar eclipse"))
5522 return -99.0;
5523
5524 double dj = NewMoon(ds, zc, dy, mn, yr);
5525 double gday = JulianDateDay(dj);
5526 int gmonth = JulianDateMonth(dj);
5527 int gyear = JulianDateYear(dj);
5528 double igday = gday.Floor();
5529 double xi = gday - igday;
5530 double utnm = xi * 24.0;
5531 double ut = utnm - 1.0;
5532 double ly = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5533 double my = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5534 double by = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5535 double hy = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5536 ut = utnm + 1.0;
5537 double sb = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians() - ly;
5538 double mz = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5539 double bz = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5540 double hz = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5541
5542 if (sb < 0.0)
5543 sb += tp;
5544
5545 double xh = utnm;
5546 double x = my;
5547 double y = by;
5548 double tm = xh - 1.0;
5549 double hp = hy;
5550 (double paa, double qaa, double xaa, double pbb, double qbb, double xbb, double p, double q) l7390result1 = UTLastContactSolarEclipse_L7390(x, y, igday, gmonth, gyear, tm, glong, glat, hp);
5551 my = l7390result1.p;
5552 by = l7390result1.q;
5553 x = mz;
5554 y = bz;
5555 tm = xh + 1.0;
5556 hp = hz;
5557 (double paa, double qaa, double xaa, double pbb, double qbb, double xbb, double p, double q) l7390result2 = UTLastContactSolarEclipse_L7390(x, y, igday, gmonth, gyear, tm, glong, glat, hp);
5558 mz = l7390result2.p;
5559 bz = l7390result2.q;
5560
5561 double x0 = xh + 1.0 - (2.0 * bz / (bz - by));
5562 double dm = mz - my;
5563
5564 if (dm < 0.0)
5565 dm += tp;
5566
5567 double lj = (dm - sb) / 2.0;
5568 double mr = my + (dm * (x0 - xh + 1.0) / 2.0);
5569 ut = x0 - 0.13851852;
5570 double rr = SunDist(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear);
5571 double sr = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5572 sr += (NutatLong(igday, gmonth, gyear) - 0.00569).ToRadians();
5573 x = sr;
5574 y = 0.0;
5575 tm = ut;
5576 hp = 0.00004263452 / rr;
5577 (double paa, double qaa, double xaa, double pbb, double qbb, double xbb, double p, double q) l7390result3 = UTLastContactSolarEclipse_L7390(x, y, igday, gmonth, gyear, tm, glong, glat, hp);
5578 sr = l7390result3.p;
5579 by -= l7390result3.q;
5580 bz -= l7390result3.q;
5581 double p3 = 0.00004263;
5582 double zh = (sr - mr) / lj;
5583 double tc = x0 + zh;
5584 double sh = (((bz - by) * (tc - xh - 1.0) / 2.0) + bz) / lj;
5585 double s2 = sh * sh;
5586 double z2 = zh * zh;
5587 double ps = p3 / (rr * lj);
5588 double z1 = (zh * z2 / (z2 + s2)) + x0;
5589 double h0 = (hy + hz) / (2.0 * lj);
5590 double rm = 0.272446 * h0;
5591 double rn = 0.00465242 / (lj * rr);
5592 double hd = h0 * 0.99834;
5593 double _ru = (hd - rn + ps) * 1.02;
5594 double _rp = (hd + rn + ps) * 1.02;
5595 double pj = Math.Abs(sh * zh / (s2 + z2).SquareRoot());
5596 double r = rm + rn;
5597 double dd = z1 - x0;
5598 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
5599
5600 if (dd < 0.0)
5601 return -99.0;
5602
5603 double zd = dd.SquareRoot();
5604 double z7 = z1 + zd - Lint((z1 + zd) / 24.0) * 24.0;
5605
5606 return z7;
5607 }
5608
5612 public static (double paa, double qaa, double xaa, double pbb, double qbb, double xbb, double p, double q) UTLastContactSolarEclipse_L7390(double x, double y, double igday, int gmonth, int gyear, double tm, double glong, double glat, double hp)
5613 {
5614 double paa = EcRA(Degrees(x), 0.0, 0.0, Degrees(y), 0.0, 0.0, igday, gmonth, gyear);
5615 double qaa = EcDec(Degrees(x), 0.0, 0.0, Degrees(y), 0.0, 0.0, igday, gmonth, gyear);
5616 double xaa = RightAscensionToHourAngle(DecimalDegreesToDegreeHours(paa), 0.0, 0.0, tm, 0.0, 0.0, 0, 0, igday, gmonth, gyear, glong);
5617 double pbb = ParallaxHA(xaa, 0.0, 0.0, qaa, 0.0, 0.0, PACoordinateType.True, glat, 0.0, Degrees(hp));
5618 double qbb = ParallaxDec(xaa, 0.0, 0.0, qaa, 0.0, 0.0, PACoordinateType.True, glat, 0.0, Degrees(hp));
5619 double xbb = HourAngleToRightAscension(pbb, 0.0, 0.0, tm, 0.0, 0.0, 0, 0, igday, gmonth, gyear, glong);
5620 double p = EQELong(xbb, 0.0, 0.0, qbb, 0.0, 0.0, igday, gmonth, gyear).ToRadians();
5621 double q = EQELat(xbb, 0.0, 0.0, qbb, 0.0, 0.0, igday, gmonth, gyear).ToRadians();
5622
5623 return (paa, qaa, xaa, pbb, qbb, xbb, p, q);
5624 }
5625
5632 public static double MagSolarEclipse(double dy, int mn, int yr, int ds, int zc, double glong, double glat)
5633 {
5634 double tp = 2.0 * Math.PI;
5635
5636 if (SolarEclipseOccurrence(ds, zc, dy, mn, yr).Equals("No solar eclipse"))
5637 return -99.0;
5638
5639 double dj = NewMoon(ds, zc, dy, mn, yr);
5640 double gday = JulianDateDay(dj);
5641 int gmonth = JulianDateMonth(dj);
5642 int gyear = JulianDateYear(dj);
5643 double igday = gday.Floor();
5644 double xi = gday - igday;
5645 double utnm = xi * 24.0;
5646 double ut = utnm - 1.0;
5647 double ly = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5648 double my = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5649 double by = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5650 double hy = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5651 ut = utnm + 1.0;
5652 double sb = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians() - ly;
5653 double mz = MoonLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5654 double bz = MoonLat(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5655 double hz = MoonHP(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5656
5657 if (sb < 0.0)
5658 sb += tp;
5659
5660 double xh = utnm;
5661 double x = my;
5662 double y = by;
5663 double tm = xh - 1.0;
5664 double hp = hy;
5665 (double paa, double qaa, double xaa, double pbb, double qbb, double xbb, double p, double q) l7390result1 = MagSolarEclipse_L7390(x, y, igday, gmonth, gyear, tm, glong, glat, hp);
5666 my = l7390result1.p;
5667 by = l7390result1.q;
5668 x = mz;
5669 y = bz;
5670 tm = xh + 1.0;
5671 hp = hz;
5672 (double paa, double qaa, double xaa, double pbb, double qbb, double xbb, double p, double q) l7390result2 = MagSolarEclipse_L7390(x, y, igday, gmonth, gyear, tm, glong, glat, hp);
5673 mz = l7390result2.p;
5674 bz = l7390result2.q;
5675
5676 double x0 = xh + 1.0 - (2.0 * bz / (bz - by));
5677 double dm = mz - my;
5678
5679 if (dm < 0.0)
5680 dm += tp;
5681
5682 double lj = (dm - sb) / 2.0;
5683 double mr = my + (dm * (x0 - xh + 1.0) / 2.0);
5684 ut = x0 - 0.13851852;
5685 double rr = SunDist(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear);
5686 double sr = SunLong(ut, 0.0, 0.0, 0, 0, igday, gmonth, gyear).ToRadians();
5687 sr += (NutatLong(igday, gmonth, gyear) - 0.00569).ToRadians();
5688 x = sr;
5689 y = 0.0;
5690 tm = ut;
5691 hp = 0.00004263452 / rr;
5692 (double paa, double qaa, double xaa, double pbb, double qbb, double xbb, double p, double q) l7390result3 = MagSolarEclipse_L7390(x, y, igday, gmonth, gyear, tm, glong, glat, hp);
5693 sr = l7390result3.p;
5694 by -= l7390result3.q;
5695 bz -= l7390result3.q;
5696 double p3 = 0.00004263;
5697 double zh = (sr - mr) / lj;
5698 double tc = x0 + zh;
5699 double sh = (((bz - by) * (tc - xh - 1.0) / 2.0) + bz) / lj;
5700 double s2 = sh * sh;
5701 double z2 = zh * zh;
5702 double ps = p3 / (rr * lj);
5703 double z1 = (zh * z2 / (z2 + s2)) + x0;
5704 double h0 = (hy + hz) / (2.0 * lj);
5705 double rm = 0.272446 * h0;
5706 double rn = 0.00465242 / (lj * rr);
5707 double hd = h0 * 0.99834;
5708 double _ru = (hd - rn + ps) * 1.02;
5709 double _rp = (hd + rn + ps) * 1.02;
5710 double pj = Math.Abs(sh * zh / (s2 + z2).SquareRoot());
5711 double r = rm + rn;
5712 double dd = z1 - x0;
5713 dd = dd * dd - ((z2 - (r * r)) * dd / zh);
5714
5715 if (dd < 0.0)
5716 return -99.0;
5717
5718 double zd = dd.SquareRoot();
5719
5720 double mg = (rm + rn - pj) / (2.0 * rn);
5721
5722 return mg;
5723 }
5724
5728 public static (double paa, double qaa, double xaa, double pbb, double qbb, double xbb, double p, double q) MagSolarEclipse_L7390(double x, double y, double igday, int gmonth, int gyear, double tm, double glong, double glat, double hp)
5729 {
5730 double paa = EcRA(Degrees(x), 0.0, 0.0, Degrees(y), 0.0, 0.0, igday, gmonth, gyear);
5731 double qaa = EcDec(Degrees(x), 0.0, 0.0, Degrees(y), 0.0, 0.0, igday, gmonth, gyear);
5732 double xaa = RightAscensionToHourAngle(DecimalDegreesToDegreeHours(paa), 0.0, 0.0, tm, 0.0, 0.0, 0, 0, igday, gmonth, gyear, glong);
5733 double pbb = ParallaxHA(xaa, 0.0, 0.0, qaa, 0.0, 0.0, PACoordinateType.True, glat, 0.0, Degrees(hp));
5734 double qbb = ParallaxDec(xaa, 0.0, 0.0, qaa, 0.0, 0.0, PACoordinateType.True, glat, 0.0, Degrees(hp));
5735 double xbb = HourAngleToRightAscension(pbb, 0.0, 0.0, tm, 0.0, 0.0, 0, 0, igday, gmonth, gyear, glong);
5736 double p = EQELong(xbb, 0.0, 0.0, qbb, 0.0, 0.0, igday, gmonth, gyear).ToRadians();
5737 double q = EQELat(xbb, 0.0, 0.0, qbb, 0.0, 0.0, igday, gmonth, gyear).ToRadians();
5738
5739 return (paa, qaa, xaa, pbb, qbb, xbb, p, q);
5740 }
5741}
Working data for precise planet calculations.
double Value2
Working value 2.
string Name
Name of planet.
double Value5
Working value 5.
double Value6
Working value 6.
double Value4
Working value 4.
Miscellaneous macro functions supporting the other classes.
Definition PAMacros.cs:13
static double double double double double double double double q UTMaxSolarEclipse_L7390(double x, double y, double igday, int gmonth, int gyear, double tm, double glong, double glat, double hp)
Definition PAMacros.cs:5379
static string LunarEclipseOccurrence(int ds, int zc, double dy, int mn, int yr)
Determine if a lunar eclipse is likely to occur.
Definition PAMacros.cs:4415
static double GreenwichSiderealTimeToUniversalTime(double greenwichSiderealHours, double greenwichSiderealMinutes, double greenwichSiderealSeconds, double greenwichDay, int greenwichMonth, int greenwichYear)
Convert Greenwich Sidereal Time to Universal Time.
Definition PAMacros.cs:720
static double double q ParallaxDecL2870(double x, double y, double rc, double rp, double rs, double tp)
Definition PAMacros.cs:1104
static double moonLongDeg
Calculate longitude, latitude, and horizontal parallax of the Moon.
Definition PAMacros.cs:3310
static double RiseSetAzimuthRise(double rah, double ram, double ras, double dd, double dm, double ds, double vd, double g)
Azimuth of rising, in degrees.
Definition PAMacros.cs:1802
static double double double double double double b LunarEclipseOccurrence_L6855(double t, double k)
Definition PAMacros.cs:4454
static double double double double double double double planetRVect PlanetCoordinates(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr, string s)
Definition PAMacros.cs:2253
static double double double double pbb
Definition PAMacros.cs:5379
static double double double double qd
Definition PAMacros.cs:2922
static double double double double double double double double q
Definition PAMacros.cs:3820
static string ETwilight(double ld, int lm, int ly, int ds, int zc, double gl, double gp, PATwilightType tt)
Definition PAMacros.cs:2139
static double double double double string s TwilightPMLCT_L3710(double gd, int gm, int gy, double sr, double di, double gp)
Definition PAMacros.cs:2120
static double int int yr1 MoonRiseLcDMY(double dy, int mn, int yr, int ds, int zc, double gLong, double gLat)
Definition PAMacros.cs:3849
static double HourAngleToRightAscension(double hourAngleHours, double hourAngleMinutes, double hourAngleSeconds, double lctHours, double lctMinutes, double lctSeconds, int daylightSaving, int zoneCorrection, double localDay, int localMonth, int localYear, double geographicalLongitude)
Convert Hour Angle to Right Ascension.
Definition PAMacros.cs:217
static double UniversalTimeToGreenwichSiderealTime(double uHours, double uMinutes, double uSeconds, double greenwichDay, int greenwichMonth, int greenwichYear)
Convert Universal Time to Greenwich Sidereal Time.
Definition PAMacros.cs:372
static double UTStartTotalLunarEclipse(double dy, int mn, int yr, int ds, int zc)
Calculate start time of total phase of lunar eclipse (UT)
Definition PAMacros.cs:4908
static double double double double la
Definition PAMacros.cs:1684
static double double double double double double double double double double lct
Definition PAMacros.cs:4050
static string SolarEclipseOccurrence(int ds, int zc, double dy, int mn, int yr)
Determine if a solar eclipse is likely to occur.
Definition PAMacros.cs:5204
static double SolveCubic(double w)
For W, in radians, return S, also in radians.
Definition PAMacros.cs:3189
static double NewMoon(int ds, int zc, double dy, int mn, int yr)
Calculate Julian date of New Moon.
Definition PAMacros.cs:3534
static double double double dy1
Local date of moonset.
Definition PAMacros.cs:3798
static double double double double double double double double double double double au MoonSetAz_L6700(double lct, int ds, int zc, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr, double gLat)
Definition PAMacros.cs:4393
static double double double double double planetHLong2
Definition PAMacros.cs:2253
static double double double double string s SunriseAZ_L3710(double gd, int gm, int gy, double sr, double di, double gp)
Definition PAMacros.cs:1956
static double ParallaxHA(double hh, double hm, double hs, double dd, double dm, double ds, PACoordinateType sw, double gp, double ht, double hp)
Calculate corrected hour angle in decimal hours.
Definition PAMacros.cs:947
static double double double int int double int gmn
Definition PAMacros.cs:3798
static double double double double string s TwilightAMLCT_L3710(double gd, int gm, int gy, double sr, double di, double gp)
Definition PAMacros.cs:2066
static double f
Helper function for lunar_eclipse_occurrence.
Definition PAMacros.cs:4454
static double LocalCivilTimeGreenwichDay(double lctHours, double lctMinutes, double lctSeconds, int daylightSaving, int zoneCorrection, double localDay, int localMonth, int localYear)
Determine Greenwich Day for Local Time.
Definition PAMacros.cs:323
static double CivilDateToJulianDate(double day, double month, double year)
Convert a Greenwich Date/Civil Date (day,month,year) to Julian Date.
Definition PAMacros.cs:87
static double double cometLatDeg
Definition PAMacros.cs:3233
static double double double double double double double double q MagSolarEclipse_L7390(double x, double y, double igday, int gmonth, int gyear, double tm, double glong, double glat, double hp)
Definition PAMacros.cs:5728
static double double double int mn1
Definition PAMacros.cs:3798
static double ParallaxDec(double hh, double hm, double hs, double dd, double dm, double ds, PACoordinateType sw, double gp, double ht, double hp)
Calculate corrected declination in decimal degrees.
Definition PAMacros.cs:1040
static double SunEcc(double gd, int gm, int gy)
Eccentricity of the Sun-Earth orbit.
Definition PAMacros.cs:1537
static double double double double double th
Definition PAMacros.cs:3820
static double UTFirstContactSolarEclipse(double dy, int mn, int yr, int ds, int zc, double glong, double glat)
Calculate time of first contact for solar eclipse (UT)
Definition PAMacros.cs:5399
static double MoonRiseAz(double dy, int mn, int yr, int ds, int zc, double gLong, double gLat)
Local azimuth of moonrise.
Definition PAMacros.cs:3964
static int UniversalTime_LocalCivilYear(double uHours, double uMinutes, double uSeconds, int daylightSaving, int zoneCorrection, double greenwichDay, int greenwichMonth, int greenwichYear)
Get Local Civil Year for Universal Time.
Definition PAMacros.cs:307
static string ESunRS(double ld, int lm, int ly, int ds, int zc, double gl, double gp)
Definition PAMacros.cs:1862
static string ERS(double rah, double ram, double ras, double dd, double dm, double ds, double vd, double g)
Rise/Set status.
Definition PAMacros.cs:1841
static double double double double double double di
Definition PAMacros.cs:3820
static double double double double double double double double double lu
Definition PAMacros.cs:3820
static double double double double string s SunsetAZ_L3710(double gd, int gm, int gy, double sr, double di, double gp)
Definition PAMacros.cs:2010
static double double double double double double double double double double lct MoonSetLcDMY_L6700(double lct, int ds, int zc, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr, double gLat)
Definition PAMacros.cs:4284
static double SunsetLCT(double ld, int lm, int ly, int ds, int zc, double gl, double gp)
Definition PAMacros.cs:1698
static double double lct
Definition PAMacros.cs:3798
static double Degrees(double w)
Convert W to Degrees.
Definition PAMacros.cs:463
static double double double pm
Definition PAMacros.cs:3820
static double SunriseLCT(double ld, int lm, int ly, int ds, int zc, double gl, double gp)
Calculate local civil time of sunrise.
Definition PAMacros.cs:1636
static double UniversalTime_LocalCivilDay(double uHours, double uMinutes, double uSeconds, int daylightSaving, int zoneCorrection, double greenwichDay, int greenwichMonth, int greenwichYear)
Get Local Civil Day for Universal Time.
Definition PAMacros.cs:273
static double double planetLatitude
Definition PAMacros.cs:2253
static double double moonLatDeg
Definition PAMacros.cs:3310
static double double double int int double int int gyr MoonSetLCT_L6680(double x, int ds, int zc, double gdy, int gmn, int gyr, double g1, double ut)
Definition PAMacros.cs:4141
static double SunELong(double gd, int gm, int gy)
Mean ecliptic longitude of the Sun at the epoch.
Definition PAMacros.cs:1507
static double RightAscensionToHourAngle(double raHours, double raMinutes, double raSeconds, double lctHours, double lctMinutes, double lctSeconds, int daylightSaving, int zoneCorrection, double localDay, int localMonth, int localYear, double geographicalLongitude)
Convert Right Ascension to Hour Angle.
Definition PAMacros.cs:197
static double paa
Helper function for ut_max_solar_eclipse.
Definition PAMacros.cs:5379
static double double double double double a
Definition PAMacros.cs:4454
static double double double int int double int int gyr MoonRiseLCT_L6680(double x, int ds, int zc, double gdy, int gmn, int gyr, double g1, double ut)
Definition PAMacros.cs:3798
static double MoonRiseLCT(double dy, int mn, int yr, int ds, int zc, double gLong, double gLat)
Local time of moonrise.
Definition PAMacros.cs:3729
static double UTEndTotalLunarEclipse(double dy, int mn, int yr, int ds, int zc)
Calculate end time of total phase of lunar eclipse (UT)
Definition PAMacros.cs:5010
static double UTLastContactSolarEclipse(double dy, int mn, int yr, int ds, int zc, double glong, double glat)
Calculate time of last contact for solar eclipse (UT)
Definition PAMacros.cs:5517
static double NutatLong(double gd, int gm, int gy)
Nutation amount to be added in ecliptic longitude, in degrees.
Definition PAMacros.cs:600
static double TwilightPMLCT(double ld, int lm, int ly, int ds, int zc, double gl, double gp, PATwilightType tt)
Calculate evening twilight end, in local time.
Definition PAMacros.cs:2084
static double dy1
Local date of moonrise.
Definition PAMacros.cs:3849
static double RiseSetAzimuthSet(double rah, double ram, double ras, double dd, double dm, double ds, double vd, double g)
Azimuth of setting, in degrees.
Definition PAMacros.cs:1821
static double double x
Definition PAMacros.cs:1684
static double EcDec(double eld, double elm, double els, double bd, double bm, double bs, double gd, int gm, int gy)
Ecliptic - Declination (degrees)
Definition PAMacros.cs:1551
static double MoonLat(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr)
Calculate geocentric ecliptic latitude for the Moon.
Definition PAMacros.cs:1283
static double LocalSiderealTimeToGreenwichSiderealTime(double localHours, double localMinutes, double localSeconds, double longitude)
Convert Local Sidereal Time to Greenwich Sidereal Time.
Definition PAMacros.cs:705
static double IInt(double w)
Original macro name: IINT.
Definition PAMacros.cs:3647
static double double double moonHorPara MoonLongLatHP(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr)
Definition PAMacros.cs:3310
static double double sa
Definition PAMacros.cs:2883
static double TwilightAMLCT(double ld, int lm, int ly, int ds, int zc, double gl, double gp, PATwilightType tt)
Calculate morning twilight start, in local time.
Definition PAMacros.cs:2028
static double a
Helper function for sunrise_lct()
Definition PAMacros.cs:1684
static double RiseSetLocalSiderealTimeRise(double rah, double ram, double ras, double dd, double dm, double ds, double vd, double g)
Local sidereal time of rise, in hours.
Definition PAMacros.cs:1762
static double double double double string s SunsetLCTL3710(double gd, int gm, int gy, double sr, double di, double gp)
Definition PAMacros.cs:1745
static double MoonPhase(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr)
Calculate current phase of Moon.
Definition PAMacros.cs:3458
static double UTMaxSolarEclipse(double dy, int mn, int yr, int ds, int zc, double glong, double glat)
Calculate time of maximum shadow for solar eclipse (UT)
Definition PAMacros.cs:5284
static double HorizonCoordinatesToDeclination(double azimuthDegrees, double azimuthMinutes, double azimuthSeconds, double altitudeDegrees, double altitudeMinutes, double altitudeSeconds, double geographicalLatitude)
Convert Horizon Coordinates to Declination (in decimal degrees)
Definition PAMacros.cs:544
static double double double int int double int int gyr MoonSetAz_L6680(double x, int ds, int zc, double gdy, int gmn, int gyr, double g1, double ut)
Definition PAMacros.cs:4371
static double DegreeHoursToDecimalDegrees(double degreeHours)
Convert Degree-Hours to Decimal Degrees.
Definition PAMacros.cs:533
static double Obliq(double greenwichDay, int greenwichMonth, int greenwichYear)
Obliquity of the Ecliptic for a Greenwich Date.
Definition PAMacros.cs:583
static double SunDist(double lch, double lcm, double lcs, int ds, int zc, double ld, int lm, int ly)
Calculate Sun's distance from the Earth in astronomical units.
Definition PAMacros.cs:1140
static double double double double double double b SolarEclipseOccurrence_L6855(double t, double k)
Definition PAMacros.cs:5242
static double JulianDateDay(double julianDate)
Returns the day part of a Julian Date.
Definition PAMacros.cs:134
static double DecimalDegreesToDegreeHours(double decimalDegrees)
Convert Decimal Degrees to Degree-Hours.
Definition PAMacros.cs:522
static double UnwindDeg(double w)
Convert angle in degrees to equivalent angle in the range 0 to 360 degrees.
Definition PAMacros.cs:1496
static double mm
Helper function for MoonRiseLCT.
Definition PAMacros.cs:3820
static double MoonSetLCT(double dy, int mn, int yr, int ds, int zc, double gLong, double gLat)
Local time of moonset.
Definition PAMacros.cs:4073
static double HorizonCoordinatesToHourAngle(double azimuthDegrees, double azimuthMinutes, double azimuthSeconds, double altitudeDegrees, double altitudeMinutes, double altitudeSeconds, double geographicalLatitude)
Convert Horizon Coordinates to Hour Angle (in decimal degrees)
Definition PAMacros.cs:562
static double double double xaa
Definition PAMacros.cs:5379
static double double double int int double int int gyr MoonRiseAz_L6680(double x, int ds, int zc, double gdy, int gmn, int gyr, double g1, double ut)
Definition PAMacros.cs:4028
static double FPart(double w)
Original macro name: Fpart.
Definition PAMacros.cs:3689
static double double double planetDistanceAU
Definition PAMacros.cs:2253
static double double double y
Definition PAMacros.cs:1684
static double Refract(double y2, PACoordinateType sw, double pr, double tr)
Calculate effects of refraction.
Definition PAMacros.cs:878
static double NutatObl(double greenwichDay, int greenwichMonth, int greenwichYear)
Nutation of Obliquity.
Definition PAMacros.cs:655
static double double double cometDistAU PCometLongLatDist(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr, double td, int tm, int ty, double q, double i, double p, double n)
Definition PAMacros.cs:3233
static double planetLongitude
Calculate several planetary properties.
Definition PAMacros.cs:2253
static double double double f NewMoonFullMoon_L6855(double k, double t)
Definition PAMacros.cs:3592
static double int int yr1 MoonSetLcDMY(double dy, int mn, int yr, int ds, int zc, double gLong, double gLat)
Definition PAMacros.cs:4192
static double UTDayAdjust(double ut, double g1)
Original macro name: UTDayAdjust.
Definition PAMacros.cs:3673
static double double double double double double double double q UTLastContactSolarEclipse_L7390(double x, double y, double igday, int gmonth, int gyear, double tm, double glong, double glat, double hp)
Definition PAMacros.cs:5612
static double double q ParallaxHAL2870(double x, double y, double rc, double rp, double rs, double tp)
Definition PAMacros.cs:1011
static double UTFirstContactLunarEclipse(double dy, int mn, int yr, int ds, int zc)
Calculate time of first shadow contact for lunar eclipse (UT)
Definition PAMacros.cs:4570
static int UniversalTime_LocalCivilMonth(double uHours, double uMinutes, double uSeconds, int daylightSaving, int zoneCorrection, double greenwichDay, int greenwichMonth, int greenwichYear)
Get Local Civil Month for Universal Time.
Definition PAMacros.cs:291
static double double double double double qe
Definition PAMacros.cs:2883
static double SunTrueAnomaly(double lch, double lcm, double lcs, int ds, int zc, double ld, int lm, int ly)
Calculate Sun's true anomaly, i.e., how much its orbit deviates from a true circle to an ellipse.
Definition PAMacros.cs:1585
static double SunDia(double lch, double lcm, double lcs, int ds, int zc, double ld, int lm, int ly)
Calculate Sun's angular diameter in decimal degrees.
Definition PAMacros.cs:1127
static double MoonSize(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr)
Calculate the Moon's angular diameter (degrees)
Definition PAMacros.cs:1470
static double double double double string s ESunRS_L3710(double gd, int gm, int gy, double sr, double di, double gp)
Definition PAMacros.cs:1905
static double double double int int double int int gyr MoonRiseLcDMY_L6680(double x, int ds, int zc, double gdy, int gmn, int gyr, double g1, double ut)
Definition PAMacros.cs:3920
static double EcRA(double eld, double elm, double els, double bd, double bm, double bs, double gd, int gm, int gy)
Ecliptic - Right Ascension (degrees)
Definition PAMacros.cs:1567
static double double double double double double double double double double double au MoonRiseAz_L6700(double lct, int ds, int zc, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr, double gLat)
Definition PAMacros.cs:4050
static double GreenwichSiderealTimeToLocalSiderealTime(double greenwichHours, double greenwichMinutes, double greenwichSeconds, double geographicalLongitude)
Convert Greenwich Sidereal Time to Local Sidereal Time.
Definition PAMacros.cs:392
static double double double double double double double double double double lct MoonRiseLCT_L6700(double lct, int ds, int zc, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr, double gLat)
Definition PAMacros.cs:3820
static double UTLastContactLunarEclipse(double dy, int mn, int yr, int ds, int zc)
Calculate time of last shadow contact for lunar eclipse (UT)
Definition PAMacros.cs:4650
static double double double double double double double qb PlanetLong_L4810(List< PlanetDataPrecise > pl, double ms)
Definition PAMacros.cs:2883
static double MoonHP(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr)
Calculate horizontal parallax for the Moon.
Definition PAMacros.cs:1376
static int DecimalHoursMinute(double decimalHours)
Return the minutes part of a Decimal Hours.
Definition PAMacros.cs:55
static double EQELat(double rah, double ram, double ras, double dd, double dm, double ds, double gd, int gm, int gy)
Original macro name: EQElat.
Definition PAMacros.cs:3697
static double double double e1
Definition PAMacros.cs:4454
static double FullMoon(int ds, int zc, double dy, int mn, int yr)
Calculate Julian date of Full Moon.
Definition PAMacros.cs:3567
static double DecimalHoursSecond(double decimalHours)
Return the seconds part of a Decimal Hours.
Definition PAMacros.cs:71
static double ut
Helper function for MoonRiseLCT.
Definition PAMacros.cs:3798
static double DecimalDegreesSeconds(double decimalDegrees)
Return Seconds part of Decimal Degrees.
Definition PAMacros.cs:506
static double EquatorialCoordinatesToAzimuth(double hourAngleHours, double hourAngleMinutes, double hourAngleSeconds, double declinationDegrees, double declinationMinutes, double declinationSeconds, double geographicalLatitude)
Convert Equatorial Coordinates to Azimuth (in decimal degrees)
Definition PAMacros.cs:407
static double UTEndUmbraLunarEclipse(double dy, int mn, int yr, int ds, int zc)
Calculate end time of umbra phase of lunar eclipse (UT)
Definition PAMacros.cs:4819
static int JulianDateMonth(double julianDate)
Returns the month part of a Julian Date.
Definition PAMacros.cs:154
static double double double double double double double double double double lct MoonSetLCT_L6700(double lct, int ds, int zc, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr, double gLat)
Definition PAMacros.cs:4163
static double qa
Helper function for planet_long_lat()
Definition PAMacros.cs:2839
static double double qaa
Definition PAMacros.cs:5379
static double SunMeanAnomaly(double lch, double lcm, double lcs, int ds, int zc, double ld, int lm, int ly)
Calculate the Sun's mean anomaly.
Definition PAMacros.cs:1613
static int DecimalHoursHour(double decimalHours)
Return the hour part of a Decimal Hours.
Definition PAMacros.cs:39
static double double double double string s SunriseLCTL3710(double gd, int gm, int gy, double sr, double di, double gp)
Definition PAMacros.cs:1684
static int JulianDateYear(double julianDate)
Returns the year part of a Julian Date.
Definition PAMacros.cs:175
static double SunLong(double lch, double lcm, double lcs, int ds, int zc, double ld, int lm, int ly)
Calculate Sun's ecliptic longitude.
Definition PAMacros.cs:760
static double UniversalTimeToLocalCivilTime(double uHours, double uMinutes, double uSeconds, int daylightSaving, int zoneCorrection, double greenwichDay, int greenwichMonth, int greenwichYear)
Convert Universal Time to Local Civil Time.
Definition PAMacros.cs:255
static double EccentricAnomaly(double am, double ec)
Solve Kepler's equation, and return value of the eccentric anomaly in radians.
Definition PAMacros.cs:850
static double RefractL3035(double pr, double tr, double y, double d)
Helper function for Refract.
Definition PAMacros.cs:924
static double double b
Definition PAMacros.cs:3592
static double Fract(double w)
Original macro name: FRACT.
Definition PAMacros.cs:3631
static PAWarningFlag EGstUt(double gsh, double gsm, double gss, double gd, int gm, int gy)
Status of conversion of Greenwich Sidereal Time to Universal Time.
Definition PAMacros.cs:740
static double RiseSetLocalSiderealTimeSet(double rah, double ram, double ras, double dd, double dm, double ds, double vd, double g)
Local sidereal time of setting, in hours.
Definition PAMacros.cs:1782
static double MoonDist(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr)
Calculate distance from the Earth to the Moon (km)
Definition PAMacros.cs:1456
static double UTMaxLunarEclipse(double dy, int mn, int yr, int ds, int zc)
Calculate time of maximum shadow for lunar eclipse (UT)
Definition PAMacros.cs:4496
static double MoonLong(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr)
Calculate geocentric ecliptic longitude for the Moon.
Definition PAMacros.cs:1189
static double double double double double double double qg PlanetLong_L4945(double t, PlanetDataPrecise planet)
Definition PAMacros.cs:2922
static double Unwind(double w)
Convert angle in radians to equivalent angle in degrees.
Definition PAMacros.cs:1485
static double LocalCivilTimeToUniversalTime(double lctHours, double lctMinutes, double lctSeconds, int daylightSaving, int zoneCorrection, double localDay, int localMonth, int localYear)
Convert Local Civil Time to Universal Time.
Definition PAMacros.cs:237
static double double qb
Definition PAMacros.cs:2857
static double SunPeri(double gd, int gm, int gy)
Longitude of the Sun at perigee.
Definition PAMacros.cs:1522
static double double double ca
Definition PAMacros.cs:2883
static double SunriseAZ(double ld, int lm, int ly, int ds, int zc, double gl, double gp)
Definition PAMacros.cs:1919
static double double qb PlanetLong_L4685(List< PlanetDataPrecise > pl)
Definition PAMacros.cs:2839
static double double bm
Definition PAMacros.cs:3820
static double MagLunarEclipse(double dy, int mn, int yr, int ds, int zc)
Calculate magnitude of lunar eclipse.
Definition PAMacros.cs:5109
static double DecimalDegreesMinutes(double decimalDegrees)
Return Minutes part of Decimal Degrees.
Definition PAMacros.cs:490
static double Sign(double numberToCheck)
Calculate sign of number.
Definition PAMacros.cs:3657
static int LocalCivilTimeGreenwichMonth(double lctHours, double lctMinutes, double lctSeconds, int daylightSaving, int zoneCorrection, double localDay, int localMonth, int localYear)
Determine Greenwich Month for Local Time.
Definition PAMacros.cs:340
static double double double int int double int int gyr MoonSetLcDMY_L6680(double x, int ds, int zc, double gdy, int gmn, int gyr, double g1, double ut)
Definition PAMacros.cs:4262
static double SunsetAZ(double ld, int lm, int ly, int ds, int zc, double gl, double gp)
Calculate azimuth of sunset.
Definition PAMacros.cs:1973
static double Lint(double w)
Original macro name: LINT.
Definition PAMacros.cs:3639
static double DecimalDegreesDegrees(double decimalDegrees)
Return Degrees part of Decimal Degrees.
Definition PAMacros.cs:474
static double EQELong(double rah, double ram, double ras, double dd, double dm, double ds, double gd, int gm, int gy)
Original macro name: EQElong.
Definition PAMacros.cs:3710
static double double double double double double xbb
Definition PAMacros.cs:5379
static double double double double planetHLong1
Definition PAMacros.cs:2253
static double MoonSetAz(double dy, int mn, int yr, int ds, int zc, double gLong, double gLat)
Local azimuth of moonset.
Definition PAMacros.cs:4306
static double double double double double qbb
Definition PAMacros.cs:5379
static double UTStartUmbraLunarEclipse(double dy, int mn, int yr, int ds, int zc)
Calculate start time of umbra phase of lunar eclipse (UT)
Definition PAMacros.cs:4727
static double double double int int yr1
Definition PAMacros.cs:3798
static double double double double double double double double q UTFirstContactSolarEclipse_L7390(double x, double y, double igday, int gmonth, int gyear, double tm, double glong, double glat, double hp)
Definition PAMacros.cs:5497
static double MagSolarEclipse(double dy, int mn, int yr, int ds, int zc, double glong, double glat)
Calculate magnitude of solar eclipse.
Definition PAMacros.cs:5632
static double double double double qe PlanetLong_L4735(List< PlanetDataPrecise > pl, double ms, double t)
Definition PAMacros.cs:2857
static double double double int int double gdy
Definition PAMacros.cs:3798
static double Angle(double xx1, double xm1, double xs1, double dd1, double dm1, double ds1, double xx2, double xm2, double xs2, double dd2, double dm2, double ds2, PAAngleMeasure s)
Calculate the angle between two celestial objects.
Definition PAMacros.cs:2213
static double double double double b1
Definition PAMacros.cs:4454
static double double double double string s ETwilight_L3710(double gd, int gm, int gy, double sr, double di, double gp)
Definition PAMacros.cs:2181
static double double double double double double double double double double lct MoonRiseLcDMY_L6700(double lct, int ds, int zc, double dy1, int mn1, int yr1, double gdy, int gmn, int gyr, double gLat)
Definition PAMacros.cs:3942
static double DegreesMinutesSecondsToDecimalDegrees(double degrees, double minutes, double seconds)
Convert Degrees Minutes Seconds to Decimal Degrees.
Definition PAMacros.cs:448
static double double double qc
Definition PAMacros.cs:2857
static double MoonMeanAnomaly(double lh, double lm, double ls, int ds, int zc, double dy, int mn, int yr)
Calculate the Moon's mean anomaly.
Definition PAMacros.cs:3479
static double double double double double double planetHLat
Definition PAMacros.cs:2253
static double HMStoDH(double hours, double minutes, double seconds)
Convert a Civil Time (hours,minutes,seconds) to Decimal Hours.
Definition PAMacros.cs:20
static double TrueAnomaly(double am, double ec)
Solve Kepler's equation, and return value of the true anomaly in radians.
Definition PAMacros.cs:822
static double double double double dp
Definition PAMacros.cs:3820
static double p
Helper function for parallax_ha.
Definition PAMacros.cs:1011
static double double double double double double qf
Definition PAMacros.cs:2922
static double double dd
Definition PAMacros.cs:4454
static int LocalCivilTimeGreenwichYear(double lctHours, double lctMinutes, double lctSeconds, int daylightSaving, int zoneCorrection, double localDay, int localMonth, int localYear)
Determine Greenwich Year for Local Time.
Definition PAMacros.cs:356
static double EquatorialCoordinatesToAltitude(double hourAngleHours, double hourAngleMinutes, double hourAngleSeconds, double declinationDegrees, double declinationMinutes, double declinationSeconds, double geographicalLatitude)
Convert Equatorial Coordinates to Altitude (in decimal degrees)
Definition PAMacros.cs:429
static double cometLongDeg
Calculate longitude, latitude, and distance of parabolic-orbit comet.
Definition PAMacros.cs:3233
PAAngleMeasure
Angle measurement units.
Definition PATypes.cs:49
@ Degrees
Measurement by degrees.
PATwilightType
Twilight type.
Definition PATypes.cs:28
PACoordinateType
Coordinate types.
Definition PATypes.cs:9
PAWarningFlag
Warning flags for calculation results.
Definition PATypes.cs:81