From 5e1d32bfa67bcbf5f5d6554eb25f1403bac902cb Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Tue, 9 Jul 2013 01:15:13 +0200 Subject: [PATCH] Initial commit with SWE 1.75 --- Makefile.am | 2 + autogen.sh | 9 + configure.ac | 21 + src/Makefile.am | 4 + swe/README | 6 + swe/doc/sweph.gif | Bin 0 -> 6149 bytes swe/doc/swephin.gif | Bin 0 -> 9552 bytes swe/doc/swephprg.htm | 14343 ++++++++++++++++++++++++++++++++ swe/doc/swephprg.pdf | Bin 0 -> 458696 bytes swe/doc/swisseph.htm | 8190 ++++++++++++++++++ swe/doc/swisseph.pdf | Bin 0 -> 455576 bytes swe/src/LICENSE | 54 + swe/src/Makefile.am | 6 + swe/src/Makefile.swe | 60 + swe/src/fixstars.cat | 1258 +++ swe/src/sedeltat.txt.inactive | 13 + swe/src/sefstars.txt | 1258 +++ swe/src/seleapsec.txt | 5 + swe/src/seorbel.txt | 78 + swe/src/swecl.c | 5031 +++++++++++ swe/src/swedate.c | 587 ++ swe/src/swedate.h | 82 + swe/src/swedll.h | 525 ++ swe/src/swehel.c | 3435 ++++++++ swe/src/swehouse.c | 1739 ++++ swe/src/swehouse.h | 85 + swe/src/swejpl.c | 937 +++ swe/src/swejpl.h | 105 + swe/src/swemini.c | 131 + swe/src/swemmoon.c | 1824 ++++ swe/src/swemplan.c | 959 +++ swe/src/swemptab.c | 10642 ++++++++++++++++++++++++ swe/src/swenut2000a.h | 2820 +++++++ swe/src/sweodef.h | 325 + swe/src/swepcalc.c | 758 ++ swe/src/swepcalc.h | 461 + swe/src/swepdate.c | 242 + swe/src/sweph.c | 6256 ++++++++++++++ swe/src/sweph.h | 579 ++ swe/src/swephexp.h | 778 ++ swe/src/swephlib.c | 2816 +++++++ swe/src/swephlib.h | 179 + swe/src/swetest.c | 2681 ++++++ 43 files changed, 69284 insertions(+) create mode 100644 Makefile.am create mode 100755 autogen.sh create mode 100644 configure.ac create mode 100644 src/Makefile.am create mode 100644 swe/README create mode 100644 swe/doc/sweph.gif create mode 100644 swe/doc/swephin.gif create mode 100644 swe/doc/swephprg.htm create mode 100644 swe/doc/swephprg.pdf create mode 100644 swe/doc/swisseph.htm create mode 100644 swe/doc/swisseph.pdf create mode 100644 swe/src/LICENSE create mode 100644 swe/src/Makefile.am create mode 100644 swe/src/Makefile.swe create mode 100644 swe/src/fixstars.cat create mode 100644 swe/src/sedeltat.txt.inactive create mode 100644 swe/src/sefstars.txt create mode 100644 swe/src/seleapsec.txt create mode 100644 swe/src/seorbel.txt create mode 100644 swe/src/swecl.c create mode 100644 swe/src/swedate.c create mode 100644 swe/src/swedate.h create mode 100644 swe/src/swedll.h create mode 100644 swe/src/swehel.c create mode 100644 swe/src/swehouse.c create mode 100644 swe/src/swehouse.h create mode 100644 swe/src/swejpl.c create mode 100644 swe/src/swejpl.h create mode 100644 swe/src/swemini.c create mode 100644 swe/src/swemmoon.c create mode 100644 swe/src/swemplan.c create mode 100644 swe/src/swemptab.c create mode 100644 swe/src/swenut2000a.h create mode 100644 swe/src/sweodef.h create mode 100644 swe/src/swepcalc.c create mode 100644 swe/src/swepcalc.h create mode 100644 swe/src/swepdate.c create mode 100644 swe/src/sweph.c create mode 100644 swe/src/sweph.h create mode 100644 swe/src/swephexp.h create mode 100644 swe/src/swephlib.c create mode 100644 swe/src/swephlib.h create mode 100644 swe/src/swetest.c diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..cc32fc2 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,2 @@ +ACLOCAL_AMFLAGS = -I m4 +SUBDIRS = swe src diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..018d51f --- /dev/null +++ b/autogen.sh @@ -0,0 +1,9 @@ +#! /bin/sh + +mkdir m4 &> /dev/null + +libtoolize --install --copy || exit 1 +autoheader || exit 1 +aclocal || exit 1 +autoconf || exit 1 +automake --add-missing --copy || exit 1 diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..946c5f4 --- /dev/null +++ b/configure.ac @@ -0,0 +1,21 @@ +AC_INIT([gradix], [0.1], [gergely@polonkai.eu]) +AM_INIT_AUTOMAKE([-Wall -Werror foreign]) +LT_INIT +AC_ARG_ENABLE(debug, [AC_HELP_STRING([--enable-debug], [compile with debugging support. Be warned that debugging support can eat a large amount of CPU when many clients are connected. Also, debug logs can become very large!])], , enable_debug=no) + +if test "x$enable_debug" = "xyes" ; then + AC_DEFINE([DEBUG], [1], [Define if debugging is enabled.]) +fi + +AC_PROG_CC +AC_PROG_LIBTOOL +AM_PROG_AR +PKG_PROG_PKG_CONFIG +AC_CONFIG_MACRO_DIR([m4]) +AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_FILES([ + Makefile + swe/src/Makefile + src/Makefile +]) +AC_OUTPUT diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..59f6805 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,4 @@ +bin_PROGRAMS = gradix + +gradix_SOURCES = gradix.c + diff --git a/swe/README b/swe/README new file mode 100644 index 0000000..393b3f1 --- /dev/null +++ b/swe/README @@ -0,0 +1,6 @@ +This directory contains version 1.75 of the Swiss Ephemeris programming +library in a reduced orm, so it can be used in an Autotools project like +GRadix. + +If you need the full version, you can download it from +ftp://ftp.astro.com/pub/swisseph/ (as of July, 2013) diff --git a/swe/doc/sweph.gif b/swe/doc/sweph.gif new file mode 100644 index 0000000000000000000000000000000000000000..a4cf82dc545d70c93134ff1db72c3d8389f58937 GIT binary patch literal 6149 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 n?8cV{tt^h^ABq(DB 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 literal 0 HcmV?d00001 diff --git a/swe/doc/swephprg.htm b/swe/doc/swephprg.htm new file mode 100644 index 0000000..c686ba9 --- /dev/null +++ b/swe/doc/swephprg.htm @@ -0,0 +1,14343 @@ + + + + + + +Programming interface to the Swiss Ephemeris + + + + + +
+ +

 

+ +

Programming interface to the Swiss +Ephemeris

+ +

 

+ +

Copyright Astrodienst AG 1997-2011.

+ +

This document describes the proprietary +programmer's interface to the Swiss Ephemeris DLL.

+ +

 

+ +

Swiss Ephemeris is made available by its +authors under a dual licensing  system. +The software developer, who uses any part of Swiss Ephemeris  in his or her software, must choose between +one of the two license models,   which +are

+ +

  a) +GNU public license version 2 or later

+ +

  b) +Swiss Ephemeris Professional License

+ +

 

+ +

The choice must be made before the software +developer distributes software  +containing parts of Swiss Ephemeris to others, and before any public +service using the developed software is activated.

+ +

 

+ +

If the developer chooses the GNU GPL +software license, he or she must fulfill the conditions of that license, which +includes the obligation to place his or her whole software project under the +GNU GPL or a compatible license. See +http://www.gnu.org/licenses/old-licenses/gpl-2.0.html

+ +

 

+ +

If the developer chooses the Swiss +Ephemeris Professional license, he must follow the instructions as found in +http://www.astro.com/swisseph/ and purchase the Swiss Ephemeris Professional +Edition from Astrodienst and sign the corresponding license contract.

+ +

 

+ +
+ +
+
+ +
+ +

1. The programming +steps to get a planet’s position. 5

+ +

2. The functions +swe_calc_ut() and swe_calc(). 7

+ +

2.1. The call parameters. 7

+ +

2.2. Error handling and return values. 7

+ +

2.3. Bodies ( int ipl ). 8

+ +

Additional asteroids. 8

+ +

Fictitious planets. 11

+ +

Obliquity and nutation. 13

+ +

2.4. Options chosen by flag bits (long  iflag). 13

+ +

2.4.1. The use of flag bits. 13

+ +

2.4.2. Ephemeris flags. 13

+ +

2.4.3. Speed flag. 14

+ +

2.4.4. Coordinate systems, degrees and radians. 14

+ +

2.4.5. Specialties (going beyond common interest). 14

+ +

a. True or apparent positions. 14

+ +

b. Topocentric positions. 14

+ +

c. Heliocentric positions. 14

+ +

d. Barycentric positions. 14

+ +

e. Astrometric positions. 15

+ +

f. True or mean equinox of date. 15

+ +

g. J2000 positions and positions referred to other +equinoxes. 15

+ +

h. Sidereal positions. 15

+ +

2.5. Position and Speed (double xx[6]). 15

+ +

3. The function +swe_get_planet_name(). 15

+ +

4. Fixed stars +functions. 16

+ +

4.1 swe_fixstar_ut. 16

+ +

4.2 swe_fixstar(). 16

+ +

4.3 swe_fixstar_mag(). 17

+ +

5. Apsides +functions. 17

+ +

5.1 swe_nod_aps_ut. 17

+ +

5.2 swe_nod_aps(). 17

+ +

6. Eclipse and +planetary phenomena functions. 19

+ +

6.0. +Example of a typical eclipse calculation. 19

+ +

6.1. swe_sol_eclipse_when_loc() and +swe_lun_occult_when_loc(). 20

+ +

6.2. swe_sol_eclipse_when_glob(). 20

+ +

6.3. swe_sol_eclipse_how (). 21

+ +

6.4. swe_sol_eclipse_where (). 22

+ +

6.5. swe_lun_occult_when_loc(). 23

+ +

6.6. swe_lun_occult_when_glob(). 24

+ +

6.7. swe_lun_occult_where (). 25

+ +

6.8. swe_lun_eclipse_when (). 26

+ +

6.9. swe_lun_eclipse_how (). 26

+ +

6.10. swe_rise_trans() and swe_rise_trans_true_hor() +(risings, settings, meridian transits). 27

+ +

6.11. swe_pheno_ut() and swe_pheno(), planetary phenomena. 28

+ +

6.12. swe_azalt(), horizontal coordinates, azimuth, +altitude. 28

+ +

6.13. swe_azalt_rev(). 29

+ +

6.14. swe_refrac(), swe_refract_extended(), refraction. 29

+ +

6.15. Heliacal risings etc.: swe_heliacal_ut(). 30

+ +

6.16. Magnitude limit for visibility: swe_vis_limit_mag(). 31

+ +

7. Date and time +conversion functions. 31

+ +

7.1 Calendar Date and Julian Day: swe_julday(), +swe_date_conversion(), /swe_revjul(). 31

+ +

7.2. UTC and Julian day: swe_utc_time_zone(), +swe_utc_to_jd(), swe_jdet_to_utc(), swe_jdut1_to_utc(). 32

+ +

7.3. Future insertion of leap seconds and the file +swe_leapsec.txt. 34

+ +

7.4. Mean solar time versus True solar time: +swe_time_equ(). 34

+ +

8. Delta T-related +functions. 34

+ +

8.1 swe_deltat(). 34

+ +

8.2 swe_set_tid_acc(), swe_get_tid_acc(). 35

+ +

8.3. Future updates of Delta T and the file +swe_deltat.txt. 35

+ +

9. The function +swe_set_topo() for topocentric planet positions. 35

+ +

10. Sidereal mode functions. 35

+ +

10.1. +swe_set_sid_mode(). 35

+ +

10.2. swe_get_ayanamsa_ut() and swe_get_ayanamsa(). 37

+ +

11. The Ephemeris +file related functions. 37

+ +

11.1 swe_set_ephe_path(). 37

+ +

11.2 swe_close(). 38

+ +

11.3 swe_set_jpl_file(). 38

+ +

11.4 swe_version(). 38

+ +

12. House cusp +calculation. 39

+ +

12.1 swe_houses(). 39

+ +

12.2 swe_houses_armc(). 39

+ +

12.3 swe_houses_ex(). 39

+ +

13. The sign of +geographical longitudes in Swisseph functions. 41

+ +

14. Getting the +house position of a planet with swe_house_pos(). 41

+ +

14.1. Calculating +the Gauquelin sector position of a planet with swe_house_pos() or +swe_gauquelin_sector(). 42

+ +

15. Sidereal time +with swe_sidtime() and swe_sidtime0(). 43

+ +

16. Summary of +SWISSEPH functions. 44

+ +

16.1. Calculation of planets and stars. 44

+ +

Planets, moon, asteroids, lunar nodes, apogees, +fictitious bodies. 44

+ +

Fixed stars. 44

+ +

Set the geographic location for topocentric planet +computation. 44

+ +

Set the sidereal mode for sidereal planet positions. 44

+ +

16.2 Eclipses and planetary phenomena. 45

+ +

Find the next eclipse for a given geographic position. 45

+ +

Find the next eclipse globally. 45

+ +

Compute the attributes of a solar eclipse for a given +tjd, geographic long., latit. and height. 45

+ +

Find out the geographic position where a central eclipse +is central or a non-central one maximal45

+ +

Find the next occultation of a body by the moon for a +given geographic position. 46

+ +

Find the next occultation globally. 46

+ +

Find the next lunar eclipse. 46

+ +

Compute the attributes of a lunar eclipse at a given time. 46

+ +

Compute risings, settings and meridian transits of a body. 46

+ +

Compute planetary phenomena. 47

+ +

16.3. Date and time conversion. 47

+ +

Delta T from Julian day number47

+ +

Julian day number from year, month, day, hour, with check +whether date is legal48

+ +

Julian day number from year, month, day, hour48

+ +

Year, month, day, hour from Julian day number48

+ +

Local time to UTC and UTC to local time. 48

+ +

UTC to jd (TT and UT1). 48

+ +

TT (ET1) to UTC. 49

+ +

UTC to TT (ET1). 49

+ +

Get tidal acceleration used in swe_deltat(). 49

+ +

Set tidal acceleration to be used in swe_deltat(). 49

+ +

Equation of time. 49

+ +

16.4. Initialization, setup, and closing functions. 49

+ +

Set directory path of ephemeris files. 49

+ +

16.5. House calculation. 50

+ +

Sidereal time. 50

+ +

House cusps, ascendant and MC. 50

+ +

Extended house function; to compute tropical or sidereal +positions. 50

+ +

Get the house position of a celestial point. 50

+ +

Get the Gauquelin sector position for a body. 51

+ +

16.6. Auxiliary functions. 52

+ +

Coordinate transformation, from ecliptic to equator or +vice-versa. 52

+ +

Coordinate transformation of position and speed, from +ecliptic to equator or vice-versa. 52

+ +

Get the name of a planet. 52

+ +

16.7. Other functions that may be useful52

+ +

Normalize argument into interval [0..DEG360]. 52

+ +

Distance in centisecs p1 - p2 normalized to [0..360]. 52

+ +

Distance in degrees. 52

+ +

Distance in centisecs p1 - p2 normalized to [-180..180]. 52

+ +

Distance in degrees. 53

+ +

Round second, but at 29.5959 always down. 53

+ +

Double to long with rounding, no overflow check. 53

+ +

Day of week. 53

+ +

Centiseconds -> time string. 53

+ +

Centiseconds -> longitude or latitude string. 53

+ +

Centiseconds -> degrees string. 53

+ +

17. The SWISSEPH +DLLs. 53

+ +

17.1 DLL Interface for brain damaged compilers. 53

+ +

18. Using the DLL +with  Visual Basic 5.0. 54

+ +

19. Using the DLL +with  Borland Delphi and C++ Builder54

+ +

19.1 Delphi 2.0 and higher (32-bit). 54

+ +

19.2 Borland C++ Builder55

+ +

20. Using the +Swiss Ephemeris with Perl55

+ +

21. The C sample +program.. 56

+ +

21. The source +code distribution. 57

+ +

22. The PLACALC +compatibility API57

+ +

23. Documentation +files. 58

+ +

24. Swisseph with +different hardware and compilers. 58

+ +

25. Debugging and +Tracing Swisseph. 58

+ +

25.1. If you are using the DLL. 58

+ +

25.2 If you are using the source code. 59

+ +

Appendix. 59

+ +

Update and release history. 59

+ +

Changes from version 1.78 to 1.79. 61

+ +

Changes from version 1.77 to 1.78. 61

+ +

Changes from version 1.76 to 1.77. 61

+ +

Changes from version 1.75 to 1.76. 62

+ +

Changes from version 1.74 to version 1.75. 62

+ +

Changes from version 1.73 to version 1.74. 62

+ +

Changes from version 1.72 to version 1.73. 63

+ +

Changes from version 1.71 to version 1.72. 63

+ +

Changes from version 1.70.03 to version 1.71. 63

+ +

Changes from version 1.70.02 to version 1.70.03. 63

+ +

Changes from version 1.70.01 to version 1.70.02. 63

+ +

Changes from version 1.70.00 to version 1.70.01. 63

+ +

Changes from version 1.67 to version 1.70. 63

+ +

Changes from version 1.66 to version 1.67. 64

+ +

Changes from version 1.65 to version 1.66. 64

+ +

Changes from version 1.64.01 to version 1.65.00. 64

+ +

Changes from version 1.64 to version 1.64.01. 64

+ +

Changes from version 1.63 to version 1.64. 64

+ +

Changes from version 1.62 to version 1.63. 64

+ +

Changes from version 1.61.03 to version 1.62. 65

+ +

Changes from version 1.61 to 1.61.01. 65

+ +

Changes from version 1.60 to 1.61. 65

+ +

Changes from version 1.51 to 1.60. 65

+ +

Changes from version 1.50 to 1.51. 65

+ +

Changes from version 1.40 to 1.50. 65

+ +

Changes from version 1.31 to 1.40. 66

+ +

Changes from version 1.30 to 1.31. 66

+ +

Changes from version 1.27 to 1.30. 66

+ +

Changes from version 1.26 to 1.27. 66

+ +

Changes from version 1.25 to 1.26. 66

+ +

Changes from version 1.22 to 1.23. 66

+ +

Changes from version 1.21 to 1.22. 67

+ +

Changes from version 1.20 to 1.21. 67

+ +

Changes from version 1.11 to 1.20. 67

+ +

Changes from version 1.10 to 1.11. 67

+ +

Changes from version 1.04 to 1.10. 67

+ +

Changes from Version 1.03 to 1.04. 67

+ +

Changes from Version 1.02 to 1.03. 67

+ +

Changes from Version 1.01 to 1.02. 68

+ +

Changes from Version 1.00  to 1.01. 68

+ +

1. Sidereal time. 68

+ +

2. Houses. 68

+ +

3. Ecliptic obliquity and nutation. 68

+ +

Appendix A. 68

+ +

What is missing ?. 68

+ +

Index. 69

+ +

+ +
+ +
+
+ +
+ +

 

+ +

1. The programming steps to get a planet’s +position

+ +

 

+ +

To compute a celestial bodyor point with SWISSEPH, you have to do the following steps (use swetest.c as an example). The details of +the functions will be explained in the following chapters.

+ +

 

+ +

1.         Set +the directory path of the ephemeris files, e.g.:

+ +

         swe_set_ephe_path(”C:\\SWEPH\\EPHE”);

+ +

 

+ +

2..         From +the birth date, compute the Julian day number:

+ +

         jul_day_UT += swe_julday(year, month, day, hour, gregflag);

+ +

 

+ +

3..  Compute a planet or other bodies:

+ +

         ret_flag = swe_calc_ut(jul_day_UT, +planet_no, flag, lon_lat_rad, err_msg);

+ +

     or a +fixed star:

+ +

         ret_flag = swe_fixstar_ut(star_nam, +jul_day_UT, flag, lon_lat_rad, err_msg);

+ +

 

+ +

     Note:

+ +

      The functions swe_calc_ut() +and swe_fixstar_ut() were introduced with Swisseph version 1.60.

+ +

      If you use a Swisseph version +older than 1.60 or if you want to work with Ephemeris +Time, you have to +proceed as follows instead:

+ +

 

+ +

      First, if necessary, convert Universal Time +(UT) to Ephemeris Time (ET):

+ +

         jul_day_ET = jul_day_UT + swe_deltat(jul_day_UT);

+ +

 

+ +

      Then Compute a planet or other bodies:

+ +

         ret_flag = swe_calc(jul_day_ET, +planet_no, flag, lon_lat_rad, err_msg);

+ +

      or a fixed star:

+ +

         ret_flag = swe_fixstar(star_nam, +jul_day_ET, flag, lon_lat_rad, err_msg);

+ +

 

+ +

5..         At +the end of your computations close all files and free memory calling swe_close();

+ +

 

+ +

Here is a miniature sample program, it is in the +source distribution as swemini.c

+ +

 

+ +

#include "swephexp.h"      /* this includes  "sweodef.h" */

+ +

int main()

+ +

{

+ +

  +char *sp, sdate[AS_MAXCH], snam[40], serr[AS_MAXCH]; 

+ +

  +int jday = 1, jmon = 1, jyear = 2000;

+ +

  double jut = 0.0;

+ +

  double tjd_ut, te, x2[6];

+ +

  long iflag, iflgret;

+ +

  int p;

+ +

  iflag = SEFLG_SPEED;

+ +

  while (TRUE) {

+ +

    +printf("\nDate (d.m.y) ?");

+ +

    +gets(sdate);

+ +

          /* +stop if a period . is entered */

+ +

    +if (*sdate == '.')

+ +

      +return OK;

+ +

    +if (sscanf (sdate, "%d%*c%d%*c%d", +&jday,&jmon,&jyear) < 1) exit(1);

+ +

             /*

+ +

              * +we have day, month and year and convert to Julian day number

+ +

              */

+ +

    +tjd_ut = swe_julday(jyear,jmon,jday,jut,SE_GREG_CAL);       

+ +

             /*

+ +

              * compute Ephemeris time from Universal +time by adding delta_t

+ +

              * not required for Swisseph versions +smaller than 1.60

+ +

              */

+ +

       +/* te = tjd_ut + swe_deltat(tjd_ut); */

+ +

    +printf("date: %02d.%02d.%d at 0:00 Universal time\n", jday, +jmon, jyear);

+ +

    +printf("planet     +\tlongitude\tlatitude\tdistance\tspeed long.\n");

+ +

             /*

+ +

              * a loop over all planets

+ +

              */

+ +

    +for (p = SE_SUN; p <= SE_CHIRON; p++) {

+ +

      +if (p == SE_EARTH) continue;

+ +

          /*

+ +

           * do the coordinate calculation for this +planet p

+ +

           */

+ +

iflgret = swe_calc_ut(tjd_ut, p, iflag, +x2, serr);

+ +

         +/* Swisseph versions older than 1.60 require the following

+ +

          +* statement instead */

+ +

/* iflgret = swe_calc(te, p, iflag, x2, +serr); */

+ +

               /*

+ +

                * if there is a problem, a negative +value is returned and an

+ +

                * error message is in serr.

+ +

                */

+ +

      +if (iflgret < 0)

+ +

         printf("error: %s\n", +serr);

+ +

               +/*

+ +

                * get the name of the planet p

+ +

                */

+ +

      +swe_get_planet_name(p, snam);

+ +

               /*

+ +

                * print the coordinates

+ +

                */

+ +

      +printf("%10s\t%11.7f\t%10.7f\t%10.7f\t%10.7f\n",

+ +

              snam, x2[0], x2[1], x2[2], x2[3]);

+ +

    +}

+ +

  }

+ +

  +return OK;

+ +

}

+ +

2. The functions swe_calc_ut() and swe_calc()

+ +

2.1. The call parameters

+ +

swe_calc_ut() +was introduced with Swisseph version 1.60 and makes planetary +calculations a bit simpler. For the steps required, see the chapter  The programming steps to get a planet’s position.

+ +

swe_calc_ut() +and swe_calc() work exactly +the same way except that swe_calc() requires Ephemeris +Time( more +accurate: Dynamical Time ) as a parameter whereas swe_calc_ut() expects Universal Time. For common astrological calculations, you will only need swe_calc_ut() and will not have to think +anymore about the conversion between Universal Time and Ephemeris Time.

+ +

swe_calc_ut() and +swe_calc() compute +positions of planets, asteroids, lunar nodes and apogees. They are defined as +follows:

+ +

 

+ +

int swe_calc_ut +( double tjd_ut, int ipl, int iflag, double* xx, char* serr),

+ +

where

+ +

tjd_ut     =Julian day, +Universal Time

+ +

ipl       =body number

+ +

iflag    =a 32 bit integer +containing bit flags that indicate what kind of computation is wanted

+ +

xx       =array of 6 doubles +for longitude, latitude, distance, speed in long., speed in lat., and speed in +dist.

+ +

serr[256] =character string to return error messages in case of +error.

+ +

 

+ +

and

+ +

int swe_calc(double +tjd_et, int ipl, int iflag, double *xx, char *serr),

+ +

same but

+ +

tjd_et     =     Julian +day, Ephemeris time,  where tjd_et = +tjd_ut + swe_deltat(tjd_ut)

+ +

 

+ +

A detailed description of these +variables will be given in the following sections.

+ +

2.2. Error handling and return +values

+ +

On success, swe_calc ( or swe_calc_ut)returns a 32-bit integer containing flag bits that indicate +what kind of computation has been done. This value may or may not be equal toiflag. If an option specified byiflag cannot be fulfilled or makes no sense, swe_calc just does what can be done. E.g., if you specify that you want JPL +ephemeris, butswe_calccannot find the ephemeris file, it +tries to do the computation with any available ephemeris. This will be +indicated in the return value of swe_calc. So, to make sure that swe_calc () did exactly what you had wanted, you may want to check whether or +not the return code == iflag.

+ +

However, swe_calc() might return an fatal error code (< 0) and an error string in one of +the following cases:

+ +

 

+ +

·         +if an illegal body number has been specified

+ +

·         +if a Julian day beyond the ephemeris +limits has been specified

+ +

·         +if the length of the ephemeris file is +not correct (damaged file)

+ +

·         +on read error, e.g. a file index +points to a position beyond file length ( data on file are corrupt )

+ +

·         +if the copyright section in the +ephemeris file has been destroyed.

+ +

 

+ +

If any of these errors occurs,

+ +

 

+ +

·         +the return code of the function is -1,

+ +

·         +the position and speed variables are +set to zero,

+ +

·         +the type of error is indicated in the +error string serr.

+ +

2.3. Bodies ( int ipl )

+ +

 

+ +

To tell swe_calc()which +celestial body or factor should be computed, a fixed set of body numbers is +used. The body numbers are defined in swephexp.h:

+ +

/* planet +numbers for the ipl parameter in swe_calc() */

+ +

 

+ +

#define SE_ECL_NUT     -1     

+ +

#define SE_SUN               0      

+ +

#define SE_MOON              1      

+ +

#define SE_MERCURY           2      

+ +

#define SE_VENUS             3      

+ +

#define SE_MARS              4      

+ +

#define SE_JUPITER           5      

+ +

#define SE_SATURN            6      

+ +

#define SE_URANUS            7      

+ +

#define SE_NEPTUNE           8      

+ +

#define SE_PLUTO             9      

+ +

#define SE_MEAN_NODE         10     

+ +

#define SE_TRUE_NODE         11

+ +

#define SE_MEAN_APOG         12     

+ +

#define SE_OSCU_APOG         13   

+ +

#define SE_EARTH             14

+ +

#define SE_CHIRON            15

+ +

#define SE_PHOLUS            16

+ +

#define SE_CERES             17

+ +

#define SE_PALLAS            18

+ +

#define SE_JUNO              19

+ +

#define SE_VESTA             20

+ +

#define SE_INTP_APOG             21

+ +

#define SE_INTP_PERG             22

+ +

 

+ +

#define SE_NPLANETS             23

+ +

#define SE_FICT_OFFSET       40

+ +

#define SE_NFICT_ELEM                15

+ +

 

+ +

/* +Hamburger or Uranian "planets" */

+ +

 

+ +

#define SE_CUPIDO            40

+ +

#define SE_HADES             41

+ +

#define SE_ZEUS              42

+ +

#define SE_KRONOS            43

+ +

#define SE_APOLLON           44

+ +

#define SE_ADMETOS           45

+ +

#define SE_VULKANUS          46

+ +

#define SE_POSEIDON          47

+ +

 

+ +

/* other +fictitious bodies */

+ +

 

+ +

#define SE_ISIS              48

+ +

#define SE_NIBIRU            49

+ +

#define SE_HARRINGTON           50

+ +

#define SE_NEPTUNE_LEVERRIER      51

+ +

#define SE_NEPTUNE_ADAMS         52

+ +

#define SE_PLUTO_LOWELL          53

+ +

#define SE_PLUTO_PICKERING        54

+ +

 

+ +

#define +SE_AST_OFFSET     10000

+ +

 

+ +

 

+ +

Additional asteroids

+ +

 

+ +

Body numbers of other asteroids are above SE_AST_OFFSET (=10000) and have to be constructed as +follows:

+ +

ipl = SE_AST_OFFSET + +Minor_Planet_Catalogue_number;

+ +

e.g. Eros :  ipl = SE_AST_OFFSET +  433

+ +

The names of the asteroids and their +catalogue numbers can be found in seasnam.txt.

+ +

Examples are:

+ +

 

+ +

5              Astraea

+ +

6              Hebe    

+ +

7              Iris         

+ +

8              Flora

+ +

9              Metis

+ +

10              Hygiea  

+ +

30              Urania  

+ +

42              Isis              not identical with +"Isis-Transpluto"

+ +

153              Hilda              (has an own asteroid belt at 4 AU)

+ +

227              Philosophia        

+ +

251              Sophia  

+ +

259              Aletheia

+ +

275              Sapientia             

+ +

279              Thule              (asteroid close to Jupiter)

+ +

375              Ursula   

+ +

433              Eros      

+ +

763              Cupido              different from Witte's Cupido

+ +

944              Hidalgo 

+ +

1181              Lilith              (not identical with Dark Moon +'Lilith')

+ +

1221              Amor     

+ +

1387              Kama    

+ +

1388              Aphrodite           

+ +

1862              Apollo              (different from Witte's Apollon)

+ +

3553              Damocles              highly eccentric orbit betw. Mars +and Uranus

+ +

3753              Cruithne              ("second moon" of earth)

+ +

4341              Poseidon              Greek Neptune (different from +Witte's Poseidon)

+ +

4464              Vulcano              fire god (different from Witte's +Vulkanus and intramercurian Vulcan)

+ +

5731              Zeus              Greek Jupiter (different from +Witte's Zeus)

+ +

7066              Nessus              third named Centaur (beween Saturn +and Pluto)

+ +

 

+ +

 

+ +

There are two ephemeris files for +each asteroid (except the main asteroids), a long one and a short one:

+ +

 

+ +

se09999.se1     long-term ephemeris of asteroid number +9999, 3000 BC – 3000 AD

+ +

se09999s.se1     short ephemeris of asteroid number 9999, +1500 – 2100 AD

+ +

 

+ +

The larger file is about 10 times the +size of the short ephemeris. If the user does not want an ephemeris for the +time before 1500 he might prefer to work with the short files. If so, just copy +the files ending with ”s.se1” to your hard +disk. Swe_calc()tries the long one and on failure +automatically takes the short one.

+ +

Asteroid ephemerides are looked for in the +subdirectories ast0, ast1, ast2 .. ast9 etc of the +ephemeris directory and, if not found there, in the ephemeris directory itself. +Asteroids with numbers 0 – 999 are expected in directory ast0, those with numbers 1000 – 1999 in directory ast1 etc.

+ +

 

+ +

Note that  not all asteroids + can be computed for the whole period of Swiss Ephemeris. The +orbits of some of them are extremely sensitive to +perturbations by major planets. E.g. CHIRON, +cannot be computed for the time before 650 AD and after 4650 AD +because of close encounters with Saturn. Outside this time range, Swiss +Ephemeris returns the error code, an error message, and a position value 0. Be +aware, that the user will have to handlethis case in his +program. Computing Chiron transits for Jesus or Alexander the Great will not work.

+ +

The same is +true for Pholus before 3850 BC, and for many other asteroids, as e.g. +1862 Apollo. He becomes chaotic before the year 1870 AD, when he +approaches Venus very closely. Swiss Ephemeris does not provide positions of +Apollo for earlier centuries !

+ +

 

+ +

Note on asteroid names

+ +

Asteroid names are listed in the +file seasnam.txt. This file is in the ephemeris directory.

+ +

 

+ +

Fictitious planets

+ +

 

+ +

Fictitious planets have numbers greater +than or equal to 40. The user can define his or her own fictitious planets. The +orbital elements of these planets must be written into the file seorbel.txt. The function swe_calc()looks for the file seorbel.txt in the +ephemeris path set by swe_set_ephe_path(). +If no orbital elements file is found, swe_calc()uses the built-in orbital elements of the above mentioned Uranian planets and +some other bodies. The planet number of a fictitious planet is defined as

+ +

 

+ +

ipl = SE_FICT_OFFSET_1 + +number_of_elements_set;

+ +

 

+ +

e.g. for Kronos: ipl = 39 + 4 = 43.

+ +

 

+ +

The file seorbel.txt +has the following structure:

+ +

 

+ +
+ +

    # Orbital elements of fictitious planets

+ +

    # 27 Jan. 2000

+ +

    #

+ +

    # This file is part of the Swiss Ephemeris, from Version 1.60 +on.

+ +

    #

+ +

    # Warning! These planets do not exist!

+ +

    #

+ +

    # The user can add his or her own elements.

+ +

    # 960 is the maximum number of fictitious planets.

+ +

    #

+ +

    # The elements order is as follows:

+ +

    # 1. epoch of elements (Julian day)

+ +

    # 2. equinox (Julian day or "J1900" or +"B1950" or "J2000" or “JDATE”)

+ +

    # 3. mean anomaly at epoch

+ +

    # 4. semi-axis

+ +

    # 5. eccentricity

+ +

    # 6. argument of perihelion (ang. distance of perihelion from +node)

+ +

    # 7. ascending node

+ +

    # 8. inclination

+ +

    # 9. name of planet

+ +

    #

+ +

    # use '#' for comments

+ +

    # to compute a body with swe_calc(), use planet number

+ +

    # ipl = SE_FICT_OFFSET_1 + number_of_elements_set,

+ +

    # e.g. number of Kronos is ipl = 39 + 4 = 43

+ +

    #

+ +

    # Witte/Sieggruen planets, refined by James Neely

+ +

J1900, +J1900, 163.7409, 40.99837, 0.00460, 171.4333, 129.8325, 1.0833, Cupido   # 1

+ +

J1900, +J1900,  27.6496, 50.66744, 0.00245, +148.1796, 161.3339, 1.0500, Hades    # 2

+ +

J1900, +J1900, 165.1232, 59.21436, 0.00120, 299.0440,   +0.0000, 0.0000, Zeus     # 3

+ +

J1900, +J1900, 169.0193, 64.81960, 0.00305, 208.8801,   +0.0000, 0.0000, Kronos   # 4

+ +

J1900, +J1900, 138.0533, 70.29949, 0.00000,   0.0000,   0.0000, 0.0000, +Apollon  # 5

+ +

J1900, +J1900, 351.3350, 73.62765, 0.00000,   +0.0000,   0.0000, 0.0000, +Admetos  # 6

+ +

J1900, +J1900,  55.8983, 77.25568, 0.00000,   0.0000,   +0.0000, 0.0000, Vulcanus # 7

+ +

J1900, +J1900, 165.5163, 83.66907, 0.00000,   0.0000,   0.0000, 0.0000, Poseidon # 8

+ +

    #

+ +

    # Isis-Transpluto; elements from "Die Sterne" 3/1952, +p. 70ff.

+ +

    # Strubell does not give an equinox. 1945 is taken in order to

+ +

    # reproduce the as best as ASTRON ephemeris. (This is a strange +

+ +

    # choice, though.)

+ +

    # The epoch according to Strubell is 1772.76.

+ +

    # 1772 is a leap year!

+ +

    # The fraction is counted from 1 Jan. 1772

+ +

2368547.66, 2431456.5, +0.0, 77.775, 0.3, 0.7, 0, 0, Isis-Transpluto             # 9

+ +

    # Nibiru, elements from Christian Woeltge, Hannover

+ +

1856113.380954, +1856113.380954, 0.0, 234.8921, 0.981092, 103.966, -44.567, 158.708, Nibiru # 10

+ +

    # Harrington, elements from Astronomical Journal 96(4), Oct. +1988

+ +

2374696.5, J2000, 0.0, +101.2, 0.411, 208.5, 275.4, 32.4, Harrington             # 11

+ +

    # according to W.G. Hoyt, "Planets X and Pluto", +Tucson 1980, p. 63

+ +

2395662.5, 2395662.5, +34.05, 36.15, 0.10761, 284.75, 0, 0, Leverrier (Neptune)  # 12

+ +

2395662.5, 2395662.5, +24.28, 37.25, 0.12062, 299.11, 0, 0, Adams (Neptune)      # 13

+ +

2425977.5, 2425977.5, 281, +43.0, 0.202, 204.9, 0, 0, Lowell (Pluto)             # 14

+ +

2425977.5, +2425977.5, 48.95, 55.1, 0.31, 280.1, 100, 15, Pickering (Pluto)      # 15

+ +

J1900,JDATE, +252.8987988 + 707550.7341 * T, 0.13744, 0.019, 322.212069+1670.056*T, +47.787931-1670.056*T, 7.5, Vulcan # 16

+ +

# Selena/White Moon

+ +

J2000,JDATE, 242.2205555, +0.05279142865925, 0.0, 0.0, 0.0, 0.0, Selena/White Moon, geo # 17

+ +
+ +

 

+ +

All orbital +elements except epoch and equinox may have T  +terms, where

+ +

T = (tjd – epoch) +/ 36525.

+ +

(See, e.g., +Vulcan, the second last elements set (not the ”Uranian” Vulcanus but the +intramercurian hypothetical planet Vulcan).) ”T * T”, ”T2”, ”T3” are also +allowed.

+ +

The equinox can +either be entered as a Julian day or as ”J1900” or ”B1950” or ”J2000” or, if +the equinox of date is required, as ”JDATE”. If you use T terms, note that +precession has to be taken into account with JDATE, whereas it has to be +neglected with fixed equinoxes.

+ +

 

+ +

No T term is +required with the mean anomaly, i.e. for the speed of the body, because our +software can compute it from semi-axis and gravity. However, a mean anomaly T +term had to be added with Vulcan because its speed is not in agreement with the +laws of physics. In such cases, the software takes the speed given in the elements +and does not compute it internally.

+ +

 

+ +

From Version 1.62 +on, the software also accepts orbital elements for fictitious bodies that move +about the earth. As an example, study the last elements set in the excerpt of +seorbel.txt above. After the name of the body, ”, geo” has to be added.

+ +

 

+ +

 

+ +

 

+ +

Obliquity and nutation

+ +

 

+ +

A special body +number SE_ECL_NUT is provided to compute the obliquity of the ecliptic and +the nutation. Of course nutation is already added internally to the planetary +coordinates by swe_calc() but sometimes it will be +needed as a separate value.

+ +

 

+ +

iflgret = swe_calc(tjd_et, +SE_ECL_NUT, 0, x, serr);

+ +

 

+ +

x is an +array of 6 doubles as usual. They will be filled as follows:

+ +

 

+ +

x[0] = true obliqutiy of the Ecliptic +(includes nutation)

+ +

x[1] = mean obliquity of the Ecliptic

+ +

x[2] = nutation in longitude

+ +

x[3] = nutation in obliquity

+ +

x[4] = x[5] = 0

+ +

2.4. Options chosen by flag bits +(long  iflag)

+ +

2.4.1. The +use of flag bits

+ +

 

+ +

If no bits are set, i.e. if  iflag == 0, swe_calc() computes what common astrological ephemerides (as available in book +shops) supply, i.e. an apparent  body position in geocentric ecliptic +polar coordinates ( longitude, latitude, and distance) relative to the trueequinox of the date. +

+ +

If the speed of the body is +required, set iflag = SEFLG_SPEED

+ +

For mathematical points as the mean +lunar node and the mean apogee, there is no apparent position. Swe_calc()returns true positions for these points.

+ +

If you need another kind of computation, +use the flags explained in the following paragraphs (c.f. swephexp.h). Their names begin with ‚SEFLG_‘. To +combine them, you have to concatenate them (inclusive-or) as in the following +example:

+ +

iflag = +SEFLG_SPEED | SEFLG_TRUEPOS;  (or: iflag = SEFLG_SPEED + SEFLG_TRUEPOS;) // C

+ +

iflag = +SEFLG_SPEED or SEFLG_TRUEPOS;(or: iflag = +SEFLG_SPEED + SEFLG_TRUEPOS;) +// Pascal

+ +

 

+ +

With this value ofiflag, swe_calc() will compute true positions ( i.e. not accounted for light-time ) +with speed.

+ +

The flag bits, which are defined in swephexp.h, are:

+ +

 

+ +

#define +SEFLG_JPLEPH         1L     // use JPL ephemeris +

+ +

#define +SEFLG_SWIEPH         2L     // use SWISSEPH +ephemeris, default

+ +

#define +SEFLG_MOSEPH         4L     // use Moshier +ephemeris

+ +

 

+ +

#define +SEFLG_HELCTR              8L     // +return heliocentric position

+ +

#define +SEFLG_TRUEPOS      16L     // return true positions, not apparent

+ +

#define +SEFLG_J2000               32L     // +no precession, i.e. give J2000 equinox

+ +

#define +SEFLG_NONUT               64L     // +no nutation, i.e. mean equinox of date

+ +

#define +SEFLG_SPEED3              128L     // +speed from 3 positions (do not use it, SEFLG_SPEED is

+ +

                   // +faster and preciser.)

+ +

#define +SEFLG_SPEED               256L     // +high precision speed (analyt. comp.)

+ +

#define +SEFLG_NOGDEFL      512L     // turn off gravitational deflection

+ +

#define +SEFLG_NOABERR      1024L     // turn off 'annual' aberration of light

+ +

#define +SEFLG_EQUATORIAL     2048L     // equatorial positions are wanted

+ +

#define +SEFLG_XYZ                 4096L     // +cartesian, not polar, coordinates

+ +

#define +SEFLG_RADIANS            8192L     // +coordinates in radians, not degrees

+ +

#define +SEFLG_BARYCTR            16384L     // +barycentric positions

+ +

#define +SEFLG_TOPOCTR      (32*1024L)     // topocentric positions

+ +

#define SEFLG_SIDEREAL     (64*1024L)     // sidereal +positions

+ +

#define SEFLG_ICRS     (128*1024L)     // ICRS (DE406 reference frame)

+ +

2.4.2. Ephemeris +flags

+ +

 

+ +

The flags to choose an ephemeris +are: (s. swephexp.h)

+ +

 

+ +

SEFLG_JPLEPH           /* use JPL ephemeris */

+ +

SEFLG_SWIEPH           /* use Swiss Ephemeris */

+ +

SEFLG_MOSEPH           /* use Moshier ephemeris */

+ +

 

+ +

If none of this flags is specified, swe_calc() tries to compute the default ephemeris. The default ephemeris is +defined in +swephexp.h:

+ +

#define +SEFLG_DEFAULTEPH SEFLG_SWIEPH

+ +

In this case the default ephemeris +is Swiss Ephemeris. If you have not specified an +ephemeris iniflag, swe_calc() tries to compute a Swiss Ephemeris position. If it does not find +the required Swiss Ephemeris file either, it computes a Moshier position.

+ +

2.4.3. Speed flag

+ +

 

+ +

Swe_calc()does +not compute speed if you do not add the speed flag SEFLG_SPEED. E.g.

+ +

iflag |= SEFLG_SPEED;

+ +

The computation of speed is usually cheap, +so you may set this bit by default even if you do not need the speed.

+ +

 

+ +

2.4.4. Coordinate +systems, degrees and radians

+ +

 

+ +

SEFLG_EQUATORIAL              returns +equatorial positions: rectascension and declination.

+ +

SEFLG_XYZ                             returns x, +y, z coordinates instead of longitude, latitude, and distance.

+ +

SEFLG_RADIANS                      returns +position in radians, not degrees.

+ +

 

+ +

E.g. to compute rectascension and +declination, write:

+ +

iflag = SEFLG_SWIEPH | SEFLG_SPEED | +SEFLG_EQUATORIAL;

+ +

2.4.5. +Specialties (going beyond common interest)

+ +
a. True or apparent positions
+ +

Common ephemerides supply apparent geocentric positions. Since the journey of +the light from a planet to the earth takes some time, the planets are never +seen where they actually are, but where they were a few minutes or hours +before. Astrology uses to work with the positions we see. ( More +precisely: with the positions we would see, if we stood at the center of the +earth and could see the sky. Actually, the geographical position of the +observer could be of importance as well and topocentric positionscould be +computed, but this is usually not taken into account in astrology.). The +geocentric position for the earth (SE_EARTH) is returned as zero.

+ +

To compute the truegeometrical position of a planet, +disregarding light-time, you have to add the flag SEFLG_TRUEPOS.

+ +
b. Topocentric positions
+ +

To compute topocentric +positions, i.e. positions referred to the place of the observer (the birth +place) rather than to the center of the earth, do as follows:

+ +

·         +call swe_set_topo(geo_lon, +geo_lat, altitude_above_sea)  (The longitude and latitude must be in degrees, the altitude in meters.)

+ +

·        +add the flag SEFLG_TOPOCTR toiflag

+ +

·          +call swe_calc(...)

+ +
c. Heliocentric positions
+ +

To compute a heliocentric position, +add SEFLG_HELCTR.

+ +

A heliocentric position can be +computed for all planets including the moon. For the sun, lunar nodes and lunar apogees the coordinates are +returned as zero; no error message appears.

+ +
d. Barycentric positions
+ +

SEFLG_BARYCTR yields coordinates as +referred to the solar system barycenter. However, this option is not completely +implemented.  It was used for program +tests during development.  It works only +with the JPL and the Swiss Ephemeris, not with the Moshier ephemeris; +and only with physical bodies, but not with the nodes and the apogees.

+ +

Moreover, the barycentric Sun of +Swiss Ephemeris has ”only” a precision of 0.1”. Higher accuracy would have +taken a lot of storage, on the other hand it is not needed for precise +geocentric and heliocentric positions. For more precise barycentric positions +the JPL ephemeris file should be used.

+ +

A barycentric position can be +computed for +all planets including the sun and moon. For the +lunar nodes and lunar apogees the coordinates are returned as zero; no error +message appears.

+ +
e. Astrometric positions
+ +

For astrometric positions, which are +sometimes given in the Astronomical Almanac, the light-time correction is +computed, but annual aberration and the light-deflection by the sun neglected. +This can be done with SEFLG_NOABERR and SEFLG_NOGDEFL. For positions related to +the mean equinox of 2000, you must set SEFLG_J2000 and SEFLG_NONUT, as well.

+ +
f. True or mean equinox of date
+ +

Swe_calc() usually computes the +positions as referred to the true equinox of the date ( i.e. with nutation ). +If you want the mean equinox, you can turn nutation off, using the flag bit +SEFLG_NONUT.

+ +
g. J2000 positions and positions referred to +other equinoxes
+ +

Swe_calc() usually computes the +positions as referred to the equinox of date. SEFLG_J2000 yields data referred +to the equinox J2000. For positions referred to other equinoxes, SEFLG_SIDEREAL +has to be set and the equinox specified by swe_set_sid_mode(). For more information, read the description of this function.

+ +
h. Sidereal positions
+ +

To compute sidereal positions, set +bit SEFLG_SIDEREAL and use the function swe_set_sid_mode() in order to define the ayanamsha you want. For more information, read the description of this +function.

+ +

 

+ +

2.5. Position and Speed(double +xx[6])

+ +

 

+ +

swe_calc()returns +the coordinates of position and velocity in the following order:

+ +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Ecliptic position

+
+

Equatorial position ( SEFLG_EQUATORIAL + )

+
+

Longitude

+
+

Rectascension

+
+

Latitude

+
+

Declination

+
+

Distance in AU

+
+

distance in AU

+
+

Speed in + longitude (deg/day)

+
+

Speed in + rectascension (deg/day)

+
+

Speed in + latitude (deg/day)

+
+

Speed in + declination (deg/day)

+
+

Speed in + distance (AU/day)

+
+

Speed in + distance (AU/day)

+
+ +

 

+ +

If you need rectangular +coordinates ( SEFLG_XYZ ), swe_calc() returns x, y, z, dx, dy, dz in AU.

+ +

Once you have computed a planet, +e.g., in ecliptic coordinates, its equatorial position or its rectangular +coordinates are available, too.  You can +get them very cheaply ( little CPU time used ), calling again swe_calc()with the same parameters, but adding +SEFLG_EQUATORIAL or SEFLG_XYZ to iflag. +swe_calc() will not compute the body again, just +return the data specified from internal storage.

+ +

 

+ +

3. The function swe_get_planet_name()

+ +

This function allows to find a planetary or asteroid name, when the planet +number is given. The function definition is

+ +

char* swe_get_planet_name(int +ipl, char *spname);

+ +

 

+ +

If an asteroid name is wanted, the +function does the following:

+ +

 

+ +

·         +The name is first looked for in the +asteroid file.

+ +

·         +Because many asteroids, especially the +ones with high catalogue numbers, have no names yet (or have only a preliminary +designation like 1968 HB), and because the Minor Planet Center of the IAU add +new names quite often, it happens that there is no name in the asteroid file +although the asteroid has already been given a name. For this, we have the file +seasnam.txt, a file that contains a list of all named asteroid and is usually +more up to date. If swe_calc() finds a preliminary +designation, it looks for a name in this file.

+ +

 

+ +

The file seasnam.txt can be updated by the user. To do this, download the names list +from the Minor Planet Center http://cfa-www.harvard.edu/iau/lists/MPNames.html, +rename it as seasnam.txt and move it into your ephemeris directory.

+ +

 

+ +

The file seasnam.txt need not be ordered in any way. There must be one asteroid per +line, first its catalogue number, then its name. The asteroid number may or may +not be in brackets.

+ +

Example:

+ +

 

+ +

(3192) A'Hearn

+ +

(3654) AAS

+ +

(8721) AMOS

+ +

(3568) ASCII

+ +

(2848) ASP

+ +

(677) Aaltje

+ +

  ...

+ +

4. Fixed stars functions

+ +

4.1 swe_fixstar_ut

+ +

The function swe_fixstar_ut() was introduced with Swisseph version 1.60. It does exactly +the same as swe_fixstar() except that it expects Universal Time rather than Ephemeris time as +an input value. (cf. swe_calc_ut() and swe_calc())

+ +

The functions swe_fixstar_ut() and swe_fixstar()computes fixed stars. They are defined as follows:

+ +

 

+ +

long swe_fixstar_ut(char* +star, double +tjd_ut, long +iflag, +double* xx, +char* serr);

+ +

where

+ +

star              =name of +fixed star to be searched, returned name of found star

+ +

tjd_ut              =Julian day +in Universal Time

+ +

iflag       =an integer +containing several flags that indicate what      kind +of computation is wanted

+ +

xx              =array of 6 +doubles for longitude, latitude, distance, speed in long., speed in lat., and +speed in dist.

+ +

serr[256] =character string to contain error messages in case of +error.

+ +

 For more info, see below under 4.2. +swe_fixstar()

+ +

 

+ +

4.2 swe_fixstar()

+ +

long swe_fixstar(char +*star, +double tjd_et, long iflag, double* xx, char* serr);

+ +

same, but  +tjd_et= Julian day in Ephemeris Time

+ +

 

+ +

The  +parameter star must provide for at least 41 characters for the returned star name +(= 2 x SE_MAX_STNAME + 1, where SE_MAX_STNAME is defined in swephexp.h). If a star is found, its name is returned in this field in the +format
+
traditional_name, +nomenclature_namee.g. "Aldebaran,alTau".

+ +

 

+ +

The function has three modes to search for a star in the filefixstars.cat:

+ +

 

+ +

·         +star +contains a positive number ( in ASCII string format, e.g. "234"): The 234-th non-comment line in the file +fixstars.cat is used. Comment lines begin with # and are ignored.

+ +

·         +starcontains a traditional name: the first star in the file fixstars.cat is used whose traditional name fits the given name. All names are +mapped to lower case before comparison. If star has n +characters, only the first n characters of the traditional name field are compared. If a comma +appears after a non-zero-length traditional name, the traditional name is cut +off at the comma before the search. This allows the reuse of the returned star +name from a previous call in the next call.

+ +

·         +starbegins with a comma, followed by a nomenclature name, e.g. ",alTau": the star with this name in the +nomenclature field ( the second field ) is returned. Letter case is observed in +the comparison for nomenclature names.

+ +

 

+ +

For correct spelling of nomenclature +names, see file fixstars.cat. Nomenclature names are +usually composed of a Greek letter and the name of a star constellation. The +Greek letters were originally used to write numbers, therefore to number the +stars of the constellation. The abbreviated nomenclature names we use in fixstars.cat are constructed from two lowercase letters for the Greek letter +(e.g. ”al” for ”alpha”) and three letters for the +constellation (e.g. ”Tau” for ”Tauri”).

+ +

 

+ +

The function and the DLL should +survive damaged fixstars.cat files which contain +illegal data and star names exceeding the accepted length. Such fields are cut +to acceptable length.

+ +

There are two special entries in the file +fixstars.cat:

+ +

 

+ +

·         +an entry for the Galactic Center, +named "Gal. +Center" with one blank.

+ +

·         +a star named "AA_page_B40" which is the star calculation sample of Astronomical Almanac  (our bible of the last two years), page B40.

+ +

 

+ +

You may edit the star catalogue and +move the stars you prefer to the top of the file. This will increase the speed +of your computations. The search mode is linear through the whole star file for +each call of swe_fixstar().

+ +

As for the explanation of the other +parameters, see swe_calc().

+ +

Barycentric positions are not +implemented. The difference between geocentric and heliocentric fix star +position is noticeable and arises from parallax and gravitational deflection.

+ +

Attention:swe_fixstar()does +not compute speedsof the fixed stars. If you need them, +you have to compute them on your own, calling swe_fixstar()for a second ( and third ) time.

+ +

 

+ +

4.3 swe_fixstar_mag()

+ +

long swe_fixstar_mag(char *star, double* mag, char* serr);

+ +

 

+ +

Function calculates the magnitude of +a fixed star. The function returns OK or ERR. The magnitude value is returned +in the parameter mag.

+ +

For the definition and use of the +parameter star see function swe_fixstar(). The +parameter serr and is, as usually, an error +string pointer.

+ +

 

+ +

5. Apsides functions

+ +

5.1 swe_nod_aps_ut

+ +

The functions swe_nod_aps_ut() and swe_nod_aps() compute planetary nodes and apsides ( perihelia, aphelia, second focal +points of the orbital ellipses ). Both functions do exactly the same except +that they expect a different time parameter (cf. swe_calc_ut() and swe_calc() ).

+ +

 

+ +

The definitions are:

+ +

 

+ +

int32 swe_nod_aps_ut(double tjd_ut, int32 ipl, int32 iflag, int32 method, double *xnasc, double *xndsc, double *xperi, double *xaphe, char *serr);

+ +

where

+ +

tjd_ut             =Julian +day in Universal Time

+ +

ipl              =planet +number

+ +

iflag             =same +as with swe_calc_ut() and swe_fixstar_ut()

+ +

method             =another +integer that specifies the calculation method, see explanations below

+ +

xnasc             =array +of 6 doubles for ascending node

+ +

xndsc             =array +of 6 doubles for descending node

+ +

xperi             =array +of 6 doubles for perihelion

+ +

xaphe             =array +of 6 doubles for aphelion

+ +

serr[256]              =character +string to contain error messages in case of error.

+ +

5.2 swe_nod_aps()

+ +

int32 swe_nod_aps(double +tjd_et, int32 ipl, int32 iflag, int32 method, double *xnasc, double *xndsc, +double *xperi, double *xaphe, char *serr);

+ +

same, but

+ +

tjd_et     =     Julian day in Ephemeris Time

+ +

 

+ +

The parameter iflag allows the same specifications as with the function swe_calc_ut(). I.e., it contains the Ephemeris flag, the heliocentric, +topocentric, speed, nutation flags etc. etc.

+ +

The parameter method +tells the function what kind of nodes or apsides are required:

+ +

#define SE_NODBIT_MEAN          1

+ +

 

+ +

This is also the default. Mean nodes +and apsides are calculated for the bodies that have them, i.e. for the Moon and +the planets Mercury through Neptune, osculating ones for Pluto and the +asteroids.

+ +

#define +SE_NODBIT_OSCU          2

+ +

 

+ +

Osculating nodes and apsides are +calculated for all bodies.

+ +

#define +SE_NODBIT_OSCU_BAR     4

+ +

 

+ +

Osculating nodes and apsides are +calculated for all bodies. With planets beyond Jupiter, they are computed from +a barycentric ellipse. Cf. the explanations in swisseph.doc.

+ +

 

+ +

If this bit is combined with +SE_NODBIT_MEAN, mean values are given for the planets Mercury - Neptun.

+ +

#define +SE_NODBIT_FOPOINT     256

+ +

 

+ +

The second focal point of the orbital +ellipse is computed and returned in the array of the aphelion. This bit can be +combined with any other bit.

+ +

 

+ +

It is not meaningful to compute mean +oribital elements topocentrically. The concept of mean elements precludes +consideration of any short term fluctuations in coordinates.

+ +

 

+ +

6. Eclipse and planetary phenomena functions

+ +

 

+ +

There are the following functions +for eclipse and occultation calculations.

+ +

 

+ +

Solar eclipses:

+ +

·         +swe_sol_eclipse_when_loc( tjd...) finds +the next eclipse for a given geographic position.

+ +

·         +swe_sol_eclipse_when_glob( tjd...) +finds the next eclipse globally.

+ +

·         +swe_sol_eclipse_where() computes the +geographic location of a solar eclipse for a given tjd.

+ +

·         +swe_sol_eclipse_how() computes +attributes of a solar eclipse for a given tjd, +geographic longitude, +latitude and height.

+ +

 

+ +

Occultations of planets by the moon:

+ +

These functions can also be used for +solar eclipses. But they are slightly less efficient.

+ +

·         +swe_lun_occult_when_loc( tjd...) finds +the next occultation for a body and a given geographic position.

+ +

·         +swe_lun_occult_when_glob( tjd...) finds +the next occultation of a given body globally.

+ +

·         +swe_lun_occult_where() computes the +geographic location of an occultation for a given tjd.

+ +

 

+ +

Lunar eclipses:

+ +

·         +swe_lun_eclipse_when(tjd...) finds the +next lunar eclipse.

+ +

·         +swe_lun_eclipse_how() computes the attributes of a lunar eclipse for a given tjd.

+ +

 

+ +

Risings, settings, and meridian +transits of planets and stars:

+ +

·         +swe_rise_trans()

+ +

·         +swe_rise_trans_true_hor( ) +returns rising and setting times for a local horizon with altitude != 0

+ +

 

+ +

Planetary phenomena:

+ +

·         +swe_pheno_ut() and swe_pheno() compute phase angle, phase, elongation, apparent diameter, and +apparent magnitude of the Sun, the Moon, all planets and asteroids.

+ +

 

+ +

6.0. +Example of a typical eclipse calculation

+ +

Find +the next total eclipse, calculate the geographical position where it is maximal +and the four contacts for that position (for a detailed explanation of all +eclipse functions see the next chapters):

+ +

 

+ +

double tret[10], +attr[20], geopos[10];

+ +

char +serr[255];

+ +

int32 +whicheph = 0; /* default ephemeris */

+ +

double +tjd_start = 2451545; /* Julian day number for 1 Jan 2000 */

+ +

int32 +ifltype = SE_ECL_TOTAL ¦ SE_ECL_CENTRAL ¦ SE_ECL_NONCENTRAL;

+ +

/* find +next eclipse anywhere on earth */

+ +

eclflag = +swe_sol_eclipse_when_glob(tjd_start, whicheph,  +ifltype, tret, 0, serr);

+ +

if (eclflag == +ERR)

+ +

  return ERR;

+ +

/* the +time of the greatest eclipse has been returned in tret[0];

+ +

 * now we can find geographical position of +the eclipse maximum */

+ +

tjd_start += tret[0];

+ +

eclflag = +swe_sol_eclipse_where(tjd_start, whicheph, geopos, attr, serr);

+ +

if (eclflag == +ERR)

+ +

  return ERR;

+ +

/* the +geographical position of the eclipse maximum is in geopos[0] and geopos[1];

+ +

 * now we can calculate the four contacts for +this place. The start time is chosen

+ +

 * a day before the maximum eclipse: */

+ +

tjd_start += tret[0] - 1;

+ +

eclflag = +swe_sol_eclipse_when_loc(tjd_start, whicheph, geopos, tret, attr, 0, serr);

+ +

if (eclflag == +ERR)

+ +

  return ERR;

+ +

/* now +tret[] contains the following values:

+ +

 * tret[0] = time of greatest eclipse (Julian +day number)

+ +

 * tret[1] = first contact

+ +

 * tret[2] = second contact

+ +

 * tret[3] = third contact

+ +

 * tret[4] = fourth contact */

+ +

 

+ +

6.1. swe_sol_eclipse_when_loc() and +swe_lun_occult_when_loc()

+ +

 

+ +

To find the next +eclipse for a given geographic position, use swe_sol_eclipse_when_loc().

+ +

 

+ +

int32 swe_sol_eclipse_when_loc(

+ +

double +tjd_start,      /* start date for search, +Jul. day UT */

+ +

int32 ifl,      /* +ephemeris flag */

+ +

double +*geopos,      /* 3 doubles for geo. lon, +lat, height eastern longitude is positive,

+ +

                +western longitude is negative,  +northern latitude is positive,

+ +

                +southern latitude is negative */

+ +

double +*tret,      /* return array, 10 doubles, +see below */

+ +

double +*attr,      /* return array, 20 doubles, +see below */

+ +

AS_BOOL +backward,      /* TRUE, if backward search +*/

+ +

char +*serr);     /* return error string */

+ +

 

+ +

The function returns:

+ +

/* retflag     -1 (ERR) on error (e.g. if swe_calc() for +sun or moon fails)

+ +

              SE_ECL_TOTAL or SE_ECL_ANNULAR or +SE_ECL_PARTIAL

+ +

              SE_ECL_VISIBLE,

+ +

              SE_ECL_MAX_VISIBLE,

+ +

              SE_ECL_1ST_VISIBLE, SE_ECL_2ND_VISIBLE

+ +

              SE_ECL_3ST_VISIBLE, SE_ECL_4ND_VISIBLE

+ +

 

+ +

  tret[0]     time of maximum eclipse

+ +

  tret[1]     time +of first contact

+ +

  tret[2]     time +of second contact

+ +

  tret[3]     time +of third contact

+ +

  tret[4]     time +of forth contact

+ +

  tret[5]     time +of sunrise between first and forth contact (not implemented so far)

+ +

  tret[6]     time +of sunset beween first and forth contact  +(not implemented so far)

+ +

 

+ +

 attr[0]     fraction +of solar diameter covered by moon;

+ +

               with total/annular eclipses, it results in +magnitude acc. to IMCCE.

+ +

 attr[1]     ratio +of lunar diameter to solar one

+ +

 attr[2]     fraction +of solar disc covered by moon (obscuration)

+ +

 attr[3]     diameter +of core shadow in km

+ +

 attr[4]     azimuth +of sun at tjd

+ +

 attr[5]     true +altitude of sun above horizon at tjd

+ +

 attr[6]     apparent +altitude of sun above horizon at tjd

+ +

 attr[7]     elongation +of moon in degrees

+ +

 attr[8]             magnitude acc. to NASA;

+ +

                       = attr[0] for +partial and attr[1] for annular and total eclipses

+ +

 attr[9]     saros +series number

+ +

 attr[10]     saros +series member number

+ +

*/

+ +

 

+ +

6.2. swe_sol_eclipse_when_glob()

+ +

 

+ +

To find the next +eclipse globally:

+ +

int32 swe_sol_eclipse_when_glob(

+ +

double tjd_start,      /* start date for search, Jul. day UT */

+ +

int32 ifl,      /* +ephemeris flag */

+ +

int32 ifltype,      /* eclipse type wanted: SE_ECL_TOTAL etc. or 0, if any eclipse +type */

+ +

double *tret,      /* return array, 10 doubles, see below */

+ +

AS_BOOL backward,      /* TRUE, if backward search */

+ +

char *serr);       /* return error string */

+ +

 

+ +

This function requires the time +parameter tjd_start in Universal Time and also yields the +return values (tret[]) in UT.  For conversions between ET and UT, use the +function swe_deltat().

+ +

 

+ +

Note: An implementation of this +function with parameters in Ephemeris Time would have been possible. The +question when the next solar eclipse will happen anywhere on earth is +independent of the rotational position of the earth and therefore independent +of Delta T. However, the function is often used in combination with other +eclipse functions (see example below), for which input and output in ET makes +no sense, because they concern local circumstances of an eclipse and therefore are dependent on the rotational position +of the earth. For this reason, UT has been chosen for the time parameters of +all eclipse functions.

+ +

 

+ +

ifltype specifies the eclipse type +wanted. It can be a combination of the following bits (see swephexp.h):

+ +

 

+ +

#define SE_ECL_CENTRAL     1

+ +

#define SE_ECL_NONCENTRAL        2

+ +

#define SE_ECL_TOTAL                4

+ +

#define SE_ECL_ANNULAR           8

+ +

#define SE_ECL_PARTIAL           16

+ +

#define SE_ECL_ANNULAR_TOTAL     32

+ +

 

+ +

Recommended +values for ifltype:

+ +

/* search for any eclipse, no matter which type */

+ +

ifltype = +0; 

+ +

/* search +a total eclipse; note: non-central total eclipses are very rare */

+ +

ifltype = +SE_ECL_TOTAL ¦ SE_ECL_CENTRAL ¦ SE_ECL_NONCENTRAL;

+ +

/* search +an annular eclipse */

+ +

ifltype = +SE_ECL_TOTAL ¦ SE_ECL_CENTRAL ¦ SE_ECL_NONCENTRAL;

+ +

/* search +an annular-total (hybrid) eclipse */

+ +

ifltype_ = +SE_ECL_ANNULAR_TOTAL ¦ SE_ECL_CENTRAL ¦ SE_ECL_NONCENTRAL;

+ +

/* search +a partial eclipse */

+ +

ifltype = +SE_ECL_PARTIAL;

+ +

 

+ +

If your code +does not work, please study the sample code in swetest.c.

+ +

 

+ +

The function returns:

+ +

 

+ +

/* +retflag     -1 (ERR) on error (e.g. if +swe_calc() for sun or moon fails)

+ +

              SE_ECL_TOTAL +or SE_ECL_ANNULAR or SE_ECL_PARTIAL or SE_ECL_ANNULAR_TOTAL

+ +

              SE_ECL_CENTRAL

+ +

              SE_ECL_NONCENTRAL

+ +

 

+ +

  tret[0]     time +of maximum eclipse

+ +

  tret[1]     time, +when eclipse takes place at local apparent noon

+ +

  tret[2]     time +of eclipse begin

+ +

  tret[3]     time +of eclipse end

+ +

  tret[4]     time +of totality begin

+ +

  tret[5]     time +of totality end

+ +

  tret[6]     time +of center line begin

+ +

  tret[7]     time +of center line end

+ +

  tret[8]     time +when annular-total eclipse becomes total not implemented so far

+ +

  tret[9]     time +when annular-total eclipse becomes annular again not implemented so far

+ +

 

+ +

         declare as tret[10] at +least !

+ +

 */

+ +

6.3. swe_sol_eclipse_how ()

+ +

 

+ +

To calculate the attributes of an eclipse for a given geographic position +and time:

+ +

 

+ +

int32 swe_sol_eclipse_how(

+ +

double +tjd_ut,      /* time, Jul. day UT */

+ +

int32 ifl,      /* +ephemeris flag */

+ +

double +*geopos     /* geogr. longitude, latitude, +height above sea

+ +

                     * eastern longitude is +positive,

+ +

               * western longitude is negative,

+ +

               * northern latitude is positive,

+ +

               * southern latitude is negative */

+ +

double +*attr,      /* return array, 20 doubles, +see below */

+ +

char +*serr);     /* return error string */

+ +

 

+ +

/* retflag +     -1 (ERR) on error (e.g. if swe_calc() +for sun or moon fails)

+ +

              SE_ECL_TOTAL or SE_ECL_ANNULAR or +SE_ECL_PARTIAL

+ +

               0, +if no eclipse is visible at geogr. position.

+ +

 

+ +

 attr[0]     fraction +of solar diameter covered by moon;

+ +

               with total/annular eclipses, it results in +magnitude acc. to IMCCE.

+ +

 attr[1]     ratio +of lunar diameter to solar one

+ +

 attr[2]     fraction +of solar disc covered by moon (obscuration)

+ +

 attr[3]     diameter +of core shadow in km

+ +

 attr[4]     azimuth +of sun at tjd

+ +

 attr[5]     true +altitude of sun above horizon at tjd

+ +

 attr[6]     apparent +altitude of sun above horizon at tjd

+ +

 attr[7]     elongation +of moon in degrees

+ +

 attr[8]             magnitude acc. to NASA;

+ +

                       = attr[0] for +partial and attr[1] for annular and total eclipses

+ +

 attr[9]     saros +series number

+ +

 attr[10]     saros +series member number

+ +

 

+ +

6.4. swe_sol_eclipse_where ()

+ +

 

+ +

This function can be used to find out the geographic position, where, for a +given time, a central eclipse is central or where a non-central eclipse is +maximal.

+ +

If you want to draw the eclipse path of a total or annular eclipse on +a map, first compute the start and end time of the total or annular phase with swe_sol_eclipse_when_glob(), then call swe_sol_eclipse_how() for several +time intervals to get geographic positions on the central path. The northern +and southern limits of the umbra and penumbra are +not implemented yet.

+ +

 

+ +

int32 swe_sol_eclipse_where(

+ +

double tjd_ut,      /* time, Jul. day UT */

+ +

int32 ifl,      /* +ephemeris flag */

+ +

double *geopos,     /* return array, 2 doubles, geo. long. and lat.

+ +

               * eastern longitude is positive,

+ +

               * western longitude is negative,

+ +

               * northern latitude is positive,

+ +

               * southern latitude is negative */

+ +

double *attr,      /* return array, 20 doubles, see below */

+ +

char *serr);       /* return error string */

+ +

The function returns:

+ +

 

+ +

/* -1 (ERR)     on error (e.g. if swe_calc() for sun or moon fails)

+ +

  0      if there is no solar eclipse at tjd

+ +

  +SE_ECL_TOTAL

+ +

  +SE_ECL_ANNULAR

+ +

  +SE_ECL_TOTAL | SE_ECL_CENTRAL

+ +

  +SE_ECL_TOTAL | SE_ECL_NONCENTRAL

+ +

  +SE_ECL_ANNULAR | SE_ECL_CENTRAL

+ +

  SE_ECL_ANNULAR | SE_ECL_NONCENTRAL

+ +

  SE_ECL_PARTIAL

+ +

 

+ +

  +geopos[0]:     geographic longitude +of central line

+ +

  +geopos[1]:     geographic latitude +of central line

+ +

 

+ +

  +not implemented so far:

+ +

  +geopos[2]:     geographic longitude +of northern limit of umbra

+ +

  +geopos[3]:     geographic latitude +of northern limit of umbra

+ +

  +geopos[4]:     geographic longitude +of southern limit of umbra

+ +

  +geopos[5]:     geographic latitude +of southern limit of umbra

+ +

  +geopos[6]:     geographic longitude +of northern limit of penumbra

+ +

  +geopos[7]:     geographic latitude +of northern limit of penumbra

+ +

  +geopos[8]:     geographic longitude +of southern limit of penumbra

+ +

  +geopos[9]:     geographic latitude +of southern limit of penumbra

+ +

 

+ +

  +eastern longitudes are positive,

+ +

  +western longitudes are negative,

+ +

  +northern latitudes are positive,

+ +

  +southern latitudes are negative

+ +

 

+ +

  +attr[0]     fraction of solar +diameter covered by the moon

+ +

  +attr[1]     ratio of lunar diameter +to solar one

+ +

  +attr[2]     fraction of solar disc +covered by moon (obscuration)

+ +

  +attr[3]     diameter of core shadow +in km

+ +

  +attr[4]     azimuth of sun at tjd

+ +

  +attr[5]     true altitude of sun +above horizon at tjd

+ +

  +attr[6]     apparent altitude of +sun above horizon at tjd

+ +

  +attr[7]     angular distance of +moon from sun in degrees

+ +

  attr[8]            eclipse +magnitude (= attr[0] or attr[1] depending on eclipse type)

+ +

  attr[9]            saros +series number

+ +

  attr[10]               saros +series member number

+ +

 

+ +

      declare as attr[20]!

+ +

 */

+ +

 

+ +

6.5. swe_lun_occult_when_loc()

+ +

To find the next occultation of a planet or star +by the moon for a given location, use swe_lun_occult_when_loc().

+ +

The same +function can also be used for local solar eclipses instead of +swe_sol_eclipse_when_loc(), but is a bit less efficient.

+ +

 

+ +

/* Same declaration as +swe_sol_eclipse_when_loc().

+ +

 * +In addition:

+ +

 * +int32 ipl               planet number of occulted body

+ +

 * +char* starname          name of occulted star. Must be NULL or +"", if a planetary

+ +

 *                         occultation is to be calculated. For use of +this field,

+ +

 *                             see swe_fixstar().

+ +

 * +int32 ifl             ephemeris flag. If you want to have only one conjunction

+ +

 *                         of the moon with the body tested, add the +following flag:

+ +

 *                         backward |= SE_ECL_ONE_TRY. If this flag is +not set,

+ +

 *                         the function will search for an occultation +until it

+ +

 *                         finds one. For bodies with ecliptical +latitudes > 5,

+ +

 *                         the function may search successlessly until +it reaches

+ +

 *                         the end of the ephemeris.

+ +

 */

+ +

int32 swe_lun_occult_when_loc(

+ +

double +tjd_start,      /* start date for search, +Jul. day UT */

+ +

int32 ipl,      /* +planet number */

+ +

char* starname,      /* +star name, must be NULL or ”” if not a star */

+ +

int32 ifl,      /* +ephemeris flag */

+ +

double +*geopos,      /* 3 doubles for geo. lon, +lat, height eastern longitude is positive,

+ +

                +western longitude is negative,  +northern latitude is positive,

+ +

                +southern latitude is negative */

+ +

double +*tret,      /* return array, 10 doubles, +see below */

+ +

double +*attr,      /* return array, 20 doubles, +see below */

+ +

AS_BOOL +backward,      /* TRUE, if backward search +*/

+ +

char +*serr);     /* return error string */

+ +

 

+ +

If an occultation of any planet is wanted, call the function for all planets you want to +consider and find the one with the smallest tret[1] (first contact). (If +searching backward, find the one with the greatest tret[1]). For efficiency, +set ifl |= SE_ECL_ONE_TRY. With this flag, only the next conjunction of the +moon with the bodies is checked. If no occultation has been found, repeat the +calculation with tstart = tstart + 20.

+ +

 

+ +

The function returns:

+ +

/* retflag    

+ +

         -1 (ERR) on error (e.g. if swe_calc() +for sun or moon fails)

+ +

         0  +(if no occultation/no eclipse found)

+ +

              SE_ECL_TOTAL or SE_ECL_ANNULAR or +SE_ECL_PARTIAL

+ +

              SE_ECL_VISIBLE,

+ +

              SE_ECL_MAX_VISIBLE,

+ +

              SE_ECL_1ST_VISIBLE, SE_ECL_2ND_VISIBLE

+ +

              SE_ECL_3ST_VISIBLE, SE_ECL_4ND_VISIBLE

+ +

  These return values (except the +SE_ECL_ANNULAR) also appear with occultations.

+ +

 

+ +

  tret[0]     time +of maximum eclipse

+ +

  tret[1]     time +of first contact

+ +

  tret[2]     time +of second contact

+ +

  tret[3]     time +of third contact

+ +

  tret[4]     time +of forth contact

+ +

  tret[5]     time +of sunrise between first and forth contact (not implemented so far)

+ +

  tret[6]     time +of sunset beween first and forth contact  +(not implemented so far)

+ +

 

+ +

  attr[0]     fraction +of solar diameter covered by moon (magnitude)

+ +

  attr[1]     ratio +of lunar diameter to solar one

+ +

  attr[2]     fraction +of solar disc covered by moon (obscuration)

+ +

  attr[3]     diameter +of core shadow in km

+ +

  attr[4]     azimuth +of sun at tjd

+ +

  attr[5]     true +altitude of sun above horizon at tjd

+ +

  attr[6]     apparent +altitude of sun above horizon at tjd

+ +

  attr[7]     elongation +of moon in degrees     */

+ +

 

+ +

6.6. swe_lun_occult_when_glob()

+ +

To find the next occultation of a planet or star +by the moon globally (not for a particular geographic location), use +swe_lun_occult_when_glob().

+ +

The same +function can also be used for global solar eclipses instead of +swe_sol_eclipse_when_glob(), but is a bit less efficient.

+ +

 

+ +

/* Same declaration as +swe_sol_eclipse_when_glob().

+ +

 * +In addition:

+ +

 * +int32 ipl               planet number of occulted body

+ +

 * +char* starname          name of occulted star. Must be NULL or +"", if a planetary

+ +

 *                         occultation is to be calculated. For use of +this field,

+ +

 *                             see +swe_fixstar().

+ +

 * +int32 ifl             ephemeris flag. If you want to have only one conjunction

+ +

 *                         of the moon with the body tested, add the +following flag:

+ +

 *                         backward |= SE_ECL_ONE_TRY. If this flag is +not set,

+ +

 *                         the function will search for an occultation +until it

+ +

 *                         finds one. For bodies with ecliptical +latitudes > 5,

+ +

 *                         the function may search successlessly until +it reaches

+ +

 *                         the +end of the ephemeris.

+ +

 */

+ +

int32 swe_lun_occult_when_glob(

+ +

double +tjd_start,      /* start date for search, +Jul. day UT */

+ +

int32 ipl,      /* +planet number */

+ +

char* starname,      /* +star name, must be NULL or ”” if not a star */

+ +

int32 ifl,      /* +ephemeris flag */

+ +

int32 ifltype,      /* +eclipse type wanted */

+ +

double +*geopos,      /* 3 doubles for geo. lon, +lat, height eastern longitude is positive,

+ +

                +western longitude is negative,  +northern latitude is positive,

+ +

                +southern latitude is negative */

+ +

double +*tret,      /* return array, 10 doubles, +see below */

+ +

AS_BOOL +backward,      /* TRUE, if backward search +*/

+ +

char +*serr);     /* return error string */

+ +

 

+ +

If an occultation of any planet is wanted, call the function for all planets you want to +consider and find the one with the smallest tret[1] (first contact). (If +searching backward, find the one with the greatest tret[1]). For efficiency, +set ifl |= SE_ECL_ONE_TRY. With this flag, only the next conjunction of the +moon with the bodies is checked. If no occultation has been found, repeat the +calculation with tstart = tstart + 20.

+ +

 

+ +

The function returns:

+ +

 

+ +

/* +retflag    

+ +

         -1 (ERR) on error (e.g. if swe_calc() +for sun or moon fails)

+ +

         0  +(if no occultation / eclipse has been found)

+ +

              SE_ECL_TOTAL +or SE_ECL_ANNULAR or SE_ECL_PARTIAL or SE_ECL_ANNULAR_TOTAL

+ +

              SE_ECL_CENTRAL

+ +

              SE_ECL_NONCENTRAL

+ +

 

+ +

  tret[0]     time +of maximum eclipse

+ +

  tret[1]     time, +when eclipse takes place at local apparent noon

+ +

  tret[2]     time +of eclipse begin

+ +

  tret[3]     time +of eclipse end

+ +

  tret[4]     time +of totality begin

+ +

  tret[5]     time +of totality end

+ +

  tret[6]     time +of center line begin

+ +

  tret[7]     time +of center line end

+ +

  tret[8]     time +when annular-total eclipse becomes total not implemented so far

+ +

  tret[9]     time +when annular-total eclipse becomes annular again not implemented so far

+ +

 

+ +

         declare as tret[10] at +least !

+ +

 */

+ +

 

+ +

6.7. swe_lun_occult_where ()

+ +

 

+ +

Similar to swe_sol_eclipse_where(), +this function can be used to find out the geographic position, where, for a +given time, a central eclipse is central or where a non-central eclipse is +maximal. With occultations, it tells us, at which geographic location the +occulted body is in the middle of the lunar disc or closest to it. Because +occultations are always visible from a very large area, this is not very +interesting information. But it may

+ +

become more interesting as soon as +the limits of the umbra (and penumbra) will be implemented.

+ +

 

+ +

int32 swe_lun_occult_where (

+ +

double tjd_ut,      /* time, Jul. day UT */

+ +

int32 ipl,      /* +planet number */

+ +

char* starname,      /* +star name, must be NULL or ”” if not a star */

+ +

int32 ifl,      /* +ephemeris flag */

+ +

double *geopos,     /* return array, 2 doubles, geo. long. and lat.

+ +

               * eastern longitude is positive,

+ +

               * western longitude is negative,

+ +

               * northern latitude is positive,

+ +

               * southern latitude is negative */

+ +

double *attr,      /* return array, 20 doubles, see below */

+ +

char *serr);       /* return error string */

+ +

The function returns:

+ +

 

+ +

/* -1 (ERR)     on error (e.g. if swe_calc() for sun or moon fails)

+ +

  0      if there is no solar eclipse (occultation) +at tjd

+ +

  +SE_ECL_TOTAL

+ +

  +SE_ECL_ANNULAR

+ +

  +SE_ECL_TOTAL | SE_ECL_CENTRAL

+ +

  +SE_ECL_TOTAL | SE_ECL_NONCENTRAL

+ +

  +SE_ECL_ANNULAR | SE_ECL_CENTRAL

+ +

  SE_ECL_ANNULAR | SE_ECL_NONCENTRAL

+ +

  SE_ECL_PARTIAL

+ +

 

+ +

  +geopos[0]:     geographic longitude +of central line

+ +

  +geopos[1]:     geographic latitude +of central line

+ +

 

+ +

  +not implemented so far:

+ +

  +geopos[2]:     geographic longitude +of northern limit of umbra

+ +

  +geopos[3]:     geographic latitude +of northern limit of umbra

+ +

  +geopos[4]:     geographic longitude +of southern limit of umbra

+ +

  +geopos[5]:     geographic latitude +of southern limit of umbra

+ +

  +geopos[6]:     geographic longitude +of northern limit of penumbra

+ +

  +geopos[7]:     geographic latitude +of northern limit of penumbra

+ +

  +geopos[8]:     geographic longitude +of southern limit of penumbra

+ +

  +geopos[9]:     geographic latitude +of southern limit of penumbra

+ +

 

+ +

  +eastern longitudes are positive,

+ +

  +western longitudes are negative,

+ +

  +northern latitudes are positive,

+ +

  +southern latitudes are negative

+ +

 

+ +

  +attr[0]     fraction of solar +diameter covered by moon (magnitude)

+ +

  +attr[1]     ratio of lunar diameter +to solar one

+ +

  +attr[2]     fraction of solar disc +covered by moon (obscuration)

+ +

  +attr[3]     diameter of core shadow +in km

+ +

  +attr[4]     azimuth of sun at tjd

+ +

  +attr[5]     true altitude of sun +above horizon at tjd

+ +

  +attr[6]     apparent altitude of +sun above horizon at tjd

+ +

  +attr[7]     angular distance of +moon from sun in degrees

+ +

 

+ +

      declare as attr[20]!

+ +

 */

+ +

6.8. swe_lun_eclipse_when ()

+ +

To find the next +lunar eclipse:

+ +

 

+ +

int32 swe_lun_eclipse_when(

+ +

double tjd_start,      /* start date for search, Jul. day UT */

+ +

int32 ifl,      /* +ephemeris flag */

+ +

int32 ifltype,      /* eclipse type wanted: SE_ECL_TOTAL etc.  or 0, if any eclipse type */

+ +

double *tret,      /* return array, 10 doubles, see below */

+ +

AS_BOOL backward,      /* TRUE, if backward search */

+ +

char *serr);       /* return error string */

+ +

 

+ +

Recommended +values for ifltype:

+ +

/* search for any lunar eclipse, no matter which type */

+ +

ifltype = +0; 

+ +

/* search +a total lunar eclipse */

+ +

ifltype = +SE_ECL_TOTAL;

+ +

/* search +a partial lunar eclipse */

+ +

ifltype = +SE_ECL_PARTIAL;

+ +

/* search +a penumbral lunar eclipse */

+ +

ifltype = +SE_ECL_PENUMBRAL;

+ +

 

+ +

If your code +does not work, please study the sample code in swetest.c.

+ +

 

+ +

The function returns:

+ +

 

+ +

/* retflag      -1 (ERR) on error (e.g. if swe_calc() for sun or moon fails)

+ +

              SE_ECL_TOTAL +or SE_ECL_PENUMBRAL or SE_ECL_PARTIAL

+ +

  +tret[0]     time of maximum eclipse

+ +

  +tret[1] 

+ +

  +tret[2]     time of partial phase +begin (indices consistent with solar eclipses)

+ +

  +tret[3]     time of partial phase +end

+ +

  +tret[4]     time of totality begin

+ +

  +tret[5]     time of totality end

+ +

  +tret[6]     time of penumbral phase +begin

+ +

  +tret[7]     time of penumbral phase +end

+ +

 */

+ +

 

+ +

6.9. swe_lun_eclipse_how ()

+ +

 

+ +

This function computes the attributes of a lunar eclipse at a given time:

+ +

 

+ +

int32 swe_lun_eclipse_how(

+ +

double tjd_ut,      /* time, Jul. day UT */

+ +

int32 ifl,      /* +ephemeris flag */

+ +

double *geopos,      /* input array, geopos, geolon, geoheight

+ +

               eastern longitude is positive,

+ +

               western longitude is negative,

+ +

               northern latitude is positive,

+ +

               southern latitude is negative */

+ +

double *attr,      /* return array, 20 doubles, see below */

+ +

char *serr);       /* return error string */

+ +

 

+ +

The function returns:

+ +

 

+ +

/* retflag      -1 (ERR) on error (e.g. if swe_calc() for sun or moon fails)

+ +

              SE_ECL_TOTAL +or SE_ECL_PENUMBRAL or SE_ECL_PARTIAL

+ +

               0   +if there is no eclipse

+ +

 

+ +

attr[0]     umbral +magnitude at tjd

+ +

attr[1]     penumbral +magnitude

+ +

attr[4]     azimuth +of moon at tjd. Not implemented so far

+ +

attr[5]     true +altitude of moon above horizon at tjd. Not implemented so far

+ +

attr[6]     apparent +altitude of moon above horizon at tjd. Not implemented so far

+ +

attr[7]     distance +of moon from opposition in degrees

+ +

attr[8]              eclipse magnitude (= attr[0])

+ +

attr[9]              saros series number

+ +

attr[10]            saros series member number

+ +

 

+ +

          +declare +as attr[20] at least !

+ +

 */

+ +

6.10. swe_rise_trans() and swe_rise_trans_true_hor() +(risings, settings, meridian transits)

+ +

 

+ +

The function swe_rise_trans() +computes the times of rising, setting and meridian +transits for all planets, asteroids, the moon, and the fixed stars. The +function swe_rise_trans_true_hor() does the same for a local horizon that has +an altitude != 0. Their definitions are as follows:

+ +

 

+ +

int32 swe_rise_trans(

+ +

double tjd_ut,      /* search after this time (UT) */

+ +

int32 ipl,           /* planet number, if +planet or moon */

+ +

char *starname,      /* star name, if star */

+ +

int32 epheflag,      /* ephemeris flag */

+ +

int32 rsmi,          /* integer specifying +that rise, set, orone of the two meridian transits is

+ +

               wanted. see definition below */

+ +

double *geopos,      /* array of three doubles containing

+ +

               * geograph. long., lat., height of observer +*/

+ +

double atpress,      /* atmospheric pressure in mbar/hPa */

+ +

double attemp,     /* atmospheric temperature in deg. C */

+ +

double *tret,          /* return address +(double) for rise time etc. */

+ +

char *serr);       /* return address for +error message */

+ +

 

+ +

int32 swe_rise_trans_true_hor(

+ +

double tjd_ut,      /* search after this time (UT) */

+ +

int32 ipl,           /* planet number, if +planet or moon */

+ +

char *starname,      /* star name, if star */

+ +

int32 epheflag,      /* ephemeris flag */

+ +

int32 rsmi,          /* integer specifying +that rise, set, orone of the two meridian transits is

+ +

               wanted. see definition below */

+ +

double *geopos,      /* array of three doubles containing

+ +

               * geograph. long., lat., height of observer +*/

+ +

double atpress,      /* atmospheric pressure in mbar/hPa */

+ +

double attemp,     /* atmospheric temperature in deg. C */

+ +

double horhgt,     /* height of local horizon in deg at the point where the body +rises or sets*/

+ +

double *tret,          /* return address +(double) for rise time etc. */

+ +

char *serr);       /* return address for +error message */

+ +

 

+ +

The second function has one +additional parameter horhgt for the height of the local horizon at the point +where the body rises or sets.

+ +

 

+ +

The variable +rsmi can have the following values:

+ +

 

+ +

/* +for swe_rise_transit() and swe_rise_transit_true_hor() */

+ +

#define SE_CALC_RISE     1

+ +

#define SE_CALC_SET     2

+ +

#define +SE_CALC_MTRANSIT     4     /* upper meridian transit (southern for +northern geo. latitudes) */

+ +

#define +SE_CALC_ITRANSIT     8     /* lower meridian transit (northern, below +the horizon) */

+ +

/* +the following bits can be added (or’ed) to SE_CALC_RISE or SE_CALC_SET */

+ +

#define +SE_BIT_DISC_CENTER         256     /* for rising or setting of disc center +*/

+ +

#define SE_BIT_DISC_BOTTOM      +8192     /* for rising or setting +of lower limb of disc */

+ +

#define +SE_BIT_NO_REFRACTION    512      /* if refraction is not to be +considered */

+ +

#define +SE_BIT_CIVIL_TWILIGHT    1024    /* in order to calculate civil twilight +*/

+ +

#define +SE_BIT_NAUTIC_TWILIGHT 2048    /* +in order to calculate nautical twilight */

+ +

#define +SE_BIT_ASTRO_TWILIGHT   4096    /* in order to calculate astronomical +twilight */

+ +

#define SE_BIT_FIXED_DISC_SIZE (16*1024) /* neglect the effect of +distance on disc size */

+ +

 

+ +

rsmi = 0 will return risings.

+ +

The rising times depend on the atmospheric pressure and temperature. atpress expects the atmospheric pressure in millibar (hectopascal); attemp the temperature in degrees Celsius.

+ +

If atpress is given the value 0, the function estimates the pressure from the +geographical altitude given in geopos[2] and attemp. If +geopos[2] is 0, atpress will be estimated for sea level.

+ +

 

+ +

 

+ +

6.11. swe_pheno_ut() and swe_pheno(), +planetary phenomena

+ +

 

+ +

These functions compute phase, phase angle, elongation, apparent diameter, +apparent magnitude for the Sun, the Moon, all planets and asteroids. The +two functions do exactly the same but expect a different time parameter.

+ +

 

+ +

int32 swe_pheno_ut(

+ +

double tjd_ut,     /* time Jul. Day UT */

+ +

int32 ipl,           /* planet number */

+ +

int32 iflag,      /* +ephemeris flag */

+ +

double *attr,      /* return array, 20 doubles, see below */

+ +

char *serr);       /* return error string */

+ +

 

+ +

int32 swe_pheno(

+ +

double tjd_et,     /* time Jul. Day ET */

+ +

int32 ipl,           /* planet number */

+ +

int32 iflag,      /* ephemeris flag */

+ +

double *attr,      /* return array, 20 doubles, see below */

+ +

char *serr);       /* return error string */

+ +

 

+ +

The function returns:

+ +

/*

+ +

  +attr[0] = phase angle (earth-planet-sun)

+ +

  +attr[1] = phase (illumined fraction of disc)

+ +

  +attr[2] = elongation of planet

+ +

  +attr[3] = apparent diameter of disc

+ +

  +attr[4] = apparent magnitude

+ +

 

+ +

          +declare +as attr[20] at least !

+ +

 

+ +

  +Note: the lunar magnitude is quite a complicated thing,

+ +

  +but our algorithm is very simple.

+ +

  +The phase of the moon, its distance from the earth and

+ +

  +the sun is considered, but no other factors.

+ +

 

+ +

  iflag also allows SEFLG_TRUEPOS, SEFLG_HELCTR

+ +

 */

+ +

 

+ +

6.12. swe_azalt(), horizontal coordinates, +azimuth, altitude

+ +

 

+ +

swe_azalt()computes the horizontal coordinates +(azimuth and altitude) of a planet or a star from either ecliptical or +equatorial coordinates.

+ +

 

+ +

void swe_azalt(

+ +

      double tjd_ut,     // +UT

+ +

      +int32 calc_flag,     // SE_ECL2HOR or SE_EQU2HOR

+ +

      double *geopos,     // array of 3 doubles: geograph. long., +lat., height

+ +

      double atpress,     // atmospheric pressure in mbar (hPa)

+ +

      double attemp,     // atmospheric temperature in degrees +Celsius

+ +

      double *xin,      // array of 3 doubles: position of body in +either  ecliptical or equatorial +coordinates,

+ +

                     // depending on calc_flag

+ +

      double *xaz);      // return array of 3 doubles, containing +azimuth, true altitude, apparent altitude

+ +

 

+ +

If calc_flag=SE_ECL2HOR, +set xin[0]= ecl. long., xin[1]= ecl. lat., (xin[2]=distance (not required));

+ +

else

+ +

if calc_flag= +SE_EQU2HOR, set xin[0]=rectascension, xin[1]=declination, (xin[2]= distance +(not required));

+ +

 

+ +

#define +SE_ECL2HOR          0

+ +

#define +SE_EQU2HOR          1

+ +

 

+ +

The return values are:

+ +

xaz[0] = azimuth, +i.e. position degree, measured from the south point to west.

+ +

xaz[1] = true altitude +above horizon in degrees.

+ +

xaz[2] = apparent (refracted) altitude +above horizon in degrees.

+ +

 

+ +

The apparent altitude of a body +depends on the atmospheric pressure and temperature. If only the true altitude +is required, these parameters can be neglected.

+ +

If atpress is given the value 0, the function estimates the pressure from the +geographical altitude given in geopos[2] and attemp. If geopos[2] is 0, atpress will be estimated for sea level.

+ +

 

+ +

6.13. swe_azalt_rev()

+ +

The function swe_azalt_rev()is not precisely the reverse of swe_azalt(). It computes either ecliptical or equatorial coordinates from +azimuth and true altitude. If only an apparent altitude is given, the true +altitude has to be computed first with the function swe_refrac() (see below).

+ +

It is defined as follows:

+ +

 

+ +

void swe_azalt_rev(

+ +

      +double tjd_ut,

+ +

      int32 calc_flag,     /* either SE_HOR2ECL or SE_HOR2EQU */

+ +

      +double *geopos,     /* array of 3 +doubles for geograph. pos. of observer */

+ +

      +double *xin,      /* array of 2 doubles for azimuth and true +altitude of planet */

+ +

      +double *xout);      // return array +of 2 doubles for either ecliptic or

+ +

                   // +equatorial coordinates, depending on calc_flag

+ +

 

+ +

For the definition of the azimuth +and true altitude, see chapter 4.9 on swe_azalt().

+ +

#define +SE_HOR2ECL     0

+ +

#define +SE_HOR2EQU          1

+ +

6.14. swe_refrac(), +swe_refract_extended(), refraction

+ +

The refraction +function swe_refrac()calculates either the true altitude from +the apparent altitude or the apparent altitude from the apparent altitude. Its +definition is:

+ +

 

+ +

double swe_refrac(

+ +

double inalt,

+ +

double atpress,      /* atmospheric pressure in mbar (hPa) */

+ +

double attemp,      /* atmospheric temperature in degrees Celsius */

+ +

int32 calc_flag);     /* either SE_TRUE_TO_APP or SE_APP_TO_TRUE */

+ +

where

+ +

#define SE_TRUE_TO_APP  0

+ +

#define SE_APP_TO_TRUE       1

+ +

 

+ +

The refraction depends on the +atmospheric pressure and temperature at the location of the observer.

+ +

If atpress is given the value 0, the function estimates the pressure from the +geographical altitude given in geopos[2] and attemp. If geopos[2] is 0, atpress will be estimated for sea level.

+ +

 

+ +

There is also a more sophisticated +function swe_refrac_extended(),  It allows correct +calculation of refraction for altitudes above sea > 0, where the ideal +horizon and planets that are visible may have a negative height. (for +swe_refrac(), negative apparent heights do not exist!)

+ +

 

+ +

double swe_refract_extended(

+ +

double inalt,      /* altitude of object above geometric horizon in degrees, where

+ +

                           geometric horizon = plane perpendicular to +gravity */

+ +

double geoalt,      /* altitude of observer above sea level in meters */

+ +

double atpress,      /* atmospheric pressure in mbar (hPa) */

+ +

double lapse_rate,      /* (dattemp/dgeoalt) = [°K/m] */

+ +

double attemp,      /* atmospheric temperature in degrees Celsius */

+ +

int32 calc_flag);     /* either SE_TRUE_TO_APP or SE_APP_TO_TRUE */

+ +

 

+ +

function returns:

+ +

case 1, conversion from true +altitude to apparent altitude:

+ +

- apparent altitude, if body appears +above is observable above ideal horizon

+ +

- true altitude (the input value), +otherwise

+ +

  +"ideal horizon" is the horizon as seen above an ideal sphere +(as seen from a plane over the ocean with

+ +

  +a clear sky)

+ +

case 2, conversion from apparent +altitude to true altitude:

+ +

- the true altitude resulting from +the input apparent altitude, if this value is a plausible apparent altitude,

+ +

  +i.e. if it is a position above the ideal horizon

+ +

- the input altitude otherwise

+ +

 

+ +

in addition the array dret[] returns +the following values

+ +

- dret[0] true altitude, if +possible; otherwise input value

+ +

- dret[1] apparent altitude, if +possible; otherwise input value

+ +

- dret[2] refraction

+ +

- dret[3] dip of the horizon

+ +

 

+ +

The body is above the horizon if the +dret[0] != dret[1]

+ +

 

+ +

6.15. Heliacal risings etc.: +swe_heliacal_ut()

+ +

The function swe_heliacal_ut()the Julian day of the next heliacal +phenomenon after a given start date. It works between geographic latitudes 60s +– 60n.

+ +

 

+ +

int32 swe_heliacal_ut(

+ +

double tjdstart,      /* Julian day number of start date for the search of the +heliacal event */

+ +

double *dgeo                /* geographic position (details below) */

+ +

double *datm,      /* atmospheric conditions (details below) */

+ +

double *dobs,      /* observer description (details below) */

+ +

char *objectname,        /* name string of fixed star or planet +*/

+ +

int32 event_type,      /* event type (details below) */

+ +

int32 helflag,      /* calculation flag, bitmap (details below) */

+ +

double *dret,     /* result: array of at least 50 doubles, of which 3 are used at +the moment */

+ +

char * serr     /* error string */

+ +

);     

+ +

 

+ +

Function +returns OK or ERR

+ +

 

+ +

Details for dgeo[] (array of +doubles):

+ +

        dgeo[0]: geographic longitude

+ +

        dgeo[1]: geographic latitude

+ +

        dgeo[2]: geographic altitude (eye +height) in meters

+ +

 

+ +

Details for datm[] (array of +doubles):

+ +

        datm[0]: atmospheric pressure in mbar +(hPa)

+ +

        datm[1]: atmospheric temperature in +degrees Celsius

+ +

        datm[2]: relative humidity in %

+ +

        datm[3]: if datm[3]>=1, then it is +Meteorological Range [km]

+ +

    +         if 1>datm[3]>0, +then it is the total atmsopheric coeffcient (ktot)

+ +

                      datm[3]=0, then the +other atmospheric parameters determine the total

+ +

                                                                                        + atmsopheric coeffcient (ktot)

+ +

        Default values:

+ +

        If this is too much for you, set all +these values to 0. The software will then set the following defaults:

+ +

        Pressure 1013.25, temperature 15, +relative humidity 40. The values will be modified depending

+ +

        on the altitude of the observer above +sea level.

+ +

        If the extinction coefficient +(meteorological range) datm[3] is 0, the software will calculate its value

+ +

        from datm[0..2].

+ +

 

+ +

Details for dobs[] (array of +doubles):

+ +

        dobs[0]: age of observer in years (default = 36)

+ +

        dobs[1]: Snellen ratio of observers +eyes (default = 1 = normal)

+ +

The +following parameters are only relevant if the flag SE_HELFLAG_OPTICAL_PARAMS is +set:

+ +

        dobs[2]: 0 = monocular, 1 = binocular +(actually a boolean)

+ +

        dobs[3]: telescope magnification: 0 = +default to naked eye (binocular), 1 = naked eye

+ +

        dobs[4]: optical aperture (telescope +diameter) in mm

+ +

        dobs[5]: optical transmission

+ +

 

+ +

Details for event_type:

+ +

        event_type = SE_HELIACAL_RISING (1): +morning first (exists for all visible planets and stars)

+ +

        event_type = SE_HELIACAL_SETTING (2): +evening last (exists for all visible planets and stars)

+ +

        event_type = SE_EVENING_FIRST (3): +evening first (exists for Mercury, Venus, and the Moon)

+ +

        event_type = SE_MORNING_LAST (4): +morning last (exists for Mercury, Venus, and the Moon)

+ +

 

+ +

Details for helflag:

+ +

        helflag contains ephemeris flag, like +iflag in swe_calc() etc. In addition it can contain the following bits:

+ +

        SE_HELFLAG_LONG_SEARCH (128): A +heliacal event is searched until found.

+ +

             If this bit is NOT set and no +event is found within 5 synodic periods, the function stops

+ +

             searching and  returns ERR.

+ +

        SE_HELFLAG_HIGH_PRECISION (256): More +rigorous but also slower algorithms are used

+ +

        SE_HELFLAG_OPTICAL_PARAMS (512): Use +this with calculations for optical instruments.

+ +

              Unless this bit is set, the +values of dobs[2-5] are ignored.

+ +

        SE_HELFLAG_NO_DETAILS (1024): provide +the date, but not details like visibility start, optimum, and end.

+ +

              This bit makes the program a bit +faster.

+ +

 

+ +

Details for return array dret[] +(array of doubles):

+ +

        dret[0]: start visibility (Julian day +number)

+ +

        dret[1]: optimum visibility (Julian +day number)

+ +

        dret[2]: end of visibility (Julian day +number)

+ +

 

+ +

6.16. Magnitude limit for visibility: +swe_vis_limit_mag()

+ +

The function swe_vis_lim_mag()determines the limiting visual magnitude +in dark skies:

+ +

 

+ +

double swe_vis_limit_mag(

+ +

double tjdut,      /* Julian day number */

+ +

double *dgeo                /* geographic position (details under +swe_heliacal_ut() */

+ +

double *datm,      /* atmospheric conditions (details under swe_heliacal_ut()) */

+ +

double *dobs,      /* observer description (details under swe_heliacal_ut()) */

+ +

char *objectname,        /* name string of fixed star or planet +*/

+ +

int32 helflag,      /* calculation flag, bitmap (details under swe_heliacal_ut()) */

+ +

double *dret,     /* result: magnitude required of the object to be visible */

+ +

char * serr     /* error string */

+ +

);     

+ +

 

+ +

Function +returns

+ +

         -1      on +error

+ +

         -2                   object +is below horizon

+ +

         0       OK, +photopic vision

+ +

         &1     OK, scotopic vision

+ +

         &2     OK, near limit photopic/scotopic vision

+ +

 

+ +

7. Date and time conversion functions

+ +

7.1 Calendar Date and Julian Day: swe_julday(), +swe_date_conversion(), /swe_revjul()

+ +

These functions are needed to +convert calendar dates to the astronomical time scale which measures time in +Julian days.

+ +

double swe_julday(int +year, int month, int day, double hour, int gregflag);

+ +

 

+ +

int swe_date_conversion +(

+ +

         int +y , int m , int d ,     /* year, month, +day */

+ +

     +     double hour,                /* hours (decimal, with fraction) */

+ +

     +     char c,                 /* +calendar ‘g’[regorian]|’j’[ulian] */

+ +

         double +*tjd);               /* return value for +Julian day */

+ +

 

+ +

void swe_revjul +(

+ +

         double +tjd,         /* +Julian day number */

+ +

         int +gregflag,       /* Gregorian calendar: 1, Julian calendar: 0 */

+ +

         int +*year,       /* +target addresses for year, etc. */

+ +

         int +*month, int *day, double *hour);

+ +

 

+ +

swe_julday()and swe_date_conversion() compute a Julian +day number from year, month, day, and hour. swe_date_conversion()checks in addition whether +the date is legal. It returns OK or ERR.

+ +

swe_revjul() is the reverse function of +swe_julday().It computes year, month, day and hour from a Julian day +number.

+ +

 

+ +

The variable gregflag tells the function whether the input date is Julian calendar ( gregflag = SE_JUL_CAL) or Gregorian calendar ( gregflag = SE_GREG_CAL).

+ +

Usually, you will set gregflag= SE_GREG_CAL.

+ +

The Julian +day number has nothing to do with Julius Cesar, who introduced the Julian +calendar, but was invented by the monk Julianus. The Julian day number tells +for a given date the number of days that have passed since the creation of the world +which was then considered to have happened on 1 Jan –4712 at noon. E.g. the +1.1.1900 corresponds to the Julian day number 2415020.5.

+ +

Midnight has always a JD with +fraction 0.5, because traditionally  the +astronomical day started at noon. This was practical because then there was no +change of date during a night at the telescope.  From this comes also the fact that noon ephemerides were printed +before midnight ephemerides were introduced early in the 20th century.

+ +

 

+ +

7.2. UTC and Julian day: swe_utc_time_zone(), swe_utc_to_jd(), +swe_jdet_to_utc(), swe_jdut1_to_utc()

+ +

The following functions, which were +introduced with Swiss Ephemeris version 1.76, do a similar job as the functions +described under 7.1. The difference is that input and output times are Coordinated +Universal Time (UTC). For transformations between wall clock (or arm wrist) +time and Julian Day numbers, these functions are more correct. The difference +is below 1 second, though.

+ +

 

+ +

Use these functions to convert

+ +

-          +local time to UTC and UTC to local +time,

+ +

-          +UTC to a Julian day number, and

+ +

-          +a Julian day number to UTC.

+ +

 

+ +

Note, in case of leap seconds, the input +or output time may be 60.9999 seconds. Input or output forms have to allow for +this.

+ +

 

+ +

/* transform local time to UTC or UTC to +local time

+ +

 *

+ +

 * +input:

+ +

 *   iyear ... dsec     date and time

+ +

 *   d_timezone         timezone offset

+ +

 * +output:

+ +

 *   iyear_out ... dsec_out

+ +

 *

+ +

 * +For time zones east of Greenwich, d_timezone is positive.

+ +

 * +For time zones west of Greenwich, d_timezone is negative.

+ +

 *

+ +

 * +For conversion from local time to utc, use +d_timezone.

+ +

 * +For conversion from utc to local time, use -d_timezone.

+ +

 */

+ +

void FAR PASCAL_CONV swe_ utc_time_zone(

+ +

        +int32 iyear, int32 imonth, int32 iday,

+ +

        +int32 ihour, int32 +imin, double dsec,

+ +

        double d_timezone,

+ +

        int32 +*iyear_out, int32 *imonth_out, int32 *iday_out,

+ +

        +int32 *ihour_out, int32 *imin_out, double *dsec_out

+ +

        +)

+ +

 

+ +

/* input: date and time (wall clock time), +calendar flag.

+ +

 * +output: an array of doubles with Julian Day number in ET (TT) and UT (UT1)

+ +

 *             an error +message (on error)

+ +

 * The function returns OK or ERR.

+ +

 */ +

+ +

int32 swe_utc_to_jd (

+ +

         int32 +iyear, int32 imonth, int32 iday,

+ +

         int32 ihour, int32 imin, double +dsec,   /* note : second is a +decimal */

+ +

         gregflag,      /* Gregorian calendar: 1, Julian calendar: 0 */

+ +

         dret     /* +return array, two doubles:

+ +

               * dret[0] = Julian day in ET (TT)

+ +

               * dret[1] = Julian day in UT (UT1) */

+ +

         serr     /* +error string */

+ +

)

+ +

 

+ +

/* input: Julian day number in ET (TT), +calendar flag

+ +

 * +output: year, month, day, hour, min, sec in UTC */

+ +

void swe_jdet_to_utc (

+ +

         double tjd_et,     /* Julian day number in ET (TT) */

+ +

         gregflag,      /* Gregorian calendar: 1, Julian calendar: 0 */

+ +

         int32 *iyear, +int32 *imonth, int32 *iday,

+ +

         int32 *ihour, int32 *imin, double +*dsec,   /* note : second is a +decimal */

+ +

)

+ +

 

+ +

/* input: Julian day number in UT (UT1), +calendar flag

+ +

 * +output: year, month, day, hour, min, sec in UTC */

+ +

void swe_jdut1_to_utc (

+ +

         double tjd_ut,     /* Julian day number in ET (TT) */

+ +

         gregflag,      /* Gregorian calendar: 1, Julian calendar: 0 */

+ +

         int32 *iyear, +int32 *imonth, int32 *iday,

+ +

         int32 *ihour, int32 *imin, double +*dsec,   /* note : second is a +decimal */

+ +

)

+ +

 

+ +

How do I get correct planetary +positions, sidereal time, and house cusps, starting from a wall clock date and +time?

+ +

 

+ +

int32 +iday, imonth, iyear, ihour, imin, retval;

+ +

int32 gregflag = SE_GREG_CAL;

+ +

double d_timezone = 5.5 ; /* time zone = Indian Standard Time; note: +east is positive */

+ +

double dsec, tjd_et, tjd_ut;

+ +

double dret[2];

+ +

char serr[256];

+ +

+ +

/* if +date and time is in time zone different from UTC, the time zone offset must be +subtracted

+ +

 * first in order to get UTC: */

+ +

swe_utc_time_zone(iyear, imonth, iday, ihour, imin, dsec, d_timezone,

+ +

                &iyear_utc, +&imonth_utc, &iday_utc, &ihour_utc, &imin_utc, &dsec_utc)

+ +

/* +calculate Julian day number in UT (UT1) and ET (TT) from UTC */

+ +

retval = +swe_utc_to_jd (iyear_utc, imonth_utc, iday_utc, +ihour_utc, imin_utc, dsec_utc, gregflag, dret, serr);

+ +

if (retval == ERR) {

+ +

   fprintf(stderr, +serr);  /* error handling */

+ +

}

+ +

tjd_et = dret[0];  /* this is ET (TT) */

+ +

tjd_ut = dret[1];  /* this is UT (UT1) */

+ +

/* calculate planet with tjd_et */

+ +

swe_calc(tjd_et, +…);

+ +

/* calculate houses with tjd_ut */

+ +

swe_houses(tjd_ut, …)

+ +

 

+ +

And how do you get the date and wall +clock time from a Julian day number? Depending on whether you have tjd_et +(Julian day as ET (TT)) or tjd_ut (Julian day as UT (UT1)), use one of the two +functions swe_jdet_to_utc() or swe_jdut1_to_utc().

+ +

+ +

/* first, we calculate UTC from TT (ET) */

+ +

swe_jdet_to_utc(tjd_et, gregflag, +&iyear_utc, &imonth_utc, &iday_utc, &ihour_utc, &imin_utc, +&dsec_utc);

+ +

         /* now, UTC to local time (note the +negative sign before d_timezone): */

+ +

swe_utc_time_zone(iyear_utc, imonth_utc, iday_utc, ihour_utc, imin_utc, +dsec_utc,

+ +

-d_timezone, &iyear, &imonth, &iday, &ihour, &imin, +&dsec)

+ +

 

+ +

7.3. Future insertion of leap seconds and the file swe_leapsec.txt

+ +

The insertion of leap seconds is not +known in advance. We will update the Swiss Ephemeris whenever the IERS +announces that a leap second will be inserted. However, if the user does not +want to wait for our update or does not want to download a new version of the +Swiss Ephemeris, he can create a file swe_leapsec.txt in the ephemeris +directory. Insert a line with the date on which a leap second has to be +inserted. The file looks as follows:

+ +

# This file contains the dates of leap +seconds to be taken into account

+ +

# by the Swiss Ephemeris.

+ +

# For each new leap second add the date of +its insertion in the format

+ +

# yyyymmdd, e.g. "20081231" for +21 december 2008

+ +

20081231

+ +

 

+ +

7.4. Mean solar time versus True solar time: swe_time_equ()

+ +

Universal Time (UT or UTC) is based on Mean Solar Time, AKA +Local +Mean Time, which is a uniform measure of time. A +day has always the same length, independent of the time of the year.

+ +

In the centuries before mechanical +clocks where used, when the reckoning of time was mostly based on sun dials, +the True +Solar Time was used, also called Local Apparent Time.

+ +

The difference between Local Mean Time and Local Apparent Time is called the equation of time. This difference can become as +large as 20 minutes.

+ +

If a birth time of a historical +person was noted in Local Apparent Time, it must first be +converted to Local +Mean Time by applying the equation of time, +before it can be used to compute Universal Time (for the houses) and finally Ephemeris Time +(for the planets).

+ +

 

+ +

There is a function for computing +the correction value.

+ +

 

+ +

/* equation of time function returns the +difference between local apparent and local mean time.

+ +

 e = LAT – LMT.  tjd is ephemeris time */

+ +

int swe_time_equ(double +tjd, double* +e, char* serr);

+ +

 

+ +

If you first compute tjd on the basis of the registered Local Apparent Time, you convert it to Local Mean Time +with:

+ +

tjd_mean = tjd_app + e;

+ +

 

+ +

8. Delta T-related functions

+ +

/* delta t from Julian day number */

+ +

double swe_deltat(double tjd);

+ +

/* get tidal acceleration used in +swe_deltat() */

+ +

double swe_get_tid_acc(void); +

+ +

/* set tidal acceleration to be used in +swe_deltat() */

+ +

void swe_set_tid_acc(double +t_acc);

+ +

 

+ +

The Julian day number, you compute +from a birth date, will be Universal Time (UT,  former GMT) and can be used to +compute the star time and the houses. However, for the planets and the other +factors, you have to convert UT to Ephemeris time (ET):

+ +

8.1 swe_deltat()

+ +

tjde = tjd + swe_deltat(tjd);     where tjd = Julian day in UT, tjde= in ET

+ +

 

+ +

For precision fanatics: The value of +delta t depends on the tidal acceleration in the motion of the moon. Its +default value corresponds to the state-of-the-art JPL ephemeris (e.g.  DE406, s. swephexp.h). If you use another JPL ephemeris, e.g.  DE200, you may wish the tidal constant of DE200. This makes a +difference of 0.5 time seconds in 1900 and 4 seconds in 1800 (= 0.2” in the +position of the sun). However, this effect is limited to the period 1620 - +~1997. To change the tidal acceleration, use the function

+ +

8.2 swe_set_tid_acc(), swe_get_tid_acc()

+ +

 

+ +

swe_set_tid_acc(acceleration);      // Do this before calling deltat() !

+ +

 

+ +

The values that acceleration can have are listed in swephexp.h. (e.g. SE_TIDAL_200, etc.)

+ +

To find out the built-in value of +the tidal acceleration, you can call

+ +

acceleration = swe_get_tidacc();

+ +

 

+ +

8.3. Future updates of Delta T and the file swe_deltat.txt

+ +

Delta T +values for future years can only be estimated. Strictly speaking, the Swiss +Ephemeris has to be updated every year after the new Delta T value for the past +year has been published by the IERS. We will do our best and hope to update the +Swiss Ephemeris every year. However, if the user does not want to wait for our +update or does not download a new version of the Swiss Ephemeris he can add new +Delta T values in the file swe_deltat.txt, which has to be located in the Swiss +Ephemeris ephemeris path.

+ +

# This file allows make new Delta T known +to the Swiss Ephemeris.

+ +

# Note, these values override the values +given in the internal Delta T

+ +

# table of the Swiss Ephemeris.

+ +

# Format: year and seconds (decimal)

+ +

2003 64.47

+ +

2004 65.80

+ +

2005 66.00

+ +

2006 67.00

+ +

2007 68.00

+ +

2008 68.00

+ +

2009 69.00

+ +

 

+ +

9. The function swe_set_topo() for topocentric planet positions

+ +

void swe_set_topo(double +geolon, +double geolat, double altitude);

+ +

               /* eastern longitude is positive,  western longitude is negative,

+ +

                 northern latitude is positive,       +southern latitude is negative */

+ +

 

+ +

This function must be called before topocentric planet positions for a certain birth place +can be computed. It tells Swiss Ephemeris, what geographic position is to be +used. Geographic longitude geolon and latitude geolat must be in degrees, the altitude above sea must be in meters. Neglecting +the altitude can result in an error of about 2 arc seconds with the moon and at an altitude 3000 m. After calling swe_set_topo(), add SEFLG_TOPOCTR toiflag and call swe_calc() as with +an ordinary computation. E.g.:

+ +

 

+ +

swe_set_topo(geo_lon, geo_lat, altitude_above_sea);

+ +

iflag | = SEFLG_TOPOCTR;

+ +

 

+ +

for (i = 0; i +< NPLANETS; i++) {

+ +

  iflgret = swe_calc( tjd, ipl, iflag, xp, +serr );

+ +

  printf(”%f\n”, xp[0]);

+ +

+ +

 

+ +

The parameters set by swe_set_topo() survive swe_close().

+ +

 

+ +

10. Sidereal mode functions

+ +

10.1. +swe_set_sid_mode()

+ +

void swe_set_sid_mode (int32 sid_mode, double t0, +double ayan_t0);

+ +

 

+ +

This function can be used to specify +the mode for sidereal computations.

+ +

swe_calc() or swe_fixstar() has then to be called with the bit SEFLG_SIDEREAL.

+ +

If swe_set_sid_mode() is not called, the default ayanamsha(Fagan/Bradley) is used.

+ +

If a predefined mode is wanted, the +variable sid_modehas to be set, while t0 and ayan_t0 are not considered, i.e. can be 0. The predefined sidereal modes are:

+ +

 

+ +

#define SE_SIDM_FAGAN_BRADLEY         0

+ +

#define SE_SIDM_LAHIRI                1

+ +

#define SE_SIDM_DELUCE                2

+ +

#define SE_SIDM_RAMAN                 3

+ +

#define SE_SIDM_USHASHASHI            4

+ +

#define SE_SIDM_KRISHNAMURTI          5

+ +

#define SE_SIDM_DJWHAL_KHUL           6

+ +

#define SE_SIDM_YUKTESHWAR            7

+ +

#define SE_SIDM_JN_BHASIN             8

+ +

#define SE_SIDM_BABYL_KUGLER1         9

+ +

#define SE_SIDM_BABYL_KUGLER2        10

+ +

#define SE_SIDM_BABYL_KUGLER3        11

+ +

#define SE_SIDM_BABYL_HUBER         12

+ +

#define SE_SIDM_BABYL_ETPSC         13

+ +

#define SE_SIDM_ALDEBARAN_15TAU     14

+ +

#define SE_SIDM_HIPPARCHOS           15

+ +

#define SE_SIDM_SASSANIAN            16

+ +

#define SE_SIDM_GALCENT_0SAG         17

+ +

#define SE_SIDM_J2000                18

+ +

#define SE_SIDM_J1900                19

+ +

#define SE_SIDM_B1950                20

+ +

#define SE_SIDM_SURYASIDDHANTA      21

+ +

#define SE_SIDM_SURYASIDDHANTA_MSUN  22

+ +

#define SE_SIDM_ARYABHATA            23

+ +

#define SE_SIDM_ARYABHATA_MSUN       24

+ +

#define +SE_SIDM_USER                 255

+ +

 

+ +

For information about the sidereal +modes, read the chapter on sidereal calculations in swisseph.doc.

+ +

To define your own sidereal mode, +use SE_SIDM_USER (= 255) and set the reference date (t0) and the initial value of theayanamsha +(ayan_t0).

+ +

ayan_t0 = +tropical_position_t0 – sidereal_position_t0.

+ +

Without additional specifications, +the traditional method is used. The ayanamsha measured on the ecliptic of t0 is subtracted from tropical +positions referred to the ecliptic of date.

+ +

 

+ +

Note, this method will NOT provide +accurate results if you want coordinates referred to the ecliptic of one of the +following equinoxes:

+ +

#define SE_SIDM_J2000                18

+ +

#define SE_SIDM_J1900                19

+ +

#define SE_SIDM_B1950                20

+ +

Instead, +you have to use a correct coordinate transformation as described in the +following:

+ +

 

+ +

Special uses of the sidereal functions:

+ +

 

+ +

a) correct transformation of ecliptic coordinates to the ecliptic of +a particular date

+ +

 

+ +

If a correct transformation to the +ecliptic of t0 is required the following bit can be added (‘ored’) to +the value of the variable sid_mode:

+ +

 

+ +

/* for projection onto ecliptic of t0 */

+ +

#define +SE_SIDBIT_ECL_T0        256

+ +

E.g.:

+ +

swe_set_sid_mode(SE_SIDM_J2000 + SE_SIDBIT_ECL_T0, 0, 0);

+ +

iflag |= +SEFLG_SIDEREAL;

+ +

for (i = 0; i +< NPLANETS; i++) {

+ +

  iflgret = swe_calc(tjd, ipl, iflag, xp, +serr);

+ +

  printf(”%f\n”, xp[0]);

+ +

+ +

 

+ +

This procedure is required for the +following sidereal modes, i.e. for transformation to the ecliptic of one of the +standard equinoxes:

+ +

#define SE_SIDM_J2000                18

+ +

#define SE_SIDM_J1900                19

+ +

#define SE_SIDM_B1950                20

+ +

 

+ +

b) calculating precession-corrected transits

+ +

 

+ +

The function swe_set_sidmode() can also be used for calculating ”precession-corrected transits”. +There are two methods, of which you have to choose the one that is more +appropriate for you:

+ +

 

+ +

1. If you already have tropical +positions of a natal chart, you can proceed as follows:

+ +

 

+ +

iflgret = swe_calc(tjd_et_natal, SE_ECL_NUT, 0, x, serr);

+ +

nut_long_nata = x[2];

+ +

swe_set_sid_mode( SE_SIDBIT_USER + SE_SIDBIT_ECL_T0, +tjd_et, nut_long_natal );

+ +

 

+ +

where tjd_et_natal is the Julian day of the natal chart (Ephemeris time).

+ +

After this calculate the transits, +using the function swe_calc() with the sidereal bit:

+ +

 

+ +

iflag |= +SEFLG_SIDEREAL;

+ +

iflgret = +swe_calc(tjd_et_transit, ipl_transit, iflag, xpt, serr);

+ +

 

+ +

2. If you do not +have tropical natal positions yet, if you do not need them and are just +interested in transit times, you can have it simpler:

+ +

swe_set_sid_mode( SE_SIDBIT_USER + SE_SIDBIT_ECL_T0, +tjd_et, 0 );

+ +

iflag |= +SEFLG_SIDEREAL;

+ +

iflgret = swe_calc(tjd_et_natal, ipl_natal, iflag, xp, serr);

+ +

iflgret = swe_calc(tjd_et_transit, ipl_transit, iflag, xpt, serr);

+ +

 

+ +

In this case, the +natal positions will be tropical but without nutation. Note that you should not +use them for other purposes.

+ +

 

+ +

c) solar system rotation plane

+ +

 

+ +

For sidereal positions referred to +the solar system rotation plane, use the flag

+ +

 

+ +

/* for projection onto solar system +rotation plane */

+ +

#define SE_SIDBIT_SSY_PLANE     512

+ +

 

+ +

Note: the parameters set by swe_set_sid_mode() survive calls of the function swe_close().

+ +

10.2. swe_get_ayanamsa_ut() and +swe_get_ayanamsa()

+ +

double swe_get_ayanamsa_ut(double +tjd_ut);

+ +

double swe_get_ayanamsa(double +tjd_et);

+ +

 

+ +

The function swe_get_ayanamsa_ut() was introduced with Swisseph Version 1.60 and expects Universal +Time instead of Ephemeris Time. (cf. swe_calc_ut() and swe_calc())

+ +

The two functions compute the ayanamsha, i.e. the distance of the tropical vernal point from the sidereal +zero point of the zodiac. Theayanamsha is used to compute sidereal planetary positions from tropical ones:

+ +

pos_sid = +pos_trop – ayanamsha

+ +

Before calling swe_get_ayanamsha(), you have to set the sidereal mode with swe_set_sid_mode, unless you want the +default sidereal mode, which is the Fagan/Bradleyayanamsha.

+ +

 

+ +

11. The Ephemeris file related functions

+ +

11.1 swe_set_ephe_path()

+ +

If the environment variable +SE_EPHE_PATH  exists in the environment +where Swiss Ephemeris is used, its content is used to find the ephemeris files. The variable can contain a directory +name, or a list of directory names separated by ; (semicolon) on Windows or : (colon) on Unix.

+ +

int swe_set_ephe_path(char +*path);

+ +

 

+ +

Usually an application will want to +set its own ephemeris path by calling swe_set_ephe_path(), e.g.

+ +

swe_set_ephe_path(”C:\\SWEPH\\EPHE”);

+ +

 

+ +

The argument can be a single +directory name or a list of directories, which are then searched in sequence. +The argument of this call is ignored if the environment variable SE_EPHE_PATH exists and is not empty.
+If you want to make sure that your program overrides +any environment variable setting, you can use
putenv() to +set it to an empty string.

+ +

 

+ +

If the path is longer than 256 bytes, swe_set_ephe_path() sets the path \SWEPH\EPHE instead.

+ +

If no environment variable exists +and swe_set_ephe_path() is never called, the built-in ephemeris path is used. On Windows it +is ”\sweph\ephe” relative to the current working drive, on Unix it is "/users/ephe".

+ +

Asteroid ephemerides are looked for +in the subdirectories ast0, ast1, ast2 .. ast9 of the ephemeris directory and, if not found there, in the ephemeris +directory itself. Asteroids with numbers 0 – 999 are expected in directory ast0, those with numbers 1000 – 1999 in directory ast1 etc.

+ +

The environment variable SE_EPHE_PATH is most convenient when a user has several applications installed +which all use the Swiss Ephemeris but would normally expect the ephemeris files +in different application-specific directories. The use can override this by +setting the environment variable, which forces all the different applications +to use the same ephemeris directory. This allows him to use only one set of +installed ephemeris files for all different applications. A developer should +accept this override feature and allow the sophisticated users to exploit it.

+ +

11.2 swe_close()

+ +

/* close Swiss Ephemeris */

+ +

void swe_close(void);

+ +

 

+ +

At the end of your computations you +can release most resources (open files and allocated memory) used by the Swiss +Ephemeris DLL.

+ +

The following parameters survive a +call of swe_calc():

+ +

·         +the ephemeris path set by swe_set_ephe_path()

+ +

·         +the JPL file name set by swe_set_jpl_file()

+ +

·         +the geographical location set by swe_set_topo() for topocentric planetary positions

+ +

·         +the sidereal mode set by swe_set_sid_mode() for sidereal planetary positions

+ +

 

+ +

As soon as you make a call to swe_calc() or swe_fixstar(), the Swiss Ephemeris +re-opens again.

+ +

11.3 swe_set_jpl_file()

+ +

 

+ +

/* set name of JPL ephemeris file */

+ +

int swe_set_jpl_file(char +*fname);

+ +

 

+ +

If you work with the JPL ephemeris, +SwissEph uses the default file name which is defined in swephexp.h as SE_FNAME_DFT. Currently, it has the value ”de406.eph”.

+ +

If different JPL ephemeris file is +required, call the function swe_set_jpl_file()to make the file name known to the software, e.g.

+ +

swe_set_jpl_file(”de405.eph”);

+ +

 

+ +

This file must reside in the +ephemeris path you are using for all your ephemeris files.

+ +

If the file name is longer than 256 byte, swe_set_jpl_file() cuts the file name to a length of 256 bytes. The error will become +visible after the first call of swe_calc(), when it +will return zero positions and an error message.

+ +

 

+ +

11.4 swe_version()

+ +

 

+ +

/* find out version number of your Swiss +Ephemeris version */

+ +

char *swe_version(char *svers);

+ +

/* svers is a string variable with +sufficient space to contain the version number (255 char) */

+ +

 

+ +

The Function returns a pointer to the string +svers, i.e. to the version number of the Swiss Ephemeris that your software is +using.

+ +

 

+ +

12. House cusp calculation

+ +

12.1 swe_houses()

+ +

/* house cusps, ascendant and MC */

+ +

int swe_houses(

+ +

double tjd_ut,      /* Julian day number, UT */

+ +

double geolat,      /* geographic latitude, in degrees */

+ +

double geolon,      /* geographic longitude, in degrees

+ +

               * eastern longitude is positive,

+ +

               * western longitude is negative,

+ +

               * northern latitude is positive,

+ +

               * southern latitude is negative */

+ +

int hsys,           /* house method, ascii code of one of the +letters PKORCAEVXHTBG */

+ +

double *cusps,      /* array for 13 doubles */

+ +

double *ascmc);     /* array for 10 doubles */

+ +

12.2 swe_houses_armc()

+ +

int swe_houses_armc(

+ +

double armc,         /* ARMC */

+ +

double geolat,      /* geographic latitude, in degrees */

+ +

double eps,      /* ecliptic obliquity, in +degrees */

+ +

int hsys,           /* house method, ascii code of one of the +letters PKORCAEVXHTBG */

+ +

double *cusps,      /* array for 13 doubles */

+ +

double *ascmc);     /* array for 10 doubles */

+ +

12.3 swe_houses_ex()

+ +

 

+ +

/* extended function; to compute tropical +or sidereal positions */

+ +

int swe_houses_ex(

+ +

         double +tjd_ut,      /* Julian day number, UT */

+ +

         int32 +iflag,      /* +0 or SEFLG_SIDEREAL or SEFLG_RADIANS */

+ +

         double +geolat,      /* geographic latitude, in +degrees */

+ +

         double +geolon,      /* geographic longitude, in +degrees

+ +

         * eastern longitude is positive,

+ +

               * western longitude is negative,

+ +

               * northern latitude is positive,

+ +

               * southern latitude is negative */

+ +

         int +hsys,           /* house method, ascii code of one of the letters PKORCAEVXHTBG +*/

+ +

         double +*cusps,      /* array for 13 doubles */

+ +

double *ascmc);     /* array for 10 doubles */

+ +

 

+ +

The function swe_houses() is most comfortable, if you need the houses for a given date and +geographic position. Sometimes, however, you will want to compute houses from +an ARMC, e.g. with the composite horoscope which has no date, only the +composite ARMC of two natal ARMCs. In such cases, you can use the function swe_houses_armc(). To compute the composite ecliptic obliquityeps, you will have to call sweph_calc()with ipl = SE_ECL_NUT +for both birth dates and calculate the average of botheps.

+ +

Note thattjd_ut must be Universal Time, whereas planets are +computed from Ephemeris Time

+ +

tjd_et += tjd_ut + delta_t(tjd_ut).

+ +

Also note that the array cusps +must provide space for 13 doubles (declare +as cusp[13]), otherwise you risk a +program crash. With house system ‘G’ (Gauquelin sector cusps), declare it as cusp[37].

+ +

 

+ +

Note: With house system ‘G’, the +cusp numbering is in clockwise direction.

+ +

 

+ +

The extended house function swe_houses_ex() does exactly the same calculations as swe_houses(). +The difference is that swe_houses_ex() has +a parameter iflag, which can +be set to SEFLG_SIDEREAL, if  siderealhouse +positions are wanted. Before calling swe_houses_ex() for +sidereal house positions, the sidereal mode can be set by calling the function swe_set_sid_mode(). If this is not done, the default sidereal mode, i.e. the +Fagan/Bradley ayanamsha, will be used.

+ +

There is no extended function for swe_houses_armc(). Therefore, if you want to compute such +obscure things as sidereal composite house cusps, the procedure will be +more complicated:

+ +

 

+ +

/* sidereal composite house computation; +with true epsilon, but without nutation in longitude */

+ +

swe_calc(tjd_et1, SE_ECL_NUT, 0, x1, serr);

+ +

swe_calc(tjd_et2, SE_ECL_NUT, 0, x2, serr);

+ +

armc1 = swe_sidtime(tjd_ut1) * 15;  

+ +

armc2 = swe_sidtime(tjd_ut2) * 15;

+ +

armc_comp = composite(armc1, +armc2); /* this is a function created by the user */

+ +

eps_comp = (x1[0] + x2[0]) / 2;

+ +

nut_comp = +(x1[2] + x2[2]) / 2;

+ +

tjd_comp = +(tjd_et1 + tjd_et2) / 2;

+ +

aya = swe_get_ayanamsa(tjd_comp);

+ +

swe_houses_armc(armc_comp, geolat, eps_comp, hsys, cusps, ascmc);

+ +

for (i = 1; i +<= 12; i++)

+ +

  cusp[i] = swe_degnorm(cusp[i] – aya – +nut_comp);

+ +

for (i = 0; i +< 10; i++)

+ +

  ascmc[i] = swe_degnorm(asc_mc[i] – +aya – nut_comp);

+ +

 

+ +

Output and input parameters.

+ +

The first array element cusps[0] +is always 0, the twelve houses follow in cusps[1] .. [12], the reason +being that arrays in C begin with the index 0. The indices are therefore:

+ +

cusps[0] = 0

+ +

cusps[1] = house 1

+ +

cusps[2] = house 2

+ +

etc.

+ +

 

+ +

In the array ascmc, the function returns the following +values:

+ +

ascmc[0] =      Ascendant

+ +

ascmc[1] =     MC

+ +

ascmc[2] =     ARMC

+ +

ascmc[3] =     Vertex

+ +

ascmc[4] =     "equatorial ascendant"

+ +

ascmc[5] =     "co-ascendant" (Walter Koch)

+ +

ascmc[6] =     "co-ascendant" (Michael Munkasey)

+ +

ascmc[7] =     "polar ascendant" (M. Munkasey)

+ +

 

+ +

The following defines can be used to find these +values:

+ +

#define SE_ASC          0

+ +

#define SE_MC       1

+ +

#define SE_ARMC       2

+ +

#define +SE_VERTEX        3

+ +

#define +SE_EQUASC            4     /* "equatorial ascendant" */

+ +

#define +SE_COASC1        5     /* +"co-ascendant" (W. Koch) */

+ +

#define +SE_COASC2        6     /* +"co-ascendant" (M. Munkasey) */

+ +

#define +SE_POLASC       7     /* "polar +ascendant" (M. Munkasey) */

+ +

#define +SE_NASCMC       8

+ +

 

+ +

ascmcmust be an array of 10 doubles. +ascmc[8... 9] are 0 and may +be used for additional points in future releases.

+ +

 

+ +

The following house systems are +implemented so far

+ +

hsys =        ‘P’                  Placidus

+ +

         ‘K’     Koch

+ +

         ‘O’     Porphyrius

+ +

         ‘R’     Regiomontanus

+ +

         ‘C’     Campanus

+ +

         ‘A’ or ‘E’     Equal (cusp 1 is Ascendant)

+ +

         ‘V’     Vehlow +equal (Asc. in middle of house 1)

+ +

         ‘W’     Whole sign

+ +

         ‘X’     axial +rotation system / meridian system / zariel

+ +

         ‘H’     azimuthal +or horizontal system

+ +

         ‘T’     Polich/Page +(“topocentric” system)

+ +

         ‘B’     Alcabitus

+ +

         ‘M’     Morinus

+ +

         ‘U’     Krusinski-Pisa

+ +

         ‘G’     Gauquelin sectors

+ +

 

+ +

Placidus and Koch house cusps cannot be +computed beyond the polar circle. In such cases, swe_houses() switches to Porphyry houses (each quadrant is divided into three +equal parts) and returns the error code ERR.

+ +

 

+ +

The Vertex +is the point on the ecliptic that is located in precise western direction. The opposition of the Vertex is the Antivertex, +the ecliptic east point.

+ +

 

+ +

13. The sign of geographical longitudes in Swisseph functions

+ +

There is a disagreement between American and European +programmers whether eastern or western geographical longitudes ought to be +considered positive. Americans prefer to have West longitudes positive, +Europeans prefer the older tradition that considers East longitudes as positive +and West longitudes as negative.

+ +

The Astronomical Almanac still follows the European pattern. It gives the geographical +coordinates of observatories in "East longitude".

+ +

The Swiss Ephemeris also follows the +European +style. All Swiss Ephemeris functions that use +geographical coordinates consider positive geographical longitudes as Eastand negative ones as West.

+ +

E.g. 87w39 = -87.65° (Chicago IL/USA) and 8e33 = +8.55° (Zurich, +Switzerland).

+ +

There is no such controversy about +northern and southern geographical latitudes. North is always positive and +south is negative.

+ +

 

+ +

14. Getting the house position of a planet with swe_house_pos()

+ +

To compute the house position of a +given body for a given ARMC, you may use the

+ +

double swe_house_pos(

+ +

         double +armc,         /* +ARMC */

+ +

         double +geolat,      /* geographic latitude, in +degrees */

+ +

         double +eps,      /* +ecliptic obliquity, in degrees */

+ +

         int +hsys,           /* house method, one of the letters PKRCAV */

+ +

         double +*xpin,      /* array of 2 doubles: ecl. +longitude and latitude of the planet */

+ +

char *serr);       /* return area for error +or warning message */

+ +

 

+ +

The variables armc, +geolat, eps, and xpin[0]and xpin[1](ecliptic longitude and latitude of the +planet) must be in degrees. serr must, as usually, point to a character array of 256 byte.

+ +

The function returns a value between +1.0 and 12.999999, indicating in which house a planet is and how far from its +cusp it is.

+ +

With house system ‘G’ (Gauquelin +sectors), a value between 1.0 and 36.9999999 is returned. Note that, while all +other house systems number house cusps in counterclockwise direction, Gauquelin +sectors are numbered in clockwise direction.

+ +

 

+ +

With Koch houses, the function sometimes returns 0, if the computation was not possible. This happens most often in polar regions, but it can happen at latitudes below +66°33’ as well, e.g. if a body has a high declination and falls +within the circumpolar sky. With circumpolar fixed stars (or asteroids) a Koch +house position may be impossible at any geographic location except on the +equator.

+ +

The user must decide how to deal +with this situation.

+ +

You can use the house positions +returned by this function for house horoscopes (or ”mundane” positions). For +this, you have to transform it into a value between 0 and 360 degrees. Subtract +1 from the house number and multiply it with 30, or mund_pos = (hpos – 1) * +30;

+ +

 

+ +

You will realize that house +positions computed like this, e.g. for the Koch houses, will not agree exactly +with the ones that you get applying the Huber ”hand calculation” method. If you +want a better agreement, set the ecliptic latitude xpin[1]= 0;. Remaining differences result from the +fact that Huber’s hand calculation is a simplification, whereas our computation +is geometrically accurate.

+ +

 

+ +

This function requires TROPICAL positions inxpin. SIDEREAL house positions are identical to tropical ones in the following +cases:

+ +

·         +If the traditional method is used to +compute sidereal planets (sid_pos = trop_pos – ayanamsha). Here the function swe_house_pos() works +for all house systems.

+ +

·         +If a non-traditional method +(projection to the ecliptic of t0 or to the solar system rotation plane) is +used and the definition of the house system does not depend on the ecliptic. +This is the case with Campanus, Regiomontanus, Placidus, Azimuth houses, axial rotation houses. This is NOT +the case with equal houses, Porphyry and Koch houses. +You have to compute equal and Porphyry house positions on your own. We recommend to avoid Koch +houses here. Sidereal Koch houses make no sense with these sidereal algorithms. +

+ +

·         +Alcabitus is not yet supported in +release 1.61.01

+ +

 

+ +

14.1. Calculating the Gauquelin sector position of a planet with +swe_house_pos() or swe_gauquelin_sector()

+ +

For general information on Gauquelin +sectors, read chapter 6.5 in documentation file swisseph.doc.

+ +

 

+ +

There are two functions that can be +used to calculate Gauquelin sectors:

+ +

·         +swe_house_pos. Full details about this +function are presented in the previous section. To calculate Gauquelin sectors +the parameter hsys must be set to 'G' (Gauquelin sectors). This function will +then return the sector position as a value between 1.0 and 36.9999999. Note +that Gauquelin sectors are numbered in clockwise direction, unlike all other +house systems.

+ +

·         +swe_gauquelin_sector - detailed below.

+ +

 

+ +

Function +swe_gauquelin_sector() is declared as follows:

+ +

 

+ +

int32 swe_gauquelin_sector(

+ +

double tjd_ut,      /* search after this time (UT) */

+ +

int32 ipl,           /* planet number, if +planet, or moon */

+ +

char *starname,      /* star name, if star */

+ +

int32 iflag,      /* flag for ephemeris and SEFLG_TOPOCTR */

+ +

int32 imeth,      /* method: 0 = with lat., 1 = without lat.,

+ +

               /*              2 = from rise/set, 3 = from rise/set with refraction +*/

+ +

double *geopos,      /* array of three doubles containing

+ +

               * geograph. long., lat., height of observer +*/

+ +

double atpress,       /* atmospheric +pressure, only useful with imeth=3;

+ +

                * if 0, default = 1013.25 mbar is used*/

+ +

double attemp,       /* atmospheric +temperature in degrees Celsius, only useful with imeth=3 */

+ +

double *dgsect,         /* return address for +gauquelin sector position */

+ +

char *serr);       /* return address for +error message */

+ +

 

+ +

This function returns OK or ERR +(-1). It returns an error in a number of cases, for example circumpolar bodies +with imeth=2. As with other SE functions, if there is an error, an error +message is written to serr. dgsect is used to obtain the Gauquelin sector +sector position as a value between 1.0 and 36.9999999. Gauquelin sectors are +numbered in clockwise direction.

+ +

 

+ +

There are six methods of computing +the Gauquelin sector position of a planet:

+ +

1. Sector positions from ecliptical +longitude AND latitude:

+ +

    +There are two ways of doing this:

+ +

·           +Call swe_house_pos() with hsys = 'G', +xpin[0] = ecliptical longitude of planet, and xpin[1] = ecliptical

+ +

latitude. This function returns the sector position as a value +between 1.0 and 36.9999999.

+ +

·           +Call swe_gauquelin_sector() with +imeth=0. This is less efficient than swe_house_pos because it

+ +

recalculates the whole planet whereas swe_house_pos() has an input +array for ecliptical positions

+ +

calculated before.

+ +

 

+ +

2. Sector positions computed from +ecliptical longitudes without ecliptical latitudes:

+ +

    +There are two ways of doing this:

+ +

·           +Call swe_house_pos() with hsys = 'G', +xpin[0] = ecl. longitude of planet, and xpin[1] = 0. This function

+ +

returns the sector position as a value between 1.0 and 36.9999999.

+ +

·           +Call swe_gauquelin_sector() with +imeth=1. Again this is less efficient than swe_house_pos.

+ +

 

+ +

3. Sector positions of a planet from +rising and setting times of planets.

+ +

    +The rising and setting of the disk center is used:

+ +

·           +Call swe_gauquelin_sector() with +imeth=2.

+ +

 

+ +

4. Sector positions of a planet from +rising and setting times of planets, taking into account atmospheric +refraction.

+ +

    +The rising and setting of the disk center is used:

+ +

·           +Call swe_gauquelin_sector() with imeth += 3.

+ +

 

+ +

5. Sector positions of a planet from +rising and setting times of planets.

+ +

    +The rising and setting of the disk edge is used:

+ +

·           +Call swe_gauquelin_sector() with +imeth=4.

+ +

 

+ +

6. Sector positions of a planet from +rising and setting times of planets, taking into account atmospheric +refraction.

+ +

    The rising and setting +of the disk edge is used:

+ +

·           +Call swe_gauquelin_sector() with imeth += 5.

+ +

 

+ +

15. Sidereal time with swe_sidtime() and swe_sidtime0()

+ +

The sidereal time is computed inside the houses() function +and returned via the variable armc which measures sidereal time in degrees. To get sidereal time in +hours, divide armcby 15.

+ +

If the sidereal time is required +separately from house calculation, two functions are available. The second +version requires obliquity and nutation to be given in the function call, the +first function computes them internally. Both return sidereal time at the Greenwich Meridian, measured in hours.

+ +

 

+ +

double swe_sidtime(double +tjd_ut);      /* Julian day number, UT */

+ +

double swe_sidtime0(

+ +

         double +tjd_ut,      /* Julian day number, UT */

+ +

         double +eps,      /* +obliquity of ecliptic, in degrees */

+ +

         double +nut);     /* +nutation in longitude, in degrees */

+ +
+
+ +

 

+ +

16. Summary of SWISSEPH functions

+ +

16.1. Calculation of planets and stars

+ +

Planets, +moon, asteroids, lunar nodes, apogees, fictitious bodies

+ +

 

+ +

long swe_calc_ut(

+ +

         double +tjd_ut,     /* Julian day number, +Universal Time */

+ +

         int ipl,           /* planet number */

+ +

         long iflag,      /* flag bits */

+ +

           double *xx,            /* target address for 6 position values: +longitude, latitude, distance,

+ +

               long. speed, lat. speed, dist. speed */

+ +

         char *serr);     /* 256 bytes for error string */

+ +

 

+ +

long swe_calc(

+ +

         double +tjd_et,      /* Julian day number, +Ephemeris Time */

+ +

         int ipl,           /* planet number */

+ +

         long iflag,      /* flag bits */

+ +

         double *xx,     /* target address for 6 position values: longitude, +latitude, distance,

+ +

               long. speed, lat. speed, dist. speed */

+ +

         char *serr);     /* 256 bytes for error string */

+ +

Fixed +stars

+ +

long swe_fixstar_ut(

+ +

         char +*star,         /* +star name, returned star name 40 bytes */

+ +

         double +tjd_ut,      /* Julian day number, Universal +Time */

+ +

         long iflag,      /* flag bits */

+ +

         double +*xx,            /* target address for 6 +position values: longitude, latitude, distance,

+ +

                        long. +speed, lat. speed, dist. speed */

+ +

         char *serr);     /* 256 bytes for error string */

+ +

 

+ +

long swe_fixstar(

+ +

         char +*star,         /* +star name, returned star name 40 bytes */

+ +

         double +tjd_et,      /* Julian day number, +Ephemeris Time */

+ +

         long iflag,      /* flag bits */

+ +

         double +*xx,          /* target address for 6 position values: longitude, latitude, +distance,

+ +

               long. speed, lat. speed, dist. speed */

+ +

         char *serr);     /* 256 bytes for error string */

+ +

Set the +geographic location for topocentric planet computation

+ +

void swe_set_topo (

+ +

         double +geolon,      /* geographic longitude */

+ +

         double +geolat,      /* geographic latitude

+ +

                eastern longitude is positive,

+ +

                western longitude is negative,

+ +

                northern latitude is positive,

+ +

                southern latitude is negative */

+ +

         double +altitude);     /* altitude above sea */

+ +

Set the +sidereal mode for sidereal planet positions

+ +

void swe_set_sid_mode (

+ +

      int32 sid_mode,

+ +

         double t0,          /* reference epoch */

+ +

         double ayan_t0);     /* initial ayanamsha at t0 */

+ +

 

+ +

/* to get the ayanamsha for a date */

+ +

double swe_get_ayanamsa(double +tjd_et);

+ +

16.2 Eclipses and planetary phenomena

+ +

Find the +next eclipse for a given geographic position

+ +

int32 swe_sol_eclipse_when_loc(

+ +

double tjd_start,      /* start date for search, Jul. day UT */

+ +

int32 ifl,      /* +ephemeris flag */

+ +

double *geopos,      /* 3 doubles for geo. lon, +lat, height */

+ +

         * eastern longitude is positive,

+ +

                    * +western longitude is negative,

+ +

                    * +northern latitude is positive,

+ +

                    * +southern latitude is negative */

+ +

double *tret,           /* return array, 10 +doubles, see below */

+ +

double *attr,           /* return array, 20 +doubles, see below */

+ +

AS_BOOL backward,      /* TRUE, if backward search */

+ +

char *serr);       /* return error string */

+ +

Find the +next eclipse globally

+ +

int32 swe_sol_eclipse_when_glob(

+ +

double tjd_start,      /* start date for search, Jul. day UT */

+ +

int32 ifl,      /* +ephemeris flag */

+ +

int32 ifltype,      /* eclipse type wanted: +SE_ECL_TOTAL etc. */

+ +

double *tret,           /* return array, 10 +doubles, see below */

+ +

AS_BOOL backward,      /* TRUE, if backward search */

+ +

char *serr);       /* return error string */

+ +

Compute +the attributes of a solar eclipse for a given tjd, geographic long., latit. and +height

+ +

int32 swe_sol_eclipse_how(

+ +

double tjd_ut,      /* time, Jul. day UT */

+ +

int32 ifl,      /* +ephemeris flag */

+ +

double *geopos,        /* geogr. longitude, +latitude, height */

+ +

         * eastern longitude is positive,

+ +

                    * +western longitude is negative,

+ +

                    * +northern latitude is positive,

+ +

                    * +southern latitude is negative */

+ +

double *attr,           /* return array, 20 +doubles, see below */

+ +

char *serr);       /* return error string */

+ +

Find out +the geographic position where a central eclipse is central or a non-central one +maximal

+ +

int32 swe_sol_eclipse_where (

+ +

double tjd_ut,      /* time, Jul. day UT */

+ +

int32 ifl,           /* ephemeris flag */

+ +

double *geopos,       /* return array, 2 +doubles, geo. long. and lat. */

+ +

               * eastern longitude is positive,

+ +

                    * +western longitude is negative,

+ +

                    * +northern latitude is positive,

+ +

                    * +southern latitude is negative */

+ +

double *attr,           /* return array, 20 +doubles, see below */

+ +

char *serr);       /* return error string */

+ +

 

+ +

or

+ +

 

+ +

int32 swe_lun_occult_where (

+ +

double tjd_ut,      /* time, Jul. day UT */

+ +

int32 ipl,      /* +planet number */

+ +

char* starname,      /* +star name, must be NULL or ”” if not a star */

+ +

int32 ifl,      /* +ephemeris flag */

+ +

double *geopos,     /* return array, 2 doubles, geo. long. and lat.

+ +

               * eastern longitude is positive,

+ +

               * western longitude is negative,

+ +

               * northern latitude is positive,

+ +

               * southern latitude is negative */

+ +

double *attr,      /* return array, 20 doubles, see below */

+ +

char *serr);       /* return error string */

+ +

Find the +next occultation of a body by the moon for a given geographic position

+ +

(can also be used for solar eclipses )

+ +

 

+ +

int32 swe_lun_occult_when_loc(

+ +

double +tjd_start,      /* start date for search, +Jul. day UT */

+ +

int32 ipl,      /* +planet number */

+ +

char* starname,      /* +star name, must be NULL or ”” if not a star */

+ +

int32 ifl,      /* +ephemeris flag */

+ +

double +*geopos,      /* 3 doubles for geo. lon, +lat, height eastern longitude is positive,

+ +

                +western longitude is negative,  +northern latitude is positive,

+ +

                +southern latitude is negative */

+ +

double +*tret,      /* return array, 10 doubles, +see below */

+ +

double +*attr,      /* return array, 20 doubles, +see below */

+ +

AS_BOOL +backward,      /* TRUE, if backward search +*/

+ +

char +*serr);     /* return error string */

+ +

Find the +next occultation globally

+ +

(can also be used for solar eclipses )

+ +

 

+ +

int32 swe_lun_occult_when_glob(

+ +

double +tjd_start,      /* start date for search, +Jul. day UT */

+ +

int32 ipl,      /* +planet number */

+ +

char* starname,      /* +star name, must be NULL or ”” if not a star */

+ +

int32 ifl,      /* +ephemeris flag */

+ +

int32 ifltype,      /* +eclipse type wanted */

+ +

double +*geopos,      /* 3 doubles for geo. lon, +lat, height eastern longitude is positive,

+ +

                +western longitude is negative,  +northern latitude is positive,

+ +

                +southern latitude is negative */

+ +

double +*tret,      /* return array, 10 doubles, +see below */

+ +

double +*attr,      /* return array, 20 doubles, +see below */

+ +

AS_BOOL +backward,      /* TRUE, if backward search +*/

+ +

char +*serr);     /* return error string */

+ +

Find the +next lunar eclipse

+ +

int32 swe_lun_eclipse_when(

+ +

double tjd_start,      /* start date for search, Jul. day UT */

+ +

int32 ifl,           /* ephemeris flag */

+ +

int32 ifltype,      /* eclipse type wanted: +SE_ECL_TOTAL etc. */

+ +

double *tret,           /* return array, 10 +doubles, see below */

+ +

AS_BOOL backward,      /* TRUE, if backward search */

+ +

char *serr);       /* return error string */

+ +

Compute +the attributes of a lunar eclipse at a given time

+ +

int32 swe_lun_eclipse_how(

+ +

double tjd_ut,      /* time, Jul. day UT */

+ +

int32 ifl,      /* +ephemeris flag */

+ +

double *geopos,      /* input array, geopos, +geolon, geoheight */

+ +

                eastern longitude is positive,

+ +

                     +western longitude is negative,

+ +

                     +northern latitude is positive,

+ +

                     +southern latitude is negative */

+ +

double *attr,           /* return array, 20 +doubles, see below */

+ +

char *serr);       /* return error string */

+ +

 

+ +

Compute +risings, settings and meridian transits of a body

+ +

int32 swe_rise_trans(

+ +

double tjd_ut,      /* search after this time (UT) */

+ +

int32 ipl,           /* planet number, if +planet or moon */

+ +

char *starname,      /* star name, if star */

+ +

int32 epheflag,      /* ephemeris flag */

+ +

int32 rsmi,          /* integer specifying +that rise, set, or one of the two meridian transits is

+ +

                     +wanted. see definition below */

+ +

double *geopos,      /* array of three doubles containing geograph. long., lat., +height of observer */

+ +

double atpress,      /* atmospheric pressure in mbar/hPa */

+ +

double attemp,     /* atmospheric temperature in deg. C */

+ +

double *tret,     /* return address (double) for rise time etc. */

+ +

char *serr);     /* return address for error message */

+ +

 

+ +

int32 swe_rise_trans_true_hor(

+ +

double tjd_ut,      /* search after this time (UT) */

+ +

int32 ipl,           /* planet number, if +planet or moon */

+ +

char *starname,      /* star name, if star */

+ +

int32 epheflag,      /* ephemeris flag */

+ +

int32 rsmi,          /* integer specifying +that rise, set, orone of the two meridian transits is

+ +

               wanted. see definition below */

+ +

double *geopos,      /* array of three doubles containing

+ +

               * geograph. long., lat., height of observer +*/

+ +

double atpress,      /* atmospheric pressure in mbar/hPa */

+ +

double attemp,     /* atmospheric temperature in deg. C */

+ +

double horhgt,     /* height of local horizon in deg at the point where the body +rises or sets*/

+ +

double *tret,          /* return address +(double) for rise time etc. */

+ +

char *serr);       /* return address for +error message */

+ +

 

+ +

 

+ +

Compute +planetary phenomena

+ +

int32 swe_pheno_ut(

+ +

double tjd_ut,      /* time Jul. Day UT */

+ +

int32 ipl,           /* planet number */

+ +

int32 iflag,      /* +ephemeris flag */

+ +

double *attr,           /* return array, 20 +doubles, see below */

+ +

char *serr);       /* return error string */

+ +

int32 swe_pheno(

+ +

double tjd_et,      /* time Jul. Day ET */

+ +

int32 ipl,           /* planet number */

+ +

int32 iflag,      /* ephemeris flag */

+ +

double *attr,           /* return array, 20 +doubles, see below */

+ +

char *serr);       /* return error string */

+ +

 

+ +

void swe_azalt(

+ +

      +double tjd_ut,     /* UT */

+ +

      int32 calc_flag,     /* SE_ECL2HOR or SE_EQU2HOR */

+ +

      double *geopos,     /* array of 3 doubles: geogr. long., lat., +height */

+ +

     + double atpress,     /* atmospheric pressure in mbar (hPa) */

+ +

      +double attemp,     /* atmospheric +temperature in degrees Celsius */

+ +

      double *xin, /* array of 3 doubles: position of body in +either  ecliptical or equatorial +coordinates,  depending on calc_flag */

+ +

      double *xaz); /* return array of 3 doubles, containing +azimuth, true altitude, apparent altitude */

+ +

 

+ +

void swe_azalt_rev(

+ +

      +double tjd_ut,

+ +

      int32 calc_flag,     /* either SE_HOR2ECL or SE_HOR2EQU */

+ +

      +double *geopos,     /* array of 3 +doubles for geograph. pos. of observer */

+ +

      +double *xin,      /* array of 2 doubles for azimuth and true +altitude of planet */

+ +

      double *xout); /* return array of 2 doubles for either +ecliptic or equatorial coordinates, depending on calc_flag */

+ +

double swe_refrac(

+ +

double inalt,

+ +

double atpress,      /* atmospheric pressure in mbar (hPa) */

+ +

double attemp,      /* atmospheric temperature in degrees Celsius */

+ +

int32 calc_flag);     /* either SE_TRUE_TO_APP or SE_APP_TO_TRUE */

+ +

 

+ +

16.3. Date and time conversion

+ +

Delta T from +Julian day number

+ +

 * +Ephemeris time (ET) = Universal time (UT) + swe_deltat(UT)*/

+ +

double swe_deltat(double +tjd);

+ +

Julian day +number from year, month, day, hour, with check whether date is legal

+ +

/*Return value: OK or ERR  */

+ +

int swe_date_conversion (

+ +

         int +y , int m , int d ,     /* year, month, +day */

+ +

     +     double hour,                /* hours (decimal, with fraction) */

+ +

     +     char c,                 /* +calendar ‘g’[regorian]|’j’[ulian] */

+ +

double *tjd);               /* target address for Julian day */

+ +

Julian day +number from year, month, day, hour

+ +

double swe_julday(

+ +

int year, int month, int day, double hour, +

+ +

int gregflag);     /* Gregorian calendar: 1, Julian calendar: 0 */

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

Year, +month, day, hour from Julian day number

+ +

void swe_revjul (

+ +

         double +tjd,      /* Julian day number */

+ +

         int +gregflag,     /* Gregorian calendar: 1, +Julian calendar: 0 */

+ +

         int +*year,       /* +target addresses for year, etc. */

+ +

         int +*month, int *day, double *hour);

+ +

Local time +to UTC and UTC to local time

+ +

/* transform local time to UTC or UTC to +local time

+ +

 *

+ +

 * +input:

+ +

 *   iyear ... dsec     date and time

+ +

 *   d_timezone         timezone offset

+ +

 * +output:

+ +

 *   iyear_out ... dsec_out

+ +

 *

+ +

 * +For time zones east of Greenwich, d_timezone is positive.

+ +

 * +For time zones west of Greenwich, d_timezone is negative.

+ +

 *

+ +

 * +For conversion from local time to utc, use +d_timezone.

+ +

 * +For conversion from utc to local time, use -d_timezone.

+ +

 */

+ +

void FAR PASCAL_CONV swe_utc_timezone(

+ +

        +int32 iyear, int32 imonth, int32 iday,

+ +

        +int32 ihour, int32 +imin, double dsec,

+ +

        double d_timezone,

+ +

        int32 +*iyear_out, int32 *imonth_out, int32 *iday_out,

+ +

        +int32 *ihour_out, int32 *imin_out, double *dsec_out

+ +

        +)

+ +

UTC to jd +(TT and UT1)

+ +

/* input: date and time (wall clock time), +calendar flag.

+ +

 * +output: an array of doubles with Julian Day number in ET (TT) and UT (UT1)

+ +

 *             an error +message (on error)

+ +

 * The function returns OK or ERR.

+ +

 */ +

+ +

void swe_utc_to_jd (

+ +

         int32 +iyear, int32 imonth, int32 iday,

+ +

         int32 ihour, int32 imin, double +dsec,   /* note : second is a +decimal */

+ +

         gregflag,      /* Gregorian calendar: 1, Julian calendar: 0 */

+ +

         dret     /* +return array, two doubles:

+ +

               * dret[0] = Julian day in ET (TT)

+ +

               * dret[1] = Julian day in UT (UT1) */

+ +

         serr     /* +error string */

+ +

)

+ +

TT (ET1) +to UTC

+ +

/* input: Julian day number in ET (TT), +calendar flag

+ +

 * +output: year, month, day, hour, min, sec in UTC */

+ +

void swe_jdet_to_utc (

+ +

         double tjd_et,     /* Julian day number in ET (TT) */

+ +

         gregflag,      /* Gregorian calendar: 1, Julian calendar: 0 */

+ +

         int32 *iyear, +int32 *imonth, int32 *iday,

+ +

         int32 *ihour, int32 *imin, double +*dsec,   /* note : second is a +decimal */

+ +

)

+ +

UTC to TT +(ET1)

+ +

/* input: Julian day number in UT (UT1), +calendar flag

+ +

 * +output: year, month, day, hour, min, sec in UTC */

+ +

void swe_jdut1_to_utc (

+ +

         double tjd_ut,     /* Julian day number in ET (TT) */

+ +

         gregflag,      /* Gregorian calendar: 1, Julian calendar: 0 */

+ +

         int32 *iyear, +int32 *imonth, int32 *iday,

+ +

         int32 *ihour, int32 *imin, double +*dsec,   /* note : second is a +decimal */

+ +

)

+ +

 

+ +

Get tidal +acceleration used in swe_deltat()

+ +

double swe_get_tid_acc(void);

+ +

Set tidal +acceleration to be used in swe_deltat()

+ +

void swe_set_tid_acc(double t_acc);

+ +

Equation +of time

+ +

/ * function returns the difference +between local apparent and local mean time.

+ +

e = LAT – +LMT.  tjd_et is +ephemeris time */

+ +

int swe_time_equ(double +tjd_et, double *e, char *serr);

+ +

16.4. Initialization, setup, and closing +functions

+ +

Set +directory path of ephemeris files

+ +

int swe_set_ephe_path(char *path);

+ +

 

+ +

/* set name of JPL ephemeris file */

+ +

int swe_set_jpl_file(char *fname);

+ +

 

+ +

/* close Swiss Ephemeris */

+ +

void swe_close(void);

+ +

16.5. House calculation

+ +

Sidereal +time

+ +

double swe_sidtime(double tjd_ut);      /* Julian day number, UT */

+ +

 

+ +

double swe_sidtime0(

+ +

         double +tjd_ut,      /* Julian day number, UT */

+ +

         double +eps,      /* obliquity of ecliptic, in +degrees */

+ +

         double +nut);     /* nutation, in degrees */

+ +

House +cusps, ascendant and MC

+ +

int swe_houses(

+ +

         double +tjd_ut,      /* Julian day number, UT */

+ +

         double +geolat,      /* geographic latitude, in +degrees */

+ +

         double +geolon,      /* geographic longitude, in +degrees

+ +

                eastern longitude is positive,

+ +

                western longitude is negative,

+ +

                northern latitude is positive,

+ +

                southern latitude is negative */

+ +

         int +hsys,           /* house method, one of the letters PKRCAV */

+ +

         double* +cusps,      /* array for 13 doubles */

+ +

         double* +ascmc);     /* array for 10 doubles */

+ +

Extended +house function; to compute tropical or sidereal positions

+ +

int swe_houses_ex(

+ +

         double +tjd_ut,      /* Julian day number, UT */

+ +

         int32 +iflag,      /* +0 or SEFLG_SIDEREAL or SEFLG_RADIANS */

+ +

         double +geolat,      /* geographic latitude, in +degrees */

+ +

         double +geolon,      /* geographic longitude, in +degrees

+ +

                eastern longitude is positive,

+ +

                western longitude is negative,

+ +

                northern latitude is positive,

+ +

                southern latitude is negative */

+ +

         int +hsys,           /* house method, one of the letters PKRCAV */

+ +

         double* +cusps,      /* array for 13 doubles */

+ +

         double* +ascmc);     /* array for 10 doubles */

+ +

 

+ +

int swe_houses_armc(

+ +

         double +armc,      /* ARMC */

+ +

         double +geolat,      /* geographic latitude, in +degrees */

+ +

         double +eps,      /* ecliptic obliquity, in +degrees */

+ +

         int +hsys,           /* house method, one of the letters PKRCAV */

+ +

         double +*cusps,      /* array for 13 doubles */

+ +

         double +*ascmc);     /* array for 10 doubles */

+ +

 

+ +

Get the +house position of a celestial point

+ +

double swe_house_pos (

+ +

         double +armc,      /* ARMC */

+ +

         double +geolat,      /* geographic latitude, in +degrees

+ +

             +eastern longitude is positive,

+ +

                western longitude is negative,

+ +

                northern latitude is positive,

+ +

                southern latitude is negative */

+ +

         double +eps,      /* ecliptic obliquity, in +degrees */

+ +

         int +hsys,           /* house method, one of the letters PKRCAV */

+ +

         double +*xpin,      /* array of 2 doubles: ecl. +longitude and latitude of the planet */

+ +

        +char *serr);     /* return area for +error or warning message */

+ +

 

+ +

 

+ +

Get the +Gauquelin sector position for a body

+ +

 

+ +

double swe_gauquelin_sector(

+ +

double tjd_ut,      /* search after this time (UT) */

+ +

int32 ipl,           /* planet number, if +planet, or moon */

+ +

char *starname,      /* star name, if star */

+ +

int32 iflag,      /* flag for ephemeris and SEFLG_TOPOCTR */

+ +

int32 imeth,      /* method: 0 = with lat., 1 = without lat.,

+ +

               /*              2 = from rise/set, 3 = from rise/set with refraction +*/

+ +

double *geopos,      /* array of three doubles containing

+ +

               * geograph. long., lat., height of observer +*/

+ +

double atpress,       /* atmospheric +pressure, only useful with imeth=3;

+ +

                * if 0, default = 1013.25 mbar is used*/

+ +

double attemp,       /* atmospheric +temperature in degrees Celsius, only useful with imeth=3 */

+ +

double *dgsect,         /* return address for +gauquelin sector position */

+ +

char *serr);       /* return address for error +message */

+ +

 

+ +

 

+ +

 

+ +

16.6. Auxiliary functions

+ +

Coordinate +transformation, from ecliptic to equator or vice-versa

+ +

equator -> ecliptic     : eps must be positive

+ +

ecliptic -> equator       : +eps must be negative eps, longitude and latitude are in degrees! */

+ +

 

+ +

void swe_cotrans(

+ +

double *xpo, /* 3 doubles: +long., lat., dist. to be converted; distance remains unchanged, can be set to +1.00 */

+ +

         double *xpn,      /* 3 doubles: long., lat., dist. Result +of the conversion */

+ +

         double +eps);     /* obliquity of ecliptic, in +degrees. */

+ +

Coordinate +transformation of position and speed, from ecliptic to equator or vice-versa

+ +

/ * equator -> ecliptic        : +eps must be positive

+ +

  +ecliptic -> equator       : eps must be negative

+ +

  +eps, long., lat., and speeds in long. and lat. are in degrees! */

+ +

void swe_cotrans_sp(

+ +

         double +*xpo,      /* 6 doubles, input: long., +lat., dist. and speeds in long., lat and dist. */

+ +

         double +*xpn,      /* 6 doubles, position and +speed in new coordinate system */

+ +

         double +eps);     /* obliquity of ecliptic, in +degrees. */

+ +

Get the +name of a planet

+ +

char* swe_get_planet_name(

+ +

int ipl,               /* +planet number */

+ +

char* plan_name);     /* address for planet name, at least 20 char */

+ +

 

+ +

/* normalization of any degree number to +the range 0 ... 360 */

+ +

double swe_degnorm(double +x);

+ +

 

+ +

16.7. Other functions that may be useful

+ +

PLACALC, the +predecessor of SWISSEPH, had included several +functions that we do not need for SWISSEPH anymore. Nevertheless we include +them again in our DLL, because some users of our software may have taken them +over and use them in their applications. However, we gave them new names that +were more consistent with SWISSEPH.

+ +

PLACALC used +angular measurements in centiseconds a lot; +a centisecond is 1/100 of an arc second. The C +type CSEC or centisec is a 32-bit integer. CSEC was used because calculation with integer variables was +considerably faster than floating point calculation on most CPUs in 1988, when +PLACALC was written.

+ +

In the Swiss Ephemeris we have +dropped the use of centiseconds and use double (64-bit floating point) for all +angular measurements.

+ +

Normalize +argument into interval [0..DEG360]

+ +

/ * former function name: csnorm() */

+ +

extern EXP32 centisec FAR PASCAL_CONV +EXP16 swe_csnorm(centisec p);

+ +

Distance +in centisecs p1 - p2 normalized to [0..360]

+ +

/ * former function name: difcsn() */

+ +

extern EXP32 centisec FAR PASCAL_CONV +EXP16 swe_difcsn(centisec p1, centisec p2);

+ +

Distance +in degrees

+ +

/* former function name: difdegn() */

+ +

extern EXP32 double FAR PASCAL_CONV EXP16 swe_difdegn (double p1, double p2);

+ +

Distance +in centisecs p1 - p2 normalized to [-180..180]

+ +

/* former function name: difcs2n() */

+ +

extern EXP32 centisec FAR PASCAL_CONV +EXP16 swe_difcs2n(centisec p1, centisec p2);

+ +

 

+ +

Distance +in degrees

+ +

/* former function name: difdeg2n() */

+ +

extern EXP32 double FAR PASCAL_CONV EXP16 swe_difdeg2n(double p1, double p2);

+ +

Round +second, but at 29.5959 always down

+ +

 /* +former function name: roundsec() */

+ +

extern EXP32 centisec FAR PASCAL_CONV +EXP16 swe_csroundsec(centisec x);

+ +

Double to +long with rounding, no overflow check

+ +

/* former function name: d2l() */

+ +

extern EXP32 long FAR PASCAL_CONV EXP16 swe_d2l(double x);

+ +

Day of +week

+ +

/*Monday = 0, ... Sunday = 6  former function name: day_of_week() */

+ +

extern EXP32 int FAR PASCAL_CONV EXP16 swe_day_of_week(double jd);

+ +

Centiseconds +-> time string

+ +

/* former function name: TimeString() */

+ +

extern EXP32 char *FAR PASCAL_CONV EXP16 swe_cs2timestr(CSEC t, int sep, AS_BOOL +suppressZero, char *a);

+ +

Centiseconds +-> longitude or latitude string

+ +

/* former function name: LonLatString() */

+ +

extern EXP32 char *FAR PASCAL_CONV EXP16 swe_cs2lonlatstr(CSEC t, char pchar, char +mchar, char *s);

+ +

Centiseconds +-> degrees string

+ +

/* former function name: DegreeString() */

+ +

extern EXP32 char *FAR PASCAL_CONV EXP16 swe_cs2degstr(CSEC t, char *a);

+ +

 

+ +

17. The SWISSEPH DLLs

+ +

There is a 32 bit DLL:              swedll32.dll

+ +

 

+ +

You can use our programs swetest.cand swewin.cas examples.To compile swetestor swewin with a DLL:

+ +

 

+ +

1. The compiler needs the following files:

+ +

swetest.corswewin.c

+ +

swedll32.dll

+ +

swedll32.lib            (if you choose +implicit linking)

+ +

swephexp.h

+ +

swedll.h

+ +

sweodef.h

+ +

 

+ +

2. Define the following macros (-d):

+ +

USE_DLL

+ +

3. Build swetest.exe from swetest.cand swedll32.lib. +

+ +

    Build swewin.exe +from swewin.c,swewin.rc, and swedll32.lib

+ +

We +provide some project files which we have used to build our test samples. You +will need to adjust the project files to your environment.

+ +

We have +worked with Microsoft +Visual C++ 5.0 (32-bit). The DLLs where built +with the Microsoft compilers.

+ +

17.1 DLL Interface for brain damaged +compilers

+ +

If you work with GFA-Basic or some other brain damaged language, the problem will occur that +the DLL interface does not support 8-bit, 32-bit, double by value and VOID data +or function types. Therefore, we have written a set of modified functions that +use double pointers instead of doubles, character +pointersinstead of characters, and integersinstead of void. The names of these modified functions are the same as the names of +their prototypes, except that they end with ”_d”, e.g. swe_calc_d() instead of swe_calc().The export definitions of these functions can be found in file swedll.h. We do not repeat them here to avoid confusion with the ordinary +functions described in the preceding chapters. The additional functions are +only wrapper functions, i.e. they call internally the real DLL functions and +return the same results.

+ +

 

+ +

Swiss Ephemeris release 1.61 is the last +release for which 16-bit compilers have been supported and for which a 16-bit +DLL has been created.

+ +

 

+ +

18. Using the DLL with  +Visual Basic 5.0

+ +

 

+ +

The 32-bit DLL contains the exported function +under 'decorated names'. Each function has an underscore before its name, and a +suffix of the form @xx  where xx is the number of stack bytes +used by the call.

+ +

 

+ +

The Visual Basic declarations for the DLL +functions and for some important flag parameters are in the file

+ +

\sweph\vb\swedecl.txt and can be +inserted directly into a VB program.

+ +

 

+ +

A sample VB program vbsweph is included on the distribution, in directory \sweph\vb. To run this sample, the DLL file swedll32.dll +must be copied into the vb directory or installed in the Windows system +directory.

+ +

 

+ +

DLL functions returning a string:

+ +

Some DLL functions return a string, e.g.

+ +

char* swe_get_planet_name(int ipl, +char *plname)

+ +

 

+ +

This function copies its result into the +string pointer plname; the calling program must provide +sufficient space so that the result string fits into it. As usual in C +programming, the function copies the return string into the provided area and +returns the pointer to this area as the function value. This allows to use this +function directly in a C print statement.

+ +

 

+ +

In VB there are three problems with this +type of function:

+ +

 

+ +

1.   The string +parameter plname must be initialized to a string of +sufficient length before the call; the content does not matter because it is +overwritten by the called function. The parameter type must be
+
ByVal plname as +String.

+ +

2.         The +returned string is terminated by a NULL character. This must be searched in VB +and the VB string length must be set accordingly. Our sample program +demonstrates how this can be done:

+ +


+Private Function set_strlen(c$) As String
  i = InStr(c$, Chr$(0))
  c$ = Left(c$, i - 1)
  set_strlen = c$
+End Function
+plname = String(20,0)     ‘ initialize +string to length 20
+swe_get_planet_name(SE_SUN, plname)
+plname = set_strlen(plname)

+ +

3.   The function +value itself is a pointer to character. This function value cannot be used in +VB because VB does not have a pointer data type. In VB, such a Function can be +either declared as type ”As long” and the +return value ignored, or it can be declared as a Sub. We have chosen to declare +all such functions as ‚Sub‘, which +automatically ignores the return value.
+
Declare Sub swe_get_planet_name +(ByVal ipl as Long, ByVal plname as String)

+ +

 

+ +

19. Using the DLL with  +Borland Delphi and C++ Builder

+ +

19.1 Delphi 2.0 and higher (32-bit)

+ +

 

+ +

The information in this section was +contributed by Markus Fabian, Bern, Switzerland.

+ +

 

+ +

In Delphi 2.0 the declaration of the +function swe_calc() looks like this:

+ +

 

+ +

xx : Array[0..5] of double;

+ +

function swe_calc (tjd     : double;     // Julian day number

+ +

                   ipl      : Integer;    // planet number

+ +

                   iflag            : +Longint;    // flag bits

+ +

                   var +xx[0]     : double;

+ +

                   sErr            : PChar       // +Error-String;

+ +

    ) : Longint; +stdcall; far; external 'swedll32.dll' Name '_swe_calc@24';

+ +

 

+ +

A nearly complete set of declarations is in +file \sweph\delphi2\swe_d32.pas.

+ +

A small sample project for Delphi 2.0 is +also included in the same directory (starting with release 1.25 from +June 1998). This sample requires the DLL to exist in the same directory as the +sample.

+ +

19.2 Borland C++ Builder

+ +

Borland +C++ Builder (BCB) does not understand the +Microsoft format in the library file SWEDLL32.LIB; it +reports an OMF error when this file is used in a BCB project. The user must +create his/her own LIB file for BCB with the utility IMPLIB which is part of +BCB.

+ +

 

+ +

With the following command command you +create a special lib file in the current directory:

+ +

IMPLIB –f –c swe32bor.lib +\sweph\bin\swedll32.dll

+ +

 

+ +

In the C++ Builder project the following +settings must be made:

+ +

 

+ +

·          +Menu Options->Projects->Directories/Conditionals: add the conditional define USE_DLL

+ +

·         +Menu  +Project->Add_to_project: add the library file swe32bor.lib to +your project.

+ +

·         +In the project source, add the +include file +"swephexp.h"

+ +

 

+ +

In the header file swedll.h the declaration for Dllimport must be

+ +

#define DllImport  extern "C" __declspec( dllimport )

+ +

This is provided automatically by the __cplusplus switch for release 1.24 and +higher. For earlier releases the change must be made manually.

+ +

 

+ +

Changes for c++builder 2010

+ +

Swiss Ephemeris developer Jean Cremers, +Netherlands, reported in August 2010 that a different procedure is needed for +new versions of c++builder. This is his report:

+ +

 

+ +

The method +described in the file swephprg.htm 'Using the DLL with  Borland Delphi and C++ Builder' does not +work for the current c++builder (I use c++ builder 6).

+ +

The command +'IMPLIB –f –c swe32bor.lib \sweph\bin\swedll32.dll' will give 2 errors 'unable +to open file' and will create the file '-f.lib'.

+ +

It seems implib +cannot handle the switches anymore, indeed when left out the file swe32bor.lib +is generated but the file is in the coff format.

+ +

A solution is to +use the coff2omf.exe utility that comes with c++builder like this 'coff2omf.exe +swedll32.dll swe32bor.lib', it will generate a usable lib for c++builder.

+ +

 

+ +

The steps to use +sweph with c++builder then become:

+ +

 

+ +

----

+ +

With the +following command command you create a special lib file in the current +directory:

+ +

coff2omf.exe +swedll32.dll \sweph\bin\swe32bor.lib

+ +

 

+ +

In the C++ +Builder project the following settings must be made:

+ +

 

+ +

Menu +Options->Projects->Directories/Conditionals: add the conditional define +USE_DLL

+ +

Menu  Project->Add_to_project: add the library +file swe32bor.lib to your project.

+ +

In the project +source, add the include file "swephexp.h"

+ +

----

+ +

 

+ +

20. Using the Swiss Ephemeris with Perl

+ +

The Swiss Ephemeris can be run from Perl +using the Perl module SwissEph.pm. The module SwissEph.pm uses XSUB (“eXternal +SUBroutine”), which calls the Swiss Ephemeris functions either from a C library +or a DLL.

+ +

 

+ +

In order to run the Swiss Ephemeris from +Perl, you have to

+ +

 

+ +
    +
  1. Install the Swiss Ephemeris. Either you download the Swiss + Ephemeris DLL from http://www.astro.com/swisseph + or you download the Swiss Ephemeris C source code and compile a static or + dynamic shared library. We built the package on a Linux system and use a + shared library of the Swiss Ephemeris functions.
  2. +
+ +

 

+ +
    +
  1. Install the XS library:
  2. +
+ +

- Unpack the +file PerlSwissEph-1.76.00.tar.gz (or whatever newest version there is)

+ +

            - Open the file Makefile.PL, and edit it +according to your requirements. Then run it.

+ +

            - make install

+ +

 

+ +

If you work on a Windows machine and prefer +to use the Swiss Ephemeris DLL, you may want to study Rüdiger Plantiko's Perl +module for the Swiss Ephemeris at http://www.astrotexte.ch/sources/SwissEph.zip. +There is also a documentation in German language by Rüdiger Plantiko at http://www.astrotexte.ch/sources/swe_perl.html).

+ +

 

+ +

21. The C sample program

+ +

 

+ +

The distribution contains executables and C +source code of sample programs which demonstrate the use of the Swiss Ephemeris +DLL and its functions.

+ +

 

+ +

All samples programs are compiled with the +Microsoft Visual C++ 5.0 compiler (32-bit). Project and Workspace files for +these environments are included with the source files.

+ +

 

+ +

Directory structure:

+ +

Sweph\bin              DLL, LIB +and EXE file

+ +

Sweph\src                  source +files, resource files

+ +

Sweph\src\swewin32            32-bit windows sample program

+ +

Sweph\src\swete32       32-bit character mode sample program

+ +

 

+ +

 

+ +

You can run +the samples in the following environments:

+ +

Swetest.exe                         in Windows command line   

+ +

Swete32.exe                        in Windows command line

+ +

Swewin32.exe                        in Windows

+ +

 

+ +

 

+ +

Character mode executable that needs a +DLL

+ +

Swete32.exe

+ +

The project files are in \sweph\src\swete32

+ +

swetest.c

+ +

swedll32.lib

+ +

swephexp.h

+ +

swedll.h

+ +

sweodef.h

+ +

define +macros:USE_DLL   DOS32   DOS_DEGREE

+ +

 

+ +

 

+ +

swewin32.exe

+ +

The project files are in \sweph\src\swewin32

+ +

swewin.c

+ +

swedll32.lib

+ +

swewin.rc

+ +

swewin.h

+ +

swephexp.h

+ +

swedll.h

+ +

sweodef.h

+ +

resource.h

+ +

define macro    USE_DLL

+ +

 

+ +

How the sample programs search for the +ephemeris files:

+ +

 

+ +

1.   check +environment variable SE_EPHE_PATH; if it exists it is +used, and if it has invalid content, the program fails.

+ +

2.   Try to find +the ephemeris files in the current working directory

+ +

3.   Try to find +the ephemeris files in the directory where the executable resides

+ +

4.   Try to find +a directory named \SWEPH\EPHE in one of the following +three drives:

+ +

·         +where the executable resides

+ +

·         +current drive

+ +

·         +drive C:

+ +

 

+ +

As soon as it succeeds in finding the first +ephemeris file it looks for, it expects all required ephemeris files to reside +there. This is a feature of the sample programs only, as you can see in our C +code.

+ +

 

+ +

The DLL itself has a different and simpler +mechanism to search for ephemeris files, which is described with the function swe_set_ephe_path() above.

+ +

21. The source code distribution

+ +

Starting with release 1.26, the full +source code for the Swiss Ephemeris DLL is made available. Users can choose to +link the Swiss Ephemeris code directly into their applications. The source code +is written in Ansi C and consists of these files:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Bytes

+
+

Date

+
+

File name

+
+

Comment

+
+

1639

+
+

Nov 28 + 17:09

+
+

Makefile

+
+

unix + makefile for library

+
+

API + interface files

+
+

 

+
+

 

+
+

 

+
+

15050

+
+

Nov 27 + 10:56

+
+

swephexp.h

+
+

SwissEph + API include file

+
+

14803

+
+

Nov 27 + 10:59

+
+

swepcalc.h

+
+

Placalc API + include file

+
+

Internal + files

+
+

 

+
+

 

+
+

 

+
+

8518

+
+

Nov 27 + 10:06

+
+

swedate.c

+
+

 

+
+

2673

+
+

Nov 27 + 10:03

+
+

swedate.h

+
+

 

+
+

8808

+
+

Nov 28 + 19:24

+
+

swedll.h

+
+

 

+
+

24634

+
+

Nov 27 + 10:07

+
+

swehouse.c

+
+

 

+
+

2659

+
+

Nov 27 + 10:05

+
+

swehouse.h

+
+

 

+
+

31279

+
+

Nov 27 + 10:07

+
+

swejpl.c

+
+

 

+
+

3444

+
+

Nov 27 + 10:05

+
+

swejpl.h

+
+

 

+
+

38238

+
+

Nov 27 + 10:07

+
+

swemmoon.c

+
+

 

+
+

2772

+
+

Nov 27 + 10:05

+
+

swemosh.h

+
+

 

+
+

18687

+
+

Nov 27 + 10:07

+
+

swemplan.c

+
+

 

+
+

311564

+
+

Nov 27 + 10:07

+
+

swemptab.c

+
+

 

+
+

7291

+
+

Nov 27 + 10:06

+
+

sweodef.h

+
+

 

+
+

28680

+
+

Nov 27 + 10:07

+
+

swepcalc.c

+
+

 

+
+

173758

+
+

Nov 27 + 10:07

+
+

sweph.c

+
+

 

+
+

12136

+
+

Nov 27 + 10:06

+
+

sweph.h

+
+

 

+
+

55063

+
+

Nov 27 + 10:07

+
+

swephlib.c

+
+

 

+
+

4886

+
+

Nov 27 + 10:06

+
+

swephlib.h

+
+

 

+
+

43421

+
+

Nov 28 + 19:33

+
+

swetest.c

+
+

 

+
+ +

 

+ +

In most cases the user will compile +a linkable or shared library from the source code, using his favorite C +compiler, and then link this library with his application.

+ +

If the user programs in C, he will +only need to include the header file swephexp.h with his application; this in +turn will include sweodef.h. All other source files can ignored from the +perspective of application development.

+ +

22. The PLACALC compatibility API

+ +

To simplify porting of older Placalc applications to the Swiss Ephemeris API, +we have created the Placalc compatibility API which +consists of the header file swepcalc.h. This +header file replaces the headers ourdef.h, placalc.h, housasp.h and astrolib.h in Placalc applications.You should be able to link your Placalc aplication now +with the Swiss Ephemeris library. The Placalc API +is not contained in the SwissEph DLL.

+ +

All new software should use the SwissEph API directly.

+ +

23. Documentation files

+ +

 

+ +

The following files are in the directory \sweph\doc

+ +

 

+ +

sweph.cdr

+ +

sweph.gif

+ +

swephin.cdr

+ +

swephin.gif

+ +

swephprg.doc         Documentation +for programming, a MS Word-97 file

+ +

swephprg.rtf          

+ +

swisseph.doc         General +information on Swiss Ephemeris

+ +

swisseph.rtf

+ +

 

+ +

The files with suffix .CDR are Corel Draw +7.0 documents with the Swiss Ephemeris icons.

+ +

 

+ +

24. Swisseph with different hardware and compilers

+ +

Depending on what hardware and compiler you +use, there will be slight differences in your planetary calculations. For +positions in longitude, they will be never larger than 0.0001" in +longitude. Speeds show no difference larger than 0.0002 arcsec/day.

+ +

 

+ +

The following factors show larger +differences between HPUX and Linux on a Pentium II processor:

+ +

Mean +Node, Mean Apogee:

+ +

HPUX PA-Risc non-optimized versus optimized +code:

+ +

  +differences are smaller than 0.001 arcsec/day

+ +

 

+ +

HPUX PA-Risc +versus Intel Pentium gcc non-optimzed

+ +

  differences are +smaller than 0.001 arcsec/day

+ +

 

+ +

Intel Pentium gss non-optimzed versus -O9 +optimized:

+ +

Mean +Node, True node, Mean Apogee: difference smaller +than 0.001 arcsec/day

+ +

Osculating +Apogee: differences smaller than 0.03 arcsec

+ +

 

+ +

The differences originate from the fact +that the floating point arithmetic in the Pentium is executed with 80 bit +precision, whereas stored program variables have only 64 bit precision. When +code is optimized, more intermediate results are kept inside the processor +registers, i.e. they are not shortened from 80bit to 64 bit. When these results +are used for the next calculation, the outcome is then slightly different.

+ +

In the computation of speed for the nodes +and apogee, differences between positions at close intervals are involved; the +subtraction of nearly equal values results shows differences in internal +precision more easily than

+ +

other types of calculations. As these +differences have no effect on any imaginable application software and are mostly +within the design limit of Swiss Ephemeris, they can be savely ignored.

+ +

 

+ +

25. Debugging and Tracing Swisseph

+ +

25.1. If you are using the DLL

+ +

Besides the ordinary Swisseph function, +there are two additional DLLs that allow you tracing your Swisseph function +calls:

+ +

Swetrs32.dll is for single task debugging, i.e. if only one application at a +time calls Swisseph functions.

+ +

Two output files +are written:

+ +

a) swetrace.txt: reports all Swisseph functions that are being called.

+ +

b) swetrace.c: contains C code equivalent to the Swisseph calls that your +application did.

+ +

The last bracket +of the function main() at the end of the file is +missing.

+ +

If you want to +compile the code, you have to add it manually. Note that these files may grow +very fast,

+ +

depending on +what you are doing in your application. The output is limited to 10000 function +calls per run.

+ +

Swetrm32.dll is for multitasking, i.e. if more than one application at a time +are calling Swisseph functions. If you used the single task DLL here, all +applications would try to write their trace output into the same file. Swetrm32.dll generates output file names that contain the process identification +number of the application by which the DLL is called, e.g. swetrace_192.c and swetrace_192.txt.

+ +

Keep in mind +that every process creates its own output files and with time might fill your +disk.

+ +

In order to use a trace DLL, you have to +replace your Swisseph DLL by it:

+ +

a) save your Swisseph DLL

+ +

b) rename the trace DLL as your Swisseph +DLL (e.g. as +swedll32.dll)

+ +

 

+ +

IMPORTANT: The Swisseph DLL will not work properly if you call it from more +than one thread.

+ +

 

+ +

Output samples swetrace.txt:

+ +
+ +

 

+ +

swe_deltat: 2451337.870000                  0.000757        

+ +

swe_set_ephe_path: path_in =                   path_set = \sweph\ephe\

+ +

swe_calc: 2451337.870757                  -1                  258                  23.437404                  23.439365        -0.003530     -0.001961                  0.000000                  0.000000

+ +

swe_deltat: 2451337.870000                  0.000757        

+ +

swe_sidtime0: 2451337.870000                  sidt = 1.966683  eps = 23.437404                  nut = -0.003530     

+ +

swe_sidtime: 2451337.870000                  1.966683        

+ +

swe_calc: 2451337.870757                  0                  258                  77.142261        -0.000071                  1.014989                  0.956743         -0.000022                  0.000132

+ +

swe_get_planet_name: 0      Sun                 

+ +

 

+ +
+ +

 

+ +

swetrace.c:

+ +
+ +

#include +"sweodef.h"

+ +

#include +"swephexp.h"

+ +

 

+ +

void +main()

+ +

{

+ +

  double tjd, t, nut, eps; int i, ipl, retc; +long iflag;

+ +

  double armc, geolat, cusp[12], ascmc[10]; +int hsys;

+ +

  double xx[6]; long iflgret;

+ +

  char s[AS_MAXCH], star[AS_MAXCH], +serr[AS_MAXCH];

+ +

 

+ +

/*SWE_DELTAT*/

+ +

  tjd = +2451337.870000000; t = swe_deltat(tjd);

+ +

  +printf("swe_deltat: %f\t%f\t\n", tjd, t);

+ +

 

+ +

/*SWE_CALC*/

+ +

  tjd = +2451337.870757482; ipl = 0; iflag = 258;

+ +

  iflgret = +swe_calc(tjd, ipl, iflag, xx, serr);     /* +xx = 1239992 */

+ +

 

+ +

/*SWE_CLOSE*/

+ +

  swe_close();

+ +
+ +

 

+ +

25.2 If you are using the source code

+ +

Similar tracing is also possible if you +compile the Swisseph source code into your application. Use the preprocessor +definitions TRACE=1 for single task debugging, and +TRACE=2 for multitasking. In most compilers this flag can be set with –DTRACE=1 or /DTRACE=1.

+ +

For further explanations, see 21.1.

+ +
+ +

 

+ +
+ +

 

+ +

Appendix

+ +

Update and release history

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Updated

+
+

By

+
+

 

+
+

30-sep-97

+
+

Alois

+
+

added + chapter 10 (sample programs)

+
+

7-oct-97

+
+

Dieter

+
+

inserted + chapter 7 (house calculation)

+
+

8-oct-97

+
+

Dieter

+
+

Appendix + ”Changes from version 1.00 to 1.01”

+
+

12-oct-1997

+
+

Alois

+
+

Added new + chapter 10 Using the DLL with Visual Basic

+
+

26-oct-1997

+
+

Alois

+
+

 improved implementation and documentation + of swe_fixstar()

+
+

28-oct-1997

+
+

Dieter

+
+

 Changes from Version 1.02 to 1.03

+
+

29-oct-1997

+
+

Alois

+
+

 added VB sample extension, fixed VB + declaration errors

+
+

9-Nov-1997

+
+

Alois

+
+

 added Delphi declaration sample

+
+

8-Dec-97

+
+

Dieter

+
+

 remarks concerning computation of + asteroids, changes to version 1.04

+
+

8-Jan-98

+
+

Dieter

+
+

 changes from version 1.04 to 1.10.

+
+

12-Jan-98

+
+

Dieter

+
+

 changes from version 1.10 to 1.11.

+
+

21-Jan-98

+
+

Dieter

+
+

 calculation of topocentric planets and + house positions (1.20)

+
+

28-Jan-98

+
+

Dieter

+
+

 Delphi 1.0 sample and declarations for 16- + and 32-bit Delphi (1.21)

+
+

11-Feb-98

+
+

Dieter

+
+

 version 1.23

+
+

7-Mar-1998

+
+

Alois

+
+

 version 1.24 support for Borland C++ + Builder added

+
+

4-June-1998

+
+

Alois

+
+

 version 1.25 sample for Borland Delphi-2 + added

+
+

29-Nov-1998

+
+

Alois

+
+

 version 1.26 source code information added + §16, Placalc API added

+
+

1-Dec-1998

+
+

Dieter

+
+

 chapter 19 and some additions in beginning + of Appendix.

+
+

2-Dec-1998

+
+

Alois

+
+

 Equation of Time explained (in §4), changes + version 1.27 explained

+
+

3-Dec-1998

+
+

Dieter

+
+

 Note on ephemerides of 1992 QB1 and 1996 + TL66

+
+

17-Dec-1998

+
+

Alois

+
+

 Note on extended time range of 10'800 years

+
+

22 Dec 1998

+
+

Alois

+
+

 Appendix + A

+
+

12-Jan-1999

+
+

Dieter

+
+

 Eclipse functions added, version 1.31

+
+

19-Apr-99

+
+

Dieter

+
+

 version 1.4

+
+

8-Jun-99

+
+

Dieter

+
+

 Chapter 21 on tracing an debugging Swisseph

+
+

27-Jul-99

+
+

Dieter

+
+

 Info about sidereal calculations

+
+

16-Aug-99

+
+

Dieter

+
+

 version 1.51, minor bug fixes

+
+

15-Feb-00

+
+

Dieter

+
+

 many things for version 1.60

+
+

19-Mar-00

+
+

Vic Ogi

+
+

SWEPHPRG.DOC + re-edited

+
+

17-apr-02

+
+

Dieter

+
+

Documentation for version 1.64

+
+

26-Jun-02

+
+

Dieter

+
+

Version 1.64.01

+
+

31-dec-2002

+
+

Alois

+
+

edited doc to remove references to 16-bit + version

+
+

12-jun-2003

+
+

Alois/Dieter

+
+

Documentation for version 1.65

+
+

10-Jul-2003

+
+

Dieter

+
+

Documentation for version 1.66

+
+

 

+
+

25-May-2004

+
+

Dieter

+
+

Documentation of eclipse functions updated

+
+

 

+
+

31-Mar-2005

+
+

Dieter

+
+

Documentation for version 1.67

+
+

 

+
+

3-May-2005

+
+

Dieter

+
+

Documentation for version 1.67.01

+
+

 

+
+

22-Feb-2006

+
+

Dieter

+
+

Documentation for version 1.70.00

+
+

 

+
+

2-May-2006

+
+

Dieter

+
+

Documentation for version 1.70.01

+
+

 

+
+

5-Feb-2006

+
+

Dieter

+
+

Documentation for version 1.70.02

+
+

 

+
+

30-Jun-2006

+
+

Dieter

+
+

Documentation for version 1.70.03

+
+

 

+
+

28-Sep-2006

+
+

Dieter

+
+

Documentation for version 1.71

+
+

29-May-2008

+
+

Dieter

+
+

Documentation for version 1.73

+
+

18-Jun-2008

+
+

Dieter

+
+

Documentation for version 1.74

+
+

27-Aug-2008

+
+

Dieter

+
+

Documentation for version 1.75

+
+

7-April-2009

+
+

Dieter

+
+

Documentation of version 1.76

+
+ +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Release

+
+

Date

+
+

 

+
+

1.00

+
+

30-sep-1997

+
+

 

+
+

1.01

+
+

9-oct-1997

+
+

houses(), sidtime() made more convenient for developer, Vertex added.

+
+

1.02

+
+

16-oct-1997

+
+

houses() + changed again, Visual Basic support, new numbers for fictitious planets This + release was pushed to all existing licensees at this date.

+
+

1.03

+
+

28-Oct-1997

+
+

minor bug + fixes, improved swe_fixstar() functionality. This + release was not pushed, as the changes and bug fixes are minor; no changes of + function definitions occurred.

+
+

1.04

+
+

8-Dec-1997

+
+

minor bug + fixes; more asteroids.

+
+

1.10

+
+

9-Jan-1998

+
+

bug fix, s. + Appendix. This release was pushed to all existing licensees at this date.

+
+

1.11

+
+

12-Jan-98

+
+

small + improvements

+
+

1.20

+
+

20-Jan-98

+
+

New: topocentric planets + and house positions; a minor bug fix

+
+

1.21

+
+

28-Jan-98

+
+

Delphi + declarations and sample for Delphi 1.0

+
+

1.22

+
+

2-Feb-98

+
+

Asteroids + moved to subdirectory. Swe_calc() finds them + there.

+
+

1.23

+
+

11-Feb-98

+
+

two minor + bug fixes.

+
+

1.24

+
+

7-Mar-1998

+
+

Documentation + for Borland C++ Builder added, see section 14.3

+
+

1.25

+
+

4-June-1998

+
+

Sample for + Borland Delphi-2 added

+
+

1.26

+
+

29-Nov-1998

+
+

full source + code made available, Placalc API documented

+
+

1.27

+
+

2-dec-1998

+
+

Changes to SE_EPHE_PATH and swe_set_ephe_path()

+
+

1.30

+
+

17-Dec-1998

+
+

Time range + extended to 10'800 years

+
+

1.31

+
+

12-Jan-1999

+
+

New: Eclipse functions + added

+
+

1.40

+
+

19-Apr-99

+
+

New: planetary phenomena + added; bug fix in swe_sol_ecl_when_glob();

+
+

1.50

+
+

27-Jul-99

+
+

New: SIDEREAL planetary + positions and houses; new fixstars.cat

+
+

1.51

+
+

16-Aug-99

+
+

Minor bug + fixes

+
+

1.60

+
+

15-Feb-2000

+
+

Major + release with many new features and + some minor bug fixes

+
+

1.61

+
+

11-Sep-2000

+
+

Minor + release, additions to se_rise_trans(), swe_houses(), ficitious planets

+
+

1.61.01

+
+

18-Sep-2000

+
+

Minor + release, added Alcabitus house system

+
+

1.61.02

+
+

10-Jul-2001

+
+

Minor + release, fixed bug which prevented asteroid files > 22767 to be accepted

+
+

1.61.03

+
+

20-Jul-2001

+
+

Minor + release, fixed bug which was introduced in 1.61.02: Ecliptic was computed in + Radians instead of degrees

+
+

1.62.00

+
+

    23-Jul-2001

+
+

Minor + release, several bug fixes, code for fictitious satellites of the earth, + asteroid files > 55535 are accepted

+
+

1.62.01

+
+

16-Oct-2001

+
+

Bug fix, + string overflow in sweph.c::read_const(),

+
+

1.63.00

+
+

5-Jan-2002

+
+

Added house + calculation to sweetest.c and swetest.exe

+
+

1.64.00

+
+

6-Mar-2002

+
+

House + system ‘G’ for house functions and function swe_gauquelin_sector() for + Gauquelin sector calculations

+

Occultations of planets and fixed stars + by the moon

+

New Delta T algorithms

+
+

1.64.01

+
+

26-Jun-2002

+
+

Bug fix in + swe_fixstar(). Stars with decl. between –1° and 0° were wrong

+
+

1.65.00

+
+

12-Jun-2003

+
+

Long + variables replaced by INT32 for 64-bit compilers

+
+

1.66.00

+
+

10-Jul-2003

+
+

House + system ‘M’ for Morinus houses

+
+

1.67.00

+
+

31-Mar-2005

+
+

Update Delta T

+
+

1.67.01

+
+

3-May-2005

+
+

Docu for + sidereal calculations (Chap. 10) updated (precession-corrected transits)

+
+

1.70.00

+
+

22-Feb-2006

+
+

all + relevant IAU resolutions up to 2005 have been implemented

+
+

1.70.01

+
+

2-May-2006

+
+

minor bug + fix

+
+

1.70.02

+
+

5-May-2006

+
+

minor bug + fix

+
+

1.70.03

+
+

30-June-2006

+
+

bug fix

+
+

1.71

+
+

28-Sep-2006

+
+

Swiss + Ephemeris functions able to calculate minor planet  no 134340 Pluto

+
+

1.72

+
+

28-Sep-2007

+
+

New + function swe_refract_extended(), Delta T update, minor bug fixes

+
+

1.73

+
+

29-May-2008

+
+

New + function swe_fixstars_mag(), Whole Sign houses

+
+

1.74

+
+

18-Jun-2008

+
+

Bug fixes

+
+

1.75

+
+

27-Aug-2008

+
+

Swiss + Ephemeris can read newer JPL ephemeris files; bug fixes

+
+

1.76

+
+

7-April-2009

+
+

Heliacal + risings, UTC and minor improvements/bug fixes

+
+

1.77

+
+

26-Jan-2010

+
+

swe_deltat(), + swe_fixstar() improved, swe_utc_time_zone_added

+
+

1.78

+
+

3-Aug-2012

+
+

New + precession, improvement of some eclipse functions, some minor bug fixes

+
+

1.79

+
+

18-Apr-2013

+
+

New + precession, improvement of some eclipse functions, some minor bug fixes

+
+ +

 

+ +

Changes from version 1.78 to 1.79

+ +

- Improved precision in eclipse calculations: +2nd and 3rd contact with solar eclipses, penumbral and +partial phases with lunar eclipses.

+ +

- Bug fix in function +swe_sol_eclipse_when_loc().If the local maximum eclipse occurs at sunset or +sunrise, tret[0] now gives the moment when the lower limb of the Sun touches +the horizon. This was not correctly implemented in former versions

+ +

- Several changes to C code that had +caused compiler warnings (as proposed by Torsten Förtsch).

+ +

- Bug fix in Perl functions swe_house() +etc. These functions had crashed with a segmention violation if called with the +house parameter ‘G’.

+ +

- Bug fix in Perl function swe_utc_to_jd(), where gregflag had been +read from the 4th instead of the 6th parameter.

+ +

- Bug fix in Perl functions to do with date conversion. The default +mechanism for gregflag was buggy. 

+ +

- For +Hindu astrologers, some more ayanamshas were added that are related to +Suryasiddhanta and Aryabhata and are of historical interest.

+ +

 

+ +

Changes from version 1.77 to 1.78

+ +

- precession is now calculated according to Vondrák, Capitaine, +and Wallace 2011.

+ +

- Delta t for current years updated.

+ +

- new function: swe_rise_trans_true_hor() +for risings and settings at a local horizon with known height.

+ +

- functions swe_sol_eclipse_when_loc(), +swe_lun_occult_when_loc(): return values tret[5] and tret[6] (sunrise and +sunset times) added, which had been 0 so far.

+ +

- function swe_lun_eclipse_how(): return +values attr[4-6] added (azimuth and apparent and true altitude of moon).

+ +

- Attention with swe_sol_eclipse_how(): return value +attr[4] is azimuth, now measured from south, in agreement with the function +swe_azalt() and swe_azalt_rev().

+ +

- minor bug fix in swe_rise_trans(): +twilight calculation returned invalid times at high geographic latitudes.

+ +

- minor bug fix: when calling swe_calc() +1. with SEFLG_MOSEPH, 2. with SEFLG_SWIEPH, 3. again with SEFLG_MOSEPH, the +result of 1. and 3. were slightly different. Now they agree.

+ +

- minor bug fix in swe_houses(): With +house methods H (Horizon), X (Meridian), M (Morinus), and geographic latitudes +beyond the polar circle, the ascendant was wrong at times. The ascendant always +has to be on the eastern part of the horizon.

+ +

 

+ +

Changes from version 1.76 to 1.77

+ +

- Delta T:

+ +

  +- Current values were updated.

+ +

  +- File sedeltat.txt understands doubles.

+ +

  +- For the period before 1633, the new formulae by Espenak and Meeus +(2006) are used.  These formulae were +derived from Morrison & Stephenson (2004), as used by the Swiss Ephemeris +until version 1.76.02.

+ +

  +- The tidal acceleration of the moon contained in LE405/6 was corrected +according to Chapront/Chapront-Touzé/Francou A&A 387 (2002), p. 705.

+ +

 

+ +

- Fixed stars:

+ +

  +- There was an error in the handling of the proper motion in RA. The +values given in fixstars.cat, which are taken from the Simbad database +(Hipparcos), are referred to a great circle and include a factor of cos(d0).

+ +

  +- There is a new fixed stars file sefstars.txt. The parameters are now +identical to those in the Simbad database, which makes it much easier to add +new star data to the file. If the program function swe_fixstars() does not find +sefstars.txt, it will try the the old fixed stars file fixstars.cat and will +handle it correctly.

+ +

  +- Fixed stars data were updated, some errors corrected.

+ +

  +- Search string for a star ignores white spaces.

+ +

 

+ +

- Other changes:

+ +

  +- New function swe_utc_time_zone(), converts local time to UTC and UTC +to local time. Note, the function has no knowledge about time zones. The Swiss +Ephemeris still does not provide the time zone for a given place and time.

+ +

  +- swecl.c:swe_rise_trans() has two new minor features: +SE_BIT_FIXED_DISC_SIZE and SE_BIT_DISC_BOTTOM (thanks to Olivier Beltrami)

+ +

  +- minor bug fix in swemmoon.c, Moshier's lunar ephemeris (thanks to +Bhanu Pinnamaneni)

+ +

  +- solar and lunar eclipse functions provide additional data:

+ +

    +attr[8] magnitude, attr[9] saros series number, attr[10] saros series +member number

+ +

 

+ +

Changes from version 1.75 to 1.76

+ +

New features:

+ +

- Functions for the calculation of +heliacal risings and related phenomena, s. chap. 6.15-6.17.

+ +

- Functions for conversion between UTC +and JD (TT/UT1), s. chap. 7.2 and 7.3.

+ +

- File sedeltat.txt allows the user to +update Delta T himself regularly, s. chap. 8.3

+ +

- Function swe_rise_trans(): twilight +calculations (civil, nautical, and astronomical) added

+ +

- Function swe_version() returns version +number of Swiss Ephemeris.

+ +

- Swiss Ephemeris for Perl programmers +using XSUB

+ +

 

+ +

Other updates:

+ +

- Delta T updated (-2009).

+ +

 

+ +

Minor bug fixes:

+ +

- swe_house_pos(): minor bug with +Alcabitius houses fixed

+ +

- swe_sol_eclipse_when_glob(): totality +times for eclipses jd2456776 and jd2879654 fixed (tret[4], tret[5])

+ +

Changes from version 1.74 to version 1.75

+ +

- The Swiss Ephemeris is now able to read +ephemeris files of JPL ephemerides DE200 - DE421. If JPL will not change the +file structure in future releases, the Swiss Ephemeris will be able to read +them, as well.

+ +

 

+ +

- Function swe_fixstar() (and +swe_fixstar_ut()) was made slightly more efficient.

+ +

 

+ +

- Function swe_gauquelin_sector() was +extended.

+ +

 

+ +

- Minor bug fixes.

+ +

Changes from version 1.73 to version 1.74

+ +

The Swiss Ephemeris is made available +under a dual licensing system:

+ +

  a) +GNU public license version 2 or later

+ +

  b) +Swiss Ephemeris Professional License

+ +

For more details, see at the beginning of +this file and at the beginning of every source code file.

+ +

 

+ +

Minor bug fixes:

+ +

- Bug in swe_fixstars_mag() fixed.

+ +

- Bug in swe_nod_aps() fixed. With +retrograde asteroids (20461 Dioretsa, 65407 2002RP120), the calculation of +perihelion and aphelion was not correct.

+ +

- The ephemeris of asteroid 65407 +2002RP120 was updated. It had been wrong before 17 June 2008.

+ +

Changes from version 1.72 to version 1.73

+ +

New features:

+ +

- Whole Sign houses implemented (W)

+ +

- swe_house_pos() now also handles +Alcabitius house method

+ +

- function swe_fixstars_mag() provides +fixed stars magnitudes

+ +

 

+ +

Changes from version 1.71 to version 1.72

+ +

- Delta T values for recent years were +updated

+ +

- Delta T +calculation before 1600 was updated to Morrison/Stephenson 2004..

+ +

- New function swe_refract_extended(), in +cooperation with archaeoastronomer Victor  +Reijs.

+ +

  This +function allows correct calculation of refraction for altitudes above sea > +0, where the ideal horizon and

+ +

  +Planets that are visible may have a negative height.

+ +

- Minor bugs in +swe_lun_occult_when_glob() and swe_lun_eclipse_how() were fixed.

+ +

 

+ +

Changes from version 1.70.03 to version +1.71

+ +

In September 2006, Pluto was introduced +to the minor planet catalogue and given the catalogue number 134340.

+ +

The numerical integrator we use to +generate minor planet ephemerides would crash with 134340 Pluto, because Pluto +is one of those planets whose gravitational perturbations are used for the +numerical integration. Instead of fixing the numerical integrator for this +special case, we chang the Swiss Ephemeris functions in such a way that they +treat minor planet 134340 Pluto (ipl=SE_AST_OFFSET+134340) as our main body +Pluto (ipl=SE_PLUTO=9). This also results in a slightly better precision for +134340 Pluto.

+ +

 

+ +

Swiss Ephemeris versions prior to 1.71 +are not able to do any calculations for minor planet number 134340.

+ +

Changes from version 1.70.02 to version +1.70.03

+ +

Bug fixed (in swecl.c: swi_bias()): This +bug sometimes resulted in a crash, if the DLL was used and the SEFLG_SPEED was +not set. It seems that the error happened only with the DLL and did not appear, +when the Swiss Ephemeris C code was directly linked to the application.

+ +

 

+ +

Code to do with (#define NO_MOSHIER ) war +removed.

+ +

Changes from version 1.70.01 to version +1.70.02

+ +

Bug fixed in speed calculation for +interpolated lunar apsides. With ephemeris positions close to 0 Aries, speed +calculations were completely wrong. E.g. swetest -pc -bj3670817.276275689 +(speed = 1448042° !)

+ +

Thanks, once more, to Thomas Mack, for +testing the software so well.

+ +

 

+ +

Changes from version 1.70.00 to version +1.70.01

+ +

Bug fixed in speed calculation for +interpolated lunar apsides. Bug could result in program crashes if the speed +flag was set.

+ +

 

+ +

Changes from version 1.67 to version 1.70

+ +

Update of +algorithms to IAU standard recommendations:

+ +

All relevant IAU resolutions up to 2005 +have been implemented. These include:

+ +

- the "frame bias" rotation from +the JPL reference system ICRS to J2000. The correction of position ~= 0.0068 +arc sec in right ascension.

+ +

- the precession model P03 +(Capitaine/Wallace/Chapront 2003). The correction in longitude is smaller than +1 arc second from 1000 B.C. on.

+ +

- the nutation model IAU2000B (can be +switched to IAU2000A)

+ +

- corrections to epsilon

+ +

- corrections to sidereal time

+ +

- fixed stars input data can be +"J2000" or "ICRS"

+ +

- fixed stars conversion FK5 -> J2000, +where required

+ +

- fixed stars data file was updated with +newer data

+ +

- constants in sweph.h updated

+ +

For more info, see the documentation +swisseph.doc, chapters 2.1.2.1-3.

+ +

 

+ +

New features:

+ +

- Ephemerides of "interpolated lunar +apogee and perigee", as published by Dieter Koch in 2000 (swetest -pcg).

+ +

  +For more info, see the documentation swisseph.doc, chapter 2.2.4.

+ +

- House system according to Bogdan +Krusinski (character ‘U’).

+ +

  +For more info, see the documentation swisseph.doc, chapter 6.1.13.

+ +

 

+ +

Bug fixes:

+ +

- Calculation of magnitude was wrong with +asteroid numbers < 10000 (10-nov-05)

+ +

 

+ +

Changes from version 1.66 to version 1.67

+ +

 

+ +

Delta-T updated with new measured values +for the years 2003 and 2004, and better estimates for 2005 and 2006.

+ +

Bug fixed #define SE_NFICT_ELEM 15

+ +

Changes from version 1.65 to version 1.66

+ +

 

+ +

New features:

+ +

House system according to Morinus (system +‘M’).

+ +

Changes from version 1.64.01 to version +1.65.00

+ +

 

+ +

‘long’ variables were changed to ‘INT32’ +for 64-bit compilers.

+ +

 

+ +

Changes from version 1.64 to version +1.64.01

+ +

 

+ +

- Bug fixed in swe_fixstar(). Declinations +between –1° and 0° were wrongly taken as positive.

+ +

Thanks to John Smith, Serbia, who found +this bug.

+ +

- Several minor bug fixes and cosmetic code +improvements suggested by Thomas Mack, Germany.

+ +

  +swetest.c: options –po and –pn work now.

+ +

  +Sweph.c: speed of mean node and mean lunar apogee were wrong in rare +cases, near 0 Aries.

+ +

Changes from version 1.63 to version 1.64

+ +

 

+ +

New features:

+ +

1) Gauquelin sectors:

+ +

- swe_houses() etc. can be called with +house system character ‘G’ to calculate Gauquelin sector boundaries.

+ +

- swe_house_pos() can be called with house +system ‘G’ to calculate sector positions of planets.

+ +

- swe_gauquelin_sector() is new and +calculates Gauquelin sector positions with three methods: without ecl. latitude, +with ecl. latitude, from rising and setting.

+ +

 

+ +

2) Waldemath Black Moon elements have been +added in seorbel.txt (with thanks to Graham Dawson).

+ +

 

+ +

3) Occultations of the planets and fixed +stars by the moon

+ +

- swe_lun_occult_when_loc() calculates +occultations for a given geographic location

+ +

- swe_lun_occult_when_glob() calculates +occultations globally

+ +

 

+ +

4) Minor bug fixes in swe_fixstar() +(Cartesian coordinates), solar eclipse functions, swe_rise_trans()

+ +

 

+ +

5) sweclips.c integrated into swetest.c. +Swetest now also calculates eclipses, occultations, risings and settings.

+ +

 

+ +

6) new Delta T algorithms

+ +

Changes from version 1.62 to version 1.63

+ +

 

+ +

New features:

+ +

The option –house was added to swetest.c so +that swetest.exe can now be used to compute complete horoscopes in textual +mode.

+ +

Bux fix: a minor bug in function +swe_co_trans was fixed. It never had an effect.

+ +

Changes from version 1.61.03 to version +1.62

+ +

 

+ +

New features:

+ +

1) Elements for hypothetical bodies that +move around the earth (e.g. Selena/White Moon) can be added to the file +seorbel.txt.

+ +

2) The software will be able to read +asteroid files > 55535.

+ +

 

+ +

Bug fixes:

+ +

1) error in geocentric planetary descending +nodes fixed

+ +

2) swe_calc() now allows hypothetical +planets beyond SE_FICT_OFFSET + 15

+ +

3) position of hypothetical planets +slightly corrected (< 0.01 arc second)

+ +

Changes from version 1.61 to 1.61.01

+ +

 

+ +

New features:

+ +

1. swe_houses and swe_houses_armc now +supports the Alcabitus house system. The function swe_house_pos() does not yet, +because we wanted to release quickly on user request.

+ +

Changes from version 1.60 to 1.61

+ +

 

+ +

New features:

+ +

1. Function swe_rise_trans(): Risings and +settings also for disc center and without refraction

+ +

2. “topocentric” house system added to +swe_houses() and other house-related functions

+ +

3. Hypothetical planets (seorbel.txt), +orbital elements with t terms are possible now (e.g. for Vulcan according to +L.H. Weston)

+ +

Changes from version 1.51 to 1.60

+ +

 

+ +

New features:

+ +

1. Universal time functions swe_calc_ut(), swe_fixstar_ut(), etc.

+ +

2. Planetary nodes, perihelia, aphelia, +focal points

+ +

3. Risings, settings, and meridian transits of the Moon, planets, asteroids, and stars.

+ +

4. Horizontal coordinates (azimuth and altitude)

+ +

5. Refraction

+ +

6. User-definable orbital elements

+ +

7. Asteroid names can be updated by user

+ +

8. Hitherto missing "Personal +Sensitive Points" according to M. Munkasey.

+ +

 

+ +

Minor bug fixes:

+ +

·         +Astrometric lunar positions (not relevant for astrology; swe_calc(tjd, SE_MOON, SEFLG_NOABERR)) had a maximum error of about 20 arc sec).

+ +

·         +Topocentric lunar positions (not relevant for common astrology): the ellipsoid shape of the +earth was not correctly implemented. This resulted in an error of 2 - 3 arc +seconds. The new precision is 0.2 - 0.3 arc seconds, corresponding to about 500 +m in geographic location. This is also the precision that Nasa's Horizon system +provides for the topocentric moon. The planets are much better, of course.

+ +

·         +Solar eclipse functions: The correction of the topocentric moon +and another small bug fix lead to slightly different results of the solar +eclipse functions. The improvement is within a few time seconds.

+ +

 

+ +

Changes from version 1.50 to 1.51

+ +

Minor bug fixes:

+ +

·         +J2000 coordinates for the lunar node +and osculating apogee corrected. This bug did not affect ordinary computations +like ecliptical or equatorial positions.

+ +

·         +minor bugs in swetest.c corrected

+ +

·         +sweclips.exe recompiled

+ +

·         +trace DLLs recompiled

+ +

·         +some VB5 declarations corrected

+ +

Changes from version 1.40 to 1.50

+ +

New:SIDEREAL planetary +and house position.

+ +

·         +The fixed star file fixstars.cat has been improved and enlarged by Valentin Abramov, Tartu, Estonia.

+ +

·         +Stars have been ordered by +constellation. Many names and alternative spellings have been added.

+ +

·         +Minor bug fix in solar eclipse +functions, sometimes relevant in border-line cases annular/total, partial/total.

+ +

·         +J2000 coordinates for the lunar nodes +were redefined: In versions before 1.50, the J2000 lunar nodes were the +intersection points of the lunar orbit with the ecliptic of 2000. From 1.50 on, +they are defined as the intersection points with the ecliptic of date, referred +to the coordinate system of the ecliptic of J2000.

+ +

 

+ +

Changes from version 1.31 to 1.40

+ +

New:Function for several +planetary phenomena added

+ +

Bug fix in swe_sol_ecl_when_glob(). The time for maximum eclipse at local apparent noon (tret[1]) was +sometimes wrong. When called from VB5, the program crashed.

+ +

 

+ +

Changes from version 1.30 to 1.31

+ +

New: Eclipse functions added.

+ +

Minor bug fix: with previous versions, the +function +swe_get_planet_name() got the name wrong, if it +was an asteroid name and consisted of two or more words (e.g. Van Gogh)

+ +

Changes from version 1.27 to 1.30

+ +

The time range of the Swiss Ephemeris has +been extended by numerical integration. The Swiss Ephemeris now covers the +period 2 Jan 5401 BC to 31 Dec 5399 AD. To use the extended time +range, the appropriate ephemeris files must be downloaded.

+ +

In the JPL mode and the Moshier mode the +time range remains unchanged at 3000 BC to 3000 AD.

+ +

 IMPORTANT  +

+ +

Chiron’s ephemeris is now restricted to the +time range 650 AD – 4650 AD; for explanations, see swisseph.doc.

+ +

Outside this time range, Swiss Ephemeris +returns an error code and a position value 0. You must handle this situation in +your application. There is a similar restriction with Pholus (as with some +other asteroids).

+ +

Changes from version 1.26 to 1.27

+ +

The environment variable SE_EPHE_PATH is now always overriding the call to swe_set_ephe_path() if it is set and contains a value.

+ +

Both the environment variable and the +function argument can now contain a list of directory names where the ephemeris +files are looked for. Before this release, they could contain only a single +directory name.

+ +

Changes from version 1.25 to 1.26

+ +

·         +The asteroid subdirectory +ephe/asteroid has been split into directories ast0, ast1,... +with 1000 asteroid files per directory.  +

+ +

·         +source code is included with the +distribution under the new licensing model

+ +

·         +the Placalc compatibility API (swepcalc.h) is now documented

+ +

·         +There is a new function to +compute the equation of time swe_time_equ().

+ +

·         +Improvements of ephemerides:

+ +

·         +ATTENTION: Ephemeris of 16 Psyche has been wrong so far ! By a +mysterious mistake it has been identical to 3 Juno.

+ +

·         +Ephemerides of Ceres, Pallas, Vesta, +Juno, Chiron and Pholus have been reintegrated, with more recent orbital +elements and parameters (e.g. asteroid masses) that are more appropriate to +Bowells database of minor planets elements. The differences are small, though.

+ +

·         +Note that the CHIRON ephemeris is should not be used +before 700 A.D.

+ +

·         +Minor bug fix in computation of +topocentric planet positions. Nutation has not been correcly considered in +observer’s position. This has lead to an error of 1 milliarcsec with the +planets and 0.1” with the moon.

+ +

·         +We have inactivated the coordinate +transformation from IERS to FK5, because there is still no +generally accepted algorithm. This results in a difference of a few milliarcsec +from former releases.

+ +

Changes from version 1.22 to 1.23

+ +

·         +The topocentric flag now also works +with the fixed stars. (The effect of diurnal aberration is a few 0.1 arc +second.)

+ +

·         +Bug fix: The return position of swe_cotrans_sp() has been 0, when the input distance was 0.

+ +

·         +About 140 asteroids are on the CD.

+ +

Changes from version 1.21 to 1.22

+ +

·         +Asteroid ephemerides have been moved +to the ephe\asteroid.

+ +

·         +The DLL has been modified in such a +way that it can find them there.

+ +

·         +All asteroids with catalogue number +below 90 are on the CD and a few additional ones.

+ +

Changes from version 1.20 to 1.21

+ +

Sample program and function declarations +for Delphi 1.0   added.

+ +

Changes from version 1.11 to 1.20

+ +

New:

+ +

·         +A flag bit SEFLG_TOPOCTR allows to compute topocentric planet positions. Before calling swe_calc(), call swe_set_topo.

+ +

·         +swe_house_pos for computation of the +house position of a given planet. See description in SWISSEPH.DOC, Chapter 3.1 ”Geocentric and topocentric +positions”. A bug has been fixed that has sometimes turned up, when the +JPL ephemeris was closed. (An error in memory allocation and freeing.)

+ +

·         +Bug fix: swe_cotrans() did not work in former versions.

+ +

Changes from version 1.10 to 1.11

+ +

No bug fix, but two minor improvements:

+ +

 

+ +

·         +A change of the ephemeris bits in +parameter iflag of function +swe_calc() usually forces an implicit swe_close() +operation. Inside a loop, e.g. for drawing a graphical epehemeris, this can +slow down a program. Before this release, two calls with iflag = 0 and iflag = SEFLG_SWIEPH where +considered different, though in fact the same ephemeris is used. Now these two calls +are considered identical, and swe_close() is not +performed implicitly.
+For calls with the pseudo-planet-number
ipl = SE_ECL_NUT, whose result does not depend on the chosen ephemeris, the +ephemeris bits are ignored completely and swe_close() +is never performed implicitly.

+ +

·         +In former versions, calls of the +Moshier ephemeris with speed and without speed flag have returned a very small +difference in position (0.01 arc second). The reason was that, for precise +speed, swe_calc() had to do an additional iteration in the light-time calculation. +The two calls now return identical position data.

+ +

Changes from version 1.04 to 1.10

+ +

·         +A bug has been fixed that sometimes +occurred in swe_calc() when the user changed iflag between calls, e.g. the speed flag. The first call for a planet which had been +previously computed for the same time, but a different iflag, could return +incorrect results, if Sun, Moon or Earth had been computed for a different time +in between these two calls.

+ +

·         +More asteroids have been added in this +release.

+ +

Changes from Version 1.03 to 1.04

+ +

·         +A bug has been fixed that has +sometimes lead to a floating point exception when the speed flag was not +specified and an unusual sequence of planets was called.

+ +

·         +Additional asteroid files have been +included.

+ +

 

+ +

 Attention:   Use these files only with +the new DLL. Previous versions cannot deal with more than one additional +asteroid besides the main asteroids. This error did not appear so far, because +only 433 Eros was on our CD-ROM.

+ +

Changes from Version 1.02 to 1.03

+ +

·         +swe_fixstar() has a better +implementation for the search of a specific star. If a number is given, the +non-comment lines in the file fixstars.cat are now +counted from 1; they where counted from zero in earlier releases.

+ +

·         +swe_fixstar() now also computes +heliocentric and barycentric fixed stars positions. Former versions Swiss +Ephemeris always returned geocentric positions, even if the heliocentric or the +barycentric flag bit was set.

+ +

·         +The Galactic Center has been included in fixstars.cat.

+ +

·         +Two small bugs were fixed in the +implementation of the barycentric Sun and planets. Under unusual conditions, +e.g. if the caller switched from JPL to Swiss Ephemeris or vice-versa, an error +of an arc second appeared with the barycentric sun and 0.001 arc sec with the +barycentric planets. However, this did not touch normal geocentric +computations.

+ +

·         +Some VB declarations in swedecl.txt +contained errors and have been fixed. The VB sample has been extended to show +fixed star and house calculation. This fix is only in 1.03 releases from 29-oct-97 +or later, not in the two 1.03 CDROMs we burned on 28-oct-97.

+ +

Changes from Version 1.01 to 1.02

+ +

 

+ +

·         +The function swe_houses() has been changed.

+ +

·         +A new function swe_houses_armc() has been added which can be used when a sidereal time (armc) is given but no actual date is known, e.g. for Composite charts.

+ +

·         +The body numbers of the hypothetical +bodies have been changed.

+ +

·         +The development environment for the +DLL and the sample programs have been changed from Watcom 10.5 to Microsoft +Visual C++ (5.0 and 1.5). This was necessary because the Watcom compiler +created LIB files which were not compatible with Microsoft C. The LIB files +created by Visual C however are compatible with Watcom.

+ +

Changes from Version 1.00  to 1.01

+ +

1. +Sidereal time

+ +

The computation of the sidereal time is now +much easier. The obliquity and nutation are now computed inside the function. +The structure of the function swe_sidtime() has +been changed as follows:

+ +

/* sidereal time */

+ +

double swe_sidtime(double tjd_ut);      /* Julian day number, UT */

+ +

The old functions swe_sidtime0() has been kept for backward compatibility.

+ +

2. Houses

+ +

The calculation of houses has been +simplified as well. Moreover, the Vertex has been added.

+ +

The version 1.01 structure of swe_houses() is:

+ +

int swe_houses(

+ +

         double +tjd_ut,      /* julian day number, UT */

+ +

         double +geolat,      /* geographic latitude, in +degrees */

+ +

         double +geolon,      /* geographic longitude, in +degrees */

+ +

         char +hsys,           /* house method, one of the letters PKRCAV */

+ +

         double +*asc,     /* address for ascendant */

+ +

         double +*mc,       /* +address for mc */         

+ +

         double +*armc,     /* address for armc */

+ +

         double +*vertex,      /* address for vertex */

+ +

double *cusps);     /* address for 13 doubles: 1 empty + 12 houses */

+ +

 

+ +

Note also, that the indices of the +cusps have changed:

+ +

cusp[0] = 0        (before: cusp[0] = house +1)

+ +

cusp[1] = house 1        (before: cusp[1] = house +2)

+ +

cusp[2] = house +2        (etc.)

+ +

etc.

+ +

3. +Ecliptic obliquity and nutation

+ +

The new pseudo-body SE_ECL_NUT replaces the two separate pseudo-bodies SE_ECLIPTIC +and SE_NUTATION in the function swe_calc().

+ +

Appendix A

+ +

What is missing ?

+ +

 

+ +

There are some important limits in regard +to what you can expect from an ephemeris module. We do not tell you:

+ +

how to draw a chart

+ +

 

+ +

·      +which glyphs to use

+ +

·         +when a +planet is stationary (it depends on you how slow you +want it to be)

+ +

·         +how to compute universal time from +local time, i.e. what timezone a place is located in

+ +

·         +how to compute progressions, solar +returns, composit charts, transit times and a lot else

+ +

·         +what the +different calendars (Julian, Gregorian, ..) mean and +when they applied.

+ +

Index

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Flag

+
+

Body, Point

+
+

Default ephemeris flag

+
+

Additional asteroids

+
+

Ephemeris flags

+
+

Fictitious planets

+
+

Flag bits

+
+

Find a name

+
+

Speed flag

+
+

How to compute

+
+

 

+
+

Special body + SE_ECL_NUT

+
+

 

+
+

Uranian planets

+
+ +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Position

+
+

What is..

+
+

How to…

+
+

Astrometric

+
+

Ayanamsha

+
+

Change the tidal + acceleration

+
+

Barycentric

+
+

Dynamical Time

+
+

compute sidereal + composite house cusps

+
+

Equatorial

+
+

Ephemeris Time

+
+

compute the composite + ecliptic obliquity

+
+

Heliocentric

+
+

Equation of time

+
+

Draw the eclipse path

+
+

J2000

+
+

Julian day

+
+

Get obliquity and + nutation

+
+

Position and Speed

+
+

Universal Time

+
+

Get the + umbra/penumbra limits

+
+

Radians/degrees

+
+

Vertex/Anivertex

+
+

Search for a star

+
+

Sidereal

+
+

 

+
+

Switch the coordinate + systems

+
+

Topocentric

+
+

 

+
+

Switch true/mean + equinox of date

+
+

True geometrical + position

+
+

 

+
+

 

+
+

True/apparent

+
+

 

+
+

 

+
+

x, y, z

+
+

 

+
+

 

+
+ +

 

+ +

 

+ +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Errors

+
+

Variable

+
+

Asteroids

+
+

Armc

+
+

Avoiding Koch houses

+
+

Ascmc[..]

+
+

Ephemeris path length

+
+

Atpress

+
+

Errors and return + values

+
+

Attemp

+
+

Fatal error

+
+

Ayan_t0

+
+

House cusps beyond + the polar circle

+
+

Cusps[..]

+
+

Koch houses + limitations

+
+

Eps

+
+

Overriding environment + variables

+
+

Gregflag

+
+

Speeds of the fixed + stars

+
+

Hsys

+
+

 

+
+

Iflag

+
+

 

+
+

Ipl

+
+

 

+
+

Method

+
+

 

+
+

Rsmi

+
+

 

+
+

Sid_mode

+
+

 

+
+

Star

+
+ +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Function

+
+

Description

+
+

Swe_azalt

+
+

Computes + the horizontal coordinates (azimuth and altitude)

+
+

Swe_azalt_rev

+
+

computes + either ecliptical or equatorial coordinates from azimuth and true altitude

+
+

swe_calc

+
+

computes + the positions of planets, asteroids, lunar nodes and apogees

+
+

swe_calc_ut

+
+

Modified version of swe_calc

+
+

swe_close

+
+

releases + most resources used by the Swiss Ephemeris

+
+

swe_cotrans

+
+

Coordinate + transformation, from ecliptic to equator or vice-versa

+
+

swe_cotrans_sp

+
+

Coordinate + transformation of position and speed, from ecliptic to equator or vice-versa

+
+

swe_date_conversion

+
+

computes a Julian day from + year, month, day, time and checks whether a date is legal

+
+

swe_degnorm

+
+

normalization of any degree number to the range 0 ... 360

+
+

swe_deltat

+
+

Computes + the difference between Universal Time (UT, GMT) and Ephemeris time

+
+

swe_fixstar

+
+

computes fixed stars

+
+

swe_fixstar_ut

+
+

Modified version of swe_fixstar

+
+

swe_get_ayanamsa +

+
+

Computes + the ayanamsha

+
+

swe_get_ayanamsa_ut

+
+

Modified version of swe_get_ayanamsa

+
+

swe_get_planet_name

+
+

Finds a + planetary or asteroid name by given number

+
+

swe_get_tid_acc

+
+

Gets the + tidal acceleration

+
+

swe_house_pos

+
+

compute the + house + position of a given body for a given ARMC

+
+

swe_houses

+
+

Calculates + houses for a given date and geographic position

+
+

swe_houses_armc

+
+

computes + houses from ARMC (e.g. with the composite + horoscope which has no date)

+
+

swe_houses_ex

+
+

the same as + swe_houses(). Has a parameter, which can be used, if  siderealhouse + positions are wanted

+
+

swe_julday

+
+

Conversion + from day, month, year, time to Julian date

+
+

swe_lun_eclipse_how

+
+

Computes + the attributes of a lunar eclipse at a given time

+
+

swe_lun_eclipse_when

+
+

Finds the next lunar eclipse

+
+

swe_nod_aps

+
+

Computes + planetary nodes and apsides: perihelia, aphelia, second focal points of the + orbital ellipses

+
+

swe_nod_aps_ut

+
+

Modified version of swe_nod_aps

+
+

swe_pheno

+
+

Function + computes phase, + phase angle, elongation, apparent diameter, apparent magnitude

+
+

swe_pheno_ut

+
+

Modified version ofswe_pheno

+
+

swe_refrac

+
+

The true/apparent + altitude convertion

+
+

swe_revjul

+
+

Conversion + from Julian + date to day, month, year, time

+
+

swe_rise_trans

+
+

Computes + the times of rising, setting and meridian transits

+
+

swe_set_ephe_path

+
+

Set + application’s own ephemeris path

+
+

swe_set_jpl_file

+
+

Sets JPL ephemeris directory path

+
+

swe_set_sid_mode

+
+

Specifies + the sidereal modes

+
+

swe_set_tid_acc

+
+

Sets tidal acceleration used in swe_deltat()

+
+

swe_set_topo

+
+

Sets what + geographic position is to be used before topocentric planet positions for a certain birth place can be computed

+
+

swe_sidtime

+
+

returns sidereal time on Julian day

+
+

swe_sidtime0

+
+

returns sidereal time on Julian day, obliquity and nutation

+

 

+
+

swe_sol_eclipse_how

+
+

Calculates + the solar + eclipse attributes for a given geographic position + and time

+
+

swe_sol_eclipse_when_glob

+
+

finds the next solar eclipse + globally

+
+

swe_sol_eclipse_when_loc

+
+

finds the + next solar eclipse for a given geographic position

+
+

swe_sol_eclipse_where

+
+

finds out + the geographic position where an eclipse is

+

central or maximal

+
+

swe_time_equ

+
+

returns the + difference between local apparent and local mean time

+
+ +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

PlaCalc function

+
+

Description

+
+

swe_csnorm

+
+

Normalize + argument into interval [0..DEG360]

+
+

swe_cs2degstr

+
+

Centiseconds + -> degrees string

+
+

swe_cs2lonlatstr

+
+

Centiseconds + -> longitude or latitude string

+
+

swe_cs2timestr

+
+

Centiseconds + -> time string

+
+

swe_csroundsec

+
+

Round + second, but at 29.5959 always down

+
+

swe_d2l

+
+

Double to + long with rounding, no overflow check

+
+

swe_day_of_week

+
+

Day of week + Monday = 0, ... Sunday = 6

+
+

swe_difcs2n

+
+

Distance in + centisecs p1 – p2 normalized to [-180..180]

+
+

swe_difcsn

+
+

Distance in + centisecs p1 – p2 normalized to [0..360]

+
+

swe_difdeg2n

+
+

Distance in + degrees

+
+

swe_difdegn +

+
+

Distance in + degrees

+
+ +

 

+ +

End of SWEPHPRG.DOC

+ +
+ + + + diff --git a/swe/doc/swephprg.pdf b/swe/doc/swephprg.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f3e25512db88c62d10c4f426553551336ae8c6dd GIT binary patch literal 458696 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 z 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

*B%~n*p*Xobqh!~H? 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 + + + + + +SWISS EPHEMERIS + + + + + + + +
+
+ +
+ +

 

+ +

SWISS EPHEMERIS 

+ +

Computer +ephemeris for developers of astrological software

+ +

© 1997 - 2011 +by

+ +

Astrodienst AG

+ +

Dammstr. 23

+ +

Postfach +(Station)

+ +

 CH-8702 Zollikon / Zürich, Switzerland

+ +

Tel. ++41-44-392 18 18

+ +

Fax  +41-44-391 75 74

+ +

Email +to devlopers swisseph@astro.ch

+ +

 

+ +

Authors: +Dieter Koch and Dr. Alois Treindl

+ +

 

+ +

Editing +history:

+ +

14-sep-97 +Appendix A by Alois

+ +

15-sep-97 +split docu, swephprg.doc now separate (programming interface)

+ +

16-sep-97 +Dieter: absolute precision of JPL, position and speed transformations

+ +

24-sep-97 +Dieter: main asteroids

+ +

27-sep-1997 +Alois: restructured for better HTML conversion, added public function list

+ +

8-oct-1997 +Dieter: chapter 4 (houses) added

+ +

28-nov-1997 +Dieter: chapter 5 (delta t) added

+ +

20-Jan-1998 +Dieter: chapter 3 (more than...) added, chapter 4 (houses) enlarged

+ +

14-Jul-98: +Dieter: more about the precision of our asteroids

+ +

21-jul-98: +Alois: houses in PLACALC and ASTROLOG

+ +

27-Jul-98: +Dieter: True node chapter improved

+ +

2-Sep-98: +Dieter: updated asteroid chapter

+ +

29-Nov-1998: +Alois: added info on Public License and source code availability

+ +

4-dec-1998: +Alois: updated asteroid file information

+ +

17-Dec-1998: +Alois: Section 2.1.5 added: extended time range to 10'800 years

+ +

17-Dec-1998: +Dieter: paragraphs on Chiron and Pholus ephemerides updated

+ +

12-Jan-1999: +Dieter: paragraph on eclipses

+ +

19-Apr-99: +Dieter: paragraph on eclipses and planetary phenomena

+ +

21-Jun-99: +Dieter: chapter 2.27 on sidereal ephemerides

+ +

27-Jul-99: +Dieter: chapter 2.27 on sidereal ephemerides completed

+ +

15-Feb-00: +Dieter: many things for Version 1.52

+ +

11-Sep-00: +Dieter: a few additions for version 1.61

+ +

24-Jul-01: +Dieter: a few additions for version 1.62

+ +

5-jan-2002: +Alois: house calculation added to swetest for version 1.63

+ +

26-feb-2002: +Dieter: Gauquelin sectors for version 1.64

+ +

12-jun-2003: +Alois: code revisions for compatibility with 64-bit compilers, version 1.65

+ +

10-jul-2003: +Dieter: Morinus houses for Version 1.66

+ +

12-jul-2004: +Dieter: documentation of Delta T algorithms implemented with version 1.64

+ +

7-feb-2005: +Alois: added note about mean lunar elements, section 2.2.1

+ +

22-feb-2006: +Dieter: added documentation for version 1.70, see section 2.1.2.1-3

+ +

17-jul-2007: +Dieter: updated documentation of Krusinski-Pisa house system.

+ +

28-nov-2007: +Dieter: documentation of new Delta T calculation for version 1.72, see section +7

+ +

17-jun-2008: +Alois: License change to dual license, GNU GPL or Professional License

+ +

31-mar-2009: +Dieter: heliacal events

+ +

26-Feb-2010: +Alois: manual update, deleted references to CDROM

+ +

25-Jan-2011: +Dieter: Delta T updated, v. 1.77.

+ +

2-Aug-2012: +Dieter: New precession, v. 1.78.

+ +

23-apr-2013: +Dieter: new ayanamshas

+ +

 

+ +

Swiss +Ephemeris Release history:

+ +

1.00      30-sept-1997

+ +

1.01      9-oct-1997            simplified +houses() and sidtime() functions, Vertex added.

+ +

1.02      16-oct-1997            houses() changed again

+ +

1.03      28-oct-1997     minor fixes

+ +

1.04      8-Dec-1997     minor +fixes

+ +

1.10      9-Jan-1998     bug +fix, pushed to all licensees

+ +

1.11      12-Jan-98        minor +fixes

+ +

1.20      21-Jan-98        NEW: topocentric planets and house positions

+ +

1.21      28-Jan-98        Delphi +declarations and sample for Delphi 1.0

+ +

1.22      2-Feb-98            Asteroids moved to subdirectory. +Swe_calc() finds them there.

+ +

1.23      11-Feb-98        two +minor bug fixes.

+ +

1.24      7-Mar-1998            Documentation for Borland C++ +Builder added

+ +

1.25      4-June-1998     sample for Borland Delphi-2 added

+ +

1.26      29-Nov-1998     source added, Placalc API added

+ +

1.30      17-Dec-1998            NEW:Time range extended to 10'800 years

+ +

1.31      12-Jan-1999     NEW: Eclipses

+ +

1.40      19-Apr-1999     NEW: planetary phenomena

+ +

1.50      27-Jul-1999     NEW: sidereal ephemerides

+ +

1.52      15-Feb-2000 +    Several NEW +features, minor bug fixes

+ +

1.60      15-Feb-2000     Major release with many new features and some minor bug fixes

+ +

1.61      11-Sep-2000     Minor release, additions to se_rise_trans(), swe_houses(), +ficitious planets

+ +

1.62      23-Jul-2001      Minor release, fictitious earth satellites, asteroid numbers +> 55535 possible

+ +

1.63      5-Jan-2002     Minor +release, house calculation added to swetest.c and swetest.exe

+ +

1.64      7-Apr-2002     NEW: occultations of planets, +minor bug fixes, new Delta T algorithms

+ +

1.65      12-Jun-2003     Minor release, small code renovations for 64-bit compilation

+ +

1.66      10-Jul-2003     NEW: Morinus +houses

+ +

1.67      31-Mar-2005     Minor release: Delta-T updated, minor bug fixes

+ +

1.70 +     2-Mar-2006     IAU resolutions up to 2005 implemented; "interpolated" +lunar apsides

+ +

1.72      28-nov-2007     Delta T calculation according to Morrison/Stephenson 2004

+ +

1.74      17-jun-2008     License model changed to dual license, GNU GPL or Professional +License

+ +

1.76      31-mar-2009     NEW: Heliacal events

+ +

1.77      25-jan-2011     Delta T calculation updated acc. to Espenak/Meeus 2006, new fixed +stars file

+ +

1.78      2-aug-2012            Precession +calculation updated acc. to Vondrák et alii 2012

+ +

1.79      23-apr-2013     New ayanamshas, improved precision of eclipse functions, minor +bug fixes

+ +

Introduction

+ +

Swiss Ephemeris is a function +package for the computation of planetary positions. It includes the planets, +the moon, the lunar nodes, the lunar apogees, the main asteroids, Chiron, +Pholus, the fixed stars and several ”hypothetical” bodies. Hundreds of other +minor planets are included as well. Ephemeris files all numbered asteroids are +available for download.

+ +

The precision of the Swiss Ephemeris is very high. It is at least as +accurate as the Astromical Almanac, the standard planetary and lunar tables +astronomers refer to. Swiss Ephemeris will, as we hope, +be able to keep abreast to the scientific advances in ephemeris computation for +the coming decades. The expense will be small. In most cases an update of the +data files will do.

+ +

The Swiss Ephemeris package consists of a DLL, a +collection of ephemeris files and a few sample programs which demonstrate the +use of the DLL and the Swiss Ephemeris graphical label. The ephemeris files +contain compressed astronomical ephemerides (in equatorial rectangular +coordinates referred to the mean equinox 2000 and the solar system barycenter). +The DLL is mainly the code that reads these files and converts the raw data to +positions as required in astrology (calculation of light-time, transformation +to the geocenter and the true equinox of date, etc.).

+ +

Full C source code is included with the Swiss Ephemeris, so that +not-Windows programmers can create a linkable or shared library in their +environment and use it with their application.

+ +

1.        Licensing

+ +

The Swiss Ephemeris is not a product for end users. It is a toolset for +programmers to build into their astrological software. 

+ +

Swiss Ephemeris is made available by its authors under a dual +licensing  system. The software +developer, who uses any part of Swiss Ephemeris  in his or her software, must choose between one of the two +license models, which are

+ +

  a) GNU public license version 2 +or later

+ +

  b) Swiss Ephemeris Professional +License

+ +

The choice must be made before the software developer distributes +software containing parts of Swiss Ephemeris to others, and before any public +service using the developed software is activated.

+ +

 

+ +

If the developer choses the GNU GPL software license, he or she must +fulfill the conditions of that license, which includes the obligation to place +his  or her whole software project under +the GNU GPL or a compatible license.  +See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html

+ +

If the developer choses the Swiss Ephemeris Professional license,  he must follow the instructions as found in +http://www.astro.com/swisseph/  and +purchase the Swiss Ephemeris Professional Edition from Astrodienst and sign the +corresponding license contract.

+ +

The Swiss Ephemeris Professional Edition can be purchased from +Astrodienst for a one-time fixed fee for each commercial  programming +project. The license is just a legal document. All actual software and data are +found in the public download area and are to be downloaded from there. 

+ +

Professional license: The license fee for the first +license is Swiss Francs (CHF) 750.- , and CHF 400.-  for each additional license by the same licensee. An unlimited +license is available for CHF 1550.-.

+ +

2.        Descripition of the ephemerides

+ +

2.1         Planetary and lunar ephemerides

+ +

2.1.1    Three ephemerides

+ +

The Swiss Ephemeris package allows planetary and lunar computations from +any of the following three astronomical ephemerides:

+ +

1.         The Swiss Ephemeris

+ +

The core part of Swiss Ephemeris is a compression of the JPL-Ephemeris +DE406.  Using a sophisticated mechanism, +we succeeded in reducing JPL's 200 MB storage to only 18 MB. The agreement with +DE406 is  within 1 milli-arcsecond +(0.001”).  Since the inherent +uncertainty of the JPL ephemeris for most of its time range is much greater, +Swiss Ephemeris should be completely satisfying even for computations demanding +very high accuracy.

+ +

The time range of the JPL ephemeris is 3000 BC to 3000 AD or 6000 years. +We have extended this time range to 10'800 years, from 2 Jan 5401 BC to 31 Dec 5399. The details of this +extension are described below in section 2.1.5.

+ +

Each Swiss Ephemeris file covers a period of 600 years; there are 18 +planetary files, 18 Moon files and 18 main-asteroid files for the whole time +range of 10'800 years.

+ +

The file names are as follows:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Planetary file

+
+

Moon file

+
+

Main asteroid file

+
+

Time range

+
+

seplm54.se1

+
+

semom54.se1

+
+

seasm54.se1

+
+

5401 BC – 4802 BC

+
+

seplm48.se1

+
+

semom48.se1

+
+

seasm48.se1

+
+

4801 BC – 4202 BC

+
+

seplm42.se1

+
+

semom42.se1

+
+

seasm42.se1

+
+

4201 BC – 3602 BC

+
+

seplm36.se1

+
+

semom36.se1

+
+

seasm36.se1

+
+

3601 BC – 3002 BC

+
+

seplm30.se1

+
+

semom30.se1

+
+

seasm30.se1

+
+

3001 BC – 2402 BC

+
+

seplm24.se1

+
+

semom24.se1

+
+

seasm24.se1

+
+

2401 BC – 1802 BC

+
+

seplm18.se1

+
+

semom18.se1

+
+

seasm18.se1

+
+

1801 BC – 1202 BC

+
+

seplm12.se1

+
+

semom12.se1

+
+

seasm12.se1

+
+

1201 BC – 602 BC

+
+

seplm06.se1

+
+

semom06.se1

+
+

seasm06.se1

+
+

601 BC – 2 BC

+
+

sepl_00.se1

+
+

semo_00.se1

+
+

seas_00.se1

+
+

1 BC – 599 AD

+
+

sepl_06.se1

+
+

semo_06.se1

+
+

seas_06.se1

+
+

600 AD – 1199 AD

+
+

sepl_12.se1

+
+

semo_12.se1

+
+

seas_12.se1

+
+

1200 AD – 1799 AD

+
+

sepl_18.se1

+
+

semo_18.se1

+
+

seas_18.se1

+
+

1800 AD – 2399 AD

+
+

sepl_24.se1

+
+

semo_24.se1

+
+

seas_24.se1

+
+

2400 AD – 2999 AD

+
+

sepl_30.se1

+
+

semo_30.se1

+
+

seas_30.se1

+
+

3000 AD – 3599 AD

+
+

sepl_36.se1

+
+

semo_36.se1

+
+

seas_36.se1

+
+

3600 AD – 4199 AD

+
+

sepl_42.se1

+
+

semo_42.se1

+
+

seas_42.se1

+
+

4200 AD – 4799 AD

+
+

sepl_48.se1

+
+

semo_48.se1

+
+

seas_48.se1

+
+

4800 AD – 5399 AD

+
+ +

 

+ +

The blue file names in the table +indicate that a file is derived directly from the JPL data, whereas the other +files are derived from Astrodienst's own numerical integration.

+ +

All Swiss Ephemeris files for Version 1 have the file suffix .se1.

+ +

A planetary file is about  500 +kb, a lunar file 1300 kb.

+ +

Swiss Ephemeris files are distributed with the SWISSEPH package. They +are also available for download from Astrodienst's web server.

+ +

The time range of the Swiss Ephemeris

+ +

Start date                2 Jan 5401 BC (jul. calendar)                = JD   -251291.5

+ +

End date                                31 +Dec 5399 AD (greg. Cal.)        = JD +3693368.5

+ +

A note +on year numbering:

+ +

There are +two numbering systems for years before the year 1 AD. The historical numbering +system (indicated with BC) has no year zero. Year 1 BC is followed directly by +year 1 AD.

+ +

The +astronomical year numbering system does have a year zero; years before the +common era are indicated by negative year numbers. The sequence is year -1, +year 0, year 1 AD.

+ +

The +historical year 1 BC corresponds to astronomical year 0,

+ +

the +historical your 2 BC corresponds to astronomical year -1, etc.

+ +

In this +document and other documents related to the Swiss Ephemeris we use both systems +of year numbering. When we write a negative year number, it is astronomical +style; when we write BC, it is historical style.

+ +

2.         The Moshier Ephemeris

+ +

This is a semi-analytical approximation of the JPL planetary and lunar +ephemerides, currently based on the DE404 ephemeris, developed by Steve +Moshier. Its deviation from JPL is well below 1 arc second with the planets and +a few arc seconds with the moon. No data files are required for this +ephemeris, as all data are linked into the program code already.

+ +

This may be sufficient accuracy for most astrologers, since the moon +moves 1 arc second in 2 time seconds and the sun 2.5 arc seconds in one minute. +

+ +

However, if you work with the 'true' lunar node, which is derived from +the lunar ephemeris, you will have to accept an error of about 1 arc minute. To +get a position better than an arc second, you will have to spend 1.3 MB for the +lunar ephemeris file 'semo_18.se1' of Swiss Ephemeris.

+ +

The advantage of the Moshier ephemeris is that it needs no disk storage. +Its disadvantage besides the limited precision is reduced speed: it is about 10 +times slower than JPL and Swiss Ephemeris.

+ +

The Moshier Ephemeris covers the interval from 3000 BC to 3000 AD. +However, “the adjustment for the inner planets is strictly valid only from 1350 +B.C. to 3000 A.D., but may be used to 3000 B.C. with some loss of precision”. +And:  “The Moon's position is calculated +by a modified version of the lunar theory of Chapront-Touze' and Chapront. This +has a precision of 0.5 arc second relative to DE404 for all dates between 1369 +B.C. and 3000 A.D. “ (Moshier, http://www.moshier.net/aadoc.html).

+ +

3.         The full JPL Ephemeris

+ +

This is the full precision state-of-the-art ephemeris. It provides the +highest precision and is the basis of the Astronomical Almanac.

+ +

JPL is the Jet Propulsion Laboratory of NASA in Pasadena, CA, USA (see http://www.jpl.nasa.gov ). Since many years this +institute which is in charge of the planetary missions of NASA has been the +source of the highest precision planetary ephemerides. The currently newest +version of JPL ephemeris is the DE405/DE406. As most previous ephemerides, it +has been created by Dr. Myles Standish.

+ +

According to a paper (see below) by Standish and others on DE403 (of +which DE406 is only a slight refinement), the accuracy of this ephemeris can be +partly estimated from its difference from DE200:

+ +

With the inner planets, Standish shows that within the period +1600 – 2160 there is a maximum difference of 0.1 – 0.2” which is mainly due to +a mean motion error of DE200. This means that the absolute precision of DE406 +is estimated significantly better than 0.1” over that period. However, for the +period 1980 – 2000 the deviations between DE200 and DE406 are below 0.01” for all +planets, and for this period the JPL integration has been fit to measurements +by radar and laser interferometry, which are extremely precise.

+ +

With the outer planets, Standish's diagrams show that there are +large differences of several ” around 1600, and he says that these deviations +are due to the inherent uncertainty of extrapolating the orbits beyond the +period of accurate observational data.The uncertainty of Pluto exceeds +1” before 1910 and after 2010, and increases rapidly in more remote past or +future.

+ +

With the moon, there is an increasing difference of 0.9”/cty2 between 1750 and +2169. It comes mainly from errors in LE200 (Lunar Ephemeris).

+ +

The differences between DE200 and DE403 (DE406) can be summarized as +follows:

+ +

                1980 – 2000        all +planets                   < +0.01”,

+ +

1600 – 1980        Sun – Jupiter                    a few 0.1”,

+ +

1900 – 1980        Saturn – Neptune                                a +few 0.1”,

+ +

                1600 – 1900        Saturn – Neptune                                a +few ”,

+ +

                1750 – 2169        Moon                                     a few ”.

+ +

(see: E.M. Standish, X.X. Newhall, J.G. Williams, and W.M. Folkner, JPL +Planetary and Lunar Ephemerides, DE403/LE403, JPL Interoffice Memorandum +IOM 314.10-127, May 22, 1995, pp. 7f.)

+ +

 

+ +

The DE406 is a 200 Megabyte file available for download from the JPL +server ftp://navigator.jpl.nasa.gov/ephem/export  or on CD-ROM from the astronomical publisher +Willman-Bell, see http://www.willbell.com. +
+Astrodienst has received permission from Dr. Standish to include the file on +the
Swiss Ephemeris CD-ROM.

+ +

There are several versions of the JPL Ephemeris. The version is +indicated by the DE-number. A higher number stands for a later update. SWISSEPH +should be able to read any JPL file from DE200 upwards.

+ +

The time range of this ephemeris (DE406) is:

+ +

    start date                23 +Feb 3001 BC (28 Jan greg.)     = JD    625360.5,

+ +

    end date              3 Mar 3000 AD                                     = JD  2816848.5.

+ +

Swiss Ephemeris is based on the latest +JPL file, and reproduces the full JPL precision with better than 1/1000 of an +arc second, while requiring only 18 Mb instead of 200 Mb. Therefore for most +applications it makes little sense to get the full JPL file, except to compare +the precision. Precision comparison can also be done at the Astrodienst web +server, because we have a test utility online which allows to compute planetary +positions for any date with any of the three ephemerides.

+ +

For the extension of the JPL time range to 5400 BC - 5400 AD please see +section 2.5.1 below.

+ +

2.1.2.1Swiss Ephemeris and the Astronomical Almanac

+ +

The original JPL ephemeris gives barycentric equatorial Cartesian +positions of the equinox 2000. Moshier provides heliocentric positions.  The conversions to apparent geocentric +ecliptical positions were done with the algorithms and constants of the +Astronomical Almanac as described in the ”Explanatory Supplement to the +Astronomical Almanac”. Using the DE200 data file, it is possible to reproduce +the positions given by the Astronomical Almanac 1995, 1996, and 1997 down to +the last digit. Editions of other years have not been checked.

+ +

Since 2003, the Astronomical Almanac has been using JPL ephemeris DE405, +and since Astronomical Almanac 2006 all relevant resolutions of the +International Astronomical Union (IAU) have been implemented. Versions 1.70 and +higher of the Swiss Ephemeris also follow these resolutions and reproduce the +sample calculation given by AA2006, page B61-B63,  to the last digit, i.e. to better than 0.001 arc second. (To +avoid confusion when checking this, it may be useful to know that the JD given +on page B62 does not have enough digits in order to produce the correct final +result.)

+ +

2.1.2.2Swiss Ephemeris and JPL Horizons System

+ +

The Swiss Ephemeris, from Version 1.70 on, reproduces astrometric planetary positions of the +JPL Horizons System precisely. However, there are small differences with the apparent positions. The reason is that +the Horizons System still uses the old precession model IAU 1976 (Lieske) and +nutation IAU 1980 (Wahr). This was confirmed by Jon Giorgini from JPL in an +E-mail of 3 Feb. 2006.

+ +

Note on 2 August 2012. It seems that this is still true, according to +the documentation of the Horizons System at: +http://ssd.jpl.nasa.gov/?horizons_doc#longterm

+ +

2.1.2.3            Differences between Swiss Ephemeris +1.70 and older versions

+ +

With version 1.70, the standard algorithms recommended by the IAU +resolutions up to 2005 were implemented. The following calculations have been +added or changed with Swiss Ephemeris version 1.70:

+ +

- "Frame Bias" transformation from ICRS to J2000.

+ +

- Nutation IAU 2000B (could be switched to 2000A by the user)

+ +

- Precession model P03 (Capitaine/Wallace/Chapront 2003), including +improvements in ecliptic obliquity and sidereal time that were achieved by this +model

+ +

The differences between the old and new planetary positions in ecliptic longitude (arc seconds) are:

+ +

year        new - old

+ +

2000        -0.00108

+ +

1995        0.02448

+ +

1980        0.05868

+ +

1970        0.10224

+ +

1950        0.15768

+ +

1900        0.30852

+ +

1800        0.58428

+ +

1799        -0.04644

+ +

1700        -0.07524

+ +

1500        -0.12636

+ +

1000        -0.25344

+ +

0              -0.53316

+ +

-1000      -0.85824

+ +

-2000      -1.40796

+ +

-3000      -3.33684

+ +

-4000      -10.64808

+ +

-5000      -32.68944

+ +

-5400      -49.15188

+ +

The discontinuity of the curve between 1800 and 1799 is explained by the +fact that the old Swiss Ephemeris used different precession models for +different time ranges: the model IAU 1976 by Lieske for 1800 - 2200, and the +precession model by Williams 1994 outside of that time range.

+ +

Note: In the literature there are no indications concerning the +long-term use of the precession model P03. It is said to be accurate to 0.00005 +arc second for CE 1000-3000. However, there is no reason to trust alternative +models (e.g. Bretagnon 2003) more for the whole period of the Swiss Ephemeris.

+ +

The differences between version 1.70 and older versions for the future +are as follows:

+ +

2000        -0.00108

+ +

2010        -0.01620

+ +

2050        -0.14004

+ +

2100        -0.29448

+ +

2200        -0.61452

+ +

2201        0.05940

+ +

3000        0.27252

+ +

4000        0.48708

+ +

5000        0.47592

+ +

5400        0.40032

+ +

The discontinuity in 2200 has the same explanation as +the one in 1800.

+ +

 

+ +

Jyotish / sidereal +ephemerides:

+ +

The ephemeris changes by a constant value of about +0.3 arc second. This +is because all our ayanamsas have the start epoch 1900, for which epoch +precession was corrected by the same amount.

+ +

 

+ +

Fictitious planets +/ Bodies from the orbital elements file seorbel.txt:

+ +

There are changes of several 0.1 arcsec, depending on the epoch of the +orbital elements and the correction of precession as can be seen in the tables +above.

+ +

 

+ +

The differences for ecliptic obliquity in arc seconds (new - old) are:

+ +

5400        -1.71468

+ +

5000        -1.25244

+ +

4000        -0.63612

+ +

3000        -0.31788

+ +

2100        -0.06336

+ +

2000        -0.04212

+ +

1900        -0.02016

+ +

1800        0.01296

+ +

1700        0.04032

+ +

1600        0.06696

+ +

1500        0.09432

+ +

1000        0.22716

+ +

0              0.51444

+ +

-1000      1.07064

+ +

-2000      2.62908

+ +

-3000      6.68016

+ +

-4000      15.73272

+ +

-5000      33.54480

+ +

-5400      44.22924

+ +

 

+ +

The differences for sidereal time in +seconds (new - old) are:

+ +

5400        -2.544

+ +

5000        -1.461

+ +

4000        -0.122

+ +

3000        0.126

+ +

2100        0.019

+ +

2000        0.001

+ +

1900        0.019

+ +

1000        0.126

+ +

0              -0.122

+ +

-500        -0.594

+ +

-1000      -1.461

+ +

-2000      -5.029

+ +

-3000      -12.355

+ +

-4000      -25.330

+ +

-5000      -46.175

+ +

-5400      -57.273

+ +

2.1.2.4            Differences between Swiss Ephemeris +1.78 and 1.77

+ +

Former versions of the Swiss Ephemeris had used the precession model by +Capitaine, Wallace, and Chapront of 2003 for the time range 1800-2200 and the +precession model J. G. Williams in Astron. J. 108, 711-724 (1994) for epochs +outside this time range.

+ +

Version 1.78 calculates precession and ecliptic obliquity according to +Vondrák, Capitaine, and Wallace, “New precession expressions, valid for long +time intervals”, A&A 534, A22 (2011), which is good for +- 200 millennia.

+ +

This change has almost no effect for historical epochs. Planetary +positions and the obliquity of the ecliptic change by less than an arc minute +in 5400 BC. However, for research concerning the prehistoric cave paintings of +Lascaux, Altamira, etc, some of which may represent celestial constellations, +fixed star positions are required for 15’000 BC or even earlier (the Chauvet +cave was painted in 33’000 BC). Such calculations are now possible using the +Swiss Ephemeris version 1.78 or higher. However, the Sun, Moon, and the planets +remain restricted to the time range 5400 BC to 5400 AD.

+ +

Differences in precession (v. 1.78 – v. 1.77, test star was Aldebaran):

+ +

Year        Difference in arc sec

+ +

-20000  -26715"

+ +

-15000    -2690" 

+ +

-10000      -256"  

+ +

  -5000          -3.95388"       +

+ +

  -4000          -9.77904"       +

+ +

  -3000          -7.00524"       +

+ +

  -2000          -3.40560"       +

+ +

  -1000          -1.23732"       +

+ +

         0           -0.33948"       +

+ +

   1000           -0.05436"       +

+ +

   1800           -0.00144"       +

+ +

   1900           -0.00036"       +

+ +

   2000            0.00000"        +

+ +

   2100           -0.00036"       +

+ +

   2200           -0.00072"       +

+ +

   3000            0.03528"        +

+ +

   4000            0.59904"        +

+ +

   5000            2.90160"        +

+ +

 10000          76"    

+ +

 15001        +227"   

+ +

 19000      +2839"  

+ +

 20000      +5218"

+ +

 

+ +

Differences in +ecliptic obliquity

+ +

 

+ +

Year        Difference in arc sec

+ +

-20000       11074.43664"

+ +

-15000         3321.50652"

+ +

-10000           632.60532"

+ +

  -5000           -33.42636"

+ +

          0              0.01008"

+ +

    1000              0.00972"

+ +

    2000              0.00000"

+ +

    3000            -0.01008"

+ +

    4000            -0.05868"

+ +

  10000          -72.91980"

+ +

  15000        +-772.91712"

+ +

  20000      +-3521.23488”

+ +

2.1.3    The details of coordinate transformation

+ +

The following conversions are applied to the coordinates after reading +the raw positions from the ephemeris files and before output:

+ +

Correction for light-time. Since the planet's light +needs time to reach the earth, it is never seen where it actually is, but where +it was some time before. Light-time is a few minutes with the inner planets and +a few hours with distant planets like Uranus, Neptune and Pluto. For the moon, +the light-time correction is about one second. With planets, light-time +correction may be of the order of 20” in position, with the moon 0.5”

+ +

Conversion from the solar system barycenter to the +geocenter. Original JPL data are referred to the center of the gravity of the +solar system. Apparent planetary positions are referred to an imaginary +observer in the center of the earth.

+ +

Light deflection by the gravity of the sun. In gravitational +fields of the sun and the planets light rays are bent. However, within the +solar system only the sun has mass enough to deflect light significantly. +Gravity deflection is greatest for distant planets and stars, but never greater +than 1.8”. When a planet disappears behind the sun, the Explanatory +Supplement recommends to set the deflection = 0. To avoid discontinuities, +we chose another procedure. See Appendix A.

+ +

”Annual” aberration of light. The velocity of +light is finite, and therefore the apparent direction of a moving body from a +moving observer is never the same as it would be if both the planet and the +observer stood still. For comparison: if you run through the rain, the rain +seems to come from ahead even though it actually comes from above. Aberration +may reach 20”.

+ +

Frame Bias (ICRS to J2000). The JPL ephemeris +DE405/DE406 is referred to the International Celestial Reference System, a +time-independent, non-rotating reference system which was recommended by the +IAU in 1997. The planetary positions and speed vectors are rotated to the J2000 +system. This transformation makes a difference of only about 0.0068 arc seconds +in right ascension. (Implemented from Swiss Ephemeris 1.70 on)

+ +

Precession. The motion of the vernal +equinox, which is an effect of the influences of solar, lunar, and planetary +gravity on the equatorial bulge of the earth. Original JPL data are referred to +the mean equinox of the year 2000. Apparent planetary positions are referred to +the equinox of date. (From Swiss Ephemeris 1.78 on, we use the +precession model Vondrák/Capitaine/Wallace 2011.)

+ +

Nutation (true equinox of date). +A short-period oscillation of the vernal equinox. It results from the moons +gravity which acts on the equatorial bulge of the earth. The period of nutation +is identical to the period of a cycle of the lunar node, i.e. 18.6 years. The +difference between the true vernal point and the mean one is always below 17”. +(From Swiss Ephemeris 1.70 on, we use the nutation model IAU 2000. Older +versions used the nutation model IAU 1980 (Wahr).)

+ +

Transformation from equatorial to ecliptic coordinates.

+ +

 

+ +

For precise speed of the planets and the moon, we had to make a +special effort, because the Explanatory Supplement does not give +algorithms that apply the above-mentioned transformations to speed. Since this +is not a trivial job, the easiest way would have been to compute three +positions in a small interval and determine the speed from the derivation of +the parabola going through them. However, double float calculation does not +guarantee a precision better than 0.1”/day. Depending on the time difference +between the positions, speed is either good near station or during fast motion. +Derivation from more positions and higher order polynomials would not help +either.

+ +

Therefore we worked out a way to apply directly all the transformations +to the barycentric speeds that can be derived from JPL or Swiss Ephemeris. The +speed precision is now better than 0.002” for all planets, and the computation +is even much faster than it would have been from three positions. A position +with speed takes in average only 1.66 times longer than one without speed, if a +JPL or a Swiss Ephemeris position is computed. With Moshier, however, a +computation with speed takes 2.5 times longer.

+ +

2.1.4    The Swiss Ephemeris compression mechanism

+ +

The idea behind our mechanism of ephemeris compression was developed by +Dr. Peter Kammeyer of the U.S. Naval Observatory in 1987.

+ +

To make it simple, it works as follows:

+ +

The lunar and the inner planets ephemerides require by far the largest +part of the storage. A more sophisticated mechanism is needed for them than for +the outer planets.  Instead of the +positions we store the differences between JPL and the mean orbits of the +analytical theory VSOP87. These differences are much smaller than the position +values, wherefore they require less storage.  +They are stored in Chebyshew polynomials covering a period of an +anomalistic cycle each. (By the way, this is the reason, why Swiss Ephemeris +begins only with 4 Nov -3000 (instead of 23 Feb -3000 as JPL).  This is the date, when the last of the inner +planets Mars has its first perihelion after the start date of DE406.)

+ +

With the outer planets from Jupiter through Pluto we use a simpler +mechanism. We rotate the positions provided by DE406 to the mean plane of the +planet. This has the advantage that only two coordinates have high values, +whereas the third one becomes very small. The data are stored in Chebyshew +polynomials that cover a period of 4000 days each.  (This is the reason, why Swiss Ephemeris stops in the year 2991 +AD. 4000 days later is a date beyond 3000 AD)

+ +

2.1.5    The extension of the time range to 10'800 +years

+ +

The JPL ephemeris covers the time range from 3000 BC to 3000 AD. While +this is an excellent range covering all precisely known historical events, +there are some types of astrological and historical research which would +welcome a longer time range.

+ +

In December 1998 we have made an effort to extend the time range by our +own numerical integration. The exact physical model used by Standish et. al. +for the numerical integration of the DE406 ephemeris is not fully documented +(at least we do not understand some details), so that we cannot use the same +integration program as had been used at JPL for the creation of the original +ephemeris.

+ +

The previous JPL ephemeris, the DE200, however has been reproduced by +Steve Moshier over a very long time range with his integration program, which +has been available to us. We have used this integration program with start +vectors taken at the end points of the DE406 time range. To test our numerical +integrator, we ran it upwards from 3000 BC to 600 BC for a period of 2400 years +and compared its results with the DE406 ephemeris itself. The agreement is +excellent for all planets except the Moon (see table below). The lunar orbit +creates a problem because the physical model for the Moon's libration and the +effect of the tides on lunar motion is quite different in the DE406 from the +model in the DE200. We have varied the tidal coupling parameter (love number) +and the longitudinal libration phase at the start epoch until we found the best +agreement over the 2400 year test range between our integration and the JPL +data. We could reproduce the Moon's motion over a the 2400 time range with a +maximum error of 12 arcseconds. For most of this time range the agreement is +better than 5 arcsec.

+ +

With these modified parameters we ran the integration backward in time +from 3000 BC to 5400 BC. It is reasonable to assume that the integration errors +in the backward integration are not significantly different from the +integration errors in the upward integration.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

planet

+
+

max. error arcsec

+
+

avg. error arcec

+
+

Mercury  

+
+

1.67

+
+

0.61

+
+

Venus    

+
+

0.14

+
+

0.03

+
+

Earth    

+
+

1.00

+
+

0.42

+
+

Mars         

+
+

0.21

+
+

0.06

+
+

Jupiter  

+
+

0.85

+
+

0.38

+
+

Saturn   

+
+

0.59

+
+

0.24

+
+

Uranus   

+
+

0.20

+
+

0.09

+
+

Neptune               

+
+

0.12

+
+

0.06

+
+

Pluto     

+
+

0.12

+
+

0.04

+
+

Moon    

+
+

12.2

+
+

2.53

+
+

Sun bary.

+
+

6.3

+
+

0.39

+
+ +

 

+ +

The same procedure was applied +at the upper end of the DE406 range, to cover an extension period from 3000 AD +to 5400 AD. The maximum integration errors as determined in the test run 3000 +AD down to 600 AD are given in the table below.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

planet

+
+

max. error arcsec

+
+

avg. error arcsec

+
+

Mercury  

+
+

2.01

+
+

0.69

+
+

Venus    

+
+

0.06

+
+

0.02

+
+

Earth    

+
+

0.33

+
+

0.14

+
+

Mars         

+
+

1.69

+
+

0.82

+
+

Jupiter  

+
+

0.09

+
+

0.05

+
+

Saturn   

+
+

0.05

+
+

0.02

+
+

Uranus   

+
+

0.16

+
+

0.07

+
+

Neptune               

+
+

0.06

+
+

0.03

+
+

Pluto     

+
+

0.11

+
+

0.04

+
+

Moon    

+
+

8.89

+
+

3.43

+
+

Sun bary.

+
+

0.61

+
+

0.05

+
+ +

 

+ +

We expect that in some time a full integration program modeled after the +DE406 integrator will become available. At that time we will rerun our +integration and report any significant differences.

+ +

2.2         Lunar and Planetary Nodes and Apsides

+ +

2.2.1    Mean Lunar Node and Mean Lunar Apogee +('Lilith', 'Black Moon')

+ +

 

+ +

Our mean node and mean apogee are computed from Moshier's lunar routine, +which adjusts the ELP2000-85 lunar theory of Chapront-Touzé and Chapront to fit +the JPL ephemeris on the interval from 3000 BC to 3000 AD. Its deviation from +Chapront's mean node is 0 for J2000 and keeps below 20 arc seconds for the +whole period. With the apogee, the deviation reaches 3 arc minutes at 3000 BC

+ +

Lilith or the Dark Moon is either the apogee +(”aphelion”) of the lunar orbital ellipse or, for some people, its empty focal +point.  As seen from the geocenter, this +makes no difference. Both of them are located in exactly the same direction. +But the definition makes a difference for topocentric ephemerides.

+ +

Because the Earth is located in one of the two focuses of the ellipse, +it has also been argued that the second focal point ought to be called ”Dark +Earth” rather than ”Dark Moon” (Ernst Ott).

+ +

The opposite point, the lunar perigee or orbital point closest to the Earth, +is also known as Priapus. However, if Lilith is understood as the second +focus, an opposite point makes no sense, of course.

+ +

Originally, the term ”Dark Moon” was used for a hypothetical second body +that was believed to move around the earth. There are still ephemerides around +for such a body, but today’s observational skills and knowledge in celestial +mechanics clearly exclude the possibility of such an object. As a result of +confusion, the term ”Dark Moon” was later given to the lunar apogee. However, +from the astrological symbolism of the lunar apogee, the expression ”Dark Moon” +seems to be appropriate.

+ +

The Swiss Ephemeris apogee differs from the ephemeris given by Joëlle de +Gravelaine in her book ”Lilith, der schwarze Mond” (Astrodata 1990). The difference +reaches several arc minutes. The mean apogee (or perigee) moves along the mean +lunar orbit which has an inclination of 5 degrees. Therefore it has to be +projected on the ecliptic. With de Gravelaine's ephemeris, this has been +forgotten and therefore the book contains a false ephemeris. As a result of +this projection, we also provide an ecliptic latitude of the apogee, which will +be of importance if you work with declinations.

+ +

There may be still another problem. The 'first' focal point does not coincide +with the geocenter but with the barycenter of the earth-moon-system. The +difference is about 4700 km. If one took this into account, it would result in +a monthly oscillation of the Black Moon. If one defines it as the apogee, this +oscillation would be about +/- 40 arc minutes. If one defines it as the second +focus, the effect is much greater: +/- 6 degrees! However, we have neglected +this effect.

+ +

[added by Alois 7-feb-2005, arising out of a discussion with Juan +Revilla] The concept of 'mean lunar orbit' means that short term. e.g. monthly, +fluctuations must not be taken into account. In the temporal average, the EMB +coincides with the geocenter. Therefore, when mean elements are computed, it is +correct only to consider the geocenter, not the Earth-Moon Barycenter.

+ +

In addition, computing topocentric positions of mean elements is also +meaningless and should not be done.

+ +

2.2.2    The 'True' Node

+ +

The 'true' lunar node is usually considered to be the osculating node +element of the momentary lunar orbit. I.e., the axis of the lunar nodes is the +intersection line of the momentary orbital plane of the moon and the plane of +the ecliptic. Or in other words, the nodes are the intersections of the two +great circles representing the momentary apparent orbit of the moon and the +ecliptic.

+ +

The nodes are considered to be important because they are connected with +the eclipses. They are the meeting points of the sun and the moon. From this +point of view, a more correct definition might be: The axis of the lunar nodes +is the intersection line of the momentary orbital plane of the moon and the +momentary orbital plane of the sun.

+ +

This makes a difference! Because of the monthly motion of the earth +around the earth-moon barycenter, the sun is not exactly on the ecliptic but +has a latitude, which, however, is always below an arc second. Therefore the +momentary plane of the sun's motion is not identical with the ecliptic. For the +true node, this would result in a difference in longitude of several arc +seconds!  However, Swiss Ephemeris +computes the traditional version.

+ +

The advantage of the 'true' nodes against the mean ones is that when the +moon is in exact conjunction with them, it has indeed a zero latitude. This is +not true with the mean nodes. 

+ +

However, in the strict sense of the word, even the ”true” nodes are true +only twice a month, viz. at the times when the moon crosses the ecliptic. +Positions given for the times in between those two points are just a +hypothesis. They are founded on the idea that celestial orbits can be approximated +by elliptical elements. This works well with the planets, but not with the +moon, because its orbit is strongly perturbed by the sun. Another procedure, +which might be more reasonable, would be to interpolate between the true node +passages. The monthly oscillation of the node would be suppressed, and the +maximum deviation from the conventional ”true” node would be about 20 arc +minutes.

+ +

Precision of the true node:

+ +

The true node can be computed from all of our three ephemerides.  If you want a precision of the order of at +least one arc second, you have to choose either the JPL or the Swiss Ephemeris.

+ +

Maximum differences:

+ +

JPL-derived node – Swiss-Ephemeris-derived node                ~ 0.1 arc second

+ +

JPL-derived node – Moshier-derived node                        ~ 70   arc seconds

+ +

(PLACALC was not better either. Its error was often > 1 arc minute.)

+ +

2.2.3    The Osculating Apogee (so-called 'True +Lilith' or 'True Dark Moon')

+ +

The position of 'True Lilith' is given in the 'New International +Ephemerides' (NIE, Editions St. Michel) and in Francis Santoni 'Ephemerides de +la lune noire vraie 1910-2010' (Editions St. Michel, 1993). Both Ephemerides +coincide precisely.

+ +

The relation of this point to the mean apogee is not exactly of the same +kind as the relation between the true node and the mean node.  Like the 'true' node, it can be considered +as an osculating orbital element of the lunar motion. But there is an important +difference: The apogee contains the concept of the ellipse, whereas the node +can be defined without thinking of an ellipse. As has been shown above, the +node can be derived from orbital planes or great circles, which is not possible +with the apogee. Now ellipses are good as a description of planetary orbits, +but not of the lunar orbit which is strongly perturbed by the gravity of the +sun. The lunar orbit is far away from being an ellipse!

+ +

However, the osculating apogee is 'true' twice a month: when it is in +exact conjunction with the moon, the moon is most distant from the earth; and +when it is in exact opposition to the moon, the moon is closest to the +earth.  In between those two points, the +value of the osculating apogee is pure imagination. The amplitude of the +oscillation of the osculating apogee around the mean apogee is +/- 25 +degrees, while the true apogee's deviation from the mean one never +exceeds 5 degrees.

+ +

It has also to be mentioned, that there is a small difference between +the NIE's 'true Lilith' and our osculating apogee, which results from an +inaccuracy in NIE. The error reaches 20 arc minutes. According to Santoni, the +point was calculated using 'les 58 premiers termes correctifs au perigée moyen' +published by Chapront and Chapront-Touzé. And he adds: ”Nous constatons que +même en utilisant ces 58 termes correctifs, l'erreur peut atteindre +0,5d!” (p. +13) We avoid this error, computing the orbital elements from the position and +the speed vectors of the moon. (By the way, there is also an error of +/- 1 arc +minute in NIE's true node. The reason is probably the same.)

+ +

Precision:

+ +

The osculating apogee can be computed from any one of the three +ephemerides. If you want a precision of the order of at least one arc second, +you have to choose either the JPL or the Swiss Ephemeris.

+ +

Maximum differences:

+ +

JPL-derived apogee – Swiss-Ephemeris-derived apogee                ~ 0.9 arc second

+ +

JPL-derived apogee – Moshier-derived apogee                   ~ 360   arc seconds                = +6   arc minutes!

+ +

There have been several other attempts to solve the problem of a 'true' +apogee. They are not included in the SWISSEPH package.  All of them work with a correction table.

+ +

They are listed in Santoni's 'Ephemerides de la lune noire vraie' +mentioned above. With all of them, a value is added to the mean apogee +depending on the angular distance of the sun from the mean apogee. There is +something to this idea. The actual apogees that take place once a month differ +from the mean apogee by never more than 5 degrees and seem to move along a +regular curve that is a function of the elongation of the mean apogee.

+ +

However, this curve does not have exactly the shape of a sine, as is +assumed by all of those correction tables.  +And most of them have an amplitude of more than 10 degrees, which is +much too high. The most realistic solution so far was the one proposed by Henry +Gouchon in ”Dictionnaire Astrologique”, Paris 1992, which is based on an +amplitude of 5 degrees.

+ +

In ”Meridian” 1/95, Dieter Koch has published another table that pays +regard to the fact that the motion does not precisely have the shape of a sine. +(Unfortunately, ”Meridian” confused the labels of the columns of the apogee and +the perigee.)

+ +

2.2.4    The Interpolated or Natural Apogee and +Perigee (Lilith and Priapus)

+ +

As has been said above, the osculating lunar apogee (so-called +"true Lilith") is a mathematical construct which assumes that the +motion of the moon is a two-body problem. This solution is obviously too +simplistic. Although Kepler ellipses are a good means to describe planetary +orbits, they fail with the orbit of the moon, which is strongly perturbed by +the gravitational pull of the sun. This solar perturbation results in gigantic +monthly oscillations in the ephemeris of the osculating apsides (the amplitude +is 30 degrees). These oscillations have to be considered an artifact of the insufficient model, they +do not really show a motion of the apsides.

+ +

A more sensible solution seems to be an interpolation between the real +passages of the moon through its apogees and perigees. It turns out that the +motions of the lunar perigee and apogee form curves of different quality and +the two points are usually not in opposition to each other. They are more or +less opposite points only at times when the sun is in conjunction with one of +them or squares them. The amplitude of their oscillation about the mean +position is 5 degrees for the apogee and 25 degrees for the perigee.

+ +

This solution has been called the "interpolated" +or "realistic" apogee and perigee by Dieter Koch in his publications. +Juan Revilla prefers to call them the "natural" +apogee and perigee. Today, Dieter Koch would prefer the designation +"natural". The designation "interpolated" is a bit misleading, +because it associates something that astrologers used to do everyday in old +days, when they still used to work with printed ephemerides and house tables.

+ +

Note on implementation (from Swiss Ephemeris Version 1.70 on):

+ +

Conventional interpolation algorithms do not work well in the case of +the lunar apsides. The supporting points are too far away from each other in +order to provide a good interpolation, the error estimation is greater than 1 +degree for the perigee. Therefore, Dieter chose a different solution. He +derived an "interpolation method" from the analytical lunar theory +which we have in the form of moshier's lunar ephemeris. This +"interpolation method" has not only the advantage that it probably +makes more sense, but also that the curve and its derivation are both +continuous.

+ +

Literature +(in German):

+ +

- +Dieter Koch, "Was ist Lilith und welche Ephemeride ist richtig", in: +Meridian 1/95

+ +

- +Dieter Koch and Bernhard Rindgen, "Lilith und Priapus", +Frankfurt/Main, 2000. (http://www.vdhb.de/Lilith_und_Priapus/lilith_und_priapus.html)

+ +

- Juan Revilla, "The Astronomical Variants of the Lunar Apogee - +Black Moon", http://www.expreso.co.cr/centaurs/blackmoon/barycentric.html

+ +

 

+ +

2.2.5             Planetary Nodes and Apsides

+ +

Note to specialists in +planetary nodes and apsides: If important publications or web sites concerning +this topic have been forgotten in this summary, your clue will be appreciated.

+ +

Methods written in small +characters are not supported by the Swiss Ephemeris software.

+ +

Differences between the Swiss +Ephemeris and other ephemerides of the osculation nodes and apsides are +probably due to different planetary ephemerides being used for their +calculation. Small differences in the planetary ephemerides lead to much +greater differences in nodes and apsides.

+ +

 

+ +

Definitions of the nodes

+ +

The lunar nodes indicate the +intersection axis of the lunar orbital plane with the plane of the ecliptic. At +the lunar nodes, the moon crosses the plane of the ecliptic and its ecliptic +latitude changes sign. There are similar nodes for the planets, but their +definition is more complicated. Planetary nodes can be defined in the following +ways:

+ +

1)       They can be +understood as a direction or as an axis defined by the +intersection line of two orbital planes. E.g., the nodes of Mars are defined by +the intersection line of the orbital plane of Mars with the plane of the +ecliptic (or the orbital plane of the Earth).

+ +

Note: However, as +Michael Erlewine points out in his elaborate web page on this topic +(http://thenewage.com/resources/articles/interface.html), planetary nodes could +be defined for any couple of planets. E.g. there is also an intersection line +for the two orbital planes of Mars and Saturn. Such non-ecliptic nodes have not +been implemented in the Swiss Ephemeris.

+ +

Because such lines +are, in principle, infinite, the heliocentric and the geocentric positions of +the planetary nodes will be the same. There are astrologers that use such +heliocentric planetary nodes in geocentric charts.

+ +

The ascending and +the descending node will, in this case, be in precise opposition.

+ +

2)       There is a second +definition that leads to different geocentric ephemerides. The planetary nodes +can be understood, not as an infinite axis, but as the two points at +which a planetary orbit intersects with the ecliptic plane.

+ +

For the lunar nodes +and heliocentric planetary nodes, this definition makes no difference from the +definition 1). However, it does make a difference for geocentric +planetary nodes, where, the nodal points on the planets orbit are transformed +to the geocenter. The two points will not be in opposition anymore, or they +will roughly be so with the outer planets. The advantage of these nodes is that +when a planet is in conjunction with its node, then its ecliptic latitude will +be zero. This is not true when a planet is in geocentric conjunction with its +heliocentric node. (And neither is it always true for inner the planets, for +Mercury and Venus.)

+ +

Note: There is +another possibility, not implemented in the Swiss ephemeris: E.g., instead of +considering the points of the Mars orbit that are located on the ecliptic +plane, one might consider the points of the earth’s orbit that are +located on the orbital plane of Mars. If one takes these points geocentrically, +the ascending and the descending node, will always form an approximate square. +This possibility has not been implemented in the Swiss Ephemeris.

+ +

3)       Third, the planetary +nodes could be defined as the intersection points of the plane defined by their +momentary geocentric position and motion with the plane of the ecliptic. Here +again, the ecliptic latitude would change sign at the moment when the planet +were in conjunction with one of its nodes. This possibility has not been +implemented in the Swiss Ephemeris.

+ +

 

+ +

Possible definitions for apsides and focal points

+ +

The lunar apsides - the lunar +apogee and lunar perigee - have already been discussed further above. Similar +points exist for the planets, as well, and they have been considered by +astrologers. Also, as with the lunar apsides, there is a similar disagreement:

+ +

One may consider either the +planetary apsides, i.e. the two points on a planetary orbit  that are closest to the sun and most distant +from the sun, resp. The former point is called the ”perihelion” and the +latter one the ”aphelion”. For a geocentric chart, these points could be +transformed from the heliocenter to the geocenter.

+ +

However, Bernard Fitzwalter +and Raymond Henry prefer to use the second focal points of the planetary +orbits. And they call them the ”black stars” or the ”black suns of the +planets”. The heliocentric positions of these points are identical to the +heliocentric positions of the aphelia, but geocentric positions are not +identical, because the focal points are much closer to the sun than the +aphelia. Most of them are even inside the Earth orbit.

+ +

The Swiss Ephemeris supports +both points of view.

+ +

 

+ +

Special case: the Earth

+ +

The Earth is a special case. +Instead of the motion of the Earth herself, the heliocentric motion of the +Earth-Moon-Barycenter (EMB) is used to determine the osculating perihelion.

+ +

There is no node of the earth +orbit itself.

+ +

There is an axis around which +the earth's orbital plane slowly rotates due to planetary precession. The +position points of this axis are not calculated by the Swiss Ephemeris.

+ +

 

+ +

Special case: the Sun

+ +

In addition to the Earth (EMB) +apsides, our software computes so-to-say "apsides" of the solar orbit +around the Earth, i.e. points on the orbit of the Sun where it is closest to +and where it is farthest from the Earth. These points form an opposition and are +used by some astrologers, e.g. by the Dutch astrologer George Bode or the Swiss +astrologer Liduina Schmed. The ”perigee”, located at about 13 Capricorn, is +called the "Black Sun", the other one, in Cancer, is called the +”Diamond”.

+ +

So, for a complete set of +apsides, one might want to calculate them for the Sun and the Earth and +all other planets.

+ +

 

+ +

Mean and osculating positions

+ +

There are serious problems about the ephemerides of planetary nodes and +apsides. There are mean ones and osculating ones. Both are well-defined points +in astronomy, but this does not necessarily mean that these definitions make +sense for astrology. Mean points, on the one hand, are not true, i.e. if a +planet is in precise conjunction with its mean node, this does not mean it be +crossing the ecliptic plane exactly that moment. Osculating points, on the +other hand, are based on the idealization of the planetary motions as two-body +problems, where the gravity of the sun and a single planet is considered and +all other influences neglected. There are no planetary nodes or apsides, at +least today, that really deserve the label ”true”.

+ +

 

+ +

Mean positions

+ +

Mean nodes and apsides +can be computed for the Moon, the Earth and the planets Mercury – Neptune. They +are taken from the planetary theory VSOP87. Mean points can not be +calculated for Pluto and the asteroids, because there is no planetary theory +for them.

+ +

Although the Nasa has +published mean elements for the planets Mercury – Pluto based on the JPL +ephemeris DE200, we do not use them (so far), because their validity is limited +to a 250 year period, because only linear rates are given, and because they are +not based on a planetary theory. (http://ssd.jpl.nasa.gov/elem_planets.html, +”mean orbit solutions from a 250 yr. least squares fit of the DE 200 planetary +ephemeris to a Keplerian orbit where each element is allowed to vary linearly +with time”)

+ +

The differences between the +DE200 and the VSOP87 mean elements are considerable, though:

+ +

                                Node                      Perihelion

+ +

Mercury                 3”                            4”

+ +

Venus                    3”                            107”

+ +

Earth                      -                              35”

+ +

Mars                      74”                          4”

+ +

Jupiter                    330”                        1850”

+ +

Saturn                    178”                        1530”

+ +

Uranus                   806”                        6540”

+ +

Neptune                225”                        11600” +(>3 deg!)

+ +

 

+ +

 

+ +

Osculating nodes and apsides

+ +

Nodes and apsides can also be +derived from the osculating orbital elements of a body, the parameters that +define an ideal unperturbed elliptic (two-body) orbit for a given time. +Celestial bodies would follow such orbits if perturbations were to cease +instantaneously or if there were only two bodies (the sun and the planet) +involved in the motion from now on and the motion were an ideal ellipse. +This ideal assumption makes it obvious that it would be misleading to call such +nodes or apsides "true". It is more appropriate to call them +"osculating". Osculating nodes and apsides are "true" only +at the precise moments, when the body passes through them, but for the times in +between, they are a mere mathematical construct, nothing to do with the nature +of an orbit.

+ +

I have tried to solve the +problem by interpolating between actual passages of the planets through +their nodes and apsides. However, this method works only well with Mercury. +With all other planets, the supporting points are too far apart as to make an +accurate interpolation possible.

+ +

There is another problem about +heliocentric ellipses. E.g. Neptune's orbit has often two perihelia and two +aphelia within one revolution. As a result, there is a wild oscillation of the +osculating or "true" perihelion (and aphelion), which is not due to a +transformation of the orbital ellipse but rather due to the deviation of the +orbit from an elliptic shape. Neptune’s orbit cannot be adequately represented +by a heliocentric ellipse. It makes no sense to use such points in astrology.

+ +

In actuality, Neptune’s orbit +is not heliocentric at all. The double perihelia and aphelia are an effect of +the motion of the sun about the solar system barycenter. This motion is much +faster than the motion of Neptune, and Neptune cannot react on such fast +displacements of the Sun. As a result, Neptune seems to move around the +barycenter (or a mean sun) rather than around the real sun. In fact, Neptune's +orbit around the barycenter is therefore closer to an ellipse than his orbit +around the sun. The same statement is also true, though less obvious, for +Saturn, Uranus and Pluto, but not for Jupiter and the inner planets.

+ +

This fundamental problem about +osculating ellipses of planetary orbits does of course not only affect the +apsides but also the nodes.

+ +

As a solution, it seems +reasonable to compute the osculating elements of slow planets from their +barycentric motions rather than from their heliocentric motions. This procedure +makes sense especially for Neptune, but also for all planets beyond Jupiter. It +comes closer to the mean apsides and nodes for planets that have such points +defined. For Pluto and all transsaturnian asteroids, this solution may be used +as a substitute for "mean" nodes and apsides. Note, however, that +there are considerable differences between barycentric osculating and mean +nodes and apsides for Saturn, Uranus, and Neptune. (A few degrees! But heliocentric +ones are worse.)

+ +

Anyway, neither the +heliocentric nor the barycentric ellipse is a perfect representation of the +nature of a planetary orbit. So, astrologers, do not expect anything very +reliable here either!

+ +

The best choice of method will +probably be:

+ +

For Mercury – Neptune: mean +nodes and apsides.

+ +

For asteroids that belong to +the inner asteroid belt: osculating nodes/apsides from a heliocentric ellipse.

+ +

For Pluto and transjovian +asteroids: osculating nodes/apsides from a barycentric ellipse.

+ +

 

+ +

The modes of the Swiss Ephemeris function +swe_nod_aps()

+ +

The  function swe_nod_aps() can be run in the following modes:

+ +

1) Mean positions are given +for nodes and apsides of Sun, Moon, Earth, and the planets up to Neptune. +Osculating positions are given with Pluto and all asteroids. This is the +default mode.

+ +

2) Osculating positions are +returned for nodes and apsides of all planets.

+ +

3) Same as 2), but for planets +and asteroids beyond Jupiter, a barycentric ellipse is used.

+ +

4) Same as 1), but for Pluto +and asteroids beyond Jupiter, a barycentric ellipse is used.

+ +

For the reasons given above, +Dieter Koch would prefer method 4) as making most sense.

+ +

In all of these modes, the second focal point of the ellipse can be +computed instead of the aphelion.

+ +

 

+ +

 

+ +

2.3.         Asteroids

+ +

Asteroid +ephemeris files

+ +

The standard distribution of SWISSEPH includes the main asteroids +Ceres, Pallas, Juno, Vesta, as well as Chiron, and Pholus. To compute them, you +must  have the main-asteroid ephemeris +files in your ephemeris directory.

+ +

The names of these files are of the following form:

+ +

seas_18.se1                  main asteroids +for 600 years from 1800 - 2400

+ +

The size of such a file is about 200 kb.

+ +

All other asteroids are available in separate files. The names of +additional asteroid files look like:

+ +

se00433.se1                   the file of asteroid No. 433 (= +Eros)

+ +

These files cover the period 3000 BC - 3000 AD.
+A short version for the years 1500 – 2100 AD has the file name with an 's' +imbedded,
se00433s.se1.

+ +

The numerical integration of the all officiall numbered asteroids is an +ongoing effort. In December 1998, 8000 asteroids were numbered, and their +orbits computed by the devlopers of Swiss Ephemeris. In January 2001, the list +of numbered asteroids has reached 20957, and is growing very fast.

+ +

Any asteroid can be called either with the JPL, the Swiss, or the +Moshier ephemeris flag, and the results will be slightly different. The reason +is that the solar position (which is needed for geocentric positions) will be +taken from the ephemeris that has been specified.

+ +

Availability of asteroid files:

+ +

-              all short files +(over 200000) are available for free download at our ftp server ftp.astro.ch/pub/swisseph.
+The purpose of providing this large number of files for download is that the +user can pick those few asteroids he/she is interested in.

+ +

-              for all named +asteroids also a long  (6000 years) file +is available in the download area.

+ +

How the +asteroids were computed

+ +

To generate our asteroid ephemerides, we have modified the numerical +integrator of Steve Moshier, which was capable to rebuild the DE200 JPL +ephemeris.

+ +

Orbital elements, with a few exceptions, were taken from the asteroid +database computed by E. Bowell, Lowell Observatory, Flagstaff, Arizona +(astorb.dat). After the introduction of the JPL database mpcorb.dat, we still +keep working with the Lowell data because Lowell elements are given with one +more digit, which can be relevant for long-term integrations.

+ +

For a few close-Sun-approaching asteroids like 1566 Icarus, we use the +elements of JPL’s DASTCOM database. Here, the Bowell elements are not good for +long term integration because they do not account for relativity.

+ +

Our asteroid ephemerides take into account the gravitational +perturbations of all planets, including the major asteroids Ceres, Pallas, and +Vesta and also the Moon.

+ +

The mutual perturbations of Ceres, Pallas, and Vesta were included by +iterative integration. The first run was done without mutual perturbations, the +second one with the perturbing forces from the positions computed in the first +run.

+ +

The precision of our integrator is very high. A test integration of the +orbit of Mars with start date 2000 has shown a difference of only 0.0007 arc +second from DE200 for the year 1600. We also compared our asteroid ephemerides +with data from JPL’s on-line ephemeris system ”Horizons” which provides +asteroid positions from 1600 on. Taking into account that Horizons does not +consider the mutual perturbations of the major asteroids Ceres, Pallas and +Vesta, the difference is never greater than a few 0.1 arcsec.

+ +

(However, the Swisseph asteroid ephemerides do consider those +perturbations, which makes a difference of 10 arcsec for Ceres and 80 arcsec +for Pallas. This means that our asteroid ephemerides are even better than the +ones that JPL offers on the web.)

+ +

The accuracy limits are therefore not set by the algorithms of our +program but by the inherent uncertainties in the orbital elements of the +asteroids from which our integrator has to start.

+ +

Sources of errors are:

+ +

-      Only some of the +minor planets are known to better than an arc second for recent decades. (See +also informations below on Ceres, Chiron, and Pholus.)

+ +

-      Bowells elements do +not consider relativistic effects, which leads to significant errors with +long-term integrations of a few close-Sun-approaching orbits (except 1566, +2212, 3200, 5786, and 16960, for which we use JPL elements that do take into +account relativity).

+ +

The orbits of some asteroids are extremely sensitive to perturbations by +major planets. E.g. 1862 Apollo becomes chaotic before the year 1870 AD when he +passes Venus within a distance which is only one and a half the distance from +the Moon to the Earth. In this moment, the small uncertainty of the initial +elements provided by the Bowell database grows, so to speak, ”into infinity”, +so that it is impossible to determine the precise orbit prior to that date. Our +integrator is able to detect such happenings and end the ephemeris generation +to prevent our users working with meaningless data.

+ +

Ceres, Pallas, +Juno, Vesta

+ +

The orbital elements of the four main asteroids Ceres, Pallas, Juno, and +Vesta are known very precisely, because these planets have been discovered +almost 200 years ago and observed very often since. On the other hand, their +orbits are not as well-determined as the ones of the main planets. We estimate +that the precision of the main asteroid ephemerides is better than 1 arc second +for the whole 20th century. The deviations from the Astronomical Almanac +positions can reach 0.5” (AA 1985 – 1997). But the tables in AA are based on +older computations, whereas we used recent orbital elements. (s. AA 1997, page L14)

+ +

MPC elements have a precision of five digits with mean anomaly, +perihelion, node, and inclination and seven digits with eccentricity and +semi-axis. For the four main asteroids, this implies an uncertainty of a few +arc seconds in 1600 AD and a few arc minutes in 3000 BC.

+ +

Chiron

+ +

Positions of Chiron can be well computed for the time between 700 +AD  and 4650 AD. As a result of close +encounters with Saturn in Sept. 720 AD and in 4606 AD we cannot trace its orbit +beyond this time range. Small uncertainties in today's orbital elements have chaotic +effects before the year 700.

+ +

Do not rely on earlier Chiron ephemerides supplying a Chiron for Cesar's, +Jesus', or Buddha's birth chart. They are completely meaningless.

+ +

Pholus

+ +

Pholus is a minor planet with orbital characteristics that are similar +to Chiron's. It was discovered in 1992. Pholus' orbital elements are not yet as +well-established as Chiron's. Our ephemeris is reliable from 1500 AD through +now. Outside the 20th century it will probably have to be corrected by several +arc minutes during the coming years.

+ +

”Ceres” - +an application program for asteroid astrology

+ +

Dieter Koch has written the application program Ceres which +allows to compute all kinds of lists for asteroid astrology. E.g. you can +generate a list of all your natal asteroids ordered by position in the zodiac. +But the program does much more:

+ +

- natal positions, synastries/transits, composite charts, progressions, +primary directions etc.

+ +

- geocentric, heliocentric, topocentric, house horoscopes

+ +

- lists sorted by position in zodiac, by asteroid name, by declination +etc.

+ +

The program is on the asteroid short files CD-ROM and the standard Swiss +Ephemeris CD-ROM.

+ +

 

+ +

2.4         Comets

+ +

The Swiss Ephemeris does not provide ephemerides of comets yet.

+ +

2.5         Fixed stars and Galactic Center

+ +

A database of fixed stars is included with Swiss Ephemeris. It contains +about 800 stars, which can be computed with the swe_fixstar() function. The +precision is about 0.001”.

+ +

Our data are based on the star catalogue of Steve Moshier. It can be +easily extended if more stars are required.

+ +

The database was improved by Valentin Abramov, Tartu, Estonia. He +reordered the stars by constellation, added some stars, many names and +alternative spellings of names.

+ +

In Feb. +2006 (Version 1.70) the fixed stars file was updated with data from the SIMBAD +database (http://simbad.u-strasbg.fr/Simbad).

+ +

 

+ +

In Jan. +2011 (Version 1.77) a new fixed stars file sefstars.txt was created from the +SIMBAD database.

+ +

2.6         ‚Hypothetical' bodies

+ +

We include some astrological factors in the ephemeris which have no +astronomical basis – they have never been observed physically. As the purpose +of the Swiss Ephemeris is astrology, we decided to drop our scientific view in +this area and to be of service to those astrologers who use these +‘hypothetical’ planets and factors. Of course neither of our scientific +sources, JPL or Steve Moshier, have anything to do with this part of the Swiss +Ephemeris.

+ +

Uranian Planets +(Hamburg Planets: Cupido, Hades, Zeus, Kronos, Apollon, Admetos, Vulkanus, +Poseidon)

+ +

There have been discussions whether these factors are to be called +'planets' or 'Transneptunian points'. However, their inventors, the German +astrologers Witte and Sieggrün, considered them to be planets. And moreover +they behave like planets in as far as they circle around the sun and obey its +gravity.

+ +

On the other hand, if one looks at their orbital elements, it is obvious +that these orbits are highly unrealistic.  +Some of them are perfect circles – something that does not exist in +physical reality. The inclination of the orbits is zero, which is very +improbable as well. The revised elements published by James Neely in Matrix Journal +VII (1980) show small eccentricities for the four Witte planets, but they are +still smaller than the eccentricity of Venus which has an almost circular +orbit. This is again very improbable.

+ +

There are even more problems. An ephemeris computed with such elements +describes an unperturbed motion, i.e. it takes into account only the Sun's +gravity, not the gravitational influences of the other planets. This may result +in an error of a degree within the 20th century, and +greater errors for earlier centuries.

+ +

Also, note that none of the real transneptunian objects that have been +discovered since 1992 can be identified with any of the Uranian planets.

+ +

SWISSEPH uses James Neely's revised orbital elements, because they agree +better with the original position tables of Witte and Sieggrün.

+ +

The hypothetical planets can again be called with any of the three +ephemeris flags. The solar position needed for geocentric positions will then +be taken from the ephemeris specified.

+ +

Transpluto +(Isis)

+ +

This hypothetical planet was postulated 1946 by the French astronomer +M.E. Sevin because of otherwise unexplainable gravitational perturbations in +the orbits of Uranus and Neptune.

+ +

However, this theory has been superseded by other attempts during the +following decades, which proceeded from better observational data.  They resulted in bodies and orbits +completely different from what astrologers know as 'Isis-Transpluto'. More +recent studies have shown that the perturbation residuals in the orbits of +Uranus and Neptune are too small to allow postulation of a new planet. They +can, to a great extent, be explained by observational errors or by systematic +errors in sky maps.

+ +

In telescope observations, no hint could be discovered that this planet +actually existed. Rumors that claim the opposite are wrong.  Moreover, all of the transneptunian bodies +that have been discovered since 1992 are very different from Isis-Transpluto.

+ +

Even if Sevin's computation were correct, it could only provide a rough +position. To rely on arc minutes would be illusory.  Neptune was more than a degree away from its theoretical position +predicted by Leverrier and Adams.

+ +

Moreover, Transpluto's position is computed from a simple Kepler +ellipse, disregarding the perturbations by other planets' gravities.  Moreover, Sevin gives no orbital +inclination.

+ +

Though Sevin gives no inclination for his Transpluto, you will realize +that there is a small ecliptic latitude in positions computed by SWISSEPH. This +mainly results from the fact that its orbital elements are referred to epoch +5.10.1772 whereas the ecliptic changes position with time.

+ +

The elements used by SWISSEPH are taken from ”Die Sterne” 3/1952, p. 70. +The article does not say which equinox they are referred to.  Therefore, we fitted it to the Astron +ephemeris which apparently uses the equinox of 1945 (which, however, is rather +unusual!).

+ +

Harrington

+ +

This is another attempt to predict Planet X's orbit and position from +perturbations in the orbits of  Uranus +and Neptune. It was published in The Astronomical Journal 96(4), October 1988, +p. 1476ff. Its precision is meant to be of the order of +/- 30 degrees. +According to Harrington there is also the possibility that it is actually +located in the opposite constellation, i.e. Taurus instead of Scorpio. The +planet has a mean solar distance of about 100 AU and a period of about 1000 +years.

+ +

Nibiru

+ +

A highly speculative planet derived from the theory of Zecharia Sitchin, +who is an expert in ancient Mesopotamian history and a ”paleoastronomer”.  The elements have been supplied by Christian +Woeltge, Hannover.  This planet is +interesting because of its bizarre orbit. It moves in clockwise direction and +has a period of 3600 years. Its orbit is extremely eccentric. It has its +perihelion within the asteroid belt, whereas its aphelion lies at about 12 +times the mean distance of Pluto.  In +spite of its retrograde motion, it seems to move counterclockwise in +recent centuries. The reason is that it is so slow that it does not even +compensate the precession of the equinoxes.

+ +

Vulcan

+ +

This is a ‘hypothetical’ planet inside the orbit of Mercury (not +identical to the “Uranian” planet Vulkanus). Orbital elements according to L.H. +Weston. Note that the speed of this “planet” does not agree with the Kepler +laws. It is too fast by 10 degrees per year.

+ +

Selena/White +Moon

+ +

This is a ‘hypothetical’ second moon of the earth (or a third one, after +the “Black Moon”) of obscure provenance. Many Russian astrologers use it. Its +distance from the earth is more than 20 times the distance of the moon and it +moves about the earth in 7 years. Its orbit is a perfect, unperturbed circle. +Of course, the physical existence of such a body is not possible. The gravities +of Sun, Earth, and Moon would strongly influence its orbit.

+ +

Dr. +Waldemath’s Black Moon

+ +

This is another hypothetical second moon of the earth, postulated by a +Dr. Waldemath in the Monthly Wheather Review 1/1898. Its distance from +the earth is 2.67 times the distance of the moon, its daily motion about 3 +degrees. The orbital elements have been derived from Waldemath’s original data. +There are significant differences from elements used in earlier versions of +Solar Fire, due to different interpretations of the values given by Waldemath. +After a discussion between Graham Dawson and Dieter Koch it has been agreed +that the new solution is more likely to be correct. The new ephemeris does not +agree with Delphine Jay’s ephemeris either, which is obviously inconsistent +with Waldemath’s data.

+ +

This body has never been confirmed. With its 700-km diameter and an +apparent diameter of 2.5 arc min, this should have been possible very soon +after Waldemath’s publication.

+ +

 

+ +

The +Planets X of Leverrier, Adams, Lowell and Pickering

+ +

These are the hypothetical planets that have lead to the discovery of +Neptune and Pluto or at least have been brought into connection with them.  Their enormous deviations from true Neptune +and Pluto may be interesting for astrologers who work with hypothetical bodies. +E.g. Leverrier and Adams are good only around the 1840ies, the discovery epoch +of Neptune. To check this, call the program swetest as follows:

+ +

$ swetest -p8 -dU -b1.1.1770 -n8 -s7305 -hel +-fPTLBR -head

+ +

(i.e.: compute planet 8 (Neptune) - planet 'U' (Leverrier), from +1.1.1770, 8 times, in 7305-day-steps, heliocentrically. You can do this from +the Internet web page swetest.htm. The +output will be:)

+ +

Nep-Lev +01.01.1770  -18° 0'52.3811    0°55' 0.0332   -6.610753489

+ +

Nep-Lev +01.01.1790   -8°42' 9.1113    1°42'55.7192   -4.257690148

+ +

Nep-Lev +02.01.1810   -3°49'45.2014    1°35'12.0858   -2.488363869

+ +

Nep-Lev +02.01.1830   -1°38' 2.8076    0°35'57.0580   -2.112570665

+ +

Nep-Lev +02.01.1850    1°44'23.0943   -0°43'38.5357   -3.340858070

+ +

Nep-Lev +02.01.1870    9°17'34.4981   -1°39'24.1004   -5.513270186

+ +

Nep-Lev +02.01.1890   21°20'56.6250   -1°38'43.1479   -7.720578177

+ +

Nep-Lev +03.01.1910   36°27'56.1314   -0°41'59.4866   -9.265417529

+ +

 

+ +

  (difference in    (difference in   +(difference in

+ +

  longitude)        latitude)        +solar distance)

+ +

 

+ +

One can see that the error is in the range of 2 degrees between 1830 and +1850 and grows very fast beyond that period.

+ +

 

+ +

2.7 +Sidereal Ephemerides

+ +

Sidereal +Calculations

+ +

 

+ +

Sidereal +astrology has a complicated history, and we (the developers of Swiss Ephemeris) +are actually tropicalists. Any suggestions how we could improve our sidereal +calculations are welcome!

+ +

 

+ +

For deeper +studies of the problem, read:

+ +

Raymond +Mercier, ”Studies in the Medieval Conception of Precession”,

+ +

in 'Archives +Internationales d'Histoire des Sciences', (1976) 26:197-220 (part I), and +(1977) 27:33-71 (part II)

+ +

 

+ +

Thanks to +Juan Ant. Revilla, San Jose, Costa Rica, who gave us this precious +bibliographic hint.

+ +

 

+ +

The +problem of defining the zodiac

+ +

 

+ +

One of the +main differences between the western and the eastern tradition of astrology is +the definition of the zodiac. Western astrology uses the so-called tropical +zodiac in which 0 Aries is defined as the vernal point (the celestial point +where the sun stands at the beginning of spring). The tropical zodiac is a division of the ecliptic into 12 zodiac +signs that are all of equal size, i. e. 30°. Astrologers call these signs +after some constellations that are found along the ecliptic, but they are +actually independent of these constellations. Because the vernal point slowly +moves through the constellations and completes its cycle once in 26000 years, +tropical Aries moves through all constellations along the ecliptic, staying in +each one for roughly 2160 years. Currently, the vernal point, and the beginning +of tropical Aries, is located in sidereal Pisces. In a few hundred years, it will +enter Aquarius, which is the reason why the more impatient ones among us are +already preparing for the “Age of Aquarius”.

+ +

 

+ +

The +so-called sidereal zodiac also consists of 12 equal-sized zodiac signs, +but it is tied to the fixed stars. These sidereal signs, which are used in +Hindu astrology but also by some western Neo-Babylonian and Neo-Hellenistic +astrologers, only roughly coincide with the sidereal constellations, which are +of variable size.

+ +

 

+ +

While the +definition of the tropical zodiac is clear and never questioned, sidereal +astrology has quite some problems in defining its zodiac. There are many +different definitions of the sidereal zodiac, and they differ by several +degrees. At a first glance, all of them look arbitrary, and there is no +striking evidence – from a mere astronomical point of view – for anyone of +them. However, a historical study shows at least that all of them stem from +only one sidereal zodiac. On the other hand, this does not mean that it be +simple to give a precise definition of it.

+ +

 

+ +

Sidereal +planetary positions are usually computed from an equation similar to:

+ +

sidereal_position += tropical_position – ayanamsha,

+ +

where ayanamsha +is the difference between the two zodiacs and changes with time. (Sanskrit ayanâmsha +means ”part of a path”; the Hindi form of the word is ayanamsa with an s +instead of sh.) ”

+ +

The value +of the ayanamsha of date is computed from the ayanamsha value at +a start date (e.g. 1 Jan 1900) and the speed of the vernal point, the so-called +precession rate in ecliptic longitude.

+ +

 

+ +

The zero +point of the sidereal zodiac is therefore traditionally defined by the equation

+ +

sidereal Aries = tropical Aries – +ayanamsha

+ +

and by a +date for which this equation is true.

+ +

 

+ +

The Swiss +Ephemeris allows for about twenty different ayanamshas, but the user can +also define his or her own ayanamsha.

+ +

 

+ +

 

+ +

The +Babylonian tradition and the Fagan/Bradley ayanamsha

+ +

 

+ +

There have +been several attempts to calculate the zero point of the Babylonian ecliptic +from cuneiform lunar and planetary tablets. Positions were given from some +sidereally fixed reference point. The main problem in fixing the zero point is +the inaccuracy of ancient observations. Around 1900 F.X. Kugler found +that the Babylonian star positions fell into three groups:

+ +

 

+ +

  9) ayanamsha = -3°22´, t0 = -100

+ +

10) ayanamsha += -4°46´, t0 = -100                                Spica at 29 vi 26

+ +

11) ayanamsha += -5°37´, t0 = -100 

+ +

 

+ +

(9 – 11 = +Swiss Ephemeris ayanamsha numbers)

+ +

 

+ +

In 1958, Peter +Huber reviewed the topic in the light of new material and found:

+ +

 

+ +

12) ayanamsha += -4°34´ +/- 20´, t0 = –100                  +Spica at 29 vi 14

+ +

The +standard deviation was 1°08’

+ +

 

+ +

In 1977 Raymond +Mercier noted that the zero point might have been defined as the ecliptic +point that culminated simultaneously with the star eta Piscium (Al +Pherg). For this possibility, we compute:

+ +

 

+ +

13) ayanamsha += -5°04’46”, t0 = –129                             Spica at 29 vi 21

+ +

 

+ +

Around +1950, Cyril Fagan, the founder of the modern western sidereal astrology, +reintroduced the old Babylonian zodiac into astrology, placing the fixed star +Spica near 29°00 Virgo. As a result of ”rigorous statistical investigation” +(astrological!) of solar and lunar ingress charts, Donald Bradley decided +that the sidereal longitude of the vernal point must be computed from Spica at +29 vi 06'05" disregarding its proper motion. Fagan and Bradley +defined their ”synetic vernal point” as:

+ +

 

+ +

0) ayanamsha += 24°02’31.36”  for 1 Jan. 1950   with Spica at 29 vi 06'05" (without +aberration)

+ +

(For the +year –100, this ayanamsha places Spica at 29 vi 07’32”.)

+ +

 

+ +

Fagan and +Bradley said that the difference between P. Huber’s zodiac and theirs was only +1’. But actually (if Mercier’s value for the Huber ayanamsha is correct) +it was 7’.

+ +

 

+ +

According +to a text by Fagan (found on the internet), Bradley ”once opined in print prior +to "New Tool" that it made more sense to consider Aldebaran and +Antares, at 15 degrees of their respective signs, as prime fiducials than it +did to use Spica at 29 Virgo”. Such statements raise the question if the +sidereal zodiac ought to be tied up to one of those stars. Today, we know that +the fixed stars have a proper motion, wherefore such definitions are not a good +idea, if an absolute coordinate system independent on moving bodies is +intended. But the Babylonians considered them to be fixed.

+ +

 

+ +

For this +possibility, Swiss Ephemeris gives an Aldebaran ayanamsha:

+ +

 

+ +

14) ayanamsha +with Aldebaran at 15ta00’00” and Antares at 15sc00’17” around the year –100.

+ +

 

+ +

The +difference between this ayanamsha and the Fagan/Bradley one is 1’06”.

+ +

 

+ +

 

+ +

The +Hipparchan tradition

+ +

 

+ +

Raymond +Mercier has shown +that all of the ancient Greek and the medieval Arabic astronomical works +located the zero point of the ecliptic somewhere between 10 and 22 arc +minutes east of the star zeta Piscium. This definition goes back to the +great Greek astronomer Hipparchus. How did he choose that point? +Hipparchus said that the beginning of Aries rises when Spica sets. This +statement was meant for a geographical latitude of 36°, the latitude of the +island of Rhodos, which Hipparchus’ descriptions of rises and settings are +referred to.

+ +

 

+ +

However, +there seems to be more behind it. Mercier points out that according to +Hipparchus’ star catalogue the stars alpha Arietis, beta Arietis, zeta +Piscium, and Spica are located in precise alignment on a great +circle which goes through that zero point near zeta Piscium. Moreover, +this great circle was identical with the horizon once a day at Hipparchus’ +geographical latitude of 36°. In other words, the zero point rose at the same +time when the three mentioned stars in Aries and Pisces rose and at the same +time when Spica set.

+ +

 

+ +

This would +of course be a nice definition for the zero point, but unfortunately the stars +were not really in such precise alignment. They were only assumed to be +so.

+ +

 

+ +

Mercier +gives the following ayanamshas for Hipparchus and Ptolemy +(who used the same star catalogue as Hipparchus):

+ +

 

+ +

16) ayanamsha += -9°20’     27 June –128 (jd +1674484)    zePsc 29pi33’49”                Hipparchos

+ +

 

+ +

(According +to Mercier’s calculations, the Hipparchan zero point should have been between +12 and 22 arc min east of zePsc, but the Hipparchan ayanamsha, as given +by Mercier, has actually the zero point 26’ east of zePsc. This comes from the +fact that Mercier refers to the Hipparchan position of zeta Piscium, which +was at least rounded to 10’ – if otherwise correct.)

+ +

 

+ +

If we used +the explicit statement of Hipparchus that Aries rose when Spica set at a +geographical latitude of 36 degrees, the precise ayanamsha would be +-8°58’13” for 27 June –128 (jd 1674484) and zePsc would be found at 29pi12’, +which is too far from the place where it ought to be.

+ +

 

+ +

Mercier +also discusses the old Indian precession models and zodiac point definitions. +He notes that, in the Sûrya Siddânta, the star zeta Piscium (in +Sanskrit Revatî) has almost the same position as in the Greek sidereal +zodiac, i.e. 29°50’ in Pisces. On the other hand, however, Spica (in Sanskrit Citra) +is given the longitude 30° Virgo. This is a contradiction, either Spica or +Revatî must be considered wrong.

+ +

 

+ +

Moreover, +if the precession model of the Sûrya Siddânta is used to compute an ayanamsha +for the date of Hipparchus, it will turn out to be –9°14’01”, which is very +close to the Hipparchan value. The same calculation can be done with the Ârya +Siddânta, and the ayanamsha for Hipparchos’ date will be –9°14’55”. +For the Siddânta Shiromani the zero point turns out to be Revatî itself. +By the way, this is also the zero point chosen by Copernicus! So, there +is an astonishing agreement between Indian and Western traditions!

+ +

 

+ +

The same +zero point near the star Revatî is also used by the so-called Ushâshashî +ayanamsha which is still in use. It differs from the Hipparchan one by only +11 arc minutes.

+ +

 

+ +

4) ayanamsha += 18°39’39.46                1 Jan. 1900                Ushâshashî         

+ +

zePsc (Revatî) 29pi50’ (today), +29pi45’ (Hipparchus’ epoch)

+ +

 

+ +

The +Greek-Arabic-Hindu ayanamsha was zero around 560 AD. The tropical and +the sidereal zero points were at exactly the same place. Did astronomers or +astrologers react on that event? They did! Under the Sassanian ruler Khusrau +Anûshirwân, in the year 556, the astronomers of Persia met to correct their +astronomical tables, the so-called Zîj al-Shâh. These tables are no +longer extant, but they were the basis of later Arabic tables, the ones of +al-Khwârizmî and the Toledan tables.

+ +

 

+ +

One of the +most important cycles in Persian astronomy/astrology was the one of Jupiter, +which started and ended with the conjunctions of Jupiter with the sun. This +cycle happened to end in the year 564, and the conjunction of Jupiter +with the Sun took place only one day after the spring equinox. And the +spring equinox took place precisely 10 arcmin east of zePsc. This may be a +mere coincidence from a present-day astronomical point of view, but for +scientists of those days this was obviously the moment to redefine all +astronomical data.

+ +

 

+ +

Mercier +also shows that in the precession model used in that epoch and in other models +used later by Arabic Astronomers, precession was considered to be a phenomenon +connected with ”the movement of Jupiter, the calendar marker of the night sky, +in its relation to the Sun, the time keeper of the daily sky”. Such theories +were of course wrong, from the point of view of today’s knowledge, but they +show how important that date was considered to be.

+ +

 

+ +

After the +Sassanian reform of astronomical tables, we have a new definition of the +Greek-Arabic-Hindu sidereal zodiac (this is not explicitly stated by Mercier, +however):

+ +

 

+ +

16) ayanamsha += 0                              18 Mar 564, 7:53:23 UT (jd /ET 1927135.8747793)    Sassanian

+ +

     +zePsc  29pi49'59"

+ +

 

+ +

The same +zero point then reappears with a precision of 1’ in the Toledan tables, the +Khwârizmian tables, the Sûrya Siddhânta, and the Ushâshashî ayanamsha.

+ +

 

+ +

(Besides +the synchronicity of the Sun-Jupiter conjunction and the coincidence of the two +zodiacs, it is funny to note that the cosmos helped the inaccuracy of ancient +astronomy by ”rounding” the position of the star zePsc to precisely 10 arc +minutes east of the zero point! All Ptolemean star positions were rounded to 10 +arc minutes.)

+ +

 

+ +

 

+ +

Suryasiddhanta and Aryabhata

+ +

 

+ +

The explanations above are mainly +derived from the article by Mercier. However, it is possible to derive +ayanamshas from ancient Indian works themselves.

+ +

 

+ +

The planetary theory of the main +work of ancient Indian astronomy, the Suryasiddhanta, uses the so-called +Kaliyuga era as its zero point, i. e. the 18th February 3102 BC, +0:00 local time at Ujjain, which is at geographic longitude of 75.7684565 east +(Mahakala temple). This era is henceforth called “K0s”. This is also the zero +date for the planetary theory of the ancient Indian astronomer Aryabhata, with +the only difference that he reckons from sunrise of the same date instead of +midnight. We call this Aryabhatan era “K0a”.

+ +

 

+ +

Now, Aryabhata mentioned that he was +23 years old when exactly 3600 years had passed since the beginning of the +Kaliyuga era. If 3600 years with a year length as defined by the Aryabhata are +counted from K0a, we arrive at the 21st March, 499 AD, 6:56:55.57 +UT. At this point of time the mean Sun is assumed to have returned to the +beginning of the sidereal zodiac, and we can derive an ayanamsha from this +information. There are two possible solutions, though:

+ +

 

+ +

1. We can find the place of the mean +Sun at that time using modern astronomical algorithms and define this point as +the beginning of the sidereal zodiac.

+ +

2. As Aryabhata believed that the +zodiac began at the vernal point, we can take the vernal point of this date as +the zero point.

+ +

 

+ +

The same calculations can be done +based on K0s and the year length of the Suryasiddhanta. The resulting date of +Kali 3600 is the same day but about half an hour later: 7:30:31.57 UT.

+ +

 

+ +

Algorithms for the mean Sun were +taken from: Simon et alii, “Numerical expressions for precession formulae and +mean elements for the Moon and the planets”, in: Astron. Astrophys. 282,663-683 +(1994).   

+ +

 

+ +

 

+ +

The +Spica/Citra tradition and the Lahiri ayanamsha

+ +

 

+ +

There is +another ayanamsha tradition that assumes the star Spica (in Sanskrit Citra) at +0° Libra. This ayanamsha definition is the most common one in modern Hindu astrology. +It was first proposed by the astronomy historian S. B. Dixit (also written +Dikshit), who in 1896 published his important work History of Indian +Astronomy (= Bharatiya Jyotih +Shastra; bibliographical details further below). Dixit came to the +conclusion that, given the prominence that Vedic religion gave to the cardinal +points of the tropical year, the Indian calendar, which is based on the zodiac, +should be reformed and no longer be calculated relative to the sidereal, but to +the tropical zodiac. However, if such a reform could not be brought about due +to the rigid conservatism of contemporary Vedic culture, then the ayanamsha +should be chosen in such a way that the sidereal zero point would be in +opposition to Spica. In this way, it would be in accordance with Grahalaghava, a work by the 16th century +astronomer Ganeśa Daivajña that +was still used in the 20th century by Indian calendar makers. (op. +cit., Part II, p. 323ff.). This view was taken over by the Indian Calendar Reform Committee on the occasion of the Indian +calendar reform in 1956, when the ayanamsha based on the +star Spica/Citra was declared the Indian standard. This standard is mandatory +not only for astrology but also for astronomical ephemerides and almanacs and +calendars published in India. The ayanamsha based on the star Spica/Citra +became known as “Lahiri ayanamsha”. It was named after the Calcuttan astronomer +and astrologer Nirmala Chandra Lahiri, who was a member of the Reform +Committee.

+ +

 

+ +

However, as +has been said, it was Dixit who first propagated this solution to the ayanamsha +problem. Besides, the Suryasiddhanta, the most important work of ancient Hindu +astronomy, which was written in the first centuries AD, but reworked several +times, already assumes Spica/Citra at 180° (although this statement has caused +a lot of controversy because it is in contradiction with the positions of other +stars, and in particular with zeta Piscium/Revati at 359°50‘). And last but not +least, the same ayanamsha definition seems to have been used in Babylon and +Greece, as well. While the information given above in the chapters about the +Babylonian and the Hipparchan traditions are based on analyses of old star +catalogues and planetary theories, a study by Nick Kollerstrom of 22 ancient +Greek and 5 Babylonian birth charts has lead to a different conclusion: they +fit better with Spica at 0 Libra (= Lahiri), than with Aldebaran at 15 Taurus +and Spica at 29 Virgo (= Fagan/Bradley).

+ +

 

+ +

The +standard definition of the Indian ayanamsha (“Lahiri” ayanamsha) was originally +introduced in 1955 by the Indian Calendar +Reform Committee (23°15' 00" on the 21 March 1956, 0:00 Ephemeris +Time). The definition was corrected in Indian +Astronomical Ephemeris 1989, page 556, footnote:

+ +

"According +to new determination of the location of equinox this initial value has been +revised to and used in computing the mean ayanamsha with effect from +1985'."

+ +

The mention +of “mean ayanamsha” is misleading though. The value 23°15' 00".658 is true +ayanamsha, i. e. it includes nutation and is relative to the true equinox of +date.

+ +

 

+ +

1) true +ayanamsha = 23°15' 00".658                             21 March 1956, 0:00 TDT        Lahiri, Spica roughly at 0 Libra

+ +

 

+ +

The Lahiri +standard position of Spica is 179°59’04 in the year 2000, and 179°59’08 in +1900. In the year 285, when the star was conjunct the autumnal equinox, its +position was 180°00’16. It was in the year 667 AD that its position was +precisely 180°. The motion of the star is a result partly of its proper motion +and partly of planetary precession, which has the ecliptic slightly change its +orientation. But what method exactly was used to define this ayanamsha? +According to the Indian pundit AK Kaul, an expert in Hindu calendar and +astrology, Lahiri wanted to place the star at 180°, but at the same time arrive +at an ayanamsha that was in agreement with the Grahalaghava, an important work +for traditional Hindu calendar calculation that was written in the 16th +century. (e-mail from Mr. Kaul to Dieter Koch on 1 March 2013)

+ +

 

+ +

In 1967, 12 +years after the standard definition of the Lahiri ayanamsha had been published +by the Calendar Reform Committee, Lahiri published another ayanamsha in his +Bengali book Panchanga Darpan. There, +the value of “mean ayanamsha” is given as 22°26’45”.50 in 1900, whereas the +official value is 22°27’37”.76. The idea behind this modification was obviously +that he wanted to have the star exactly at 180° for recent years, whereas with +the standard definition the star is “wrong” by almost an arc minute. It +therefore seems that Lahiri did not follow the Indian standard himself but was +of the opinion that Spica had to be at exactly 180° (true chitrapaksha +ayanamsha). At the moment, the Swiss only supports the official standard. +However, it is rather trivial to calculate the positions of a planet and the +star and then subtract the star from the planet.

+ +

 

+ +

Swiss +Ephemeris versions below 1.78.01, had a slightly different definition of the +Lahiri ayanamsha that had been taken from Robert Hand's astrological software +Nova. It made a difference of only 0.01 arc sec.

+ +

 

+ +

Many thanks +to Vinay Jha, Narasimha Rao, and Avtar Krishen Kaul for helping us to better +understand the complicated matter.

+ +

 

+ +

If the +reader finds errors in this documentation or is able to contribute important +information, his or her feedback will be greatly appreciated.

+ +

 

+ +

Sources:

+ +

Burgess, +E., The Surya Siddanta. A Text-book of Hindu Astronomy, Delhi, 2000 +(MLBD).

+ +

Dikshit, S(ankara) B(alkrishna), Bharatiya Jyotish Sastra (History of Indian Astronomy) (Tr. +from Marathi), Govt. of India, 1969, part I & II.

+ +

Kollerstrom, Nick, „The Star Zodiac of Antiquity“, in: Culture +& Cosmos, Vol. +1, No.2, 1997).

+ +

Lahiri, N. C., Panchanga Darpan (in Bengali), Calcutta, 1967 (Astro Research +Bureau).

+ +

Lahiri, +N. C., Tables of the Sun, Calcutta, 1952 (Astro Research Bureau).

+ +

Saha, M. +N., and Lahiri, N. C., Report of the Calendar Reform Committee, C.S.I.R., New Delhi, 1955.

+ +

The +Indian astronomical ephemeris for the year 1989, +Delhi (Positional Astronomy Centre, India Meteorological Department)

+ +

 

+ +

The +sidereal zodiac and the Galactic Center

+ +

 

+ +

As said +before, there is a very precise definition for the tropical ecliptic. It starts +at one of the two intersection points of the ecliptic and the celestial +equator. Similarly, we have a very precise definition for the house circle +which is said to be an analogy of the zodiac. It starts at one of the two +intersection points of the ecliptic and the local horizon. Unfortunately there +is no such definition for the sidereal zodiac. Or can a fixed star like Spica +be important enough to play the role of an anchor star?

+ +

 

+ +

One could +try to make the sidereal zero point agree with the Galactic Center. The Swiss +astrologer Bruno Huber has pointed out that the Galactic Center enters a new +tropical sign always around the same time when the vernal point enters the next +sidereal sign. Around the time, when the vernal point will go into Aquarius, +the Galactic Center will change from Sagittarius to Capricorn. Huber also notes +that the ruler of the tropical sign of the Galactic Center is always the same +as the ruler of the sidereal sign of the vernal point (at the moment Jupiter, +will be Saturn in a few hundred years).

+ +

 

+ +

A +correction of the Fagan ayanamsha by about 2 degrees or a correction of +the Lahiri ayanamsha by 3 degrees would place the Galactic Center at 0 +Sagittarius. Astrologically, this would obviously make some sense. Therefore, +we add an ayanamsha fixed at the Galactic Center:

+ +

 

+ +

17) +Galactic Center at 0 Sagittarius

+ +

 

+ +

The other +possibility – in analogy with the tropical ecliptic and the house circle – +would be to start the sidereal ecliptic at the intersection point of the +ecliptic and the galactic plane. At present, this point is located near 0 +Capricorn. However, defining this point as sidereal 0 Aries would mean to break +completely with the tradition, because it is far away from the traditional sidereal +zero points.

+ +

 

+ +

Other +ayanamshas

+ +

 

+ +

There are a +few more ayanamshas, whose provenance is not known to us. They were +given to us by Graham Dawson (”Solar Fire”), who took them over from Robert +Hand’s Program ”Nova”:

+ +

 

+ +

2) De Luce

+ +

3) Raman

+ +

5) Krishnamurti

+ +

 

+ +

David Cochrane adds

+ +

 

+ +

7) Yukteshvar

+ +

8) JN Bhasin

+ +

 

+ +

Graham +Dawson adds the following one:

+ +

 

+ +

6) Djwhal +Khul

+ +

 

+ +

He comments it as follows: ”The "Djwhal +Khul" ayanamsha originates from information in an article in the Journal +of Esoteric Psychology, Volume 12, No 2, pp91-95, Fall 1998-1999 publ. Seven +Ray Institute). It is based on an inference that the Age of Aquarius starts in +the year 2117. I decided to use the 1st of July simply to minimise the possible +error given that an exact date is not given.”

+ +

 

+ +

Conclusions

+ +

 

+ +

We have +found that there are basically three definitions, not counting the manifold +variations:

+ +

1.     the Babylonian zodiac with Spica at 29 +Virgo or Aldebaran at 15 Taurus:

+ +

a) P. Huber, b) Fagan/Bradley c) refined with Aldebaran +at 15 Tau

+ +

2.     the Greek-Arabic-Hindu zodiac with the zero +point between 10 and 20’ east of zeta Piscium:

+ +

a) Hipparchus, b) Ushâshashî, c) Sassanian

+ +

3.     the Greek-Hindu astrological zodiac with +Spica at 0 Libra

+ +

a) Lahiri

+ +

 

+ +

The +differences are:

+ +

between 1) +and 3) is about 1 degree

+ +

between 1) +and 2) is about 5 degrees

+ +

between 2) +and 3) is about 4 degrees

+ +

 

+ +

It is +obvious that all of them stem from the same origin, but it is difficult to say +which one should be preferred for sidereal astrology.

+ +

 

+ +

1) is +historically the oldest one, but we are not sure about its precise astronomical +definition. Aldebaran at 15 Tau might be one.

+ +

 

+ +

3) has the +most striking reference point, the bright star Spica at 0 Libra. But this +definition is so clear and simple that, had it really been intended by the +inventors of the sidereal ecliptic, it would certainly not have been forgotten +or given up by the Greek and Arabic tradition.

+ +

 

+ +

2) is the +only definition independent on a star – especially, if we take the Sassanian +version. This is an advantage, because all stars have a proper motion and +cannot really define a fixed coordinate system. Also, it is the only ayanamsha +for which there is historical evidence that it was observed and recalibrated at +the time when it was 0.

+ +

 

+ +

On the +other hand, the point 10’ East of zePsc has no astronomical significance at +all, and the great difference between this zero point and the Babylonian one +raises the question: Did Hipparchus’ definition result from a misunderstanding +of the Babylonian definition, or was it an attempt to improve the Babylonian +zodiac?

+ +

 

+ +

 

+ +

In search +of correct algorithms

+ +

 

+ +

A second +problem in sidereal astrology – after the definition of the zero point – is the +precession algorithm to be applied. We can think of five possibilities:

+ +

 

+ +

1)     the traditional algorithm (implemented in +Swiss Ephemeris as default mode)

+ +

 

+ +

In all +software known to us, sidereal planetary positions are computed from an +equation mentioned before:

+ +

sidereal_position += tropical_position – ayanamsha,

+ +

The ayanamhsa +is computed from the ayanamsha(t0) at a starting date (e.g. 1 Jan 1900) +and the speed of the vernal point, the so-called precession rate.

+ +

 

+ +

This +algorithm is unfortunately too simple. At best, it can be considered as an +approximation. The precession of the equinoxes is not only a matter of +ecliptical longitude, but is a more complex phenomenon. It has two components:

+ +

 

+ +

a) The soli-lunar +precession: The combined gravitational pull of the Sun and the Moon on +the equatorial bulge of the earth causes the earth to spin like a top. As a +result of this movement, the vernal point moves around the ecliptic with a +speed of about 50”. This cycle lasts about 26000 years.

+ +

 

+ +

b) The planetary +precession: The earth orbit itself is not fixed. The gravitational +influence from the planets causes it to wobble. As a result, the obliquity of +the ecliptic currently decreases by 47” per century, and this movement has an +influence on the position of the vernal point, as well. (This has nothing to do +with the precessional motion of the earth rotation axis; the equator holds an +almost stable angle against the ecliptic of a fixed date, e.g. 1900, with a +change of only a couple of 0.06” cty-2).

+ +

 

+ +

Because the +ecliptic is not fixed, it cannot be correct just to subtract an ayanamsha +from the tropical position in order to get a sidereal position. Let us take, +e.g., the Fagan/Bradley ayanamsha, which is defined by:

+ +

ayanamsha = +24°02’31.36” + d(t)

+ +

24°02’... +is the value of the ayanamsha on 1 Jan 1950. It is obviously measured on +the ecliptic of 1950.

+ +

d(t) is the distance of the vernal point +at epoch t from the position of the vernal point on 1 Jan 1950. This +value is also measured on the ecliptic of 1950. But the whole ayanamsha +is subtracted from a planetary position which is referred to the ecliptic of +the epoch t. This does not make sense.

+ +

 

+ +

As an +effect of this procedure, objects that do not move sidereally, e.g. the +Galactic Center, seem to move. If we compute its precise tropical position for +several dates and then subtract the Fagan/Bradley ayanamsha for the same +dates in order to get its sidereal position, these positions will all be +slightly different:

+ +

 

+ +

Date         Longitude        +Latitude

+ +

01.01.-5000  2 sag 07'57.7237   -4°41'34.7123 (without aberration)

+ +

01.01.-4000  2 sag 07'32.9817   -4°49' 4.8880

+ +

01.01.-3000  2 sag 07'14.2044   -4°56'47.7013

+ +

01.01.-2000  2 sag 07' 0.4590   -5° 4'39.5863

+ +

01.01.-1000  2 sag 06'50.7229   -5°12'36.9917

+ +

01.01.0      2 sag 06'44.2492   -5°20'36.4081

+ +

01.01.1000   2 sag 06'40.7813   -5°28'34.3906

+ +

01.01.2000   2 sag 06'40.5661   -5°36'27.5619

+ +

01.01.3000   2 sag 06'44.1743   -5°44'12.6886

+ +

01.01.4000   2 sag 06'52.1927   -5°51'46.6231

+ +

01.01.5000   2 sag 07' 4.8942   -5°59' 6.3665

+ +

 

+ +

The effect +can be much greater for bodies with greater ecliptical latitude.

+ +

Exactly the +same kind of thing happens to sidereal planetary positions, if one calculates +them in the traditional way. It is only because planets move that we are not +aware of it.

+ +

 

+ +

The traditional method of computing sidereal positions is +geometrically not sound and can never achieve the same degree of accuracy as +tropical astrology is used to.

+ +

 

+ +

2)     fixed-star-bound ecliptic (not +implemented in Swiss Ephemeris)

+ +

 

+ +

One could +use a stellar object as an anchor for the sidereal zodiac, and make sure that a +particular stellar object is always at a certain position on the ecliptic of +date. E.g. one might want to have Spica always at 0 Libra or the Galactic +Center always at 0 Sagittarius. There is nothing against this method from a +geometrical point of view. But it has to be noted, that this system is not +really fixed either, because it is still based on the moving ecliptic, and +moreover the fixed stars have a small proper motion, as well.

+ +

 

+ +

3)     projection onto the ecliptic of t0 +(implemented in Swiss Ephemeris as an option)

+ +

 

+ +

Another +possibility would be to project the planets onto the reference ecliptic of the ayanamsha +– for Fagan/Bradley, e.g., this would be the ecliptic of 1950 – by a correct coordinate +transformation and then subtract 24.042°, the initial value of the ayanamsha. +

+ +

 

+ +

If we +follow this method, the position of the galactic center will always be the same +(2 sag 06'40.4915   -5°36' 4.0652     (without aberration))

+ +

 

+ +

This method +is geometrically sounder than the traditional one, but still it has a problem. +For, if we want everything referred to the ecliptic of a fixed date t0, we will +have to choose that date very carefully. Its ecliptic ought to be of special +importance. The ecliptic of 1950 or the one of 1900 are obviously meaningless +and not suitable as a reference plane. And how about that 18 March 564, on +which the tropical and the sidereal zero point coincided? Although this may be +considered as a kind of cosmic anniversary (the Sassanians did so), the +ecliptic plane of that time does not have an ”eternal” value. It is different +from the ecliptic plane of the previous anniversary around the year 26000 BC, +and it is also different from the ecliptic plane of the next cosmic anniversary +around the year 26000 AD.

+ +

 

+ +

This +algorithm is supported by the Swiss Ephemeris, too. However, it must not be +used with the Fagan/Bradley definition or with other definitions that were +calibrated with the traditional method of ayanamsha subtraction. It can +be used for computations of the following kind:

+ +

a)     Astronomers may want to calculate positions +referred to a standard equinox like J2000, B1950, or B1900, or to any other +equinox.

+ +

b)    Astrologers may be interested in the +calculation of precession-corrected transits. See explanations in the +next chapter.

+ +

c)     The algorithm can be applied to the Sassanian +ayanamsha or to any user-defined sidereal mode, if the ecliptic of its +reference date is considered to be astrologically significant.

+ +

d)    The algorithm makes the problems of the +traditional method visible. It shows the dimensions of the inherent inaccuracy +of the traditional method.

+ +

 

+ +

For the planets +and for centuries close to t0, the difference from the traditional procedure +will be only a few arc seconds in longitude. Note that the Sun will have an +ecliptical latitude of several arc minutes after a few centuries.

+ +

 

+ +

For the +lunar nodes, the procedure is as follows:

+ +

Because the +lunar nodes have to do with eclipses, they are actually points on the ecliptic +of date, i.e. on the tropical zodiac. Therefore, we first compute the nodes as +points on the ecliptic of date and then project them onto the sidereal zodiac. +This procedure is very close to the traditional method of computing sidereal +positions (a matter of arc seconds). However, the nodes will have a latitude of +a couple of arc minutes.

+ +

 

+ +

For the +axes and houses, we compute the points where the horizon or the house lines +intersect with the sidereal plane of the zodiac, not with the ecliptic +of date. Here, there are greater deviations from the traditional procedure. If t +is 2000 years from t0 the difference between the ascendant positions +might well be 1/2 degree.

+ +

 

+ +

4)     The long-term mean Earth-Sun plane (not +implemented in Swiss Ephemeris)

+ +

 

+ +

To avoid +the problem of choice of a reference ecliptic, we might watch out for a kind of +”average ecliptic”. As a matter of fact, there are some possibilities in this +direction. The mechanism of the planetary precession mentioned above works in a +similar way as the mechanism of the luni-solar precession. The movement of the +earth orbit can be compared to a spinning top, with the earth mass equally +distributed around the whole orbit. The other planets, especially Venus and +Jupiter, cause it to move around an average position. But unfortunately, this +”long-term mean Earth-Sun plane” is not really stable, either, and therefore +not suitable as a fixed reference frame.

+ +

 

+ +

The period +of this cycle is about 75000 years. The angle between the long-term mean plane +and the ecliptic of date is at the moment about 1°33’, but it changes +considerably. (This cycle must not be confused with the period between two +maxima of the ecliptic obliquity, which is about 40000 years and often +mentioned in the context of planetary precession. This is the time it takes the +vernal point to return to the node of the ecliptic (its rotation point), and +therefore the oscillation period of the ecliptic obliquity.)

+ +

 

+ +

5)     The solar system rotation plane +(implemented in Swiss Ephemeris as an option)

+ +

 

+ +

The solar +system as a whole has a rotation axis, too, and its equator is quite close to +the ecliptic, with an inclination of 1°34’44” against the ecliptic of the year +2000. This plane is extremely stable and probably the only convincing candidate +for a fixed zodiac plane.

+ +

 

+ +

This method +avoids the problem of method 3). No particular ecliptic has to be chosen as a +reference plane. The only remaining problem is the choice of the zero point.

+ +

 

+ +

This +algorithm must not be applied to any of the predefined sidereal modes, except +the Sassanian one. You can use this algorithm, if you want to research on a +better-founded sidereal astrology, experiment with your own sidereal mode, and +calibrate it as you like.

+ +

 

+ +

 

+ +

More +benefits from our new sidereal algorithms: standard equinoxes and +precession-corrected transits

+ +

 

+ +

Method no. +3, the transformation to the ecliptic of t0, opens two more possibilities:

+ +

You can +compute positions referred to any equinox, 2000, 1950, 1900, or whatever you +want. This is sometimes useful when Swiss Ephemeris data ought to be compared +with astronomical data, which are often referred to a standard equinox.

+ +

There are +predefined sidereal modes for these standard equinoxes:

+ +

18) J2000

+ +

19) J1900

+ +

20) B1950

+ +

 

+ +

Moreover, +it is possible to compute precession-corrected transits or synastries +with very high precision. An astrological transit is defined as the passage of +a planet over the position in your birth chart. Usually, astrologers assume +that tropical positions on the ecliptic of the transit time has to be compared +with the positions on the tropical ecliptic of the birth date. But it has been +argued by some people that a transit would have to be referred to the ecliptic +of the birth date. With the new Swiss Ephemeris algorithm (method no. 3) it is +possible to compute the positions of the transit planets referred to the +ecliptic of the birth date, i.e. the so-called precession-corrected +transits. This is more precise than just correcting for the precession in +longitude (see details in the programmer's documentation swephprg.doc, +ch. 8.1).

+ +

 

+ +

3.         Apparent versus true planetary positions

+ +

The Swiss ephemeris provides the calculation of apparent or true +planetary positions. Traditional astrology works with apparent positions. +”Apparent” means that the position where we see the planet is used, not +the one where it actually is. Because the light's speed is finite, a planet is +never seen exactly where it is. (see above, 2.1.3 ”The details of coordinate +transformation”, light-time and aberration) Astronomers therefore make a +difference between apparent and true positions. However, this +effect is below 1 arc minute.

+ +

Most astrological ephemerides provide apparent positions. However, +this may be wrong. The use of apparent positions presupposes that astrological +effects can be derived from one of the four fundamental forces of physics, +which is impossible. Also, many astrologers think that astrological ”effects” +are a synchronistic phenomenon (the ones familiar with physics may refer to the +Bell theorem). For such reasons, it might be more convincing to work with true +positions.

+ +

Moreover, the Swiss Ephemeris supports so-called astrometric +positions, which are used by astronomers when they measure positions of +celestial bodies with respect to fixed stars. These calculations are of no use +for astrology, though.

+ +

4.         Geocentric versus topocentric and +heliocentric positions

+ +

More precisely speaking, common ephemerides tell us the position where +we would see a planet if we stood in the center of the earth and could see the +sky. But it has often been argued that a planet’s position ought to be referred +to the geographic position of the observer (or the birth place). This can make +a difference of several arc seconds with the planets and even more than a +degree with the moon! Such a position referred to the birth place is called +the topocentric planetary position. The observation of transits over the +moon might help to find out whether or not this method works better.

+ +

For very precise topocentric calculations, the Swiss Ephemeris not only +requires the geographic position, but also its altitude above sea. An altitude +of 3000 m (e.g. Mexico City) may make a difference of more than 1 arc second +with the moon. With other bodies, this effect is of the amount of a 0.01”. The +altitudes are referred to the approximate earth ellipsoid. Local irregularities +of the geoid have been neglected.

+ +

Our topocentric lunar positions differ from the NASA positions (s. the Horizons +Online Ephemeris System http://ssd.jpl.nasa.gov) by 0.2 - 0.3 arc sec. This +corresponds to a geographic displacement by a few 100 m and is about the best +accuracy possible. In the documentation of the Horizons System, +it is written that: "The Earth is assumed to be a rigid body. ... These +Earth-model approximations result in topocentric station location errors, with +respect to the reference ellipsoid, of less than 500 meters."

+ +

The Swiss ephemeris also allows the computation of apparent or true topocentric +positions.

+ +

With the lunar nodes and apogees, Swiss Ephemeris does not make a +difference between topocentric and geocentric positions. There are manyfold +ways to define these points topocentrically. The simplest one is to understand +them as axes rather than points somewhere in space. In this case, the +geocentric and the topocentric positions are identical, because an axis is an +infinite line that always points to the same direction, not depending on the +observer's position.

+ +

Moreover, the Swiss Ephemeris supports the calculation of heliocentric +and barycentric planetary positions. Heliocentric positions are +positions as seen from the center of the sun rather than from the center of the +earth. Barycentric ones are positions as seen from the center of the solar +system, which is always close to but not identical to the center of the sun.

+ +

5. +Heliacal Events, Eclipses, Occultations, and Other Planetary Phenomena

+ +

5.1. Heliacal Events of the Moon, +Planets and Stars

+ +

5.1.1. Introduction

+ +

From Swiss Ephemeris version 1.76 on, heliacal +events have been included. The heliacal rising and setting of planets and stars +was very important for ancient Babylonian and Greek astronomy and +astrology.  Also, first and last +visibility of the Moon can be calculated, which are important for many +calendars, e.g. the Islamic, Babylonian and ancient Jewish calendars.

+ +

The heliacal events that can be determined are:

+ +

·     +Inferior +planets

+ +

·Heliacal +rising (morning first)

+ +

·Heliacal +setting (evening last)

+ +

·Evening +first

+ +

·Morning last

+ +

·     +Superior +planets and stars

+ +

·Heliacal +rising

+ +

·Heliacal setting

+ +

 

+ +

·     +Moon

+ +

·Evening +first

+ +

·Morning +last

+ +

 

+ +

The +acronychal risings and settings (also called cosmical settings) of superior +planets are a different matter. They will be added in a future version of the +Swiss Ephemeris.

+ +

 

+ +

The principles behind the calculation are based +on the visibility criterion of Schaefer [1993, 2000], which includes +dependencies on aspects of:

+ +

·     +Position +celestial objects  
+like the position and magnitude of the Sun, Moon and the studied celestial object, +

+ +

·     +Location +and optical properties observer 
+like his/her location (longitude, latitude, height), age, acuity and possible +magnification of optical instruments (like binoculars)

+ +

·     +Meteorological +circumstances 
+mainly expressed in the astronomical extinction coefficient, which is +determined by temperature, air pressure, humidity, visibility range (air +quality).

+ +

·     +Contrast +between studied object and sky background 
+The observer’s eye can on detect a certain amount of contract and this contract +threshold is the main body of the calculations

+ +

In the following sections above aspects will be +discussed briefly and an idea will be given what functions are available to +calculate the heliacal events. Lastly the future developments will be +discussed.

+ +

5.1.2. Aspect determining visibility

+ +

The theory behind this visibility criterion is +explained by Schaefer [1993, 2000] and the implemented by Reijs [2003] and Koch +[2009]. The general ideas behind this theory are explained in the following +subsections.

+ +

5.1.2.1. Position of celestial +objects

+ +

To determine the visibility of a celestial +object it is important to know where the studied celestial object is and what +other light sources are in the sky. Thus beside determining the position of the +studied object and its magnitude, it also involves calculating the position of +the Sun (the main source of light) and the Moon. This is common functions +performed by Swiss Ephemeris.

+ +

5.1.2.2. Geographic location

+ +

The location of the observer determines the +topocentric coordinates (incl. influence of refraction) of the celestial object +and his/her height (and altitude of studied object) will have influence on the +amount of airmass that is in the path of celestial object’s light. 

+ +

5.1.2.3. Optical properties of +observer

+ +

The observer’s eyes will determine the +resolution and the contrast differences he/she can perceive (depending on age +and acuity), furthermore the observer might used optical instruments (like +binocular or telescope).

+ +

5.1.2.4. Meteorological +circumstances

+ +

The meteorological circumstances are very +important for determining the visibility of the celestial object. These +circumstances influence the transparency of the airmass (due to +Rayleigh&aerosol scattering and ozone&water absorption) between the +celestial object and the observer’s eye. This result in the astronomical +extinction coefficient (AEC: ktot). As this is a complex +environment, it is sometimes ‘easier’ to use a certain AEC, instead of +calculating it from the meteorological circumstances.

+ +

The parameters are stored in the datm (Pressure +[mbar], Temperature [C], Relative humidity [%], AEC [-]) array.

+ +

5.1.2.5. Contrast between object and +sky background

+ +

All the above aspects influence the perceived +brightnesses of the studied celestial object and its background sky. The +contrast threshold between the studied object and the background will determine +if the observer can detect the studied object.

+ +

5.1.3. Functions to determine the +heliacal events

+ +

Two functions are seen as the spill of +calculating the heliacal events:

+ +

5.1.3.1. Determining the contrast +threshold (swe_vis_limit_magn) 

+ +

Based on all the aspects mentioned earlier, the +contrast threshold is determine which decides if the studied object is visible +by the observer or not.

+ +

5.1.3.2. Iterations to determine +when the studied object is really visible (swe_heliacal_ut) 

+ +

In general this procedure works in such a way +that it finds (through iterations) the day that conjunction/opposition between +Sun and studied object happens and then it determines, close to Sun’s rise or +set (depending on the heliacal event), when the studied object is visible (by +using the swe_vis_limit_magn function).

+ +

5.1.3.3. Geographic limitations of +swe_heliacal_ut() and strange behavior of planets in high geographic latitudes

+ +

This function is limited to geographic +latitudes between 60S and 60N. Beyond that the heliacal phenomena of the +planets become erratic.  We found cases +of strange planetary behavior even at 55N.

+ +

An example:

+ +

At 0E, 55N, with an extinction coefficient 0.2, +Mars had a heliacal rising on 25 Nov. 1957. But during the following weeks and +months Mars did not constantly increase its height above the horizon before +sunrise. In contrary, it disappeared again, i.e. it did a “morning last” on 18 +Feb. 1958. Three months later, on 14 May 1958, it did a second morning first +(heliacal rising). The heliacal setting or evening last took place on 14 June +1959.

+ +

Currently, this special case is not handled by +swe_heliacal_ut(). The function cannot detect “morning lasts” of Mars and +following “second heliacal risings”. The function only provides the heliacal +rising of  25 Nov. 1957 and the next +ordinary heliacal rising in its ordinary synodic cycle which took place on 11 +June 1960.

+ +

However, we may find a solution for such +problems in future releases of the Swiss Ephemeris and even extend the +geographic range of swe_heliacal_ut() to beyond +/- 60.

+ +

5.1.3.4. Visibility of Venus and the +Moon during day

+ +

For the Moon, swe_heliacal_ut() calculates the +evening first and the morning last. For each event, the function returns the +optimum visibility and a time of visibility start and visibility end. Note, +that on the day of its morning last or evening first, the moon is often visible +for almost the whole day. It even happens that the crescent first becomes +visible in the morning after its rising, then disappears, and again reappears +during culmination, because the observation conditions are better as the moon +stands high above the horizon. The function swe_heliacal_ut() does not handle +this in detail. Even if the moon is visible after sunrise, the function assumes +that the end time of observation is at sunrise. The evening fist is handled in +the same way.

+ +

With Venus, we have a similar situation. Venus +is often accessible to naked eye observation during day, and sometimes even +during inferior conjunction, but usually only at a high altitude above the +horizon. This means that it may be visible in the morning at its heliacal +rising, then disappear and reappear during culmination.  (Whoever does not believe me, please read +the article by H.B. Curtis listed under “References”.)  The function swe_heliacal_ut() does not +handle this case. If binoculars or a telescope is used, Venus may be even +observable during most of the day on which it first appears in the east.

+ +

5.1.4. Future developments

+ +

The section of the Swiss Ephemeris software is +still under development. The acronychal events of superior planets and stars +will be added. And comparing other visibility criterions will be included; like +Schoch’s criterion [1928], Hoffman’s overview [2005] and +Caldwall&Laney  criterion [2005].

+ +

5.1.5. References

+ +

- Caldwell, J.A.R., Laney, C.D., First +visibility of the lunar crescent, http://www.saao.ac.za/public-info/sun-moon-stars/moon-index/lunar-crescent-visibility/first-visibility-of-lunar-crescent/, 2005, viewed March, 30th, +2009 

+ +

- H.B. Curtis, Venus Visible at inferior +conjunction, in : Popular Astronomy vol. 18 (1936), p. 44; +online at http://articles.adsabs.harvard.edu/cgi-bin/nph-iarticle_query?1936PA.....44...18C&data_type=PDF_HIGH&whole_paper=YES&type=PRINTER&filetype=.pdf

+ +

- Hoffman, R.E., Rational design of +lunar-visibility criteria, The observatory, Vol. 125, June 2005, No. +1186, pp 156-168. 

+ +

- Reijs, V.M.M., Extinction angle and heliacal events, +http://www.iol.ie/~geniet/eng/extinction.htm, 2003, viewed March, 30th, +2009 

+ +

- Schaefer, B., Astronomy and the limit of +vision, Vistas in astronomy, 36:311, 1993 

+ +

- Schaefer, B., New methods and techniques for +historical astronomy and archaeoastronomy, Archaeoastronomy, Vol. XV, +2000, page 121-136 

+ +

- Schoch, K., Astronomical and calendrical +tables in Langdon. S., Fotheringham, K.J., The Venus tables of Amninzaduga: +A solution of Babylonian chronology by means of Venus observations of the first +dynasty, Oxford, 1928.

+ +

 

+ +

5.2. +Eclipses, occultations, risings, settings, and other planetary phenomena

+ +

The Swiss Ephemeris also includes functions for many calculations +concerning solar and lunar eclipses. You can:

+ +

- search for eclipses or occultations, globally or for a given +geographical position

+ +

- compute global or local circumstances of eclipses or occultations

+ +

- compute the geographical position where an eclipse is central

+ +

Moreover, you can compute for all planets and asteroids:

+ +

- risings and settings (also for stars)

+ +

- midheaven and lower heaven transits (also for stars)

+ +

- height of a body above the horizon (refracted and true, also for +stars)

+ +

- phase angle

+ +

- phase (illumined fraction of disc)

+ +

- elongation (angular distance between a planet and the sun)

+ +

- apparent diameter of a planetary disc

+ +

- apparent magnitude.

+ +

6.     AC, MC, Houses, Vertex

+ +

The Swiss Ephemeris package +also includes a function that computes the Ascendant, the MC, the houses, the +Vertex, and the Equatorial Ascendant (sometimes called "East Point").

+ +

6.1.         House Systems

+ +

The following house methods +have been implemented so far:

+ +

6.1.1. +Placidus

+ +

This system is named after the Italian monk +Placidus de Titis (1590-1668). The cusps are defined by divisions of +semidiurnal and seminocturnal arcs. The 11th +cusp is the point on the ecliptic that has completed 2/3 of its semidiurnal +arc, the 12th cusp the point that has completed 1/3 of it. +The 2nd cusp has completed 2/3 of its seminocturnal arc, and the 3rd cusp 1/3.

+ +

6.1.2. +Koch/GOH

+ +

This system is called after +the German astrologer Walter Koch (1895-1970). Actually it was invented by +Fiedrich Zanzinger and Heinz Specht, but it was made known by Walter Koch. In +German-speaking countries, it is also called the +"Geburtsorthäusersystem" (GOHS), i.e. the "Birth place house +system". Walter Koch thought that this system was more related to the +birth place than other systems, because all house cusps are computed with the "polar +height of the birth place", which has the same value as the geographic +latitude.

+ +

This argumentation shows +actually a poor understanding of celestial geometry. With the Koch system, the +house cusps are actually defined by horizon lines at different times. To +calculate the cusps 11 and 12, one can take the time it took the MC degree to +move from the horizon to the culmination, divide this time into three and see +what ecliptic degree was on the horizon at the thirds. There is no reason why +this procedure should be more related to the birth place than other house +methods.

+ +

6.1.3. +Regiomontanus

+ +

Named after the Johannes +Müller (called "Regiomontanus", because he stemmed from Königsberg) +(1436-1476).

+ +

The equator is divided into 12 +equal parts and great circles are drawn through these divisions and the north +and south points on the horizon. The intersection points of these circles with +the ecliptic are the house cusps.

+ +

6.1.4. Campanus

+ +

Named after Giovanni di Campani +(1233-1296).

+ +

The vertical great circle from +east to west is divided into 12 equal parts and great circles are drawn through +these divisions and the north and south points on the horizon. The intersection +points of these circles with the ecliptic are the house cusps.

+ +

6.1.5. +Equal System

+ +

The zodiac is divided into 12 +houses of 30 degrees each starting from the Ascendant.

+ +

6.1.6 +Vehlow-equal System

+ +

Equal houses with the +Ascendant positioned in the middle of the first house.

+ +

6.1.7. +Axial Rotation System

+ +

Also called the "Meridian +house system". The equator is partitioned into 12 equal parts starting +from the ARMC. Then the ecliptic points are computed that have these divisions +as their right ascension. Note: The ascendant is different from the 1st +house cusp.

+ +

6.1.8. +The Morinus System

+ +

The equator is divided into 12 +equal parts starting from the ARMC. The resulting 12 points on the equator are +transformed into ecliptic coordinates. Note: The Ascendant is different from +the 1st cusp, and the MC is different from the 10th cusp. +

+ +

6.1.9. +Horizontal system

+ +

The house cusps are defined by +division of the horizon into 12 directions. The first house cusp is not +identical with the Ascendant but is located precisely in the east.

+ +

6.1.10. +The Polich-Page (“topocentric”) system

+ +

This system was introduced in +1961 by Wendel Polich and A.P. Nelson Page. Its construction is rather +abstract: The tangens of the polar height of the 11th house is the +tangens of the geo. latitude divided by 3. (2/3 of it are taken for the 12th +house cusp.) The philosophical reasons for this algorithm are obscure. Nor is this +house system more “topocentric” (i.e. birth-place-related) than any other house +system. (c.f. the misunderstanding with the “birth place system”.) The +“topocentric” house cusps are close to Placidus house cusps except for high +geographical latitudes. It also works for latitudes beyond the polar circles, +wherefore some consider it to be an improvement of the Placidus system. +However, the striking philosophical idea behind Placidus, i.e. the division of +diurnal and nocturnal arcs of points of the zodiac, is completely abandoned.

+ +

6.1.11. +Alcabitus system

+ +

A method of house division +which first appears with the Hellenistic astrologer Rhetorius (500 A.D.) but is +named after Alcabitius, an Arabic astrologer, who lived in the 10th century +A.D. This is the system used in the few remaining examples of ancient Greek +horoscopes.

+ +

The MC and ASC are +respectively the 10th- and 1st- house cusps. The remaining cusps are determined +by the trisection of the semidiurnal and seminocturnal arcs of the ascendant, +measured on the celestial equator. The houses are formed by great circles that +pass through these trisection points and the celestial north and south poles.

+ +

6.1.12. +Gauquelin sectors

+ +

This is the “house” system +used by the Gauquelins and their epigones and critics in statistical +investigations in Astrology. Basically, it is identical with the Placidus house +system, i.e. diurnal and nocturnal arcs of ecliptic points or planets are +subdivided. There are a couple of differences, though.

+ +

-          +Up to 36 “sectors” (or house cusps) are used instead of 12 houses.

+ +

-          +The sectors are counted in clockwise direction.

+ +

-          +There are so-called plus (+) and minus (–) zones. The plus zones are the +sectors that turned out to be significant in statistical investigations, e.g. +many top sportsmen turned out to have their Mars in a plus zone. The plus +sectors are the sectors 36 – 3, 9 – 12, 19 – 21, 28 – 30.

+ +

-          +More sophisticated algorithms are used to calculate the exact house +position of a planet (see chapters 6.4 and 6.5 on house positions and Gauquelin +sector positions of planets).

+ +

 

+ +

6.1.13. +Krusinski/Pisa/Goelzer system

+ +

This house system was first published in 1994/1995 by three different +authors independently of each other:

+ +

- by Bogdan +Krusinski (Poland)

+ +

- by Milan Pisa +(Czech Republic) under the name “Amphora house system”.

+ +

- by Georg Goelzer (Switzerland) under the name “Ich-Kreis-Häusersystem” +(“I-Circle house system”)..

+ +

Krusinski +defines the house system as “… based on the great circle passing through +ascendant and zenith. This circle is divided into 12 equal parts (1st cusp is +ascendant, 10th cusp is zenith), then the resulting points are projected onto +the ecliptic through meridian circles. The house cusps in space are +half-circles perpendicular to the equator and running from the north to the south +celestial pole through the resulting cusp points on the house circle. The +points where they cross the ecliptic mark the ecliptic house cusps.” +(Krusinski, e-mail to Dieter Koch)

+ +

It +may seem hard to believe that three persons could have discovered the same +house system at almost the same time. But apparently this is what happened. +Some more details are given here, in order to refute wrong accusations from the +Czech side against Krusinski of having “stolen” the house system.

+ +

Out of the documents that Milan Pisa sent to +Dieter Koch, the following are to be mentioned: Private correspondence from +1994 and 1995 on the house system between Pisa and German astrologers Böer and +Schubert-Weller, two type-written (apparently unpublished) treatises in German +on the house system dated from 1994. A printed booklet of 16 pages in Czech +from 1997 on the theory of the house system (“Algoritmy noveho systemu +astrologickych domu”). House tables computed by Michael Cifka for the +geographical latitude of Prague, copyrighted from 1996. The house system was +included in the Czech astrology software Astrolog v. 3.2 (APAS) in 1998. Pisa’s +first publication on the house system happened in spring 1997 in “Konstelace“ +No. 22, the periodical of the Czech Astrological Society.

+ +

 

+ +

Bogdan Krusinski first published the house +system at an astrological congress in Poland, the “"XIV +Szkola Astrologii Humanistycznej" held by Dr Leszek Weres, which took +place between 15.08.1995 and 28.08.1995 in  +Pogorzelica at cost of the Baltic Sea.” Since +then Krusinski has distributed printed house tables for the Polish geographical +latitudes 49-55° and floppy disks with house tables for latitudes 0-90°. In +1996, he offered his program code to Astrodienst for implementation of this +house system into Astrodienst’s then astronomical software Placalc. (At that +time, however, Astrodienst was not interested in it.) In May 1997, Krusinski +put the data on the web at http://www.ci.uw.edu.pl/~bogdan/astrol.htm (now at +http://www.astrologia.pl/main/domy.html) In February 2006 he sent +Swiss-Ephemeris-compatible program code in C for this house system to +Astrodienst. This code was included into Swiss Ephemeris Version 1.70 and +released on 8 March 2006.

+ +

 

+ +

Georg Goelzer describes the same house system +in his book “Der Ich-Kosmos”, which appeared in July 1995 at Dornach, +Switzerland (Goetheanum). The book has a second volume with house tables +according to the house method under discussion. The house tables were created +by Ulrich Leyde. Goelzer also uses a house calculation programme which has the +time stamp “9 April 1993” and produces the same house cusps.

+ +

 

+ +

By March 2006, when the house system was +included in the Swiss Ephemeris under the name  +of “Krusinski houses”, neither Krusinski nor Astrodienst knew about the +works of Pisa and Goelzer. Goelzer heard of his co-discoverers only in 2012 and +then contacted Astrodienst.

+ +

 

+ +

Conclusion: It seems that the house system was +first “discovered” and published by  +Goelzer, but that Pisa and Krusinski also “discovered” it independently. +We do not consider this a great miracle because the number of possible house +constructions is quite limited.

+ +

 

+ +

6.2. +Vertex, Antivertex, East Point and Equatorial Ascendant, etc.

+ +

The Vertex is the point +of the ecliptic that is located precisely in western direction. The Antivertex +is the opposition point and indicates the precise east in the horoscope. It is +identical to the first house cusp in the horizon house system.

+ +

There is a lot of confusion +about this, because there is also another point which is called the "East +Point" but is usually not located in the east. In celestial +geometry, the expression "East Point" means the point on the horizon +which is in precise eastern direction. The equator goes through this point as +well, at a right ascension which is equal to ARMC + 90 degrees. On the other +hand, what some astrologers call the "East Point" is the point on the +ecliptic whose right ascension is equal to ARMC + 90 (i.e. the right ascension +of the horizontal East Point). This point can deviate from eastern direction by +23.45 degrees, the amount of the ecliptic obliquity. For this reason, the +term  "East Point" is not very +well-chosen for this ecliptic point, and some astrologers (M. Munkasey) prefer +to call it the Equatorial Ascendant. This, because it is identical to +the Ascendant at a geographical latitude 0.

+ +

The Equatorial Ascendant is +identical to the first house cusp of the axial rotation system.

+ +

Note: If a projection of the +horizontal East Point on the ecliptic is wanted, it might seem more reasonable +to use a projection rectangular to the ecliptic, not rectangular to the equator +as is done by the users of the "East Point". The planets, as well, +are not projected on the ecliptic in a right angle to the ecliptic.

+ +

The Swiss Ephemeris supports +three more points connected with the house and angle calculation. They are part +of Michael Munkasey's system of the 8 Personal Sensitive Points (PSP). +The PSP include the Ascendant, the MC, the Vertex, the Equatorial +Ascendant, the Aries Point, the Lunar Node, +and the "Co-Ascendant" and the "Polar Ascendant".

+ +

The term +"Co-Ascendant" seems to have been invented twice by two different +people, and it can mean two different things. The one "Co-Ascendant" +was invented by Walter Koch (?). To calculate it, one has to take the ARIC as +an ARMC and compute the corresponding Ascendant for the birth place. The +"Co-Ascendant" is then the opposition to this point.

+ +

The second +"Co-Ascendant" stems from Michael Munkasey. It is the Ascendant +computed for the natal ARMC and a latitude which has the value 90° - +birth_latitude.

+ +

The "Polar +Ascendant" finally was introduced by Michael Munkasey. It is the +opposition point of Walter Koch's version of the "Co-Ascendant". +However, the "Polar Ascendant" is not the same as an Ascendant +computed for the birth time and one of the geographic poles of the earth. At +the geographic poles, the Ascendant is always 0 Aries or 0 Libra. This is not +the case for Munkasey's "Polar Ascendant".

+ +

 

+ +

6.3.      House cusps beyond the polar circle

+ +

Beyond the polar circle, we proceed as follows:

+ +

1)    We make sure that +the ascendant is always in the eastern hemisphere.

+ +

2)    Placidus and Koch house +cusps sometimes can, sometimes cannot be computed beyond the polar circles. +Even the MC doesn't exist always, if one defines it in the Placidus manner. Our +function therefore automatically switches to Porphyry houses (each quadrant is +divided into three equal parts) and returns a warning.

+ +

3)    Beyond the polar +circles, the MC is sometimes below the horizon. The geometrical definition of +the Campanus and Regiomontanus systems requires in such cases +that the MC and the IC are swapped. The whole house system is then oriented in +clockwise direction.

+ +

There are similar problems with the Vertex and the horizon +house system for birth places in the tropics. The Vertex is defined +as the point on the ecliptic that is located in precise western direction. The +ecliptic east point is the opposition point and is called the Antivertex. +Our program code makes sure that the Vertex (and the cusps 11, 12, 1, 2, 3 of the +horizon house system) is always located in the western hemisphere. Note that +for birthplaces on the equator the Vertex is always 0 Aries or 0 Libra.

+ +

Of course, there are no problems in the calculation of the Equatorial +Ascendant for any place on earth.

+ +

6.3.1.            Implementation in other calculation +modules:

+ +

a) PLACALC

+ +

Placalc is the predecessor of Swiss Ephemeris; it is a calculation +module created by Astrodienst in 1988 and distributed as C source code. Beyond +the polar circles, Placalc‘s house calculation did switch to Porphyry houses +for all unequal house systems. Swiss Ephemeris still does so with the Placidus +and Koch method, which are not defined in such cases. However, the computation +of the MC and Ascendant was replaced by a different model in some cases: Swiss +Ephemeris gives priority to the Ascendant, choosing it always as the +eastern rising point of the ecliptic and accepting an MC below the horizon, +whereas Placalc gave priority to the MC. The MC was always chosen as the +intersection of the meridian with the ecliptic above the horizon. To +keep the quadrants in the correct order, i.e. have an Ascendant in the left +side of the chart, the Ascendant was switched by 180 degrees if necessary.

+ +

In the discussions between Alois Treindl and Dieter Koch during the +development of the Swiss Ephemeris it was recognized that this model is more +unnatural than the new model implemented in Swiss Ephemeris.

+ +

Placalc also made no difference between Placidus/Koch on one hand and +Regiomontanus/Campanus on the other as Swiss Ephemeris does. In Swiss +Ephemeris, the geometrical definition of Regiomontanus/Campanus is strictly +followed, even for the price of getting the houses in ”wrong” order. (see +above, chapter 4.1.)

+ +

b) ASTROLOG program as written by Walter Pullen

+ +

While the freeware program Astrolog contains the planetary routines of +Placalc, it uses its own house calculation module by Walter Pullen. Various +releases of Astrolog contain different approaches to this problem.

+ +

c) ASTROLOG on our website

+ +

ASTROLOG is also used on Astrodienst’s website for displaying free +charts. This version of Astrolog used on our website however is different from +the Astrolog program as distributed on the Internet. Our webserver version of +Astrolog contains calls to Swiss Ephemeris for planetary positions. For +Ascendant, MC and houses it still uses Walter Pullen's code. This will change +in due time because we intend to replace ASTROLOG on the website with our own +charting software.

+ +

d) other astrology programs

+ +

Because most astrology programs still use the Placalc module, they +follow the Placalc method for houses inside the polar circles. They give +priority to keep the MC above the horizon and switch the Ascendant by 180 +degrees if necessary to keep the quadrants in order.

+ +

6.4.         House position of a planet

+ +

The Swiss Ephemeris DLL also provides a function to compute the house +position of a given body, i.e. in which house it is. This function can be used +either to determine the house number of a planet or to compute its position in +a house horoscope. (A house horoscope is a chart in which all +houses are stretched or shortened to a size of 30 degrees. For unequal house +systems, the zodiac is distorted so that one sign of the zodiac does not +measure 30 house degrees)

+ +

Note that the actual house position of a planet is not always the one +that it seems to be in an ordinary chart drawing. Because the planets are not +always exactly located on the ecliptic but have a latitude, they can seemingly +be located in the first house, but are actually visible above the horizon. In +such a case, our program function will place the body in the 12th (or 11 th or +10 th) house, whatever celestial geometry requires. However, it is possible to +get a house position in the ”traditional” way, if one sets the ecliptic +latitude to zero.

+ +

Although it is not possible to compute Placidus house cusps +beyond the polar circle, this function will also provide Placidus house +positions for polar regions. The situation is as follows:

+ +

The Placidus method works with the semidiurnal and seminocturnal arcs of +the planets. Because in higher geographic latitudes some celestial bodies (the +ones within the circumpolar circle) never rise or set, such arcs do not exist. +To avoid this problem it has been proposed in such cases to start the diurnal +motion of a circumpolar body at its ”midnight” culmination and its nocturnal +motion at its midday culmination. This procedure seems to have been proposed by +Otto Ludwig in 1930. It allows to define a planet's house position even if it +is within the circumpolar region, and even if you are born in the northernmost +settlement of Greenland. However, this does not mean that it be possible to +compute ecliptical house cusps for such locations. If one tried that, it would +turn out that e.g. an 11 th house cusp did not exist, but there were two 12th +house cusps.

+ +

Note however, that circumpolar bodies may jump from the 7th house +directly into the 12th one or from the 1st one directly into the 6th one.

+ +

The Koch method, on the other hand, cannot be helped even with +this method. For some bodies it may work even beyond the polar circle, but for +some it may fail even for latitudes beyond 60 degrees. With fixed stars, it may +even fail in central Europe or USA. (Dieter Koch regrets the connection of his +name with such a badly defined house system)

+ +

Note that Koch planets do strange jumps when the cross the meridian. +This is not a computation error but an effect of the awkward definition of this +house system. A planet can be east of the meridian but be located in the

+ +

9th house, or west of the meridian and in the 10th house. It is possible +to avoid this problem or to make Koch house positions agree better with the +Huber ”hand calculation” method, if one sets the ecliptic latitude of the +planets to zero. But this is not more correct from a geometrical point of view.

+ +

6.5.         Gauquelin sector position of a planet

+ +

The calculation of the +Gauquelin sector position of a planet is based on the same idea as the Placidus +house system, i.e. diurnal and nocturnal arcs of ecliptic points or planets are +subdivided.

+ +

Three different algorithms +have been used by Gauquelin and others to determine the sector position of a +planet.

+ +

1.        +We can take the ecliptic point of the planet (ecliptical latitude +ignored) and calculate the fraction of its diurnal or nocturnal arc it has +completed

+ +

2.        +We can take the true planetary position (taking into account ecliptical +latitude) for the same calculation.

+ +

3.        +We can use the exact times for rise and set of the planet to determine +the ratio between the time the planet has already spent above (or below) the +horizon and its diurnal (or nocturnal) arc. Times of rise and set are defined +by the appearance or disappearance of the center of the planet’s disks.

+ +

All three methods are +supported by the Swiss Ephemeris.

+ +

Methods 1 and 2 also work for +polar regions. The Placidus algorithm is used, and the Otto Ludwig method +applied with circumpolar bodies. I.e. if a planet does not have a rise and set, +the “midnight” and “midday” culminations are used to define its semidiurnal and +seminocturnal arcs.

+ +

With method 3, we don’t try to +do similar. Because planets do not culminate exactly in the north or south, a +planet can actually rise on the western part of the horizon in high geographic +latitudes. Therefore, it does not seem appropriate to use meridian transits as +culmination times. On the other hand, true culmination times are not always +available. E.g. close to the geographic poles, the sun culminates only twice a +year.

+ +

7.               DT (Delta T)

+ +

The computation of planets uses the so called Ephemeris Time (ET) +which is a completely regular time measure. Computations of sidereal time and +houses, on the other hand, depend on the rotation of the earth, which is not +regular at all. The time used for such purposes is called Universal Time (UT) +or Terrestrial Dynamic Time (TDT). It is an irregular time measure, and +is roughly identical to the time indicated by our clocks (if time zones are +neglected). The difference between ET and UT is called DT (”Delta T”), and +is defined as DT = ET – UT.

+ +

The earth's rotation decreases slowly, currently at the rate of about +0.5 – 1 second per year. Even worse, this decrease is irregular itself. It +cannot precisely predicted but only derived from star observations. The values +of DT achieved like this must be tabulated. However, this +table, which is published yearly by the Astronomical Almanac, starts only at +1620, about the time when the telescope was invented. For more remote +centuries, DT must be estimated from old eclipse records. The +uncertainty is in the range of hours for the year 3000 B.C. For future times, DT is estimated from +the current and the general changing rate, depending on whether a short-term or +a long-term extrapolation is intended.

+ +

NOTE:The DT algorithms have been +improved with the Swiss Ephemeris release 1.64 (Stephenson 1997), with release +1.72 (Morrison/Stephenson 2004) and 1.77 (Espenak & Meeus). These changes +result in significant changes of the ephemeris for remote historical dates, if +Universal Time is used.

+ +

The Swiss Ephemeris computes DT as follows.

+ +

1633 - today + a +couple of years:

+ +

The tabulated values of DT, in hundredths of a second, +were taken from the Astronomical Almanac page K8 and K9 and are yearly updated. +

+ +

The DT function adjusts for a value of secular tidal +acceleration ndot = -25.826 arcsec per century squared, the value contained in +JPL's lunar ephemeris LE405/6. ELP2000 (and DE200) used the value -23.8946.

+ +

To change ndot, one can either redefine SE_TIDAL_DEFAULT in swephexp.h +or use the routine swe_set_tid_acc() before calling the Swiss Ephemeris.

+ +

Bessel's interpolation formula was implemented to obtain fourth order +interpolated values at intermediate times.

+ +

-before 1633:

+ +

For dates before 1600, the polynomials published by Espenak and Meeus +(2006) are used, with linear interpolation. They are based on an assumed value +of ndot = -26. The program adjusts for ndot = -25.826. These formulae include +the long-term formula by Morrison/Stephenson (2004, p. 332), which is used for +epochs before -500.

+ +

future:

+ +

For the time after the last tabulated value, we use the formula of +Stephenson (1997; p. 507), with a modification that avoids a jump at the end of +the tabulated period. A linear term is added that makes a slow transition from +the table to the formula over a period of 100 years. (Need not be updated, when +table will be enlarged.)

+ +

Differences between +the old and new algorithms (before and after release 1.77):

+ +

    year           +difference in seconds (new - old)

+ +

  -3000                 3

+ +

  -2000              +   2

+ +

  -1100              +   1

+ +

  -1001              +29

+ +

    -900              +-45

+ +

    -800              +-57

+ +

    -700              +     -696  (is a maximum!)

+ +

    -500              +-14

+ +

until -200         3 +> diff > -25

+ +

until 100           3 +> diff > -15

+ +

until 500           3 +> diff > -3

+ +

until 1600         4 +> diff > -16

+ +

until 1630         1 +> diff > -30

+ +

until 1700         0.1 +|diff|

+ +

until 1900                               0.01

+ +

until 2100                             0.001

+ +

 

+ +

The differences for –1000 to + 1630 are explained as +follows:

+ +

Espenak & Meeus ignore Morrison & Stephenson's +values for -700 and -600, whereas the former Swiss Ephemeris versions used +them. For -500 to +1600 Espenak & Meeus use polynomials whereas the former +Swiss Ephemeris versions used a linear interpolation between Morrison / +Stephenson's tabulated values.

+ +

 

+ +

Differences between +the old and new algorithms (before and after release 1.72):

+ +

    year           +difference in seconds (new - old)

+ +

  -3000                   -4127

+ +

  -2000              +     -2130

+ +

  -1000              +     -760

+ +

         0              -20

+ +

   1000              -30

+ +

   1600               10

+ +

   1619              0.5

+ +

   1620                 0

+ +

 

+ +

Differences between +the old and new algorithms (before and after release 1.64):

+ +

    year           +difference in seconds (new - old)

+ +

  -3000           2900

+ +

         0           1200

+ +

   1600               29

+ +

   1619               60

+ +

   1620               -0.6

+ +

   1700               -0.4

+ +

   1800               -0.1

+ +

   1900               -0.02

+ +

   1940               -0.001

+ +

   1950                0

+ +

   2000                0

+ +

   2020                2

+ +

   2100              23

+ +

   3000           -400

+ +

In 1620, where the DT table of the Astronomical +Almanac starts, there was a jump of a whole minute in the old algorithms. The +new algorithms has no jumps anymore.

+ +

The smaller differences for the period 1620-1955, where we still use the +same data as before, is due to a correction in the tidal acceleration of the +moon, which now has the same value as is also used by JPL for their DT calculations.

+ +

References:

+ +

 

+ +

- Borkowski, K. M., "ELP2000-85 and the Dynamical Time - Universal +Time relation," Astronomy and +Astrophysics 205, L8-L10 (1988)

+ +

- Chapront-Touze, Michelle, and Jean Chapront, Lunar Tables and Programs from 4000 B.C. to A.D. 8000, Willmann-Bell +1991

+ +

- Espenak, Fred, and Jean Meeus, “Five-millennium Catalog of Lunar +Eclipses –1900 to +3000”, 2009, p. 18ff., http://eclipse.gsfc.nasa.gov/5MCSE/TP2009-214174.pdf.

+ +

- Explanatory Supplement of the +Astronomical Almanach, University Science Books, 1992, Mill Valley, CA, p. +265ff.

+ +

- Morrison, L. V. and F. R. Stephenson, Sun and Planetary System, vol 96,73 eds. W. Fricke, G. Teleki, Reidel, +Dordrecht (1982)

+ +

- Morrison, L. V., and F.R. Stephenson, “Historical +Values of the Earth’s Clock Error DT +and the Calculation of Eclipses”, JHA xxxv (2004), pp.327-336

+ +

- Stephenson, F. R., and L. V. Morrison, +"Long-term changes in the rotation of the Earth: 700 BC to AD 1980", Philosophical Transactions of the Royal Society of London, +Series A 313, 47-70 (1984)

+ +

- Stephenson, F. R., and M. A. Houlden, Atlas of Historical Eclipse Maps, Cambridge U. Press (1986)

+ +

- Stephenson, F.R. & Morrison, L.V., "Long-Term Fluctuations in +the Earth's Rotation: 700 BC to AD 1990", in: Philosophical Transactions of the Royal Society of London, Ser. A, +351 (1995), 165-202.

+ +

- Stephenson, F. Richard, Historical +Eclipses and Earth's Rotation, Cambridge U. Press (1997)

+ +

- For a comprehensive collection of +publications and formulae, see R.H. van Gent at +http://www.phys.uu.nl/~vgent/astro/deltatime.htm.

+ +

 

+ +

8.        Programming Environment

+ +

Swiss Ephemeris is written in portable C and the same code is used for +creation of the 32-bit Windows DLL and the link library. All data files are +fully portable between different hardware architectures.

+ +

To build the DLLs, we use Microsoft Visual C++ version 5.0 (for 32-bit).

+ +

The DLL has been successfully used in the following programming +environments:

+ +

Visual C++ 5.0                 (sample +code included in the distribution)

+ +

Visual Basic 5.0  (sample code +and VB declaration file included)

+ +

Delphi 2 and Delphi 3 (32-bit, declaration file included)

+ +

As the number of  users grows, +our knowledge base about the interface details between programming environments +and the DLL grows. All such information is added to the distributed Swiss +Ephemeris and registered users are informed via an email mailing list.

+ +

Earlier version up to version 1.61 supported 16-bit Windows programming. +Since then, 16-bit support has been dropped.

+ +

9.         Swiss Ephemeris Functions

+ +

9.1         Swiss Ephemeris API

+ +

We give a short overview of the most important functions contained in +the Swiss Ephemeris DLL. The detailed description of the programming interface +is contained in the document swephprg.doc which is +distributed together with the file you are reading.

+ +

Calculation +of planets and stars

+ +

/* planets, moon, asteroids, lunar +nodes, apogees, fictitious bodies */

+ +

swe_calc();

+ +

 

+ +

/* fixed stars */

+ +

swe_fixstar();   

+ +

Date and +time conversion

+ +

/* delta t from Julian day number

+ +

 * Ephemeris time (ET) = Universal time (UT) + swe_deltat(UT)*/

+ +

swe_deltat();

+ +

 

+ +

/* Julian day number from year, month, +day, hour, */

+ +

swe_date_conversion ();           

+ +

/* Julian day number from year, month, +day, hour */

+ +

swe_julday();          

+ +

 

+ +

/* year, month, day, hour from Julian +day number */

+ +

swe_revjul ();

+ +

 

+ +

/* UTC to Julian day number */

+ +

swe_utc_to_jd ();

+ +

 

+ +

/* Julian day number TT to UTC */

+ +

swe_jdet_to_utc ();

+ +

 

+ +

/* Julian day number UT1 to UTC */

+ +

swe_jdut1_to_utc ();

+ +

 

+ +

/* utc to time zone or time zone to +utc*/

+ +

swe_utc_time_zone ();

+ +

 

+ +

/* get tidal acceleration used in +swe_deltat() */

+ +

swe_get_tid_acc();

+ +

 

+ +

/* set tidal acceleration to be used in +swe_deltat() */

+ +

swe_set_tid_acc();

+ +

Initialization, +setup, and closing functions

+ +

/* set directory path of ephemeris files +*/

+ +

swe_set_ephe_path();

+ +

 

+ +

/* set name of JPL ephemeris file */

+ +

swe_set_jpl_file();

+ +

 

+ +

/* close Swiss Ephemeris */

+ +

swe_close();

+ +

House +calculation

+ +

/* sidereal time */

+ +

swe_sidtime();   

+ +

/* house cusps, ascendant, MC, armc, +vertex */

+ +

swe_houses();    

+ +

      Auxiliary functions

+ +

/* coordinate transformation, from +ecliptic to equator or vice-versa. */

+ +

swe_cotrans();   

+ +

/* coordinate transformation of position +and speed,

+ +

 * from ecliptic to equator or vice-versa*/

+ +

swe_cotrans_sp();

+ +

/* get the name of a planet */

+ +

swe_get_planet_name(); 

+ +

/* normalization of any degree number to +the range 0 ... 360 */

+ +

swe_degnorm();

+ +

Other +functions that may be useful

+ +

PLACALC, the predecessor of SWISSEPH, included several functions that we +do not need for SWISSEPH anymore. Nevertheless we include them again in our +DLL, because some users of our software may have taken them over and use them +in their applications. However, we gave them new names that were more +consistent with SWISSEPH.

+ +

PLACALC used angular measurements in centiseconds a lot; a centisecond +is 1/100 of an arc second. The C type CSEC or centisec is a 32-bit integer. CSEC +was used because calculation with integer variables was considerably faster +than floating point calculation on most CPUs in 1988, when PLACALC was written.

+ +

In the Swiss Ephemeris we have dropped the use of centiseconds and use +double (64-bit floating point) for all angular measurements.

+ +

/* +normalize argument into interval [0..DEG360]

+ +

 * former function name: csnorm() */

+ +

swe_csnorm();

+ +

 

+ +

/* +distance in centisecs p1 - p2 normalized to [0..360[

+ +

 * former function name: difcsn() */

+ +

swe_difcsn +();

+ +

 

+ +

/* +distance in degrees  * former function +name: difdegn() */

+ +

swe_difdegn +();

+ +

 

+ +

/* +distance in centisecs p1 - p2 normalized to [-180..180[

+ +

 * former function name: difcs2n() */

+ +

swe_difcs2n();

+ +

 

+ +

/* +distance in degrees

+ +

 * former function name: difdeg2n() */

+ +

swe_difdeg2n();

+ +

 

+ +

/* round +second, but at 29.5959 always down

+ +

 * former function name: roundsec() */

+ +

swe_csroundsec();

+ +

 

+ +

/* +double to long with rounding, no overflow check

+ +

 * former function name: d2l() */

+ +

swe_d2l();

+ +

 

+ +

/* +Monday = 0, ... Sunday = 6

+ +

 * former function name: day_of_week() */

+ +

swe_day_of_week();

+ +

 

+ +

/* +centiseconds -> time string

+ +

 * former function name: TimeString() */

+ +

swe_cs2timestr();

+ +

 

+ +

/* +centiseconds -> longitude or latitude string 

+ +

 * former function name: LonLatString() */

+ +

swe_cs2lonlatstr();

+ +

 

+ +

/* centiseconds +-> degrees string

+ +

 * former function name: DegreeString() */

+ +

swe_cs2degstr();

+ +

 

+ +

9.2         Placalc API

+ +

Placalc is a planetary calculation module which was made available by +Astrodienst since 1988 to other programmers under a source code license. Placalc +is less well designed, less complete and not as precise as the Swiss Ephemeris +module. However, many developers of astrological software have used it over +many years and like it. Astrodienst has used it internally since 1989 for a +large set of application programs.

+ +

To simplify the introduction of Swiss Ephemeris in 1997 in Astrodienst's +internal operation, we wrote an interface module which translates all calls to +Placalc functions into Swiss Ephemeris functions, and translates the results +back into the format expected in the Placalc Application Interface (API).

+ +

This interface (swepcalc.c and swepcalc.h) is part of the source code distribution of Swiss Ephemeris; it is not +contained in the DLL. All new software should be written directly for the +SwissEph API, but porting old Placalc software is convenient and very simple +with the Placalc API.

+ +

Appendix

+ +

A. The +gravity deflection for a planet passing behind the Sun

+ +

The calculation of the apparent position of a planet involves a +relativistic effect, which is the curvature of space by the gravity field of +the Sun. This can also be described by a semi-classical algorithm, where the +photon travelling from the planet to the observer is deflected in the Newtonian +gravity field of the Sun, where the photon has a non-zero mass arising from its +energy. To get the correct relativistic result, a correction factor 2.0 must be +included in the calculation.

+ +

A problem arises when a planet disappears behind the solar disk, as seen +from the Earth. Over the whole 6000 year time span of the Swiss Ephemeris, it +happens often.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Planet

+
+

number of passes behind the Sun

+
+

Mercury

+
+

1723

+
+

Venus

+
+

456

+
+

Mars

+
+

412

+
+

Jupiter

+
+

793

+
+

Saturn

+
+

428

+
+

Uranus

+
+

1376

+
+

Neptune

+
+

543

+
+

Pluto

+
+

57

+
+ +

 

+ +

A typical occultation of a planet by the Solar disk, which has a diameter +of approx. _ degree, has a duration of about 12 hours. For the outer planets it +is mostly the speed of the Earth's movement which determines this duration.

+ +

Strictly speaking, there is no apparent position of a planet when +it is eclipsed by the Sun. No photon from the planet reaches the observer's eye +on Earth. Should one drop gravitational deflection, but keep aberration and +light-time correction, or should one switch completely from apparent positions +to true positions for occulted planets? In both cases, one would come up with +an ephemeris which contains discontinuities, when at the moment of occultation +at the Solar limb suddenly an effect is switched off.

+ +

Discontinuities in the ephemeris need to be avoided for several reasons. +On the level of physics, there cannot be a discontinuity. The planet cannot +jump from one position to another. On the level of mathematics, a non-steady +function is a nightmare for computing any derived phenomena from this function, +e.g. the time and duration of an astrological transit over a natal body, +or  an aspect of the planet.

+ +

Nobody seems to have handled this problem before in astronomical +literature. To solve this problem, we have used the following approach: We +replace the Sun, which is totally opaque for electromagnetic waves and not +transparent for the photons coming from a planet behind it, by a transparent +gravity field. This gravity field has the same strength and spatial +distribution as the gravity field of the Sun. For photons from occulted +planets, we compute their path and deflection in this gravity field, and from +this calculation we get reasonable apparent positions also for occulted +planets.

+ +

The calculation has been carried out with a semi-classical Newtonian +model, which can be expected to give the correct relativistic result when it is +multiplied with a correction factor 2. The mass of the Sun is mostly +concentrated near its center; the outer regions of the Solar sphere have a low +mass density. We used the a mass density distribution from the Solar standard model, +assuming it to have spherical symmetry (our Sun mass distribution m® is from +Michael Stix, The Sun, p. 47). The path of photons through this gravity field +was computed by numerical integration. The application of this model in the +actual ephemeris could then be greatly simplified by deriving an effective +Solar mass which a photon ”sees” when it passes close by or ”through” the Sun. +This effective mass depends only from the closest distance to the Solar center +which a photon reaches when it travels from the occulted planet to the +observer. The dependence of the effective mass from the occulted planet's +distance is so small that it can be neglected for our target precision of 0.001 +arc seconds.

+ +

For a remote planet just at the edge of the Solar disk the gravity +deflection is about 1.8”, always pointing away from the center of the Sun. This +means that the planet is already slightly behind the Solar disk (with a +diameter of 1800”) when it appears to be at the limb, because the light bends +around the Sun. When the planet now passes on a central path behind the Solar +disk, the virtual gravity deflection we compute increases to 2.57 times the +deflection at the limb, and this maximum is reached at _ of the Solar radius. +Closer to the Solar center, the deflection drops and reaches zero for photons +passing centrally through the Sun's gravity field.

+ +

We have discussed our approach with Dr. Myles Standish from JPL and here +is his comment (private email to Alois Treindl, 12-Sep-1997):

+ +

.. it +seems that your approach is

+ +

entirely +reasonable and can be easily justified as long

+ +

as you +choose a reasonable model for the density of

+ +

the +sun.  The solution may become more +difficult if an

+ +

ellipsoidal +sun is considered,  but certainly that +is

+ +

an +additional refinement which can not be crucial.

+ +

 

+ +

B. The +list of asteroids

+ +

 

+ +

# +====================================

+ +

# At +the same time a brief introduction into asteroids

+ +

# +====================================================

+ +

#

+ +

# As +of the year 2010, there is no longer any CDROM. All

+ +

# +parts of Swiss Ephemeris can be downloaded in the download area.

+ +

#

+ +

# +Literature:

+ +

# +Lutz D. Schmadel, Dictionary of Minor Planet Names,

+ +

#   Springer, Berlin, Heidelberg, New York

+ +

# +Charles T. Kowal, Asteroids. Their Nature and Utilization,

+ +

#   Whiley & Sons, 1996, Chichester, +England

+ +

#

+ +

#

+ +

# +What is an asteroid?

+ +

# +--------------------

+ +

#

+ +

# +Asteroids are small planets. Because there are too many

+ +

# of +them and because most of them are quite small,

+ +

# +astronomers did not like to call them "planets", but

+ +

# +invented names like "asteroid" (Greek "star-like",

+ +

# +because through telescopes they did not appear as planetary

+ +

# +discs but as star like points) or "planetoid" (Greek

+ +

# +"something like a planet"). However they are also often

+ +

# +called minor planets.

+ +

# The +minor planets can roughly be divided into two groups.

+ +

# +There are the inner asteroids, the majority of which

+ +

# +circles in the space between Mars and Jupiter, and

+ +

# +there are the outer asteroids, which have their realm

+ +

# +beyond Neptune. The first group consists of rather

+ +

# +dense, earth-like material, whereas the Transneptunians

+ +

# +mainly consist of water ice and frozen gases. Many comets

+ +

# are +descendants of the "asteroids" (or should one say

+ +

# +"comets"?) belt beyond Neptune. The first Transneptunian

+ +

# +objects (except Pluto) were discovered only after 1992

+ +

# and +none of them has been given a name as yet.

+ +

#

+ +

#

+ +

# The +largest asteroids

+ +

# +---------------------

+ +

# +Most asteroids are actually only debris of collisions

+ +

# of +small planets that formed in the beginning of the

+ +

# +solar system. Only the largest ones are still more

+ +

# or +less complete and round planets.

+ +

 

+ +

1    Ceres        # 913 km  goddess of +corn and harvest

+ +

2    Pallas       # 523 km  goddess of +wisdom, war and liberal arts

+ +

4    Vesta        # 501 km  goddess of +the hearth fire

+ +

10   Hygiea       # 429 km  goddess of +health

+ +

511  Davida       +# 324 km  after an astronomer +David P. Todd

+ +

704  Interamnia   +# 338 km  "between +rivers", ancient name of

+ +

                  #         its discovery place Teramo

+ +

65   Cybele       # 308 km  Phrygian +Goddess, = Rhea, wife of Kronos-Saturn

+ +

52   Europa       # 292 km  beautiful +mortal woman, mother of Minos by Zeus

+ +

87   Sylvia       # 282 km 

+ +

451  Patientia    +# 280 km  patience

+ +

31   Euphrosyne   # 270 km  one of the +three Graces, benevolence

+ +

15   Eunomia      # 260 km  one of the +Hours, order and law

+ +

324  Bamberga     +# 252 km  after a city in Bavaria

+ +

3    Juno         # 248 km  wife of +Zeus

+ +

16   Psyche       # 248 km  +"soul", name of a nymph

+ +

 

+ +

 

+ +

# +Asteroid families

+ +

# +-----------------

+ +

# +Most asteroids live in families. There are several kinds

+ +

# of +families.

+ +

# - +There are families that are separated from each other

+ +

#   by orbital resonances with Jupiter or other +major planets.

+ +

# - +Other families, the so-called Hirayama families, are the

+ +

#   relics of asteroids that broke apart long +ago when they

+ +

#   collided with other asteroids.

+ +

# - +Third, there are the Trojan asteroids that are caught

+ +

#   in regions 60 degrees ahead or behind a +major planet

+ +

#   (Jupiter or Mars) by the combined +gravitational forces

+ +

#   of this planet and the Sun.

+ +

 

+ +

# +Near Earth groups:

+ +

# +------------------

+ +

#

+ +

# +Aten family: they cross Earth; mean distance from Sun is less than Earth

+ +

 

+ +

2062 +Aten         # an Egyptian Sun god

+ +

2100 +Ra-Shalom    # Ra is an Egyptian Sun +god, Shalom is Hebrew "peace"

+ +

                  # was discovered during Camp +David mid-east peace conference

+ +

 

+ +

# +Apollo family: they cross Earth; mean distance is greater than Earth

+ +

 

+ +

1862 +Apollo       # Greek Sun god

+ +

1566 +Icarus       # wanted to fly to the sky, +fell into the ocean

+ +

                  # Icarus crosses Mercury, +Venus, Earth, and Mars

+ +

                  # and has his perihelion +very close to the Sun

+ +

3200 +Phaethon     # wanted to drive the solar +chariot, crashed in flames

+ +

                  # Phaethon crosses Mercury, Venus, Earth, and Mars

+ +

                  # and has his perihelion +very close to the Sun

+ +

 

+ +

# +Amor family: they cross Mars, approach Earth

+ +

 

+ +

1221 +Amor         # Roman love god

+ +

433  Eros         +# Greek love god

+ +

 

+ +

# Mars +Trojans:

+ +

# +-------------

+ +

 

+ +

5261 +Eureka       a mars Trojan

+ +

 

+ +

# +Main belt families:

+ +

# +-------------------

+ +

 

+ +

# +Hungarias: asteroid group at 1.95 AU

+ +

 

+ +

434  Hungaria     +# after Hungary

+ +

 

+ +

# +Floras: Hirayama family at 2.2 AU

+ +

 

+ +

8    Flora        # goddess of flowers

+ +

 

+ +

# +Phocaeas: asteroid group at 2.36 AU

+ +

 

+ +

25   Phocaea      # maritime town in Ionia

+ +

 

+ +

# +Koronis family: Hirayama family at 2.88 AU

+ +

 

+ +

158  Koronis      +# mother of Asklepios by Apollo

+ +

 

+ +

# Eos +family: Hirayama family at 3.02 AU

+ +

 

+ +

221  Eos          +# goddess of dawn

+ +

 

+ +

# Themis +family: Hirayama family at 3.13 AU

+ +

 

+ +

24   Themis       # goddess of justice

+ +

 

+ +

# +Hildas: asteroid belt at 4.0 AU, in 3:2 resonance with Jupiter

+ +

# +--------------------------------------------------------------

+ +

# The +Hildas have fairly eccentric orbits and, at their

+ +

# +aphelion, are very close to the orbit of Jupiter. However,

+ +

# at +those times, Jupiter is ALWAYS somewhere else. As

+ +

# +Jupiter approaches, the Hilda asteroids move towards

+ +

# +their perihelion points.

+ +

 

+ +

153  Hilda        +# female first name, means "heroine"

+ +

 

+ +

# a +single asteroid at 4.26 AU, in 4:3 resonance with Jupiter

+ +

279  Thule        +# mythical center of Magic in the uttermost north

+ +

 

+ +

# +Jupiter Trojans:

+ +

# +----------------

+ +

# +Only the Trojans behind Jupiter are actually named after Trojan heroes,

+ +

# whereas +the "Trojans" ahead of Jupiter are named after Greek heroes that

+ +

# +participated in the Trojan war. However there have been made some mistakes,

+ +

# +i.e. there are some Trojan "spies" in the Greek army and some Greek +"spies"

+ +

# in +the Trojan army.

+ +

 

+ +

# Greeks +ahead of Jupiter:

+ +

624  Hector       +# Trojan "spy" in the Greek army, by far the greatest

+ +

                  # Trojan hero and the +greatest Trojan asteroid

+ +

588  Achilles     +# slayer of Hector

+ +

1143 +Odysseus

+ +

 

+ +

# +Trojans behind Jupiter:

+ +

1172 +Äneas

+ +

3317 +Paris

+ +

884  Priamus

+ +

 

+ +

# +Jupiter-crossing asteroids:

+ +

# +---------------------------

+ +

 

+ +

3552 +Don Quixote  # perihelion near Mars, +aphelion beyond Jupiter;

+ +

                  # you know Don Quixote, +don't you?

+ +

944  Hidalgo      +# perihelion near Mars, aphelion near Saturn;

+ +

                  # after a Mexican national +hero

+ +

5335 +Damocles     # perihelion near Mars, +aphelion near Uranus;

+ +

                  # the man sitting below a +sword suspended by a thread

+ +

 

+ +

# +Centaurs:

+ +

# +---------

+ +

 

+ +

2060 +Chiron       # perihelion near Saturn, +aphelion near Uranus

+ +

                  # educator of heros, +specialist in healing and war arts

+ +

5145 +Pholus       # perihelion near Saturn, +aphelion near Neptune

+ +

                  # seer of the gods, keeper +of the wine of the Centaurs

+ +

7066 +Nessus       # perihelion near Saturn, aphelion in Pluto's mean distance

+ +

                  # ferryman, killed by +Hercules, kills Hercules

+ +

 

+ +

# +Plutinos:

+ +

# +---------

+ +

# +These are objects with periods similar to Pluto, i.e. objects

+ +

# +that resonate with the Neptune period in a 3:2 ratio.

+ +

# +There are no Plutinos included in Swiss Ephemeris so far, but

+ +

# +PLUTO himself is considered to be a Plutino type asteroid!

+ +

 

+ +

# +Cubewanos:

+ +

# +----------

+ +

# +These are non-Plutiono objects with periods greater than Pluto.

+ +

# The +word "Cubewano" is derived from the preliminary designation

+ +

# of +the first-discovered Cubewano: 1992 QB1

+ +

 

+ +

20001 +1992 QB1    # will be given the name of +a creation deity

+ +

                  # (fictitious catalogue number +20001!)

+ +

 

+ +

# +other Transplutonians:

+ +

 

+ +

20001 +1996 TL66   # mean solar distance 85 AU, +period 780 years

+ +

 

+ +

# +Asteroids that challenge hypothetical planets astrology

+ +

# +-------------------------------------------------------

+ +

 

+ +

42   Isis         # not identical with "Isis-Transpluto"

+ +

                  # Egyptian lunar goddess

+ +

763  Cupido       +# different from Witte's Cupido

+ +

                  # Roman god of sexual desire

+ +

4341 +Poseidon     # not identical with +Witte's Poseidon

+ +

                  # Greek name of Neptune

+ +

4464 +Vulcano      # compare Witte's Vulkanus

+ +

                  # and intramercurian hypothetical Vulcanus

+ +

                  # Roman fire god

+ +

5731 +Zeus         # different from Witte's +Zeus

+ +

                  # Greek name of Jupiter

+ +

1862 +Apollo       # different from Witte's +Apollon

+ +

                  # Greek god of the Sun

+ +

398  Admete       +# compare Witte's Admetos

+ +

                  # "the untamed +one", daughter of Eurystheus

+ +

 

+ +

# +Asteroids that challenge Dark Moon astrology

+ +

# +--------------------------------------------

+ +

 

+ +

1181 +Lilith       # not identical with Dark +Moon 'Lilith'

+ +

                  # first evil wife of Adam

+ +

3753 +Cruithne     # often called the +"second moon" of earth;

+ +

                  # actually not a moon, but +an asteroid that

+ +

                  # orbits around the sun in a +certain resonance

+ +

                  # with the earth.

+ +

                  # After the first Celtic +group to come to the British Isles.

+ +

 

+ +

# +Also try the two points 60 degrees in front of and behind the

+ +

# +Moon, the so called Lagrange points, where the combined

+ +

# +gravitational forces of the earth and the moon might imprison

+ +

# +rocks and stones. There have been some photographic hints

+ +

# +that there are clouds of such material around these points.

+ +

# +They are called the Kordylewski clouds.

+ +

 

+ +

 

+ +

# +other asteroids

+ +

# +---------------

+ +

 

+ +

5    Astraea      # a goddess of justice

+ +

6    Hebe         # goddess of youth

+ +

7    Iris         # rainbow goddess, messenger of the gods

+ +

8    Flora        # goddess of flowers and gardens

+ +

9    Metis        # goddess of prudence

+ +

10   Hygiea       # goddess of health

+ +

14   Irene        # goddess of peace

+ +

16   Psyche       # "soul", a nymph

+ +

19   Fortuna      # goddess of fortune

+ +

 

+ +

# +Some frequent names:

+ +

# +--------------------

+ +

# +There are thousands of female first names in the asteroids list.

+ +

# +Very interesting for relationship charts!

+ +

 

+ +

78   Diana

+ +

170  Maria

+ +

234  Barbara

+ +

375  Ursula       +

+ +

412  Elisabetha

+ +

542  Susanna

+ +

 

+ +

# +Wisdom asteroids:

+ +

# +-----------------

+ +

 

+ +

134  Sophrosyne   +# equanimity, healthy mind and impartiality

+ +

197  Arete        +# virtue

+ +

227  Philosophia

+ +

251  Sophia       +# wisdom (Greek)

+ +

259  Aletheia     +# truth

+ +

275  Sapientia    +# wisdom (Latin)

+ +

 

+ +

# Love +asteroids:

+ +

# +---------------

+ +

 

+ +

344  Desiderata

+ +

433  Eros

+ +

499  Venusia

+ +

763  Cupido

+ +

1221 +Amor              

+ +

1387 +Kama         # Indian god of sexual +desire           

+ +

1388 +Aphrodite    # Greek love Goddess

+ +

1389 +Onnie        # what is this, after 1387 +and 1388 ?

+ +

1390 +Abastumani   # and this?

+ +

 

+ +

# The +Nine Muses

+ +

# +--------------

+ +

 

+ +

18   Melpomene    Muse of tragedy

+ +

22   Kalliope     Muse of heroic poetry

+ +

23   Thalia   +    Muse of comedy

+ +

27   Euterpe      Muse of music and lyric poetry

+ +

30   Urania       Muse of astronomy and astrology

+ +

33   Polyhymnia   Muse of singing and rhetoric

+ +

62   Erato        Muse of song and dance

+ +

81   Terpsichore  Muse of choral dance and song

+ +

84   Klio         Muse of history

+ +

 

+ +

# +Money and big busyness asteroids

+ +

# +--------------------------------

+ +

 

+ +

19   Fortuna      # goddess of fortune

+ +

904  Rockefellia

+ +

1338 +Duponta

+ +

3652 +Soros

+ +

 

+ +

# +Beatles asteroids:

+ +

# +------------------

+ +

 

+ +

4147 +Lennon

+ +

4148 +McCartney

+ +

4149 +Harrison

+ +

4150 Starr

+ +

 

+ +

# Composer +Asteroids:

+ +

# +-------------------

+ +

 

+ +

2055 +Dvorak

+ +

1814 +Bach

+ +

1815 +Beethoven

+ +

1034 +Mozartia

+ +

3941 +Haydn

+ +

And +there are many more...

+ +

 

+ +

# +Astrodienst asteroids:

+ +

# +----------------------

+ +

 

+ +

# +programmers group:

+ +

3045 +Alois

+ +

2396 +Kochi

+ +

2968 +Iliya        # Alois' dog

+ +

 

+ +

# +artists group:

+ +

412  Elisabetha

+ +

 

+ +

# +production family:

+ +

612  Veronika

+ +

1376 +Michelle

+ +

1343 +Nicole

+ +

1716 +Peter

+ +

 

+ +

# +children group

+ +

105 +Artemis

+ +

1181 +Lilith

+ +

 

+ +

# +special interest group

+ +

564 +Dudu

+ +

349 +Dembowska

+ +

484 +Pittsburghia

+ +

 

+ +

# By +the year 1997, the statistics of asteroid names looked as follows:

+ +

 

+ +

# Men +(mostly family names)           2551

+ +

# +Astronomers                         1147

+ +

# +Women (mostly first names)           684

+ +

# +Mythological terms                   542

+ +

# +Cities, harbours buildings           497

+ +

# +Scientists (no astronomers)          493

+ +

# +Relatives of asteroid discoverers    277

+ +

# +Writers                              249

+ +

# +Countries, provinces, islands        246

+ +

# +Amateur astronomers                  209

+ +

# +Historical, political figures        176

+ +

# +Composers, musicians, dancers        157

+ +

# +Figures from literature, operas      145

+ +

# +Rivers, seas, mountains              135

+ +

# +Institutes, observatories            116

+ +

# +Painters, sculptors                  101

+ +

# Plants, trees, animals                63

+ +
+ + + + diff --git a/swe/doc/swisseph.pdf b/swe/doc/swisseph.pdf new file mode 100644 index 0000000000000000000000000000000000000000..aa40a65e8f426057f43463a626ed391057d9c95a GIT binary patch literal 455576 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

|*u3lz-uKzl(4@Pj(TVbulM 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

}5tLPdvqxd5nyF8Q^$SaH8C>Ojl62 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

Et1HLV&Z` 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

M-Be1&`1M5DpHWZWa? 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 literal 0 HcmV?d00001 diff --git a/swe/src/LICENSE b/swe/src/LICENSE new file mode 100644 index 0000000..a242b22 --- /dev/null +++ b/swe/src/LICENSE @@ -0,0 +1,54 @@ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + diff --git a/swe/src/Makefile.am b/swe/src/Makefile.am new file mode 100644 index 0000000..5a2a0bf --- /dev/null +++ b/swe/src/Makefile.am @@ -0,0 +1,6 @@ +LIBSWE_VERSION = 1:75:0 +lib_LTLIBRARIES = libswe-1.75.la +libswe_1_75_la_SOURCES = swedate.c swehouse.c swejpl.c swemmoon.c swemplan.c swepcalc.c sweph.c swepdate.c swephlib.c swecl.c swehel.c +libswe_1_75_la_CFLAGS = $(CFLAGS) -Wall +libswe_1_75_la_LIBADD = +libswe_1_75_la_LDFLAGS = -version-info diff --git a/swe/src/Makefile.swe b/swe/src/Makefile.swe new file mode 100644 index 0000000..0df137a --- /dev/null +++ b/swe/src/Makefile.swe @@ -0,0 +1,60 @@ +# $Header$ +# this Makefie creates a SwissEph library and a swetest sample on HP-Unix 10.20 +# It has also been used successfully on Suse Linix 5.3 + +# The mode marked as 'Linux' should also work with the GNU C compiler +# gcc on other systems. It is known to work with gcc on Solaris. + +# If you modify this makefile for another compiler, please +# let us know. We would like to add as many variations as possible. +# If you get warnings and error messages from your compiler, please +# let us know. We like to fix the source code so that it compiles +# free of warnings. +# send email to swisseph@astro.ch +# + +CFLAGS = -g -O9 -Wall # for Linux and other gcc systems +OP=$(CFLAGS) +CC=cc #for Linux + +# compilation rule for general cases +.o : + $(CC) $(OP) -o $@ $? -lm +.c.o: + $(CC) -c $(OP) $< + +SWEOBJ = swedate.o swehouse.o swejpl.o swemmoon.o swemplan.o swepcalc.o sweph.o\ + swepdate.o swephlib.o swecl.o swehel.o + +swetest: swetest.o libswe.a + $(CC) $(OP) -o swetest swetest.o -L. -lswe -lm + +swemini: swemini.o libswe.a + $(CC) $(OP) -o swemini swemini.o -L. -lswe -lm + +# create an archive and a dynamic link libary fro SwissEph +# a user of this library will inlcude swephexp.h and link with -lswe + +libswe.a: $(SWEOBJ) + ar r libswe.a $(SWEOBJ) + +libswe.so: $(SWEOBJ) + $(CC) -shared -o libswe.so $(SWEOBJ) + +clean: + rm -f *.o swetest libswe* + +### +swecl.o: swejpl.h sweodef.h swephexp.h swedll.h sweph.h swephlib.h +sweclips.o: sweodef.h swephexp.h swedll.h +swedate.o: swephexp.h sweodef.h swedll.h +swehel.o: swephexp.h sweodef.h swedll.h +swehouse.o: swephexp.h sweodef.h swedll.h swephlib.h swehouse.h +swejpl.o: swephexp.h sweodef.h swedll.h sweph.h swejpl.h +swemini.o: swephexp.h sweodef.h swedll.h +swemmoon.o: swephexp.h sweodef.h swedll.h sweph.h swephlib.h +swemplan.o: swephexp.h sweodef.h swedll.h sweph.h swephlib.h swemptab.c +swepcalc.o: swepcalc.h swephexp.h sweodef.h swedll.h +sweph.o: swejpl.h sweodef.h swephexp.h swedll.h sweph.h swephlib.h +swephlib.o: swephexp.h sweodef.h swedll.h sweph.h swephlib.h +swetest.o: swephexp.h sweodef.h swedll.h diff --git a/swe/src/fixstars.cat b/swe/src/fixstars.cat new file mode 100644 index 0000000..6e51b48 --- /dev/null +++ b/swe/src/fixstars.cat @@ -0,0 +1,1258 @@ +Aldebaran ,alTau,ICRS,04,35,55.2387,16,30,33.485,0.418533333333333,-18.935,54.26,0.05009, 0.85, 16, 629 +Algol ,bePer,ICRS,03,08,10.1315,40,57,20.332,0.0159333333333333,-0.144,4.0,0.03514, 2.12, 40, 673 +Antares ,alSco,ICRS,16,29,24.4609,-26,25,55.209,-0.0677333333333333,-2.321,-3.4,0.0054, 0.96,-26,11359 +Regulus ,alLeo,ICRS,10,08,22.3107,11,58,01.945,-1.66266666666667,0.491,5.9,0.04209, 1.35, 12, 2149 +Sirius ,alCMa,ICRS,06,45,08.9173,-16,42,58.017,-3.64033333333333,-122.314,-7.6,0.37921, -1.47,-16, 1591 +Spica ,alVir,ICRS,13,25,11.5793,-11,09,40.759,-0.283333333333333,-3.173,1.0,0.01244, 0.97,-10, 3672 +Gal. Center,SgrA*,2000,17,45,40.0383,-29,00,28.069,0.000, 0.00, 0.0,0.0000,999.99, 0, 0 +# Great Attractor, near Galaxy Cluster ACO 3627, at gal. coordinates +# 325.3, -7.2, 4844 km s-1 according to Kraan-Korteweg et al. 1996, +# Woudt 1998 +Great Attractor,GA,2000,16,15,02.836,-60,53,22.54,0.000, 0.00, 0.0,0.0000,999.99, 0, 0 +# Virgo Cluster, according to NED (Nasa Extragalactic Database) +Virgo Cluster,VC,2000,12,26,32.1,12,43,24,0.000, 0.00, 0.0,0.0000,999.99, 0, 0 +Andromeda Galaxy,M31,ICRS,00,42,44.31,41,16,09.4,0,4.2,0,0,3.4, 0, 0 +# Prasepe (Beehive Cluster): http://seds.lpl.arizona.edu/messier/m/m044.html (note, the apparent dimension is 95.0 arc min) +Praesepe Cluster,M44,2000,08,40,6.000,19,59,0.00,0.000, 0.00, 0.0,0.0000,3.7, 0, 0 +# Prasepe (Beehive Cluster): http://obswww.unige.ch/webda/cgi-bin/ocl_page.cgi?cluster=m44 (note, the apparent dimension is 95.0 arc min) +Praesepe Cluster,M44,ICRS,08,40,24.000,19,41,-0.2399,-0.001292,33.57, 0.0,0.0000,3.7, 0, 0 +# moved this to top of file, otherwise Polaris Australis will be found +Polaris ,alUMi,ICRS,02,31,49.0837,89,15,50.794,0.2948,-1.175,-17.4,0.00756, 2.02, 88, 8 +# +# Fixed stars brighter than Magnitude 5 +# This file is based on data provided by S. Moshier. +# 7 Mai 1999: +# File was improved by Valentin Abramov, Tartu, Estonia in April 1999. +# - The stars are ordered by constellation. +# - Most names come from Arabic and have several transliterations, +# e.g. Algieba and Al Jabhah. In such cases, the record has been +# duplicated and both spellings have been given. +# +# 11 Jan 2006 (Dieter Koch): +# File updated with star positions from the SIMBAD Astronomical Database. +# http://simbad.u-strasbg.fr/simbad/sim-fid +# +# The Galactic Center was taken from +# The Astrophysical Journal, Volume 518, Issue 1, pp. L33-L35. +# +# The data are: +# traditional name (no leading blanks in field) +# nomenclature name (no leading blanks in field) +# equinox (must be either '1950' or '2000' or 'ICRS') +# right ascension hours +# minutes +# seconds +# declination degrees +# minutes +# seconds +# proper motion in right asc., time seconds per century * cos(decl0) +# in decl., arc seconds per century +# radial velocity in km/s +# annual parallax +# magnitude +# DM zone (Durchmusterung zone; declination 1900) +# DM number +# +# To achieve higher speed for swe_fixstar(), you can copy the +# stars you prefer to the top of the list +# +# The following stars are given first to avoid that swe_fixstar() +# return e.g. Denebola when Deneb is required. +Deneb ,alCyg,ICRS,20,41,25.9147,45,16,49.217,0.0104,0.155,-4.5,0.00101, 1.25, 44, 3541 +Deneb Adige ,alCyg,ICRS,20,41,25.9147,45,16,49.217,0.0104,0.155,-4.5,0.00101, 1.25, 44, 3541 +Rigel ,beOri,ICRS,05,14,32.2723,-08,12,05.906,0.0124666666666667,-0.056,20.7,0.00422, 0.12,-08, 1063 +Mira ,omiCet,ICRS,02,19,20.7927,-02,58,39.513,0.0688666666666667,-23.948,63.8,0.00779, 3.04,-03, 353 +Ain ,epTau,ICRS,04,28,36.9995,19,10,49.554,0.714866666666667,-3.677,39,0.02104, 3.54, 18, 640 +# +# Andromeda +Alpheratz ,alAnd,ICRS,00,08,23.2586,29,05,25.555,0.904533333333333,-16.295,-11.7,0.0336, 2.06, 28, 4 +Sirrah ,alAnd,ICRS,00,08,23.2586,29,05,25.555,0.904533333333333,-16.295,-11.7,0.0336, 2.06, 28, 4 +Mirach ,beAnd,ICRS,01,09,43.9236,35,37,14.008,1.1706,-11.223,.3,0.01636, 2.06, 34, 198 +Almaak ,ga-1And,ICRS,02,03,53.9531,42,19,47.009,0.2872,-5.085,-11.7,0.00919, 2.26, 41, 395 +Almak ,ga-1And,ICRS,02,03,53.9531,42,19,47.009,0.2872,-5.085,-11.7,0.00919, 2.26, 41, 395 +Almac ,ga-1And,ICRS,02,03,53.9531,42,19,47.009,0.2872,-5.085,-11.7,0.00919, 2.26, 41, 395 +Almach ,ga-1And,ICRS,02,03,53.9531,42,19,47.009,0.2872,-5.085,-11.7,0.00919, 2.26, 41, 395 + ,deAnd,ICRS,00,39,19.6758,30,51,39.686,0.7692,-8.305,-7.3,0.03219, 3.27, 30, 91 + ,epAnd,ICRS,00,38,33.3458,29,18,42.305,-1.52946666666667,-25.409,-83.6,0.01934, 4.37, 28, 103 + ,zeAnd,ICRS,00,47,20.3254,24,16,01.841,-0.674866666666667,-8.189,-23.7,0.01798, 4.06, 23, 106 + ,ioAnd,ICRS,23,38,08.2013,43,16,05.063,0.1848,-0.121,-.5,0.00649, 4.29, 42, 4720 + ,kaAnd,ICRS,23,40,24.5081,44,20,02.154,0.5422,-1.896,-9,0.01922, 4.14, 43, 4522 + ,laAnd,ICRS,23,37,33.8425,46,27,29.347,1.06146666666667,-42.146,6.8,0.03874, 3.82, 45, 4283 + ,muAnd,ICRS,00,56,45.2115,38,29,57.641,1.01853333333333,3.682,7.6,0.02393, 3.87, 37, 175 + ,nuAnd,ICRS,00,49,48.8473,41,04,44.079,0.1512,-1.805,-23.9,0.0048, 4.53, 40, 171 +Adhil ,xiAnd,ICRS,01,22,20.4198,45,31,43.600,0.214733333333333,0.873,-11.7,0.01668, 4.88, 44, 287 + ,omiAnd,ICRS,23,01,55.2643,42,19,33.525,0.1498,0.024,-14.0,0.00471, 3.62, 41, 4664 + ,piAnd,ICRS,00,36,52.8497,33,43,09.637,0.101533333333333,-0.356,8.7,0.00497, 4.36, 32, 101 + ,rhAnd,ICRS,00,21,07.2691,37,58,06.971,0.3888,-3.965,9.1,0.02042, 5.18, 37, 45 + ,siAnd,ICRS,00,18,19.6569,36,47,06.807,-0.4434,-4.248,-8.0,0.02311, 4.52, 35, 44 +Adhab ,upAnd,ICRS,01,36,47.8428,41,24,19.652,-1.15046666666667,-38.103,-28.3,0.07425, 4.09, 40, 332 + ,psAnd,ICRS,23,46,02.0466,46,25,12.993,0.0603333333333333,-0.625,-24.8,0.00249, 4.95, 45, 4321 + ,omeAnd,ICRS,01,27,39.3817,45,24,24.074,2.37993333333333,-10.932,10.8,0.03533, 4.83, 44, 307 +Andromeda Galaxy,M31,ICRS,00,42,44.31,41,16,09.4,0,4.2,0,0,3.4, 0, 0 +# Antila + ,alAnt,ICRS,10,27,09.1011,-31,04,04.004,-0.536133333333333,0.963,12.2,0.0089, 4.25,-30, 8465 + ,epAnt,ICRS,09,29,14.7197,-35,57,04.808,-0.164933333333333,0.507,22.2,0.00466, 4.51,-35, 5724 + ,thAnt,ICRS,09,44,12.110,-27,46,10.30,-0.318666666666667,3.4,24.0,0, 4.79,-27, 6881 + ,ioAnt,ICRS,10,56,43.0511,-37,08,15.956,0.499733333333333,-12.45,-.2,0.0164, 4.60,-36, 6808 +# Apus + ,alAps,ICRS,14,47,51.7087,-79,02,41.103,-0.0378,-1.575,-1.1,0.00793, 3.83,-78, 893 + ,gaAps,ICRS,16,33,27.0835,-78,53,49.732,-0.837866666666667,-7.759,5.4,0.02044, 3.89,-78, 1103 + ,de-1Aps,ICRS,16,20,20.8056,-78,41,44.682,-0.0660666666666667,-3.659,-12.0,0.00426, 4.68,-78, 1092 + ,thAps,ICRS,14,05,19.8781,-76,47,48.308,-0.582733333333333,-3.123,9.0,0.00993, 5.50,-76, 799 + ,ioAps,ICRS,17,22,05.8760,-70,07,23.549,-0.0115333333333333,-1.204,-4.3,0.00285, 5.41,-69, 2719 + ,ka-1Aps,ICRS,15,31,30.8214,-73,23,22.527,0.00253333333333333,-1.828,62,0.0032, 5.49,-72, 1802 +# Aquila +Altair ,alAql,ICRS,19,50,46.9990,08,52,05.959,3.57913333333333,38.557,-26.1,0.19445, 0.77, 08, 4236 +Alshain ,beAql,ICRS,19,55,18.7934,06,24,24.348,0.309,-48.135,-39.8,0.07295, 3.71, 06, 4357 +Tarazed ,gaAql,ICRS,19,46,15.5795,10,36,47.740,0.1048,-0.308,-2.1,0.00708, 2.72, 10, 4043 +Al Mizan ,deAql,ICRS,19,25,29.9005,03,06,53.191,1.68713333333333,8.067,-30.1,0.06505, 3.36, 02, 3879 +Deneb el Okab Borealis,epAql,ICRS,18,59,37.3574,15,04,05.873,-0.3512,-7.381,-48,0.02122, 4.02, 14, 3736 +Deneb el Okab Australis,zeAql,ICRS,19,05,24.6082,13,51,48.521,-0.0469333333333333,-9.531,-25,0.03918, 2.99, 13, 3899 +Dheneb ,zeAql,ICRS,19,05,24.6082,13,51,48.521,-0.0469333333333333,-9.531,-25,0.03918, 2.99, 13, 3899 +Bazak ,etAql,ICRS,19,52,28.3679,01,00,20.378,0.0462666666666667,-0.73,-14.8,0.00278, 3.90, 00, 4337 +Tseen Foo ,thAql,ICRS,20,11,18.2855,-00,49,17.260,0.236533333333333,0.605,-27.3,0.01136, 3.23,-01, 3911 +Al Thalimaim Posterior,ioAql,ICRS,19,36,43.2777,-01,17,11.763,0.0126,-2.075,-21.4,0.01061, 4.36,-01, 3782 + ,kaAql,ICRS,19,36,53.4493,-07,01,38.918,0.0086,-0.269,-19.4,0.00224, 4.95,-07, 5006 +Al Thalimaim Anterior,laAql,ICRS,19,06,14.9384,-04,52,57.195,-0.1312,-9.037,-12,0.02605, 3.42,-05, 4876 + ,muAql,ICRS,19,34,05.3529,07,22,44.189,1.4184,-15.539,-23.9,0.0295, 4.45, 07, 4132 + ,rhAql,ICRS,20,14,16.6193,15,11,51.391,0.371266666666667,5.798,-23.0,0.02124, 4.95, 14, 4227 + ,taAql,ICRS,20,04,08.3152,07,16,40.677,0.0949333333333333,1.297,-28.0,0.00619, 5.65, 06, 4416 + ,ome-1Aql,ICRS,19,17,48.9986,11,35,43.519,0.00166666666666667,1.262,-14.3,0.00772, 5.28, 11, 3790 +Bered ,12Aql,ICRS,19,01,40.8272,-5,44,20.814,-0.161,-3.973,-43.9,0.02195, 4.027, 0, 0 +# Aquarius +Sadalmelek ,alAqr,ICRS,22,05,47.0357,-00,19,11.463,0.119333333333333,-0.993,7.5,0.0043, 2.96,-01, 4246 +Sadalmelik ,alAqr,ICRS,22,05,47.0357,-00,19,11.463,0.119333333333333,-0.993,7.5,0.0043, 2.96,-01, 4246 +Sadalsuud ,beAqr,ICRS,21,31,33.5341,-05,34,16.220,0.151933333333333,-0.67,6.5,0.00533, 2.91,-06, 5770 +Sadalachbia ,gaAqr,ICRS,22,21,39.3754,-01,23,14.393,0.8616,0.89,-15,0.02067, 3.84,-02, 5741 +Skat ,deAqr,ICRS,22,54,39.0125,-15,49,14.953,-0.293866666666667,-2.481,18.0,0.02044, 3.27,-16, 6173 +Albali ,epAqr,ICRS,20,47,40.5515,-09,29,44.793,0.2126,-3.532,-16.0,0.01421, 3.77,-10, 5506 +Altager ,epAqr,ICRS,20,47,40.5515,-09,29,44.793,0.2126,-3.532,-16.0,0.01421, 3.77,-10, 5506 +Sadaltager ,ze-1Aqr,ICRS,22,28,49.912,-00,01,11.9,1.273333333,3.7,28.9,0.0, 4.5,0, 0 +Hydria ,etAqr,ICRS,22,35,21.3806,-00,07,02.991,0.5904,-5.61,-8,0.01777, 4.02,-00, 4384 +Deli ,etAqr,ICRS,22,35,21.3806,-00,07,02.991,0.5904,-5.61,-8,0.01777, 4.02,-00, 4384 +Ancha ,thAqr,ICRS,22,16,50.0364,-07,46,59.845,0.793,-2.191,-14.7,0.01704, 4.16,-08, 5845 + ,ioAqr,ICRS,22,06,26.2297,-13,52,10.845,0.269666666666667,-5.716,-10,0.0189, 4.27,-14, 6209 +Situla ,kaAqr,ICRS,22,37,45.3810,-04,13,41.001,-0.455733333333333,-12.047,8.2,0.01392, 5.03,-04, 5716 +Hydor ,laAqr,ICRS,22,52,36.8759,-07,34,46.557,0.130066666666667,3.271,-8.8,0.00833, 3.74,-08, 5968 +Ekkhysis ,laAqr,ICRS,22,52,36.8759,-07,34,46.557,0.130066666666667,3.271,-8.8,0.00833, 3.74,-08, 5968 + ,muAqr,ICRS,20,52,39.2336,-08,58,59.944,0.313733333333333,-3.291,-9.1,0.02101, 4.73,-09, 5598 +Albulaan ,nuAqr,ICRS,21,09,35.6477,-11,22,18.095,0.6154,-1.576,-11.8,0.01993, 4.51,-11, 5538 +Seat ,piAqr,ICRS,22,25,16.6232,01,22,38.642,0.122533333333333,0.335,4,0.00296, 4.66, 00, 4872 + ,siAqr,ICRS,22,30,38.8161,-10,40,40.620,0.0119333333333333,-2.626,11,0.01229, 4.82,-11, 5850 + ,ta-2Aqr,ICRS,22,49,35.5023,-13,35,33.475,-0.0838666666666667,-3.88,1.0,0.00858, 4.01,-14, 6354 + ,phAqr,ICRS,23,14,19.3597,-06,02,56.410,0.308133333333333,-19.585,-.4,0.01468, 4.22,-06, 6170 +Bunda ,xiAqr,ICRS,21,37,45.1093,-07,51,15.125,0.761933333333333,-2.444,-18,0.01826, 4.69,-08, 5701 + ,upAqr,ICRS,22,34,41.6369,-20,42,29.577,1.47733333333333,-14.658,-1.9,0.04397, 5.20,-21, 6251 + ,ps-1Aqr,ICRS,23,15,53.4947,-09,05,15.853,2.45706666666667,-1.702,-26.4,0.02197, 4.21,-09, 6156 + ,ps-3Aqr,ICRS,23,18,57.6767,-09,36,38.700,0.2898,-0.78,-10,0.0131, 4.98,-10, 6094 + ,ome-2Aqr,ICRS,23,42,43.3441,-14,32,41.657,0.655666666666667,-6.678,3,0.02116, 4.49,-15, 6476 + ,3Aqr,ICRS,20,47,44.2360,-05,01,39.723,-0.022,-4.024,-22.0,0.00733, 4.478,0, 0 + ,88Aqr,ICRS,23,09,26.7971,-21,10,20.675,0.3732666666666667,3.125,21.1,0.01396, 3.66,0, 0 + ,98Aqr,ICRS,23,22,58.2267,-20,06,02.088,-0.8018,-9.670,-6.5,0.02014, 3.967,0, 0 +# Ara +Ara ,alAra,ICRS,17,31,50.4933,-49,52,34.121,-0.208466666666667,-6.715,0,0.01346, 2.95,-49,11511 + ,beAra,ICRS,17,25,17.9887,-55,31,47.583,-0.0548666666666667,-2.471,-.4,0.00541, 2.85,-55, 8100 + ,deAra,ICRS,17,31,05.9130,-60,41,01.853,-0.357666666666667,-9.937,10,0.01742, 3.62,-60, 6842 + ,ep-1Ara,ICRS,16,59,35.0477,-53,09,37.576,0.00746666666666667,2.153,23.1,0.01072, 4.06,-52,10372 + ,zeAra,ICRS,16,58,37.2117,-55,59,24.507,-0.122066666666667,-3.529,-6.0,0.00568, 3.13,-55, 7766 + ,etAra,ICRS,16,49,47.1563,-59,02,28.961,0.263933333333333,-2.528,9.0,0.01041, 3.76,-58, 6906 + ,thAra,ICRS,18,06,37.8711,-50,05,29.318,-0.0562,-0.926,3.4,0.00322, 3.66,-50,11720 + ,muAra,ICRS,17,44,08.7029,-51,50,02.591,-0.1004,-19.117,-9.0,0.06546, 5.15,-51,11094 +# Aries +Hamal ,alAri,ICRS,02,07,10.4071,23,27,44.723,1.27153333333333,-14.577,-14.2,0.04948, 2.00, 22, 306 +Sheratan ,beAri,ICRS,01,54,38.4091,20,48,28.926,0.642133333333333,-10.88,-1.9,0.05474, 2.64, 20, 306 +Mesarthim ,gaAri,ICRS,01,53,31.8143,19,17,37.866,0.529533333333333,-9.91,79.43,0.01596, 3.88, 18, 243 +Botein ,deAri,ICRS,03,11,37.7655,19,43,36.039,1.03073333333333,-0.839,24.7,0.01944, 4.35, 19, 477 + ,zeAri,ICRS,03,14,54.0961,21,02,39.988,-0.198866666666667,-7.715,7,0.00959, 4.89, 20, 527 + ,thAri,ICRS,02,18,07.5365,19,54,04.189,-0.107133333333333,0.09,6,0.00842, 5.69, 19, 340 + ,nuAri,ICRS,02,38,48.9945,21,57,41.070,-0.0472,-1.512,8,0.00941, 5.30, 21, 362 + ,siAri,ICRS,02,51,29.5869,15,04,55.454,0.2084,-2.329,17.0,0.0068, 5.49, 14, 480 + ,ta-1Ari,ICRS,03,21,13.6245,21,08,49.510,0.144533333333333,-2.241,13.9,0.00706, 5.28, 20, 543 + ,41Ari,ICRS,02,49,59.0323,27,15,37.825,0.4364666666667,-11.659,4.0,0.02045, 3.606, 20, 543 +# Auriga +Capella ,alAur,ICRS,05,16,41.3591,45,59,52.768,0.503466666666667,-42.711,30.2,0.07729, 0.08, 45, 1077 +Menkalinan ,beAur,ICRS,05,59,31.7229,44,56,50.758,-0.376066666666667,-0.088,-18.2,0.03972, 1.90, 44, 1328 +Prijipati ,deAur,ICRS,05,59,31.6366,54,17,04.762,0.5754,-13.405,8.2,0.02322, 3.72, 54, 970 +Maaz ,epAur,ICRS,05,01,58.1341,43,49,23.910,0.0012,-0.231,-2.5,0.0016, 2.99, 43, 1166 +Al Anz ,epAur,ICRS,05,01,58.1341,43,49,23.910,0.0012,-0.231,-2.5,0.0016, 2.99, 43, 1166 +Haedi ,zeAur,ICRS,05,02,28.6869,41,04,33.015,0.0592,-2.143,12.8,0.00414, 3.75, 40, 1142 +Haedus ,zeAur,ICRS,05,02,28.6869,41,04,33.015,0.0592,-2.143,12.8,0.00414, 3.75, 40, 1142 +Hoedus I ,zeAur,ICRS,05,02,28.6869,41,04,33.015,0.0592,-2.143,12.8,0.00414, 3.75, 40, 1142 +Sadatoni ,zeAur,ICRS,05,02,28.6869,41,04,33.015,0.0592,-2.143,12.8,0.00414, 3.75, 40, 1142 +Hoedus II ,etAur,ICRS,05,06,30.8928,41,14,04.108,0.204,-6.841,7.3,0.01487, 3.17, 41, 1058 +Bogardus ,thAur,ICRS,05,59,43.2690,37,12,45.307,0.2806,-7.361,29.5,0.01883, 2.54, 41, 1058 +Manus ,thAur,ICRS,05,59,43.2690,37,12,45.307,0.2806,-7.361,29.5,0.01883, 2.54, 41, 1058 +Hasseleh ,ioAur,ICRS,04,56,59.6187,33,09,57.925,0.0242,-1.854,17.5,0.00637, 2.69, 32, 855 +Al Khabdhilinan,ioAur,ICRS,04,56,59.6187,33,09,57.925,0.0242,-1.854,17.5,0.00637, 2.69, 32, 855 + ,kaAur,ICRS,06,15,22.6891,29,29,53.074,-0.472666666666667,-26.173,20.3,0.01931, 4.35, 29, 1154 + ,laAur,ICRS,05,19,08.4745,40,05,56.586,3.4622,-66.474,65.7,0.07908, 4.71, 39, 1248 + ,muAur,ICRS,05,13,25.7177,38,29,04.193,-0.1244,-7.241,21,0.02008, 4.86, 38, 1063 + ,nuAur,ICRS,05,51,29.3990,39,08,54.529,0.0565333333333333,0.039,9.7,0.01517, 3.97, 39, 1429 + ,xiAur,ICRS,05,54,50.7821,55,42,25.008,-0.0243333333333333,1.72,-11.8,0.01354, 4.99, 55, 1027 + ,omiAur,ICRS,05,45,54.0387,49,49,34.519,-0.0745333333333333,-1.131,-6.4,0.00676, 5.47, 49, 1398 + ,chAur,ICRS,05,32,43.6729,32,11,31.278,-0.0120666666666667,-0.4,-.2,0.0008, 4.76, 32, 1024 + ,ps-1Aur,ICRS,06,24,53.9027,49,17,16.415,0.00546666666666667,-0.248,4.7,0.00085, 4.91, 49, 1488 + ,ps-5Aur,ICRS,06,46,44.3388,43,34,38.737,-0.00186666666666667,16.549,-24.0,0.06056, 5.25, 43, 1595 + ,ps-6Aur,ICRS,06,47,39.5761,48,47,22.115,-0.035,0.64,-7.7,0.00769, 5.22, 48, 1436 +# Bootes +Arcturus ,alBoo,ICRS,14,15,39.6720,19,10,56.677,-7.28953333333333,-199.943,-5.2,0.08885, -0.04, 19, 2777 +Nekkar ,beBoo,ICRS,15,01,56.7623,40,23,26.036,-0.268,-2.922,-19.9,0.01491, 3.50, 40, 2840 +Seginus ,gaBoo,ICRS,14,32,04.6719,38,18,29.709,-0.770333333333333,15.187,-36.5,0.03829, 3.03, 38, 2565 +Haris ,gaBoo,ICRS,14,32,04.6719,38,18,29.709,-0.770333333333333,15.187,-36.5,0.03829, 3.03, 38, 2565 +Princeps ,deBoo,ICRS,15,15,30.1630,33,18,53.401,0.5656,-11.057,-12.3,0.02794, 3.49, 33, 2561 +Izar ,epBoo,ICRS,14,44,59.2177,27,04,27.201,-0.337666666666667,2,-50.65,0.01555, 2.70, 27, 2417 +Mirak ,epBoo,ICRS,14,44,59.2177,27,04,27.201,-0.337666666666667,2,-50.65,0.01555, 2.70, 27, 2417 +Pulcherrima ,epBoo,ICRS,14,44,59.2177,27,04,27.201,-0.337666666666667,2,-50.65,0.01555, 2.70, 27, 2417 +Mufrid ,etBoo,ICRS,13,54,41.0787,18,23,51.781,-0.406333333333333,-35.81,-.1,0.08817, 2.68, 19, 2725 +Muphrid ,etBoo,ICRS,13,54,41.0787,18,23,51.781,-0.406333333333333,-35.81,-.1,0.08817, 2.68, 19, 2725 +Asellus Primus ,thBoo,ICRS,14,25,11.7964,51,51,02.677,-1.57373333333333,-39.908,-10.9,0.06863, 4.05, 52, 1804 +Asellus Secundus,ioBoo,ICRS,14,16,09.9294,51,22,02.033,-0.999866666666667,8.942,-18.7,0.03354, 4.75, 52, 1784 +Asellus Tertius,ka-2Boo,ICRS,14,13,29.0078,51,47,23.874,0.409266666666667,-1.057,-17.4,0.02103, 4.54, 52, 1782 + ,laBoo,ICRS,14,16,23.0187,46,05,17.900,-1.24946666666667,15.901,-8.1,0.03358, 4.18, 46, 1949 +Alkalurops ,mu-1Boo,ICRS,15,24,29.4278,37,22,37.800,-0.984533333333333,8.469,-12.5,0.02696, 4.31, 37, 2636 + ,nu-1Boo,ICRS,15,30,55.7593,40,49,58.968,0.0734666666666667,-0.881,-10.4,0.00374, 5.02, 41, 2609 +Hemelein Prima,rhBoo,ICRS,14,31,49.7899,30,22,17.174,-0.6696,12.022,-13.7,0.02192, 3.58, 31, 2628 +Al Hamalain ,rhBoo,ICRS,14,31,49.7899,30,22,17.174,-0.6696,12.022,-13.7,0.02192, 3.58, 31, 2628 +Hemelein Secunda,siBoo,ICRS,14,34,40.8171,29,44,42.468,1.25546666666667,13.272,.2,0.06466, 4.46, 30, 2536 + ,taBoo,ICRS,13,47,15.7429,17,27,24.862,-3.20226666666667,5.418,-15.6,0.06412, 4.50, 18, 2782 +Ceginus ,phBoo,ICRS,15,37,49.5973,40,21,12.358,0.403,5.957,-9.7,0.02, 5.24, 40, 2907 + ,psBoo,ICRS,15,04,26.7417,26,56,51.536,-1.1754,-0.452,-25.5,0.01304, 4.54, 27, 2447 +Merga ,38Boo,ICRS,14,49,18.6693,46,06,58.340,-0.049,-7.732,-4.7,0.02134, 5.74, 46, 1993 +# Caelum + ,alCae,ICRS,04,40,33.7125,-41,51,49.509,-0.9412,-7.495,-.6,0.04967, 4.45,-42, 1587 + ,beCae,ICRS,04,42,03.4806,-37,08,39.468,0.312666666666667,19.314,26.8,0.03616, 5.05,-37, 1867 + ,deCae,ICRS,04,30,50.0997,-44,57,13.498,0.0162666666666667,-0.248,14.2,0.00459, 5.07,-45, 1567 +# Camelopardalis + ,alCam,ICRS,04,54,03.0113,66,20,33.641,0.00326666666666667,0.731,6.1,0.00047, 4.29, 66, 358 + ,beCam,ICRS,05,03,25.0901,60,26,32.084,-0.0407333333333333,-1.478,-1.7,0.00327, 4.03, 60, 856 + ,gaCam,ICRS,03,50,21.5091,71,19,56.156,0.1218,-4.2,-1,0.00973, 4.63, 70, 259 +# Capricornus +Algedi ,al-1Cap,ICRS,20,17,38.8694,-12,30,29.564,0.148266666666667,0.075,-26.1,0.00475, 4.24,-12, 5683 +Giedi Prima,al-1Cap,ICRS,20,17,38.8694,-12,30,29.564,0.148266666666667,0.075,-26.1,0.00475, 4.24,-12, 5683 +Algedi ,al-2Cap,ICRS,20,18,03.2554,-12,32,41.467,0.411866666666667,0.285,.1,0.03001, 3.56,-12, 5685 +Giedi Secunda,al-2Cap,ICRS,20,18,03.2554,-12,32,41.467,0.411866666666667,0.285,.1,0.03001, 3.56,-12, 5685 +Dabih ,beCap,ICRS,20,21,00.6757,-14,46,52.922,0.3228,1.4,-18.9,0.00948, 3.08,-15, 5629 +Nashira ,gaCap,ICRS,21,40,05.4563,-16,39,44.308,1.24926666666667,-2.233,-31.2,0.02348, 3.68,-17, 6340 +Deneb Algedi ,deCap,ICRS,21,47,02.4451,-16,07,38.229,1.75506666666667,-29.623,-6.3,0.08458, 2.87,-16, 5943 +Castra ,epCap,ICRS,21,37,04.8311,-19,27,57.642,0.0898666666666667,0.081,-23.7,0.00492, 4.64,-20, 6251 +Marakk ,zeCap,ICRS,21,26,40.0261,-22,24,40.797,-0.0174,1.888,3.0,0.00819, 3.74,-22,15388 +Armus ,etCap,ICRS,21,04,24.3004,-19,51,17.966,-0.260066666666667,-2.445,23.8,0.02064, 4.84,-20, 6115 +Dorsum ,thCap,ICRS,21,05,56.8281,-17,13,58.299,0.530933333333333,-6.164,-10.9,0.02061, 4.07,-17, 6174 + ,ioCap,ICRS,21,22,14.7962,-16,50,04.353,0.205533333333333,0.526,11.5,0.01513, 4.28,-17, 6245 + ,laCap,ICRS,21,46,32.0983,-11,21,57.436,0.2024,-0.925,1,0.0111, 5.43,-12, 6087 + ,muCap,ICRS,21,53,17.7717,-13,33,06.365,2.08686666666667,1.367,-21.5,0.03615, 5.08,-14, 6149 +Alshat ,nuCap,ICRS,20,20,39.8161,-12,45,32.687,0.104733333333333,-1.463,-2,0.01198, 4.76,-13, 5642 +Oculus ,piCap,ICRS,20,27,19.2098,-18,12,42.195,0.0688,-1.087,-13,0.0049, 5.25,-18, 5685 +Bos ,rhCap,ICRS,20,28,51.6140,-17,48,49.273,-0.105266666666667,-0.766,18.4,0.03304, 4.78,-18, 5689 +Pazan ,psCap,ICRS,20,46,05.7330,-25,16,15.231,-0.342533333333333,-15.666,25.8,0.06816, 4.14,-25,15018 +Pazhan ,psCap,ICRS,20,46,05.7330,-25,16,15.231,-0.342533333333333,-15.666,25.8,0.06816, 4.14,-25,15018 + ,upCap,ICRS,20,40,02.9445,-18,08,19.172,-0.151533333333333,-2.163,-12.5,0.00432, 5.10,-18, 5738 +Baten Algiedi,omeCap,ICRS,20,51,49.2910,-26,55,08.877,-0.0531333333333333,-0.254,9.0,0.00519, 4.11,-27,15082 + ,24Cap,ICRS,21,07,07.6679,-25,00,21.072,-0.181266666667,-4.337,31.9,0.00624, 4.531,0,0 + ,36Cap,ICRS,21,28,43.4002,-21,48,25.848,0.8931333333333,-0.547,-22.2,0.01818, 4.513,0,0 +# Carina +Canopus ,alCar,ICRS,06,23,57.1099,-52,41,44.378,0.133266666666667,2.367,20.5,0.01043, -0.72,-52, 914 +Miaplacidus ,beCar,ICRS,09,13,11.9755,-69,43,01.948,-1.05106666666667,10.891,-5,0.02934, 1.68,-69, 1023 +Avior ,epCar,ICRS,08,22,30.8356,-59,30,34.139,-0.168933333333333,2.272,11.6,0.00516, 1.86,-59, 1032 +Foramen ,etCar,ICRS,10,45,03.591,-59,41,04.26,-0.0506666666666667,0.1,-25.0,0, 6.21,0, 0 +Vathorz Posterior,thCar,ICRS,10,42,57.4013,-64,23,40.020,-0.1258,1.206,24,0.00743, 2.76,-63, 1599 +Scutulum ,ioCar,ICRS,09,17,05.4067,-59,16,30.825,-0.126866666666667,1.311,13.3,0.00471, 2.25,-58, 1465 +Tureis ,ioCar,ICRS,09,17,05.4067,-59,16,30.825,-0.126866666666667,1.311,13.3,0.00471, 2.25,-58, 1465 +Aspidiske ,ioCar,ICRS,09,17,05.4067,-59,16,30.825,-0.126866666666667,1.311,13.3,0.00471, 2.25,-58, 1465 +Drus ,chCar,ICRS,07,56,46.7143,-52,58,56.496,-0.1892,1.676,19.4,0.00843, 3.47,-52, 1343 +Drys ,chCar,ICRS,07,56,46.7143,-52,58,56.496,-0.1892,1.676,19.4,0.00843, 3.47,-52, 1343 +Simiram ,omeCar,ICRS,10,13,44.2179,-70,02,16.452,-0.2382,0.755,7,0.00881, 3.32,-69, 1178 +Vathorz Prior,upCar,ICRS,9,47,06.1216,-65,04,19.224,-0.077,0.497,0,0.00201, 2.96,0, 0 +# Cassiopeia +Schedar ,alCas,ICRS,00,40,30.4405,56,32,14.392,0.335733333333333,-3.217,-3.8,0.01427, 2.23, 55, 139 +Shedir ,alCas,ICRS,00,40,30.4405,56,32,14.392,0.335733333333333,-3.217,-3.8,0.01427, 2.23, 55, 139 +Schedir ,alCas,ICRS,00,40,30.4405,56,32,14.392,0.335733333333333,-3.217,-3.8,0.01427, 2.23, 55, 139 +Caph ,beCas,ICRS,00,09,10.6851,59,08,59.207,3.4892,-18.044,11.3,0.05989, 2.27, 58, 3 +Tsih ,gaCas,ICRS,00,56,42.5317,60,43,00.265,0.171,-0.382,-6.8,0.00532, 2.47, 59, 144 +Cih ,gaCas,ICRS,00,56,42.5317,60,43,00.265,0.171,-0.382,-6.8,0.00532, 2.47, 59, 144 +Ruchbah ,deCas,ICRS,01,25,48.9523,60,14,07.019,1.9816,-4.95,6.7,0.03281, 2.68, 59, 248 +Rucha ,deCas,ICRS,01,25,48.9523,60,14,07.019,1.9816,-4.95,6.7,0.03281, 2.68, 59, 248 +Segin ,epCas,ICRS,01,54,23.7255,63,40,12.365,0.2132,-1.866,-8.1,0.00738, 3.38, 62, 320 + ,zeCas,ICRS,00,36,58.2846,53,53,48.874,0.118466666666667,-0.915,2.0,0.00546, 3.66, 53, 105 +Achird ,etCas,ICRS,00,49,06.2912,57,48,54.674,7.24713333333333,-55.973,10.0,0.16799, 3.44, 57, 150 + ,kaCas,ICRS,00,32,59.9917,62,55,54.418,0.0266,-0.21,-2.3,0.00079, 4.16, 62, 102 +Marfak ,muCas,ICRS,01,08,16.3942,54,55,13.221,22.8126666666667,-160.035,-97.2,0.13242, 5.17, 54, 223 + ,omiCas,ICRS,00,44,43.5177,48,17,03.711,0.1186,-0.762,-16.9,0.0036, 4.54, 47, 183 + ,rhCas,ICRS,23,54,23.0324,57,29,57.776,-0.0302666666666667,-0.345,-43.1,0.00028, 4.54, 56, 3111 + ,psCas,ICRS,01,25,56.0217,68,07,48.045,0.500466666666667,2.682,-11.5,0.01689, 4.74, 67, 123 +# Centaurus +Rigil Kent ,alCen,ICRS,14,39,36.20,-60,50,08.2,-24.0533333333333,68.6,-22.3,0.742, -0.01,-60, 5483 +Rigel Kentaurus,alCen,ICRS,14,39,36.20,-60,50,08.2,-24.0533333333333,68.6,-22.3,0.742, -0.01,-60, 5483 +Toliman ,alCen,ICRS,14,39,36.20,-60,50,08.2,-24.0533333333333,68.6,-22.3,0.742, -0.01,-60, 5483 +Bungula ,alCen,ICRS,14,39,36.20,-60,50,08.2,-24.0533333333333,68.6,-22.3,0.742, -0.01,-60, 5483 +Hadar ,beCen,ICRS,14,03,49.4045,-60,22,22.942,-0.2264,-2.506,5.9,0.00621, 0.61,-59, 5365 +Agena ,beCen,ICRS,14,03,49.4045,-60,22,22.942,-0.2264,-2.506,5.9,0.00621, 0.61,-59, 5365 +Muhlifain ,gaCen,ICRS,12,41,31.0386,-48,57,35.598,-1.24853333333333,-0.12,-5.5,0.02501, 2.17,-48, 7597 + ,deCen,ICRS,12,08,21.4998,-50,43,20.732,-0.316866666666667,-0.642,11,0.00825, 2.60,-50, 6697 +Birdun ,epCen,ICRS,13,39,53.2584,-53,27,59.018,-0.0973333333333333,-1.279,3.0,0.00868, 2.30,-52, 6655 + ,zeCen,ICRS,13,55,32.3857,-47,17,18.150,-0.380933333333333,-4.475,6.5,0.00848, 2.55,-46, 8949 + ,etCen,ICRS,14,35,30.4238,-42,09,28.168,-0.2354,-3.244,-.2,0.01057, 2.31,-41, 8917 +Menkent ,thCen,ICRS,14,06,40.9485,-36,22,11.836,-3.462,-51.786,1.3,0.05352, 2.06,-35, 9260 +Alhakim ,ioCen,ICRS,13,20,35.8176,-36,42,44.262,-2.27173333333333,-8.798,.1,0.05564, 2.75,-36, 8497 +Ke Kwan ,kaCen,ICRS,14,59,09.6851,-42,06,15.098,-0.1184,-2.133,8.0,0.00605, 3.13,-41, 9342 +Ma Ti ,laCen,ICRS,11,35,46.8847,-63,01,11.430,-0.2256,-0.687,-1.4,0.00796, 3.13,-62, 2127 +Mati ,laCen,ICRS,11,35,46.8847,-63,01,11.430,-0.2256,-0.687,-1.4,0.00796, 3.13,-62, 2127 + ,muCen,ICRS,13,49,36.9890,-42,28,25.434,-0.159,-1.922,9.1,0.00619, 3.04,-41, 8172 +Kabkent Secunda,nuCen,ICRS,13,49,30.2771,-41,41,15.753,-0.1734,-2.038,9.0,0.00687, 3.39,0, 0 + ,xi-2Cen,ICRS,13,06,54.6393,-49,54,22.486,-0.174933333333333,-1.243,14.3,0.00792, 4.27,-49, 7644 + ,piCen,ICRS,11,21,00.4067,-54,29,27.669,-0.235466666666667,-0.22,9.4,0.01015, 3.89,-53, 4498 + ,siCen,ICRS,12,28,02.3819,-50,13,50.286,-0.2166,-1.241,8,0.00736, 3.91,-49, 7115 +Kabkent Tertia,phCen,ICRS,13,58,16.2661,-42,06,02.712,-0.1578666667,-1.982,5.7,0.00701, 3.806,0, 0 + ,psCen,ICRS,14,20,33.4316,-37,53,07.061,-0.43,-1.139,-5,0.01319, 4.05,-37, 9336 +Proxima Centauri,V645 Cen,ICRS,14,29,42.9487,-62,40,46.141,-25.1693333333333,76.933,-3775.40,0.77233, 11.01, 00, 0000 +# Cepheus +Alderamin ,alCep,ICRS,21,18,34.7715,62,35,08.061,0.9994,4.827,-10,0.06684, 2.44, 61, 2111 +Alphirk ,beCep,ICRS,21,28,39.5971,70,33,38.578,0.084,0.873,-8.2,0.00548, 3.23, 69, 1173 +Alfirk ,beCep,ICRS,21,28,39.5971,70,33,38.578,0.084,0.873,-8.2,0.00548, 3.23, 69, 1173 +Alrai ,gaCep,ICRS,23,39,20.8490,77,37,56.193,-0.325666666666667,12.719,-42.4,0.0725, 3.21, 76, 928 +Errai ,gaCep,ICRS,23,39,20.8490,77,37,56.193,-0.325666666666667,12.719,-42.4,0.0725, 3.21, 76, 928 +Alradif ,deCep,ICRS,22,29,10.2663,58,24,54.715,0.1098,0.355,-16.8,0.00332, 3.75, 57, 2548 +Alredif ,deCep,ICRS,22,29,10.2663,58,24,54.715,0.1098,0.355,-16.8,0.00332, 3.75, 57, 2548 +Phicares ,epCep,ICRS,22,15,02.1899,57,02,36.912,3.1763333333,4.999,-0.6,0.03886, 4.19, 0, 0 +Phicareus ,epCep,ICRS,22,15,02.1899,57,02,36.912,3.1763333333,4.999,-0.6,0.03886, 4.19, 0, 0 +Kurhah ,zeCep,ICRS,22,10,51.2767,58,12,04.539,0.089,0.449,-18.4,0.00449, 3.35, 57, 2475 +Alagemin ,etCep,ICRS,20,45,17.3750,61,50,19.615,0.573933333333333,81.798,-87.3,0.06973, 3.43, 61, 2050 +Alkidr ,thCep,ICRS,20,29,34.8851,62,59,38.778,0.3,-1.331,-6.8,0.02404, 4.22, 62, 1821 +Alvahet ,ioCep,ICRS,22,49,40.8166,66,12,01.468,-0.440666666666667,-12.474,-12.4,0.02827, 3.52, 65, 1814 + ,kaCep,ICRS,20,08,53.3469,77,42,41.110,0.0740666666666667,2.372,-22.8,0.00997, 4.39, 77, 764 +Erakis ,muCep,ICRS,21,43,30.4609,58,46,48.166,0.0349333333333333,-0.288,19.3,0.00062, 4.08, 58, 2316 +The Garnet Star,muCep,ICRS,21,43,30.4609,58,46,48.166,0.0349333333333333,-0.288,19.3,0.00062, 4.08, 58, 2316 + ,nuCep,ICRS,21,45,26.9255,61,07,14.901,-0.0205333333333333,-0.186,-20.8,0.00064, 4.29, 60, 2288 +Kurdah ,xiCep,ICRS,22,03,47.4539,64,37,40.697,1.42973333333333,8.929,-7.2,0.03207, 4.26, 63, 1802 +Alkurhah ,xiCep,ICRS,22,03,47.4539,64,37,40.697,1.42973333333333,8.929,-7.2,0.03207, 4.26, 63, 1802 +Al Kalb al Rai,rhCep,ICRS,22,29,52.9786, 78,49,27.425, 0.7747, -2.167, 1.0,0.01375, 5.50, 78, 801 +# Cetus +Menkar ,alCet,ICRS,03,02,16.7721,04,05,23.042,-0.0787333333333333,-7.876,-26.1,0.01482, 2.53, 03, 419 +Diphda ,beCet,ICRS,00,43,35.3711,-17,59,11.777,1.55193333333333,3.271,13.0,0.03404, 2.04,-18, 115 +Difda ,beCet,ICRS,00,43,35.3711,-17,59,11.777,1.55193333333333,3.271,13.0,0.03404, 2.04,-18, 115 +Kaffaljidhma ,gaCet,ICRS,02,43,18.0390,03,14,08.947,-0.9762,-14.527,-5.1,0.03978, 3.47, 02, 422 +Phycochroma ,deCet,ICRS,02,39,28.9567,00,19,42.638,0.0962666666666667,-0.253,13.0,0.00504, 4.07,-00, 406 +Baten Kaitos ,zeCet,ICRS,01,51,27.6336,-10,20,06.136,0.258533333333333,-3.804,9.0,0.01259, 3.73,-11, 359 +Deneb Algenubi,etCet,ICRS,01,08,35.3916,-10,10,56.151,1.43873333333333,-13.833,11.5,0.02773, 3.45,-10, 240 +Altawk ,thCet,ICRS,01,24,01.4050,-08,10,59.724,-0.522533333333333,-20.688,17.2,0.02848, 3.60,-08, 244 +Deneb Kaitos ,ioCet,ICRS,00,19,25.6745,-08,49,26.117,-0.0958,-3.784,18.6,0.01126, 3.56,-09, 48 +Shemali ,ioCet,ICRS,00,19,25.6745,-08,49,26.117,-0.0958,-3.784,18.6,0.01126, 3.56,-09, 48 + ,ka-1Cet,ICRS,03,19,21.6960,03,22,12.712,1.79246666666667,9.353,19.9,0.10918, 4.83, 02, 518 +Menkar ,laCet,ICRS,02,59,42.9018,08,54,26.513,0.0614666666666667,-1.492,10.2,0.00769, 4.70, 08, 455 + ,muCet,ICRS,02,44,56.5423,10,06,50.925,1.90106666666667,-3.04,30.4,0.03871, 4.27, 09, 359 + ,nuCet,ICRS,02,35,52.4721,05,35,35.687,-0.1926,-2.276,5.0,0.00877, 4.86, 04, 418 + ,xi-1Cet,ICRS,02,12,59.9955,08,50,48.182,-0.174866666666667,-1.44,-4.2,0.00901, 4.37, 08, 345 + ,xi-2Cet,ICRS,02,28,09.5425,08,27,36.193,0.278133333333333,-1.446,11.2,0.01853, 4.28, 07, 388 +Mira ,omiCet,ICRS,02,19,20.7927,-02,58,39.513,0.0688666666666667,-23.948,63.8,0.00779, 3.04,-03, 353 +Al Sadr al Ketus,piCet,ICRS,02,44,07.3499,-13,51,31.307,-0.0505333333333333,-0.84,15.4,0.0074, 4.25,-14, 519 + ,rhCet,ICRS,02,25,57.0053,-12,17,25.727,-0.0780666666666667,-1.137,10,0.00617, 4.89,-12, 451 + ,siCet,ICRS,02,32,05.2283,-15,14,40.837,-0.539466666666667,-14.684,-29.4,0.03873, 4.75,-15, 449 + ,taCet,ICRS,01,44,04.0829,-15,56,14.928,-11.4796,85.417,-16.4,0.27418, 3.50,-16, 295 +Abyssus Aqueus,upCet,ICRS,02,00,00.3079,-21,04,40.194,0.886733333333333,-2.453,18.0,0.01084, 4.00,-21, 358 +Al Nitham ,ph-1Cet,ICRS,00,44,11.4013,-10,36,34.382,-0.0464,-11.388,0.6,0.01554, 4.775,-11, 153 + ,ph-2Cet,ICRS,00,50,07.5910,-10,38,39.572,-1.4978,-22.844,7.7,0.06469, 5.19,-11, 153 + ,chCet,ICRS,01,49,35.1027,-10,41,11.077,-0.992666666666667,-9.447,-.9,0.04235, 4.67,-11, 352 +# Chameleon + ,beCha,ICRS,12,18,20.8242,-79,18,44.063,-0.2538,1.2,23,0.01205, 4.26,-78, 741 + ,gaCha,ICRS,10,35,28.1062,-78,36,28.029,-0.253333333333333,1.153,-22.4,0.00789, 4.11,-77, 622 + ,de-2Cha,ICRS,10,45,47.0033,-80,32,24.676,-0.248866666666667,0.619,22.6,0.00897, 4.45,-79, 556 + ,etCha,ICRS,08,41,19.5122,-78,57,48.094,-0.1954,2.758,14,0.01032, 5.47,-78, 372 + ,thCha,ICRS,08,20,38.5405,-77,29,04.118,-0.8606,4.078,21.7,0.02122, 4.35,-77, 383 + ,piCha,ICRS,11,37,15.6355,-75,53,47.558,-0.854733333333333,-0.121,-9.8,0.02375, 5.74,-75, 744 +# Circinus + ,alCir,ICRS,14,42,30.4194,-64,58,30.499,-1.28426666666667,-23.406,7.2,0.06097, 3.19,-64, 2977 + ,beCir,ICRS,15,17,30.8494,-58,48,04.349,-0.655933333333333,-13.546,9.6,0.03375, 4.07,-58, 5875 +# Canis Major +Sirius ,alCMa,ICRS,06,45,08.9173,-16,42,58.017,-3.64033333333333,-122.314,-7.6,0.37921, -1.46,-16, 1591 +Mirzam ,beCMa,ICRS,06,22,41.9853,-17,57,21.304,-0.023,-0.047,33.7,0.00653, 1.98,-17, 1467 +Murzim ,beCMa,ICRS,06,22,41.9853,-17,57,21.304,-0.023,-0.047,33.7,0.00653, 1.98,-17, 1467 +Muliphein ,gaCMa,ICRS,07,03,45.4927,-15,37,59.830,-0.0054,-1.12,32,0.00811, 4.11,-15, 1625 +Isis ,gaCMa,ICRS,07,03,45.4927,-15,37,59.830,-0.0054,-1.12,32,0.00811, 4.11,-15, 1625 +Wezen ,deCMa,ICRS,07,08,23.4843,-26,23,35.519,-0.0183333333333333,0.333,34.3,0.00182, 1.86,-26, 3916 +Adara ,epCMa,ICRS,06,58,37.5485,-28,58,19.501,0.0175333333333333,0.229,27.3,0.00757, 1.50,-28, 3666 +Adhara ,epCMa,ICRS,06,58,37.5485,-28,58,19.501,0.0175333333333333,0.229,27.3,0.00757, 1.50,-28, 3666 +Furud ,zeCMa,ICRS,06,20,18.7925,-30,03,48.122,0.0533333333333333,0.381,32.2,0.0097, 3.02,-30, 3038 +Aludra ,etCMa,ICRS,07,24,05.7025,-29,18,11.173,-0.0250666666666667,0.666,41.1,0.00102, 2.44,-29, 4328 + ,kaCMa,ICRS,06,49,50.4591,-32,30,30.520,-0.0612,0.404,14,0.00413, 3.96,-32, 3404 + ,xi-2CMa,ICRS,06,35,03.3882,-22,57,53.255,0.0874,1.652,26,0.00792, 4.54,-22, 1458 + ,omi-2CMa,ICRS,07,03,01.4726,-23,49,59.847,-0.0104,0.428,48.4,0.00127, 3.03,-23, 4797 + ,siCMa,ICRS,07,01,43.1477,-27,56,05.389,-0.0400666666666667,0.464,21.5,0.00268, 3.46,-27, 3544 + ,thCMa,ICRS,06,54,11.3978,-12,02,19.060,-0.926933333333333,-1.447,97.3,0.01294, 4.07,-11, 1681 +# Canis Minor +Procyon ,alCMi,ICRS,07,39,18.1183,05,13,29.975,-4.7772,-103.46,-3.2,0.28593, 0.38, 05, 1739 +Gomeisa ,beCMi,ICRS,07,27,09.0427,08,17,21.536,-0.3352,-3.845,22,0.01916, 2.90, 08, 1774 + ,zeCMi,ICRS,07,51,41.9887,01,46,00.726,-0.0931333333333333,-0.378,32.3,0.00776, 5.14, 02, 1808 +# Cancer +Acubens ,alCnc,ICRS,08,58,29.2217,11,51,27.723,0.276333333333333,-2.922,-13.8,0.01879, 4.25, 12, 1948 +Al Tarf ,beCnc,ICRS,08,16,30.9206,09,11,07.961,-0.312,-4.865,22.3,0.01123, 3.52, 09, 1917 +Asellus Borealis ,gaCnc,ICRS,08,43,17.1461,21,28,06.602,-0.712933333333333,-3.925,28.7,0.02058, 4.67, 21, 1895 +Asellus Australis,deCnc,ICRS,08,44,41.0996,18,09,15.511,-0.114,-22.846,17.1,0.02397, 3.94, 18, 2027 +Tegmen ,zeCnc,ICRS,08,12,12.851, 17,38,52.75,0.49533,-11.90,-5.7,0.0417, 5.60, 18, 1867 +Tegmine ,zeCnc,ICRS,08,12,12.851, 17,38,52.75,0.49533,-11.90,-5.7,0.0417, 5.60, 18, 1867 + ,etCnc,ICRS,08,32,42.4969,20,26,28.183,-0.297666666666667,-4.471,23.8,0.01046, 5.33, 20, 2109 +Decapoda ,ioCnc,ICRS,08,46,41.8205, 28,45,35.634,-0.13793, -4.395, 15.7,0.01094, 4.02, 29, 1824 + ,kaCnc,ICRS,09,07,44.8123,10,40,05.488,-0.135733333333333,-0.996,24.2,0.00674, 5.24, 11, 1984 + ,xiCnc,ICRS,09,09,21.5337,22,02,43.604,-0.0032,-0.07,-7.4,0.00857, 5.14, 22, 2061 + ,si-3Cnc,ICRS,08,59,32.6539,32,25,06.813,-0.295533333333333,-3.461,23.3,0.01019, 5.20, 32, 1821 + ,chCnc,ICRS,08,20,03.8603,27,13,03.745,-0.122533333333333,-37.625,32.5,0.05517, 5.14, 27, 1589 + ,ome-1Cnc,ICRS,08,00,55.8737,25,23,34.209,0.118533333333333,0.649,1.9,0.0029, 5.88, 25, 1812 +# Columba +Phact ,alCol,ICRS,05,39,38.9399,-34,04,26.788,-0.000666666666666667,-2.405,35,0.01216, 2.64,-34, 2375 +Wazn ,beCol,ICRS,05,50,57.5929,-35,46,05.911,0.3716,40.466,88.9,0.03794, 3.12,-35, 2546 +Ghusn al Zaitun,deCol,ICRS,06,22,06.8283,-33,26,11.040,-0.16466666667,-5.248,-2.6,0.01375, 3.853,0, 0 + ,gaCol,ICRS,05,57,32.2100,-35,16,59.807,-0.0176666666666667,1.119,24.2,0.00382, 4.36,-35, 2612 + ,etCol,ICRS,05,59,08.8053,-42,48,54.488,0.123533333333333,-1.145,17.0,0.00614, 3.96,-42, 2266 +Al Kurud ,kaCol,ICRS,06,16,33.1357,-35,08,25.867,0.0026,8.758,24.2,0.01783, 4.37,-35, 2800 +Tsze ,laCol,ICRS,05,53,06.8812,-33,48,04.899,-0.0301333333333333,3.24,30.0,0.00955, 4.87,-33, 2599 + ,omiCol,ICRS,05,17,29.0900,-34,53,42.747,0.624733333333333,-33.653,21.1,0.02963, 4.83,-35, 2214 +# Coma Berenices +Diadem ,alCom,ICRS,13,09,59.2766,17,31,45.953,-2.97306666666667,12.969,-17.7,0.06981, 5.22, 18, 2697 +Aldafirah ,beCom,ICRS,13,11,52.3935,27,52,41.459,-5.34633333333333,88.268,6.1,0.10923, 4.26, 28, 2193 +Kissin ,gaCom,ICRS,12,26,56.2723,28,16,06.322,-0.556066666666667,-8.099,3.9,0.01918, 4.36, 29, 2288 +# Corona Borealis +Alphecca ,alCrB,ICRS,15,34,41.2681,26,42,52.895,0.802533333333333,-8.944,1.7,0.04365, 2.23, 27, 2512 +Alphekka ,alCrB,ICRS,15,34,41.2681,26,42,52.895,0.802533333333333,-8.944,1.7,0.04365, 2.23, 27, 2512 +Gemma ,alCrB,ICRS,15,34,41.2681,26,42,52.895,0.802533333333333,-8.944,1.7,0.04365, 2.23, 27, 2512 +Nusakan ,beCrB,ICRS,15,27,49.7308,29,06,20.530,-1.20926666666667,8.684,-18.7,0.0286, 3.68, 29, 2670 + ,epCrB,ICRS,15,57,35.2518,26,52,40.368,-0.510333333333333,-6.024,-30.5,0.0142, 4.15, 27, 2558 + ,thCrB,ICRS,15,32,55.7825,31,21,32.880,-0.1308,-0.894,-25,0.01049, 4.14, 31, 2750 + ,kaCrB,ICRS,15,51,13.9315,35,39,26.575,-0.0538,-34.741,-24.0,0.03213, 4.82, 36, 2652 +The Blaze Star,taCrB,ICRS,16,08,58.2990,36,29,27.399,-0.2714,34.347,-18.6,0.02884, 4.76, 36, 2699 +# Corona Australis +Alfecca Meridiana,alCrA,ICRS,19,09,28.3417,-37,54,16.108,0.571533333333333,-9.665,-18.4,0.02515, 4.11,-38,13350 + ,et-1CrA,ICRS,18,48,50.4902,-43,40,48.171,0.1626,-2.084,-4,0.0094, 5.49,-43,12841 + ,thCrA,ICRS,18,33,30.1857,-42,18,45.035,0.216533333333333,-2.103,-2.1,0.00376, 4.64,-42,13378 +# Crater +Alkes ,alCrt,ICRS,10,59,46.4647,-18,17,55.620,-3.08253333333333,12.911,46.8,0.01871, 4.08,-17, 3273 +Alsharasif ,beCrt,ICRS,11,11,39.4893,-22,49,33.050,0.0315333333333333,-9.906,4.73,0.01226, 4.48,-22, 3095 + ,gaCrt,ICRS,11,24,52.9238,-17,41,02.435,-0.646733333333333,0.322,1,0.0389, 4.08,-16, 3244 +Labrum ,deCrt,ICRS,11,19,20.4475,-14,46,42.749,-0.8298,20.661,-5.2,0.01675, 3.56,-13, 3345 + ,epCrt,ICRS,11,24,36.5911,-10,51,33.564,-0.160933333333333,2.446,3.1,0.00895, 4.895,0, 0 + ,etCrt,ICRS,11,56,00.9536,-17,09,02.983,-0.327133333333333,-0.823,15,0.01142, 5.18,-16, 3358 + ,thCrt,ICRS,11,36,40.9134,-09,48,08.089,-0.395466666666667,0.282,1,0.0107, 4.70,-08, 3202 + ,zeCrt,ICRS,11,44,45.7756,-18,21,02.428,0.181,-2.456,-4.6,0.00931, 4.73,-17, 3460 +# Crux +#Acrux ,al-1Cru,ICRS,12,26,35.871,-63,05,56.58,-0.235333333333333,-1.2,-11.2,0, 1.4,-62, 2745 # one star of a binary system +Acrux ,alCru,ICRS,12,26,35.8958,-63,05,56.73,-0.2358,-1.473,0, 0.01017, 0.81,-62, 2745 # binary star system +Mimosa ,beCru,ICRS,12,47,43.2631,-59,41,19.549,-0.3216,-1.282,15.6,0.00925, 1.25,-59, 4451 +Gacrux ,gaCru,ICRS,12,31,09.9593,-57,06,47.562,0.186266666666667,-26.433,21.4,0.03709, 1.63,-56, 5272 +Decrux ,deCru,ICRS,12,15,08.7157,-58,44,56.140,-0.244533333333333,-1.072,22.2,0.00896, 2.80,-58, 4189 +Juxta Crucem ,epCru,ICRS,12,21,21.6093,-60,24,04.128,-1.1404,9.82,-4.6,0.01430, 3.59,0, 0 +# Corvus +Alchiba ,alCrv,ICRS,12,08,24.8170,-24,43,43.952,0.667866666666667,-3.933,4.4,0.06771, 4.02,-24,10174 +Alchita ,alCrv,ICRS,12,08,24.8170,-24,43,43.952,0.667866666666667,-3.933,4.4,0.06771, 4.02,-24,10174 +Kraz ,beCrv,ICRS,12,34,23.2346,-23,23,48.333,0.00573333333333333,-5.6,-7.6,0.02334, 2.65,-22, 3401 +Gienah Corvi ,gaCrv,ICRS,12,15,48.3702,-17,32,30.946,-1.06386666666667,2.231,-4.2,0.01978, 2.59,-16, 3424 +Algorab ,deCrv,ICRS,12,29,51.8554,-16,30,55.557,-1.3998,-13.93,9,0.03711, 2.95,-15, 3482 +Minkar ,epCrv,ICRS,12,10,07.4807,-22,37,11.159,-0.4768,1.055,4.9,0.01075, 3.00,-21, 3487 +Avis Satyra ,etCrv,ICRS,12,32,04.2270,-16,11,45.627,-2.8291333333,-5.841,-3.5,0.05492, 4.31,0, 0 +# Canes Venatici +Cor Caroli ,al-2CVn,ICRS,12,56,01.6674,38,19,06.167,-1.5562,5.498,-3.3,0.0296, 2.90, 39, 2580 +Asterion ,beCVn,ICRS,12,33,44.5446,41,21,26.927,-4.7004,29.291,6.9,0.11946, 4.26, 42, 2321 +Chara ,beCVn,ICRS,12,33,44.5446,41,21,26.927,-4.7004,29.291,6.9,0.11946, 4.26, 42, 2321 +# Cygnus +Deneb ,alCyg,ICRS,20,41,25.9147,45,16,49.217,0.0104,0.155,-4.5,0.00101, 1.25, 44, 3541 +Albireo ,be-1Cyg,ICRS,19,30,43.2806,27,57,34.852,-0.0472666666666667,-0.563,-24.0,0.00846, 3.24, 27, 3410 +Sador ,gaCyg,ICRS,20,22,13.7019,40,15,24.045,0.0162,-0.093,-7.5,0.00214, 2.20, 39, 4159 +Sadir ,gaCyg,ICRS,20,22,13.7019,40,15,24.045,0.0162,-0.093,-7.5,0.00214, 2.20, 39, 4159 +Sadr ,gaCyg,ICRS,20,22,13.7019,40,15,24.045,0.0162,-0.093,-7.5,0.00214, 2.20, 39, 4159 +Ruc ,deCyg,ICRS,19,44,58.4779,45,07,50.915,0.28813333,4.844,-20.1,0.01907, 2.90, 0, 0 +Rukh ,deCyg,ICRS,19,44,58.4779,45,07,50.915,0.28813333,4.844,-20.1,0.01907, 2.90, 0, 0 +Urakhga ,deCyg,ICRS,19,44,58.4779,45,07,50.915,0.28813333,4.844,-20.1,0.01907, 2.90, 0, 0 +Al Fawaris ,deCyg,ICRS,19,44,58.4779,45,07,50.915,0.28813333,4.844,-20.1,0.01907, 2.90, 0, 0 +Gienah Cygni ,epCyg,ICRS,20,46,12.6827,33,58,12.922,2.37446666666667,33.028,-10.6,0.04526, 2.46, 33, 4018 +Gienah Ghurab,epCyg,ICRS,20,46,12.6827,33,58,12.922,2.37446666666667,33.028,-10.6,0.04526, 2.46, 33, 4018 + ,zeCyg,ICRS,21,12,56.1862,30,13,36.897,0.0458,-6.812,17.4,0.02162, 3.20, 29, 4348 + ,etCyg,ICRS,19,56,18.3719,35,05,00.325,-0.226666666666667,-2.76,-26.5,0.0234, 3.89, 34, 3798 + ,thCyg,ICRS,19,36,26.53,50,13,15.9,-0.0543333333333333,26.299,-28.0,0.05378, 4.48, 49, 3062 + ,io-2Cyg,ICRS,19,29,42.3591,51,43,47.204,0.139466666666667,12.812,-19.5,0.02663, 3.79, 51, 2605 + ,kaCyg,ICRS,19,17,06.1688,53,22,06.454,0.401466666666667,12.293,-29.3,0.02648, 3.77, 53, 2216 + ,nuCyg,ICRS,20,57,10.4183,41,10,01.688,0.0567333333333333,-2.397,-27.6,0.00917, 3.94, 40, 4364 + ,xiCyg,ICRS,21,04,55.8628,43,55,40.267,0.0573333333333333,0.035,-19.7,0.00277, 3.72, 43, 3800 +Azelfafage ,pi-1Cyg,ICRS,21,42,05.6646,51,11,22.639,0.035,-0.211,-8.2,0.00194, 4.67, 50, 3410 + ,pi-2Cyg,ICRS,21,46,47.6091,49,18,34.453,0.0240666666666667,-0.186,-12.3,0.00282, 4.23, 48, 3504 + ,rhCyg,ICRS,21,33,58.8525,45,35,30.615,-0.1632,-9.388,6.9,0.0262, 4.02, 44, 3865 + ,siCyg,ICRS,21,17,24.9529,39,23,40.853,0.00286666666666667,-0.361,-4.1,0.00072, 4.23, 38, 4431 + ,upCyg,ICRS,21,17,55.0764,34,53,48.832,0.0797333333333334,0.685,4,0.00362, 4.43, 34, 4371 +Ruchbah I ,ome-1Cyg,ICRS,20,30,03.5407,48,57,05.648,0.0667333333333333,0.764,-22,0.00375, 4.95, 48, 3142 +Ruchbah II ,ome-2Cyg,ICRS,20,31,18.8163,49,13,13.070,0.0586,-3.128,-64.0,0.00807, 5.44, 48, 3154 + ,61Cyg,ICRS,21,06,54.6,38,44,45,27.5536666666667,320.178,4133.05,4.13305, 5.21, 38, 4343 +# Delphinus +Sualocin ,alDel,ICRS,20,39,38.2874,15,54,43.459,0.360933333333333,0.791,-3.4,0.01355, 3.77, 15, 4222 +Rotanev ,beDel,ICRS,20,37,32.9411,14,35,42.313,0.788533333333333,-4.765,-22.7,0.03349, 3.64, 14, 4369 + ,ga-2Del,ICRS,20,46,39.5023,16,07,27.466,-0.172533333333333,-19.627,-6.5,0.03214, 4.27, 15, 4255 + ,deDel,ICRS,20,43,27.5339,15,04,28.491,-0.130733333333333,-4.174,9.3,0.01603, 4.43, 14, 4403 +Deneb Dulphim,epDel,ICRS,20,33,12.7712,11,18,11.746,0.0716666666666667,-2.854,-19.3,0.00909, 4.03, 10, 4321 + ,kaDel,ICRS,20,39,07.7842,10,05,10.331,2.15726666666667,2.107,-52.0,0.03327, 5.05, 09, 4600 +# Dorado + ,alDor,ICRS,04,33,59.7775,-55,02,41.909,0.387066666666667,1.273,25.6,0.01856, 3.27,-55, 663 + ,beDor,ICRS,05,33,37.5177,-62,29,23.371,0.00706666666666667,1.256,7.2,0.00314, 3.40,-62, 487 + ,gaDor,ICRS,04,16,01.5857,-51,29,11.933,0.670466666666667,18.423,25.2,0.04926, 4.25,-51, 1066 + ,deDor,ICRS,05,44,46.3788,-65,44,07.893,-0.1892,0.612,-3,0.02248, 4.35,-65, 496 + ,zeDor,ICRS,05,05,30.6558,-57,28,21.734,-0.212466666666667,11.742,-2.0,0.08583, 4.72,-57, 735 + ,thDor,ICRS,05,13,45.4542,-67,11,06.918,0.1212,3.896,10.5,0.00597, 4.83,-67, 401 + ,nuDor,ICRS,06,08,44.2619,-68,50,36.274,-0.339333333333333,1.968,17.5,0.01178, 5.06,-68, 474 +# Draco +Thuban ,alDra,ICRS,14,04,23.3498,64,22,33.062,-0.3768,1.719,-13.0,0.01056, 3.647, 65, 978 +Alwaid ,beDra,ICRS,17,30,25.9620,52,18,04.994,-0.103933333333333,1.157,-20.0,0.00902, 2.79, 52, 2065 +Rastaban ,beDra,ICRS,17,30,25.9620,52,18,04.994,-0.103933333333333,1.157,-20.0,0.00902, 2.79, 52, 2065 +Eltanin ,gaDra,ICRS,17,56,36.3699,51,29,20.022,-0.0568,-2.305,-27.6,0.0221, 2.23, 51, 2282 +Etamin ,gaDra,ICRS,17,56,36.3699,51,29,20.022,-0.0568,-2.305,-27.6,0.0221, 2.23, 51, 2282 +Nodus II ,deDra,ICRS,19,12,33.3000,67,39,41.549,0.629933333333333,9.23,24.8,0.03254, 3.07, 67, 1129 +Altais ,deDra,ICRS,19,12,33.3000,67,39,41.549,0.629933333333333,9.23,24.8,0.03254, 3.07, 67, 1129 +Tyl ,epDra,ICRS,19,48,10.3521,70,16,04.549,0.534533333333333,3.902,3.1,0.0224, 3.99, 69, 1070 +Nodus I ,zeDra,ICRS,17,08,47.1956,65,42,52.860,-0.1384,1.915,-17,0.0096, 3.17, 65, 1170 +Aldhibah ,zeDra,ICRS,17,08,47.1956,65,42,52.860,-0.1384,1.915,-17,0.0096, 3.17, 65, 1170 +Alsafi ,thDra,ICRS,16,01,53.3457,58,33,54.905,-2.13386666666667,33.496,-8.5,0.04779, 4.01, 58, 1608 +Edasich ,ioDra,ICRS,15,24,55.7747,58,57,57.836,-0.0551333333333333,1.73,-10.7,0.03192, 3.29, 59, 1654 +Ed Asich ,ioDra,ICRS,15,24,55.7747,58,57,57.836,-0.0551333333333333,1.73,-10.7,0.03192, 3.29, 59, 1654 +Ketu ,kaDra,ICRS,12,33,28.9443,69,47,17.656,-0.3876,1.142,-11.4,0.00655, 3.87, 70, 703 +Giansar ,laDra,ICRS,11,31,24.2205,69,19,51.873,-0.274266666666667,-1.879,7.2,0.00976, 3.84, 70, 665 +Gianfar ,laDra,ICRS,11,31,24.2205,69,19,51.873,-0.274266666666667,-1.879,7.2,0.00976, 3.84, 70, 665 +Arrakis ,muDra,ICRS,17,05,20.1160,54,28,12.153,-0.44,7.386,-17.3,0.03708, 5.83, 54, 1857 +Kuma ,nu-1Dra,ICRS,17,32,10.5697,55,11,03.273,0.9902,5.424,-15.2,0.03296, 4.88, 55, 1944 +Kuma ,nu-2Dra,ICRS,17,32,16.0258,55,10,22.651,0.958066666666667,6.246,-16.0,0.03264, 4.87, 55, 1945 +Grumium ,xiDra,ICRS,17,53,31.7295,56,52,21.514,0.624333333333333,7.844,-25.8,0.02926, 3.75, 56, 2033 + ,omiDra,ICRS,18,51,12.0955,59,23,18.063,0.517066666666667,2.543,-19.5,0.01012, 4.66, 59, 1925 +Alsafi ,siDra,ICRS,19,32,21.5908,69,39,40.232,3.9884,-173.871,26.7,0.1734, 4.68, 69, 1053 +Athafi ,siDra,ICRS,19,32,21.5908,69,39,40.232,3.9884,-173.871,26.7,0.1734, 4.68, 69, 1053 + ,taDra,ICRS,19,15,33.0563,73,21,19.685,-0.777333333333333,10.425,-29.7,0.02173, 4.45, 73, 857 + ,upDra,ICRS,18,54,23.8547,71,17,49.891,0.323933333333333,4.211,-7.1,0.00947, 4.82, 71, 915 +Batentaban Borealis,chDra,ICRS,18,21,03.3826,72,43,58.235,3.54013333333333,-35.16,32.5,0.12411, 3.57, 72, 839 +Dziban ,ps-1Dra,ICRS,17,41,56.342, 72,08,55.89, 0.540, -26.72, -10.0,0.0460, 4.58, 72, 804 +Alathfar ,omeDra,ICRS,17,36,57.0921,68,45,28.691,0.00893333333333333,32.105,-14.0,0.04262, 4.80, 68, 949 +Al Athfar ,omeDra,ICRS,17,36,57.0921,68,45,28.691,0.00893333333333333,32.105,-14.0,0.04262, 4.80, 68, 949 +Aldhibain ,etDra,ICRS,16,23,59.4861,61,30,51.167,-0.1132,5.668,-14.3,0.03718, 2.763, 0, 0 +Batentaban Australis,phDra,ICRS,18,20,45.4304,71,20,16.132,-0.0394,3.579,-16.0,0.01128, 4.22, 0, 0 +# Equuleus +Kitalpha ,alEqu,ICRS,21,15,49.4317,05,14,52.241,0.397533333333333,-9.433,-16.2,0.01751, 3.92, 04, 4635 + ,gaEqu,ICRS,21,10,20.5001,10,07,53.686,0.327133333333333,-15.185,-17.0,0.02838, 4.69, 09, 4732 +# Eridanus +Achernar ,alEri,ICRS,01,37,42.8466,-57,14,12.327,0.5868,-4.008,16,0.02268, 0.46,-57, 334 +Cursa ,beEri,ICRS,05,07,50.9851,-05,05,11.206,-0.555933333333333,-7.544,-9.2,0.03671, 2.79,-05, 1162 +Zaurak ,gaEri,ICRS,03,58,01.7664,-13,30,30.655,0.4034,-11.134,61.7,0.01475, 2.95,-13, 781 +Rana ,deEri,ICRS,03,43,14.9018,-09,45,48.221,-0.6114,74.224,-6.1,0.11058, 3.54,-10, 728 + ,epEri,ICRS,03,32,55.8442,-09,27,29.744,-6.50906666666667,1.798,15.5,0.31074, 3.73,-09, 697 +Azha ,etEri,ICRS,02,56,25.6497,-08,53,53.320,0.5182,-21.999,-20.3,0.02449, 3.89,-09, 553 +Acamar ,th-1Eri,ICRS,02,58,15.696,-40,18,16.97,-0.297333333333333,1.9,11.9,0.028, 3.42,-40, 771 +Zibal ,zeEri,ICRS,03,15,50.0245,-08,49,11.027,-0.0254666666666667,4.552,-4,0.02718, 4.80,-09, 624 + ,ioEri,ICRS,02,40,40.0344,-39,51,19.352,0.901133333333333,-2.734,-9.3,0.02242, 4.11,-40, 689 + ,kaEri,ICRS,02,26,59.1223,-47,42,13.825,0.133133333333333,-0.544,27.7,0.00617, 4.25,-48, 637 + ,laEri,ICRS,05,09,08.7830,-08,45,14.691,0,-0.201,3,0.00186, 4.27,-08, 1040 + ,muEri,ICRS,04,45,30.1511,-03,15,16.767,0.115133333333333,-1.351,8.5,0.00613, 4.02,-03, 876 + ,nuEri,ICRS,04,36,19.1416,-03,21,08.853,0.0115333333333333,-0.454,14.9,0.00556, 3.93,-03, 834 + ,xiEri,ICRS,04,23,40.8523,-03,44,43.693,-0.319466666666667,-5.673,-11,0.01566, 5.17,-04, 818 +Beid ,omi-1Eri,ICRS,04,11,51.9402,-06,50,15.292,0.0794666666666667,8.128,11,0.02598, 4.04,-07, 764 +Keid ,omi-2Eri,ICRS,04,15,16.3201,-07,39,10.336,-14.9314,-342.034,-42.2,0.19825, 4.43,-07, 780 + ,phEri,ICRS,02,16,30.5853,-51,30,43.793,0.605,-2.19,10.2,0.02106, 3.56,-52, 285 +Angetenar ,ta-2Eri,ICRS,02,51,02.3215,-21,00,14.470,-0.26,-1.663,-8.6,0.01785, 4.75,-21, 509 + ,ta-3Eri,ICRS,03,02,23.5002,-23,37,28.098,-0.973066666666667,-5.576,-9.8,0.03785, 4.09,-24, 1387 + ,ta-5Eri,ICRS,03,33,47.2761,-21,37,58.378,0.2994,-2.747,14.0,0.01102, 4.26,-22, 628 + ,ta-6Eri,ICRS,03,46,50.8875,-23,14,59.002,-1.06573333333333,-52.854,6.5,0.05579, 4.23,-23, 1565 +Theemin ,up-2Eri,ICRS,04,35,33.0385,-30,33,44.429,-0.326133333333333,-1.275,-4.0,0.01562, 3.82,-30, 1901 + ,chEri,ICRS,01,55,57.4724,-51,36,32.025,4.54153333333333,28.426,-6.3,0.05719, 3.70,-52, 241 +Sceptrum ,53Eri,ICRS,04,38,10.8241,-14,18,14.471,-0.519066666666667,-17.806,41.8,0.02984, 3.87,-14, 933 +# Fornax +Fornacis ,alFor,ICRS,03,12,04.5277,-28,59,15.425,2.4766,61.228,-20.5,0.07086, 4.00,-29, 1177 + ,beFor,ICRS,02,49,05.4195,-32,24,21.232,0.579733333333333,15.896,16.8,0.01931, 4.46,-32, 1025 + ,deFor,ICRS,03,42,14.9027,-31,56,18.101,0.0344,1.423,26,0.00445, 5.00,-32, 1430 + ,kaFor,ICRS,02,22,32.5468,-23,48,58.774,1.3156,-0.439,18.4,0.0456, 5.20,-24, 1038 + ,la-1For,ICRS,02,33,07.0265,-34,38,59.881,-0.116066666666667,-1.794,13.0,0.00858, 5.88,-35, 877 + ,muFor,ICRS,02,12,54.4705,-30,43,25.771,0.102133333333333,0.715,10,0.00982, 5.28,-31, 882 + ,nuFor,ICRS,02,04,29.4385,-29,17,48.548,0.0837333333333333,0.854,18.5,0.00903, 4.69,-29, 706 + ,taFor,ICRS,03,38,47.6717,-27,56,34.995,0.143666666666667,2.585,39,0.00781, 6.08,-28, 1225 +# Gemini +Castor ,alGem,ICRS,07,34,35.8628,31,53,17.795,-1.37553333333333,-14.818,-206.33,0.06327, 1.58, 32, 1581 +Pollux ,beGem,ICRS,07,45,18.9503,28,01,34.315,-4.17126666666667,-4.596,3.3,0.09674, 1.14, 28, 1463 +Alhena ,gaGem,ICRS,06,37,42.7011,16,23,57.308,-0.0136,-6.692,-12.5,0.03112, 1.93, 16, 1223 +Almeisan ,gaGem,ICRS,06,37,42.7011,16,23,57.308,-0.0136,-6.692,-12.5,0.03112, 1.93, 16, 1223 +Wasat ,deGem,ICRS,07,20, 7.3775, 21,58,56.354,-0.1248,-0.776,4.1,0.05545, 3.53, 22, 1645 +Mebsuta ,epGem,ICRS,06,43,55.9260,25,07,52.047,-0.0395333333333333,-1.281,9.9,0.00361, 2.98, 25, 1406 +Mekbuda ,zeGem,ICRS,07,04,06.5318,20,34,13.069,-0.0381333333333333,-0.096,6.7,0.00279, 3.79, 20, 1687 +Propus etaGem,etGem,ICRS,06,14,52.6572,22,30,24.476,-0.416866666666667,-1.024,19.0,0.00934, 3.28, 22, 1241 +Nageba ,thGem,ICRS,06,52,47.3382,33,57,40.514,-0.0177333333333333,-4.767,21,0.01659, 3.60, 34, 1481 +Propus iotGem,ioGem,ICRS,07,25,43.5961,27,47,53.089,-0.808533333333333,-8.443,8.4,0.0259, 3.79, 28, 1385 +Al Krikab ,kaGem,ICRS,07,44,26.8542,24,23,52.773,-0.149666666666667,-5.624,20.6,0.02273, 3.57, 24, 1759 +Kebash ,laGem,ICRS,07,18,05.5787,16,32,25.379,-0.307266666666667,-3.79,-9.2,0.03459, 3.58, 16, 1443 +Alkibash ,laGem,ICRS,07,18,05.5787,16,32,25.379,-0.307266666666667,-3.79,-9.2,0.03459, 3.58, 16, 1443 +Tejat ,muGem,ICRS,06,22,57.6270,22,30,48.909,0.378933333333333,-10.879,54.8,0.01407, 2.88, 22, 1304 + ,nuGem,ICRS,06,28,57.7867,20,12,43.679,-0.0398666666666667,-1.408,39.4,0.00649, 4.15, 20, 1441 +Alzirr ,xiGem,ICRS,06,45,17.3647,12,53,44.128,-0.767733333333333,-19.091,25.3,0.05702, 3.36, 13, 1396 + ,piGem,ICRS,07,47,30.3235,33,24,56.509,-0.1254,-2.863,-12.0,0.0058, 5.14, 33, 1585 + ,rhGem,ICRS,07,29,06.7191,31,47,04.381,1.0622,19.382,-4.4,0.05406, 4.18, 32, 1562 + ,siGem,ICRS,07,43,18.7265,28,53,0.635,0.4122666666667,-23.126,45.8,0.02668, 4.28, 0, 0 + ,taGem,ICRS,07,11,08.3707,30,14,42.587,-0.206666666666,-4.840,21.83,0.01081, 4.398, 0, 0 + ,upGem,ICRS,07,35,55.3464,26,53,44.667,-0.263866666666667,-10.808,-20.6,0.01357, 4.06, 27, 1424 + ,phGem,ICRS,07,53,29.8143,26,45,56.818,-0.2268,-3.117,8.0,0.01282, 4.97, 27, 1499 + ,chGem,ICRS,08,03,31.0803,27,47,39.596,-0.1902,-3.525,-10.9,0.01266, 4.94, 28, 1532 + ,omeGem,ICRS,07,02,24.7805,24,12,55.604,-0.0430666666666667,-0.04,-8.5,0.00197, 5.18, 24, 1502 +# Grus +Alnair ,alGru,ICRS,22,08,13.9855,-46,57,39.512,0.850666666666667,-14.791,11.8,0.03216, 1.74,-47,14063 +Gruid ,beGru,ICRS,22,42,40.0507,-46,53,04.477,0.904533333333333,-0.451,1.6,0.01917, 2.11,-47,14308 +Al Dhanab ,gaGru,ICRS,21,53,55.7245,-37,21,53.468,0.6392,-1.21,-2.1,0.01607, 3.01,-37,14536 +Ras Alkurki ,gaGru,ICRS,21,53,55.7245,-37,21,53.468,0.6392,-1.21,-2.1,0.01607, 3.01,-37,14536 + ,de-1Gru,ICRS,22,29,16.1747,-43,29,44.033,0.1708,-0.423,4.9,0.01103, 3.97,-44,14931 + ,epGru,ICRS,22,48,33.2983,-51,19,00.710,0.723133333333333,-6.593,0,0.02516, 3.49,-51,13389 + ,zeGru,ICRS,23,00,52.8116,-52,45,14.893,-0.433933333333333,-1.291,-1.1,0.02899, 4.12,-53,10382 + ,ioGru,ICRS,23,10,21.5377,-45,14,48.161,0.8828,-2.627,-4.4,0.01763, 3.90,-45,14947 + ,laGru,ICRS,22,06,06.8854,-39,32,36.072,-0.161066666666667,-12.517,38.8,0.0132, 4.46,-40,14639 + ,nuGru,ICRS,22,28,39.2099,-39,07,54.450,0.248266666666667,-16.072,10.6,0.01242, 5.47,-39,14723 + ,omiGru,ICRS,23,26,36.5762,-52,43,17.770,0.221066666666667,13.007,18,0.03128, 5.54,-53,10461 +# Hercules +Ras Algethi ,alHer,ICRS,17,14,38.8584,14,23,25.198,-0.0447333333333333,3.278,-6.71,0.00853, 2.78, 14, 3207 +Rasalgethi ,alHer,ICRS,17,14,38.8584,14,23,25.198,-0.0447333333333333,3.278,-6.71,0.00853, 2.78, 14, 3207 +Kornephoros ,beHer,ICRS,16,30,13.1999,21,29,22.608,-0.6562,-1.449,-25.5,0.02207, 2.77, 21, 2934 +Rutilicus ,zeHer,ICRS,16,41,17.1603,31,36,09.812,-3.0842666666667,34.508,-69.9,0.09264, 3.539, 0, 0 + ,gaHer,ICRS,16,21,55.2144,19,09,11.269,-0.316266666666667,4.461,-35.3,0.01669, 3.75, 19, 3086 +Sarin ,deHer,ICRS,17,15,01.9106,24,50,21.135,-0.140933333333333,-15.768,-40.0,0.04155, 3.14, 25, 3221 +Kajam epsHer ,epHer,ICRS,17,00,17.3738,30,55,35.057,-0.317866666666667,2.689,-25.1,0.02004, 3.92, 31, 2947 +Sofian ,etHer,ICRS,16,42,53.7653,38,55,20.116,0.2372,-8.498,8.3,0.02911, 3.53, 39, 3029 +Rukbalgethi Genubi,thHer,ICRS,17,56,15.1805,37,15,01.941,0.0182666666666667,0.724,-27.2,0.00487, 3.86, 37, 2982 +Al Jathiyah ,ioHer,ICRS,17,39,27.8864,46,00,22.795,-0.0478,0.397,-20.0,0.00658, 3.80, 46, 2349 +Marsik ,kaHer,ICRS,16,08, 4.5255, 17,02,49.129,-0.2286,-0.546,-11.0,0.0084, 5.00, 17, 2964 +Marfik ,kaHer,ICRS,16,08, 4.5255, 17,02,49.129,-0.2286,-0.546,-11.0,0.0084, 5.00, 17, 2964 +Masym ,laHer,ICRS,17,30,44.3099,26,06,38.323,0.1226,1.678,-26.4,0.00888, 4.41, 26, 3034 +Maasym ,laHer,ICRS,17,30,44.3099,26,06,38.323,0.1226,1.678,-26.4,0.00888, 4.41, 26, 3034 +Melkarth ,muHer,ICRS,17,46,27.5269,27,43,14.434,-1.9428,-75.003,-15.6,0.11905, 3.42, 27, 2888 + ,xiHer,ICRS,17,57,45.8857,29,14,52.367,0.548866666666667,-1.873,-1.5,0.02412, 3.70, 29, 3156 + ,omiHer,ICRS,18,07,32.5507,28,45,44.959,-0.00113333333333333,0.751,-29.5,0.00939, 3.83, 28, 2925 +Fudail ,piHer,ICRS,17,15,02.8343,36,48,32.983,-0.182333333333333,0.27,-25.7,0.00889, 3.16, 36, 2844 + ,siHer,ICRS,16,34,06.1821,42,26,13.348,-0.0602,5.98,-10.9,0.01079, 4.20, 42, 2724 +Rukbalgethi Shemali,taHer,ICRS,16,19,44.4368,46,18,48.119,-0.0876666666666667,3.931,-13.8,0.01037, 3.89, 46, 2169 + ,phHer,ICRS,16,08,46.1779,44,56,05.662,-0.1732,3.586,-15.6,0.01427, 4.26, 45, 2376 + ,chHer,ICRS,15,52,40.5415,42,27,05.465,2.92673333333333,62.955,-55.4,0.06308, 4.62, 42, 2648 +Kajam omeHer ,omeHer,ICRS,16,25,24.9533,14,01,59.770,0.2626,-5.989,-5.9,0.01387, 4.57, 14, 3049 +Cujam ,omeHer,ICRS,16,25,24.9533,14,01,59.770,0.2626,-5.989,-5.9,0.01387, 4.57, 14, 3049 +Apex ,HerA*,1950,18,04,00.00 , 30,00,00.0 , 0.000, 0.00, 0.0,0.0000,999.99, 0, 0 +# Horologium + ,alHor,ICRS,04,14,00.1143,-42,17,39.725,0.279266666666667,-20.365,21.7,0.02785, 3.86,-42, 1425 + ,zeHor,ICRS,02,40,39.6129,-54,32,59.681,0.2184,0.524,-1.1,0.02049, 5.21,-55, 446 + ,laHor,ICRS,02,24,53.9107,-60,18,43.011,-0.473866666666667,-13.104,6,0.0204, 5.35,-60, 199 + ,muHor,ICRS,03,03,36.8195,-59,44,15.991,-0.4854,-6.389,17.3,0.02367, 5.11,-60, 236 +# Hydra +Alphard ,alHya,ICRS,09,27,35.2433,-08,39,30.969,-0.0966,3.325,-4.3,0.0184, 1.98,-08, 2680 +Cor Hydrae ,alHya,ICRS,09,27,35.2433,-08,39,30.969,-0.0966,3.325,-4.3,0.0184, 1.98,-08, 2680 + ,beHya,ICRS,11,52,54.5205,-33,54,29.248,-0.3868,0.240,-1.0,0.00893, 4.276,0, 0 +Cauda Hydrae ,gaHya,ICRS,13,18,55.2968,-23,10,17.444,0.456066666666667,-4.109,-5.4,0.02469, 3.00,-22, 3554 +Dhanab al Shuja,gaHya,ICRS,13,18,55.2968,-23,10,17.444,0.456066666666667,-4.109,-5.4,0.02469, 3.00,-22, 3554 +Mautinah ,deHya,ICRS,08,37,39.3662,05,42,13.614,-0.468466666666667,-0.699,11.3,0.01821, 4.16, 06, 2001 +Ashlesha ,epHya,ICRS,08,46,46.5106,06,25,07.713,-1.54026666667,-4.017,36.4,0.02413, 3.38, 0, 0 +Hydrobius ,zeHya,ICRS,08,55,23.6263,05,56,44.028,-0.665066666666667,1.465,22.8,0.02164, 3.11, 06, 2060 + ,etHya,ICRS,08,43,13.4752,03,23,55.184,-0.1276,-0.129,21.0,0.00699, 4.274, 0, 0 + ,thHya,ICRS,09,14,21.8590,02,18,51.409,0.750466666666667,-30.607,-10,0.02534, 3.88, 02, 2167 + ,ioHya,ICRS,09,39,51.3619,-01,08,34.117,0.318733333333333,-6.292,23.2,0.01183, 3.91,-00, 2231 + ,kaHya,ICRS,09,40,18.3633,-14,19,56.252,-0.175466666666667,-1.925,18,0.00633, 5.06,-13, 2917 + ,laHya,ICRS,10,10,35.2775,-12,21,14.699,-1.33553333333333,-10.028,19.4,0.02844, 3.61,-11, 2820 + ,muHya,ICRS,10,26,05.4267,-16,50,10.646,-0.856733333333333,-8.006,39.6,0.01314, 3.81,-16, 3052 +Pleura ,nuHya,ICRS,10,49,37.4884,-16,11,37.134,0.618466666666667,19.902,-1.2,0.02354, 3.11,-15, 3138 + ,xiHya,ICRS,11,33,00.1155,-31,51,27.451,-1.39393333333333,-4.16,-4.6,0.02523, 3.54,-31, 9083 + ,omiHya,ICRS,11,40,12.7891,-34,44,40.775,-0.2936,-0.184,5.9,0.00659, 4.70,-34, 7610 +Sataghni ,piHya,ICRS,14,06,22.2971,-26,40,56.500,0.287,-14.082,27.2,0.03217, 3.27,-26,10095 +Al Minliar al Shuja,siHya,ICRS,08,38,45.4377,03,20,29.167,-0.126866666666667,-1.629,24.5,0.00925, 4.44, 03, 2026 +Minchir ,siHya,ICRS,08,38,45.4377,03,20,29.167,-0.126866666666667,-1.629,24.5,0.00925, 4.44, 03, 2026 +Ukdah ,ta-1Hya,ICRS,09,29,08.8977,-02,46,08.270,0.672866666666667,-0.315,9.8,0.05848, 4.60,-02, 2901 +Ukdah ,ta-2Hya,ICRS,09,31,58.9281,-01,11,04.790,-0.0761333333333333,-0.387,5.6,0.00711, 4.57,-00, 2211 + ,up-1Hya,ICRS,09,51,28.6937,-14,50,47.771,0.1245333333333333,-2.188,-14.5,0.01192, 4.117,0, 0 + ,up-2Hya,ICRS,10,05,07.4700,-13,03,52.654,-0.249866666666667,1.99,28,0.01177, 4.60,-12, 3073 + ,ch-1Hya,ICRS,11,05,19.9074,-27,17,37.004,-1.2716,-0.687,17,0.02298, 4.94,-26, 8338 +# Hydrus + ,alHyi,ICRS,01,58,46.1935,-61,34,11.493,1.75026666666667,2.689,7,0.04574, 2.86,-62, 162 + ,beHyi,ICRS,00,25,45.0719,-77,15,15.284,14.7990666666667,32.528,22.7,0.13378, 2.80,-77, 16 + ,gaHyi,ICRS,03,47,14.3412,-74,14,20.264,0.340466666666667,11.527,15.8,0.01523, 3.24,-74, 276 + ,deHyi,ICRS,02,21,44.9427,-68,39,33.905,-0.3338,0.238,6,0.0241, 4.09,-69, 113 + ,epHyi,ICRS,02,39,35.3613,-68,16,01.006,0.582666666666667,0.056,6,0.02127, 4.11,-68, 161 + ,et-2Hyi,ICRS,01,54,56.1314,-67,38,50.292,0.506666666666667,7.317,-16.2,0.01504, 4.69,-68, 101 + ,thHyi,ICRS,03,02,15.4484,-71,54,08.844,0.1812,1.595,11.8,0.00621, 5.53,-72, 219 + ,ioHyi,ICRS,03,15,57.6605,-77,23,18.435,0.754666666666667,6.2,19.4,0.03402, 5.53,-77, 134 + ,kaHyi,ICRS,02,22,52.3051,-73,38,44.852,-0.543933333333333,1.184,22,0.01026, 5.01,-74, 194 + ,laHyi,ICRS,00,48,35.4173,-74,55,24.375,0.888066666666667,-3.459,9.5,0.01594, 5.07,-75, 64 + ,muHyi,ICRS,02,31,40.5442,-79,06,33.775,0.914266666666667,-5.442,-14.5,0.01118, 5.28,-79, 66 +# Indus + ,alInd,ICRS,20,37,34.0320,-47,17,29.406,0.328,6.607,-1.3,0.03221, 3.11,-47,13477 + ,beInd,ICRS,20,54,48.6031,-58,27,14.957,0.1404,-2.475,-4.9,0.00541, 3.65,-58, 7788 + ,gaInd,ICRS,21,26,15.4395,-54,39,37.654,0.00826666666666667,3.869,6.8,0.01568, 6.24,-55, 9586 + ,deInd,ICRS,21,57,55.0747,-54,59,33.272,0.286666666666667,-0.367,15,0.01765, 4.40,-55, 9733 + ,epInd,ICRS,22,03,21.6571,-56,47,09.514,26.4094,-253.833,-40.4,0.27579, 4.69,-57,10015 + ,etInd,ICRS,20,44,02.3337,-51,55,15.495,1.0366,-5.364,-1.6,0.04138, 4.51,-52,11752 + ,omiInd,ICRS,21,50,47.1841,-69,37,45.898,-0.165133333333333,-0.473,20.2,0.00584, 5.53,-70, 2873 + ,rhInd,ICRS,22,54,39.4833,-70,04,25.352,-0.287933333333333,7.32,-3.0,0.03771, 6.14,-70, 2971 +# Lacerta + ,alLac,ICRS,22,31,17.5010,50,16,56.969,0.9148,1.715,-4.0,0.03186, 3.77, 49, 3875 + ,beLac,ICRS,22,23,33.6235,52,13,44.567,-0.0904,-18.637,-10.4,0.01921, 4.43, 51, 3358 +# Leo +Regulus ,alLeo,ICRS,10,08,22.3107,11,58,01.945,-1.66266666666667,0.491,5.9,0.04209, 1.35, 12, 2149 +Denebola ,beLeo,ICRS,11,49,03.5776,14,34,19.417,-3.3268,-11.378,-.2,0.09016, 2.14, 15, 2383 +Algieba ,ga-1Leo,ICRS,10,19,58.427,19,50,28.53,1.966,-15.4,-36.7,0.02596, 2.61, 20, 2467 +Dhur ,deLeo,ICRS,11,14,06.5013,20,31,25.381,0.9554,-13.043,-20.2,0.05652, 2.56, 21, 2298 +Zosma ,deLeo,ICRS,11,14,06.5013,20,31,25.381,0.9554,-13.043,-20.2,0.05652, 2.56, 21, 2298 +Ras Elased Australis,epLeo,ICRS,09,45,51.0730,23,46,27.317,-0.307266666666667,-0.957,4.3,0.01301, 2.98, 24, 2129 +Adhafera ,zeLeo,ICRS,10,16,41.4169,23,25,02.318,0.132266666666667,-0.73,-15.6,0.01256, 3.44, 24, 2209 +Algieba ,etLeo,ICRS,10,07,19.9523,16,45,45.592,-0.0129333333333333,-0.053,3.3,0.00153, 3.52, 17, 2171 +Al Jabhah ,etLeo,ICRS,10,07,19.9523,16,45,45.592,-0.0129333333333333,-0.053,3.3,0.00153, 3.52, 17, 2171 +Tse Tseng ,ioLeo,ICRS,11,23,55.4523,10,31,46.231,0.938333333333333,-7.78,-10.3,0.04126, 3.94, 11, 2348 +Tsze Tseang ,ioLeo,ICRS,11,23,55.4523,10,31,46.231,0.938333333333333,-7.78,-10.3,0.04126, 3.94, 11, 2348 +Alminhar ,kaLeo,ICRS,09,24,39.2591,26,10,56.367,-0.207533333333333,-4.806,28.2,0.01528, 4.46, 26, 1939 +Al Minliar al Asad,kaLeo,ICRS,09,24,39.2591,26,10,56.367,-0.207533333333333,-4.806,28.2,0.01528, 4.46, 26, 1939 +Alterf ,laLeo,ICRS,09,31,43.2281,22,58,04.694,-0.1292,-3.904,26.7,0.00969, 4.31, 23, 2107 +Ras Elased Borealis,muLeo,ICRS,09,52,45.8173,26,00,25.025,-1.44193333333333,-5.492,13.8,0.02452, 3.88, 26, 2019 +Rasalas ,muLeo,ICRS,09,52,45.8173,26,00,25.025,-1.44193333333333,-5.492,13.8,0.02452, 3.88, 26, 2019 + ,xiLeo,ICRS,09,31,56.7388,11,17,59.376,-0.599466666666667,-8.4,29.4,0.01367, 4.97, 11, 2053 +Subra ,omiLeo,ICRS,09,41,09.0328,09,53,32.309,-0.9578,-3.745,-143.67,0.02412, 3.52, 10, 2044 +Shishimai ,siLeo,ICRS,11,21,08.1943,06,01,45.558,-0.611733333333333,-1.283,-5.3,0.01524, 4.05, 06, 2437 +Coxa ,thLeo,ICRS,11,14,14.4052,15,25,46.453,-0.3934,-7.937,7.6,0.01836, 3.34, 16, 2234 +Chertan ,thLeo,ICRS,11,14,14.4052,15,25,46.453,-0.3934,-7.937,7.6,0.01836, 3.34, 16, 2234 +Cestan ,thLeo,ICRS,11,14,14.4052,15,25,46.453,-0.3934,-7.937,7.6,0.01836, 3.34, 16, 2234 +Chort ,thLeo,ICRS,11,14,14.4052,15,25,46.453,-0.3934,-7.937,7.6,0.01836, 3.34, 16, 2234 + ,piLeo,ICRS,10,00,12.8066,08,02,39.203,-0.2004,-2.211,23.4,0.00621, 4.70, 08, 2301 +Shir ,rhLeo,ICRS,10,32,48.6719,09,18,23.708,-0.0371333333333333,-0.359,42.0,0.00057, 3.85, 10, 2166 + ,taLeo,ICRS,11,27,56.2400,02,51,22.555,0.115466666666667,-1.041,-9.1,0.00525, 4.95, 03, 2504 + ,upLeo,ICRS,11,36,56.9306,-00,49,25.495,0.00866666666666667,4.343,1.0,0.01831, 4.30,-00, 2458 + ,phLeo,ICRS,11,16,39.7009,-03,39,05.764,-0.721,-3.576,-3,0.01669, 4.47,-02, 3315 + ,chLeo,ICRS,11,05,01.0273,07,20,09.626,-2.29606666666667,-4.74,4.7,0.03454, 4.63, 08, 2455 + ,psLeo,ICRS,09,43,43.9046,14,01,18.091,0.0345333333333333,-0.613,7.7,0.00457, 5.35, 14, 2136 +# Lepus +Arneb ,alLep,ICRS,05,32,43.8159,-17,49,20.239,0.0218,0.154,23.9,0.00254, 2.58,-17, 1166 +Nihal ,beLep,ICRS,05,28,14.7232,-20,45,33.988,-0.0335333333333333,-8.592,-13.6,0.02049, 2.84,-20, 1096 + ,gaLep,ICRS,05,44,27.7904,-22,26,54.176,-1.94953333333333,-36.846,-9.7,0.11149, 3.60,-22, 1211 + ,deLep,ICRS,05,51,19.2957,-20,52,44.719,1.52633333333333,-64.793,99.3,0.02905, 3.81,-20, 1211 +Sasin ,epLep,ICRS,05,05,27.6643,-22,22,15.717,0.128466666666667,-7.235,1.0,0.01439, 3.19,-22, 1000 + ,zeLep,ICRS,05,46,57.3408,-14,49,19.020,-0.0989333333333333,-0.118,20,0.04647, 3.55,-14, 1232 + ,etLep,ICRS,05,56,24.2929,-14,10,03.721,-0.281533333333333,13.902,-2.4,0.06647, 3.71,-14, 1286 + ,laLep,ICRS,05,19,34.5245,-13,10,36.439,-0.0166,-0.474,20.2,0.00303, 4.29,-13, 1127 + ,muLep,ICRS,05,12,55.9009,-16,12,19.686,0.3044,-1.613,27.7,0.01769, 3.31,-16, 1072 +# Libra + ,al-1Lib,ICRS,14,50,41.1813,-15,59,50.053,-0.9062,-5.947,-23,0.04226, 5.15,-15, 3965 +Zubenelgenubi,al-2Lib,ICRS,14,50,52.7131,-16,02,30.401,-0.7046,-6.9,-10,0.04225, 2.75, -15, 3966 +Zuben Elgenubi,al-2Lib,ICRS,14,50,52.7131,-16,02,30.401,-0.7046,-6.9,-10,0.04225, 2.75, -15, 3966 +Zubeneshamali,beLib,ICRS,15,17,00.4148,-09,22,58.503,-0.6426,-2.076,-35.2,0.02038, 2.61,-08, 3935 +Zuben Eshamali,beLib,ICRS,15,17,00.4148,-09,22,58.503,-0.6426,-2.076,-35.2,0.02038, 2.61,-08, 3935 +Zubenelakrab ,gaLib,ICRS,15,35,31.5790,-14,47,22.333,0.4378,0.693,-27.5,0.02142, 3.91,-14, 4237 +Zuben Elakrab ,gaLib,ICRS,15,35,31.5790,-14,47,22.333,0.4378,0.693,-27.5,0.02142, 3.91,-14, 4237 +Zubenelakribi,deLib,ICRS,15,00,58.3486,-08,31,08.195,-0.441333333333333,-0.34,-38.7,0.01072, 4.92,-07, 3938 +Zuben Elakribi,deLib,ICRS,15,00,58.3486,-08,31,08.195,-0.441333333333333,-0.34,-38.7,0.01072, 4.92,-07, 3938 + ,ze-1Lib,ICRS,15,28,15.4082,-16,42,59.343,0.111066666666667,-3.336,-21.4,0.00359, 5.92,-16, 4089 + ,io-1Lib,ICRS,15,12,13.2901,-19,47,30.158,-0.237266666666667,-3.255,-11.6,0.00866, 4.54,-19, 4047 + ,kaLib,ICRS,15,41,56.7981,-19,40,43.781,-0.2214,-10.433,-3.8,0.00816, 4.74,-19, 4188 + ,laLib,ICRS,15,53,20.0586,-20,10,01.345,-0.0240666666666667,-1.9,6,0.00915, 5.03,-19, 4249 +Zubenhakrabi ,nuLib,ICRS,15,06,37.5962,-16,15,24.544,-0.242733333333333,-2.328,-15.1,0.00426, 5.20,-15, 4026 +Zuben Hakrabi ,nuLib,ICRS,15,06,37.5962,-16,15,24.544,-0.242733333333333,-2.328,-15.1,0.00426, 5.20,-15, 4026 + ,xi-2Lib,ICRS,14,56,46.1118,-11,24,34.922,0.0528666666666667,1.121,14.6,0.00606, 5.46,-10, 3989 +Brachium ,siLib,ICRS,15,04,04.2155,-25,16,55.073,-0.479,-4.469,-4.3,0.01117, 3.29,-24,11834 + ,taLib,ICRS,15,38,39.3695,-29,46,39.913,-0.1433333333,-2.654,3.2,0.00733, 3.644,0,0 + ,upLib,ICRS,15,37,01.4498,-28,08,06.286,-0.0884,-0.348,-24.9,0.01676, 3.58,-27,10464 +# Leo Minor + ,beLMi,ICRS,10,27,52.9997,36,42,25.962,-0.850133333333333,-10.962,5.6,0.02234, 4.21, 37, 2080 +Praecipua ,omiLMi,ICRS,10,53,18.7051, 34,12,53.536, 0.6164667,-28.606,16.1,0.0334, 3.83, 34, 2172 +# Lupus +Kakkab ,alLup,ICRS,14,41,55.7556,-47,23,17.520,-0.141,-2.422,5.2,0.00595, 2.30,-46, 9501 +Men ,alLup,ICRS,14,41,55.7556,-47,23,17.520,-0.141,-2.422,5.2,0.00595, 2.30,-46, 9501 +Kekouan ,beLup,ICRS,14,58,31.9269,-43,08,02.256,-0.227066666666667,-3.83,.2,0.00623, 2.68,-42, 9853 +Thusia ,gaLup,ICRS,15,35,08.4479,-41,10,00.325,-0.107,-2.552,2.3,0.00575, 2.765,0,0 +Hilasmus ,deLup,ICRS,15,21,22.3217,-40,38,51.064,-0.1274,-2.405,.2,0.00639, 3.22,-40, 9538 + ,zeLup,ICRS,15,12,17.0949,-52,05,57.290,-0.7596,-7.1,-10.0,0.02806, 3.41,-51, 8830 + ,thLup,ICRS,16,06,35.5448,-36,48,08.238,-0.1056,-3.106,15.2,0.00794, 4.23,-36,10642 + ,ka-1Lup,ICRS,15,11,56.0757,-48,44,16.147,-0.643466666666667,-4.797,-6,0.01789, 3.87,-48, 9704 + ,ph-1Lup,ICRS,15,21,48.3700,-36,15,40.955,-0.612333333333333,-8.603,-29.4,0.00999, 3.56,-35,10236 + ,ph-2Lup,ICRS,15,23,09.3501,-36,51,30.559,-0.120333333333333,-2.153,2.3,0.00538, 4.54,-36,10103 + ,ta-1Lup,ICRS,14,26,08.2239,-45,13,17.127,-0.0900666666666667,-1.402,-215.0,0.00315, 4.56,-44, 9322 + ,chLup,ICRS,15,50,57.5376,-33,37,37.796,-0.0394666666666667,-2.491,5,0.01586, 3.95,-33,10754 +# Lynx +Alvashak ,alLyn,ICRS,09,21,03.3013,34,23,33.223,-1.48533333333333,1.478,37.6,0.01469, 3.13, 35, 1979 +Al Fahd ,alLyn,ICRS,09,21,03.3013,34,23,33.223,-1.48533333333333,1.478,37.6,0.01469, 3.13, 35, 1979 +Alsciaukat ,31Lyn,ICRS,08,22,50.1096,43,11,17.270,-0.1708,-9.944,24.4,0.00839, 4.25, 43, 1815 +Mabsuthat ,31Lyn,ICRS,08,22,50.1096,43,11,17.270,-0.1708,-9.944,24.4,0.00839, 4.25, 43, 1815 +Mabsuthat ,kaLyn,ICRS,08,22,50.1096,43,11,17.270,-0.1708,-9.944,24.4,0.00839, 4.25, 43, 1815 +Maculosa ,38Lyn,ICRS,09,18,50.6436,36,48,09.348,-0.2174,-12.378,4.0,0.02675, 3.82, 0, 0 +Maculata ,38Lyn,ICRS,09,18,50.6436,36,48,09.348,-0.2174,-12.378,4.0,0.02675, 3.82, 0, 0 +# Lyra +Vega ,alLyr,ICRS,18,36,56.3364,38,47,01.291,1.3402,28.747,-13.9,0.12893, 0.03, 38, 3238 +Sheliak ,beLyr,ICRS,18,50,04.7947,33,21,45.601,0.00733333333333333,-0.446,-19.2,0.0037, 3.45, 33, 3223 +Sulaphat ,gaLyr,ICRS,18,58,56.6227,32,41,22.407,-0.0184,0.177,-21.1,0.00514, 3.24, 32, 3286 +Sulafat ,gaLyr,ICRS,18,58,56.6227,32,41,22.407,-0.0184,0.177,-21.1,0.00514, 3.24, 32, 3286 +Aladfar ,etLyr,ICRS,19,13,45.4875,39,08,45.486,-0.0106,-0.061,-8.1,0.00313, 4.39, 38, 3490 + ,thLyr,ICRS,19,16,22.0951,38,08,01.431,-0.00326666666666667,0.123,-30.9,0.00424, 4.36, 37, 3398 + ,ioLyr,ICRS,19,07,18.1291,36,06,00.566,-0.00426666666666667,-0.428,-18,0.00392, 5.28, 35, 3485 + ,kaLyr,ICRS,18,19,51.7095,36,03,52.371,-0.1076,4.132,-22.3,0.01371, 4.33, 36, 3094 +Alathfar ,muLyr,ICRS,18,24,13.7857,39,30,26.059,-0.142066666666667,-0.456,-24.0,0.00739, 5.11, 39, 3410 +# Mensa + ,alMen,ICRS,06,10,14.4735,-74,45,10.963,0.812266666666667,-21.28,34.9,0.09854, 5.09,-74, 374 + ,gaMen,ICRS,05,31,53.0156,-76,20,27.470,0.9546,28.774,56.7,0.03243, 5.19,-76, 333 + ,deMen,ICRS,04,17,59.2737,-80,12,50.518,0.1884,6.102,-20,0.008, 5.62,-80, 116 + ,etMen,ICRS,04,55,11.2017,-74,56,12.667,0.184,6.188,25.8,0.00458, 5.47,-75, 290 + ,zeMen,ICRS,06,40,02.8901,-80,48,48.933,-0.0338666666666667,5.337,7,0.00807, 5.64,-80, 196 + ,muMen,ICRS,04,43,03.9634,-70,55,51.698,0.062,3.477,-1.0,0.00675, 5.69,-71, 282 + ,xiMen,ICRS,04,58,50.9645,-82,28,13.845,-0.034,0.412,-5,0.00934, 5.85,-82, 106 +# Microscopium + ,gaMic,ICRS,21,01,17.4602,-32,15,27.962,-0.0139333333333333,-0.019,17.6,0.01459, 4.67,-32,16353 + ,epMic,ICRS,21,17,56.2848,-32,10,21.141,0.369733333333333,-2.212,-1,0.01976, 4.71,-32,16498 + ,zeMic,ICRS,21,02,57.9539,-38,37,53.210,-0.185733333333333,-10.881,4.6,0.02832, 5.35,-39,14089 + ,th-1Mic,ICRS,21,20,45.6423,-40,48,34.076,0.507866666666667,1.766,2.3,0.01749, 4.82,-41,14475 + ,ioMic,ICRS,20,48,29.1421,-43,59,18.758,1.17186666666667,-11.217,-14.9,0.02435, 5.11,-44,14145 +# Monoceros + ,alMon,ICRS,07,41,14.8324,-09,33,04.071,-0.498666666666667,-1.964,10.5,0.02261, 3.93,-09, 2172 + ,deMon,ICRS,07,11,51.8603,-00,29,33.952,-0.00146666666666667,0.668,15,0.0087, 4.15,-00, 1636 + ,epMon,ICRS,06,23,46.0855, 04,35,34.314,-0.1392,1.075,14.6,0.02539, 4.44, 04, 1236 +# Musca + ,alMus,ICRS,12,37,11.0184,-69,08,08.030,-0.2658,-1.244,13,0.01067, 2.69,-68, 1702 + ,gaMus,ICRS,12,32,28.0147,-72,07,58.758,-0.337266666666667,-0.516,2.5,0.01007, 3.87,-71, 1336 + ,deMus,ICRS,13,02,16.2633,-71,32,55.879,1.75713333333333,-2.327,36.5,0.03591, 3.62,-70, 1548 + ,etMus,ICRS,13,15,14.9405,-67,53,40.521,-0.246133333333333,-1.063,-8,0.00804, 4.80,-67, 2224 + ,laMus,ICRS,11,45,36.4191,-66,43,43.546,-0.669466666666667,3.321,16.3,0.02542, 3.64,-66, 1640 +# Norma + ,ga-2Nor,ICRS,16,19,50.4225,-50,09,19.828,-1.0624,-5.284,-28.9,0.02558, 4.02,-49,10536 + ,deNor,ICRS,16,06,29.4381,-45,10,23.467,0.116466666666667,3.703,-15.5,0.02641, 4.72,-44,10625 + ,kaNor,ICRS,16,13,28.7289,-54,37,49.683,-0.0355333333333333,-2.248,-13.5,0.00745, 4.94,-54, 7245 +# Octans + ,alOct,ICRS,21,04,43.0645,-77,01,25.562,0.0922,-36.937,45.0,0.02207, 5.15,-77, 1474 + ,beOct,ICRS,22,46,03.5079,-81,22,53.815,-0.369,0.088,23.9,0.02323, 4.15,-82, 889 + ,etOct,ICRS,10,59,13.7676,-84,35,38.015,-0.427533333333333,-0.802,-2.6,0.00917, 6.26,-83, 386 + ,epOct,ICRS,22,20,01.6781,-80,26,23.089,0.375733333333333,-4.278,11.7,0.01215, 5.10,-81, 995 + ,thOct,ICRS,00,01,35.7037,-77,03,56.608,-0.3768,-17.695,23.7,0.01477, 4.78,-77, 1596 + ,zeOct,ICRS,08,56,40.9863,-85,39,47.348,-0.775133333333333,3.375,-3.6,0.02073, 5.42,-85, 183 + ,ioOct,ICRS,12,54,58.8107,-85,07,24.127,0.4498,2.211,53.4,0.00879, 5.46,-84, 407 + ,kaOct,ICRS,13,40,55.4795,-85,47,09.756,-0.584333333333333,-2.103,-9,0.01271, 5.65,-85, 384 + ,nuOct,ICRS,21,41,28.6463,-77,23,24.167,0.4322,-24.037,34.4,0.04722, 3.76,-77, 1510 + ,rhOct,ICRS,15,43,16.9294,-84,27,54.983,0.913333333333333,9.675,-11,0.01502, 5.66,-84, 510 +Polaris Australis,siOct,ICRS,21,08,46.8457,-88,57,23.396,0.173066666666667,0.502,11.9,0.01207, 5.47,-89, 47 + ,taOct,ICRS,23,28,03.7830,-87,28,55.970,0.1086,1.148,31.0,0.00624, 5.49,-88, 204 + ,upOct,ICRS,22,31,37.5157,-85,58,02.111,-0.250933333333333,6.125,19.0,0.00988, 5.74,-86, 406 + ,chOct,ICRS,18,54,47.1361,-87,36,21.037,-0.2446,-13.522,33.6,0.01306, 5.28,-87, 274 +# Ophiuchus +Rasalhague ,alOph,ICRS,17,34,56.0705,12,33,36.125,0.733866666666667,-22.261,12.6,0.06984, 2.08, 12, 3252 +Celbalrai ,beOph,ICRS,17,43,28.3531,04,34,02.290,-0.271133333333333,15.88,-11.9,0.03978, 2.77, 04, 3489 +Kelb Alrai ,beOph,ICRS,17,43,28.3531,04,34,02.290,-0.271133333333333,15.88,-11.9,0.03978, 2.77, 04, 3489 +Al Durajah ,gaOph,ICRS,17,47,53.5605,02,42,26.194,-0.154333333333333,-7.512,-5.0,0.03442, 3.75, 02, 3403 +Yed Prior ,deOph,ICRS,16,14,20.7395,-03,41,39.563,-0.305533333333333,-14.291,-19.9,0.01916, 2.74,-03, 3903 +Yed Posterior,epOph,ICRS,16,18,19.2890,-04,41,33.038,0.549266666666667,4.008,-10.3,0.03034, 3.24,-04, 4086 +Han ,zeOph,ICRS,16,37,09.5378,-10,34,01.524,0.0871333333333333,2.544,-15,0.00712, 2.56,-10, 4350 +Sabik ,etOph,ICRS,17,10,22.6873,-15,43,29.677,0.2744,9.765,-.9,0.03877, 2.43,-15, 4467 +Imad ,thOph,ICRS,17,22,00.5784,-24,59,58.364,-0.0589333333333333,-2.364,-2,0.00579, 3.27,-24,13292 + ,ioOph,ICRS,16,54,00.4715,10,09,55.293,-0.358333333333333,-3.468,-21,0.01395, 4.38, 10, 3092 +Helkath ,kaOph,ICRS,16,57,40.0973,09,22,30.118,-1.9536,-0.97,-55.6,0.03799, 3.20, 09, 3298 +Marfik ,laOph,ICRS,16,30,54.8229,01,59,02.123,-0.209133333333333,-7.3,-13.5,0.01963, 02, 3118 +, +Sinistra ,nuOph,ICRS,17,59,01.5915,-09,46,25.075,-0.0687333333333333,-11.612,12.6,0.02135, 3.34,-09, 4632 + ,xiOph,ICRS,17,21,00.3741,-21,06,46.557,1.7467333333333333,-20.474,-9.0,0.05748, 4.39,0, 0 + ,siOph,ICRS,17,26,30.8803,04,08,25.295,0.00833333333333333,0.709,-27.1,0.00278, 4.34, 04, 3422 +Barnard's star,V799 Oph,ICRS,17,38,28.1,04,39,41,0.113333333333333,3.8,17,0.017, 9.54,+04, 3561a + ,44Oph,ICRS,17,26,22.2161,-24,10,31.114,-0.0131333333333333,-11.769,-37.2,0.03896, 4.166, 0, 0 + ,45Oph,ICRS,17,27,21.2737,-29,52,01.320,0.095866666667,-13.741,37.3,0.02926, 4.286, 0, 0 +# Orion +Betelgeuse ,alOri,ICRS,05,55,10.3053,07,24,25.426,0.1822,1.086,21.0,0.00763, 0.50, 07, 1055 +Beteigeuse ,alOri,ICRS,05,55,10.3053,07,24,25.426,0.1822,1.086,21.0,0.00763, 0.50, 07, 1055 +Rigel ,beOri,ICRS,05,14,32.2723,-08,12,05.906,0.0124666666666667,-0.056,20.7,0.00422, 0.12,-08, 1063 +Bellatrix ,gaOri,ICRS,05,25,07.8631,06,20,58.928,-0.0583333333333333,-1.328,18.2,0.01342, 1.64, 06, 919 +Mintaka ,deOri,ICRS,05,32, 0.4007,-00,17,56.731, 0.011133, -0.056, 16.0,0.00356, 2.23,-00, 983 +Alnilam ,epOri,ICRS,05,36,12.8135,-01,12,06.911,0.00993333333333333,-0.106,25.90,0.00243, 1.70,-01, 969 +Alnitak ,zeOri,ICRS,05,40,45.5271,-01,56,33.260,0.0266,0.254,3.99,0.00399, 1.74,-02, 1338 +Trapezium ,th-1COri,ICRS,05,35,16.463,-05,23,23.18,0.006133333,-0.013,28.0,-0.00185, 5.13,0, 0 +Hatsya ,ioOri,ICRS,05,35,25.9825,-05,54,35.645,0.0151333333333333,-0.062,21.5,0.00246, 2.76,-06, 1241 +Nair al Saif ,ioOri,ICRS,05,35,25.9825,-05,54,35.645,0.0151333333333333,-0.062,21.5,0.00246, 2.76,-06, 1241 +Saiph ,kaOri,ICRS,05,47,45.3889,-09,40,10.577,0.0103333333333333,-0.12,20.5,0.00452, 2.06,-09, 1235 +Heka ,laOri,ICRS,05,35,08.2771,09,56,02.970,-0.00686666666666667,-0.186,-1.03,0.00309, 3.66, 09, 879 +Meissa ,laOri,ICRS,05,35,08.2771,09,56,02.970,-0.00686666666666667,-0.186,-1.03,0.00309, 3.66, 09, 879 + ,muOri,ICRS,06,02,22.9988,09,38,50.196,0.0946,-3.744,45.0,0.02149, 4.29, 14, 1152 + ,nuOri,ICRS,06,07,34.3249,14,46,06.498,0.033,-2.118,24.1,0.0061, 4.42, 0, 0 + ,xiOri,ICRS,06,11,56.3958,14,12,31.54,-0.0106,-2.23,24.0,0.00514, 4.442, 0, 0 + ,omi-1Ori,ICRS,04,52,31.9621,14,15,02.311,-0.0174666666666667,-5.613,-7.9,0.00602, 4.74, 14, 777 + ,pi-1Ori,ICRS,04,54,53.7279,10,09,02.999,0.2672,-12.837,13.0,0.02704, 4.656, 0, 0 + ,pi-2Ori,ICRS,04,50,36.7217,08,54,00.633,-0.0058,-3.157,24.0,0.01684, 4.353, 0, 0 +Tabit ,pi-3Ori,ICRS,04,49,50.4106,06,57,40.592,3.08946666666667,1.162,24.1,0.1246, 3.19, 06, 762 +Tabit ,pi-4Ori,ICRS,04,51,12.3639,05,36,18.374,-0.0241333333333333,0.103,23.3,0.00259, 3.69, 05, 745 + ,pi-5Ori,ICRS,04,54,15.0965,02,26,26.419,0.00953333333333333,0.023,23.4,0.00243, 3.72, 02, 810 + ,pi-6Ori,ICRS,04,58,32.9019,01,42,50.457,-0.0106,-0.793,15.36,0.003542, 4.474, 0, 0 + ,taOri,ICRS,05,17,36.3899,-06,50,39.874,-0.102066666666667,-0.957,20.1,0.00588, 3.60,-07, 1028 +Thabit ,upOri,ICRS,05,31,55.8600,-07,18,05.533,-0.0036,-0.444,17.4,0.00211, 4.62,-07, 1106 + ,ph-1Ori,ICRS,05,34,49.2371,09,29,22.485,-0.00826666666666667,-0.249,33.2,0.00331, 4.41, 09, 877 + ,ch-2Ori,ICRS,06,03,55.1849,20,08,18.427,0.0146,-0.281,16.8,0.0001, 4.646, 0, 0 + ,71Ori,ICRS,06,14,50.8767,19,09,23.231,-0.63853333333333333,-18.158,35.7,0.04733, 5.20, 0, 0 +# Pavo +Peacock ,alPav,ICRS,20,25,38.8578,-56,44,06.324,0.0514,-8.615,2.0,0.0178, 1.94,-57, 9674 + ,bePav,ICRS,20,44,57.4944,-66,12,11.565,-0.282666666666667,1.057,9.8,0.02371, 3.42,-66, 3501 + ,gaPav,ICRS,21,26,26.6056,-65,21,58.314,0.540533333333333,80.073,-30.2,0.1085, 4.22,-65, 3918 + ,dePav,ICRS,20,08,43.6084,-66,10,55.446,8.07,-113.027,-21.7,0.16374, 3.56,-66, 3474 + ,epPav,ICRS,20,00,35.5532,-72,54,37.813,0.536933333333333,-13.134,-1.5,0.03073, 3.96,-73, 2086 + ,zePav,ICRS,18,43,02.1361,-71,25,41.208,0.00833333333333333,-15.829,-16.3,0.01555, 4.01,-71, 2353 + ,etPav,ICRS,17,45,43.9873,-64,43,25.937,-0.0738666666666667,-5.637,-7.6,0.00879, 3.62,-64, 3662 + ,laPav,ICRS,18,52,13.0349,-62,11,15.337,-0.00886666666666667,-1.353,9,0.0018, 4.22,-62, 5983 + ,xiPav,ICRS,18,23,13.6212,-61,29,38.043,0.00353333333333333,0.17,12.2,0.00776, 4.36,-61, 6140 + ,omiPav,ICRS,21,13,20.5095,-70,07,34.560,0.276133333333333,-2.034,-19,0.00367, 5.02,-70, 2835 +# Phoenix +Ankaa ,alPhe,ICRS,00,26,17.0509,-42,18,21.533,1.55166666666667,-35.362,74.6,0.04214, 2.39,-42, 116 + ,gaPhe,ICRS,01,28,21.9271,-43,19,05.642,-0.1214,-20.771,25.8,0.01394, 3.41,-43, 449 + ,dePhe,ICRS,01,31,15.1046,-49,04,21.728,0.921466666666667,15.42,-7.3,0.02215, 3.95,-49, 425 + ,epPhe,ICRS,00,09,24.6420,-45,44,50.734,0.814333333333333,-18.013,-9.2,0.02328, 3.88,-46, 18 + ,etPhe,ICRS,00,43,21.2385,-57,27,47.016,-0.0344,1.55,2,0.01357, 4.36,-58, 42 + ,ioPhe,ICRS,23,35,04.5640,-42,36,54.269,0.2812,1.078,19.4,0.01192, 4.71,-43,15420 + ,la-1Phe,ICRS,00,31,24.9807,-48,48,12.652,0.938266666666667,1.947,-2,0.01897, 4.77,-49, 115 + ,muPhe,ICRS,00,41,19.5517,-46,05,06.025,-0.1928,0.104,18.8,0.01319, 4.59,-46, 180 + ,piPhe,ICRS,23,58,55.7793,-52,44,44.905,0.3862,6.146,-14.1,0.0127, 5.13,-53,10561 + ,upPhe,ICRS,01,07,47.8533,-41,29,12.898,0.24,0.785,14,0.01648, 5.21,-42, 391 + ,phPhe,ICRS,01,54,22.0331,-42,29,49.020,-0.2288,-2.834,12.0,0.01055, 5.11,-43, 583 + ,psPhe,ICRS,01,53,38.7417,-46,18,09.607,-0.615866666666667,-9.146,1.5,0.01015, 4.41,-46, 552 + ,omePhe,ICRS,01,02, 1.8208,-57,00, 8.601, 0.0442667, 1.653, 13.0,0.00886, 6.109,-57, 220 +# Pegasus +Markab ,alPeg,ICRS,23,04,45.6538,15,12,18.952,0.407333333333333,-4.256,-3.5,0.02336, 2.49, 14, 4926 +Scheat ,bePeg,ICRS,23,03,46.4575,28,04,58.041,1.25173333333333,13.761,8.7,0.01637, 2.42, 27, 4480 +Algenib ,gaPeg,ICRS,00,13,14.1528,15,11,00.945,0.0313333333333333,-0.824,4.1,0.00979, 2.83, 14, 14 +Enif ,epPeg,ICRS,21,44,11.1581,09,52,30.041,0.200133333333333,0.138,4.7,0.00485, 2.39, 09, 4891 +Homam ,zePeg,ICRS,22,41,27.7208,10,49,52.912,0.515866666666667,-1.098,7,0.01564, 3.40, 10, 4797 +Matar ,etPeg,ICRS,22,43,00.1374,30,13,16.483,0.0874,-2.611,4.3,0.01518, 2.94, 29, 4741 +Biham ,thPeg,ICRS,22,10,11.9852,06,11,52.314,1.87973333333333,3.123,-6,0.03377, 3.53, 05, 4961 +Baham ,thPeg,ICRS,22,10,11.9852,06,11,52.314,1.87973333333333,3.123,-6,0.03377, 3.53, 05, 4961 + ,ioPeg,ICRS,22,07,00.6661,25,20,42.402,1.9782,2.693,-4.3,0.08506, 3.76, 24, 4533 +Jih ,kaPeg,ICRS,21,44,38.7344,25,38,42.128,0.311066667,1.347,-8.1,0.02834, 4.159, 0, 0 +Sadalbari ,laPeg,ICRS,22,46,31.8787,23,33,56.354,0.379933333333333,-1.046,-3.9,0.00826, 3.95, 22, 4709 + ,muPeg,ICRS,22,50,00.1928,24,36,05.685,0.960733333333333,-4.344,13.9,0.02795, 3.48, 23, 4615 + ,pi-1Peg,ICRS,22,09,13.6338,33,10,20.415,-0.4,-6.586,-5.7,0.01151, 5.65, 32, 4349 + ,pi-2Peg,ICRS,22,09,59.2441,33,10,41.606,-0.0822666666666667,-1.794,2.0,0.01296, 4.29, 32, 4352 +Kerb ,taPeg,ICRS,23,20,38.2426,23,44,25.213,0.2032,-0.914,16.0,0.0195, 4.60, 22, 4810 +Salm ,taPeg,ICRS,23,20,38.2426,23,44,25.213,0.2032,-0.914,16.0,0.0195, 4.60, 22, 4810 + ,upPeg,ICRS,23,25,22.7841,23,24,14.764,1.28746666666667,3.647,-11.1,0.01883, 4.41, 22, 4833 + ,phPeg,ICRS,23,52,29.2882,19,07,13.033,-0.0428,-3.422,-7.8,0.00746, 5.08, 18, 5231 + ,chPeg,ICRS,00,14,36.1645,20,12,24.126,0.6044,0.188,-45.8,0.01001, 4.80, 19, 27 + ,psPeg,ICRS,23,57,45.5264,25,08,29.044,-0.2404,-3.225,-4.2,0.00754, 4.66, 24, 4865 +# Perseus +Mirfak ,alPer,ICRS,03,24,19.3703,49,51,40.247,0.160733333333333,-2.601,-2.4,0.00551, 1.80, 49, 917 +Mirphak ,alPer,ICRS,03,24,19.3703,49,51,40.247,0.160733333333333,-2.601,-2.4,0.00551, 1.80, 49, 917 +Algol ,bePer,ICRS,03,08,10.1315,40,57,20.332,0.0159333333333333,-0.144,4.0,0.03514, 2.12, 40, 673 + ,gaPer,ICRS,03,04,47.7907,53,30,23.184,0.00333333333333333,-0.419,2.5,0.01272, 2.93, 52, 654 + ,dePer,ICRS,03,42,55.5028,47,47,15.185,0.158866666666667,-4.193,4,0.00618, 3.01, 47, 876 + ,epPer,ICRS,03,57,51.2307,40,00,36.773,0.0840666666666667,-2.406,12.61,0.00606, 2.89, 39, 895 +Atik ,zePer,ICRS,03,54,07.9215,31,53,01.088,0.0294,-0.915,4.41,0.00332, 2.85, 31, 666 +Miram ,etPer,ICRS,02,50,41.8101,55,53,43.786,0.110933333333333,-1.376,-1.0,0.00245, 3.76, 55, 714 + ,thPer,ICRS,02,44,11.9863,49,13,42.412,2.2268,-8.996,25.0,0.08903, 4.12, 48, 746 + ,ioPer,ICRS,03,09,04.0197,49,36,47.799,8.41453333333333,-9.16,50.0,0.09493, 4.05, 49, 857 +Misam ,kaPer,ICRS,03,09,29.7715,44,51,27.157,1.1534,-14.205,29.2,0.02905, 3.80, 44, 631 + ,laPer,ICRS,04,06,35.0434,50,21,04.543,-0.0868666666666667,-3.637,6.1,0.00941, 4.29, 49, 1101 + ,muPer,ICRS,04,14,53.8621,48,24,33.591,0.0336,-1.735,5.04,0.00451, 4.14, 48, 1063 + ,nuPer,ICRS,03,45,11.6319,42,34,42.775,-0.0972666666666667,0.175,-12.7,0.00586, 3.77, 42, 815 +Menkib ,xiPer,ICRS,03,58,57.9011,35,47,27.717,0.0128,0.23,70.1,0.00184, 4.04, 35, 775 +Atiks ,omiPer,ICRS,03,44,19.1320,32,17,17.693,0.0540666666666667,-1.032,18.5,0.00221, 3.83, 31, 642 +Gorgona Secunda,piPer,ICRS,02,58,45.6701,39,39,45.823,0.172533333333333,-4.067,14.2,0.01002, 4.69, 39, 681 +Gorgona Tertia ,rhPer,ICRS,03,05,10.5934,38,50,24.986,0.857933333333333,-10.661,28.2,0.01003, 3.39, 38, 630 + ,siPer,ICRS,03,30,34.4835,47,59,42.778,0.0104,1.813,15.9,0.00923, 4.35, 47, 843 + ,taPer,ICRS,02,54,15.4605,52,45,44.924,-0.0132666666666667,-0.453,2.2,0.01315, 3.95, 52, 641 + ,phPer,ICRS,01,43,39.6375,50,41,19.437,0.160533333333333,-1.359,.8,0.00455, 4.07, 49, 444 +Gorgona Quatra,omePer,ICRS,03,11,17.3816,39,36,41.697,-0.174733333333333,0.478,6.7,0.01069, 4.63, 39, 724 +Capulus ,NGC869,2000,2,19,1.0,57,9,0.0,-0.00273333,-0.103,-39.82,0.0, 3.7,0, 0 # NGC 869 , from Starlight / Sarah Ashton +Capulus ,M34Per,ICRS,2,42,6.0,42,46,0.0,0.0002,-0.743,0.0,0.0, 5.2,0, 0 # NGC 1039 + ,16Per,ICRS,2,50,35.0597,38,19,07.117,1.3045333333333333,-10.892,14.0,0.02554, 4.2,0, 0 +# Pictor + ,alPic,ICRS,06,48,11.4523,-61,56,29.010,-0.455933333333333,24.203,20.6,0.03296, 3.27,-61, 720 + ,gaPic,ICRS,05,49,49.6623,-56,09,59.987,0.544066666666667,-7.177,15.7,0.01878, 4.51,-56, 946 + ,dePic,ICRS,06,10,17.9089,-54,58,07.121,-0.0274,0.653,30.6,0.00197, 4.81,-54, 980 + ,zePic,ICRS,05,19,22.1349,-50,36,21.483,0.153333333333333,22.738,45.1,0.0277, 5.45,-50, 1723 + ,et-2Pic,ICRS,05,04,58.0144,-49,34,40.215,0.458266666666667,-0.303,36.0,0.00688, 5.03,-49, 1562 +# Piscis Austrinus +Fomalhaut ,alPsA,ICRS,22,57,39.0465,-29,37,20.050,2.1948,-16.421,6.5,0.13008, 1.16,-30,19370 +Tien Kang ,bePsA,ICRS,22,31,30.3307,-32,20,45.864,0.3976,-1.87,6.3,0.02199, 4.29,-32,17126 +Aboras ,dePsA,ICRS,22,55,56.8995,-32,32,22.662,0.0722666666667,3.032,-11.6,0.01914, 4.226,0,0 + ,epPsA,ICRS,22,40,39.3400,-27,02,37.021,0.146733333333333,-0.088,3,0.00438, 4.17,-27,16010 + ,ioPsA,ICRS,21,44,56.8099,-33,01,32.814,0.211933333333333,-9.4,1.9,0.01593, 4.34,-33,15734 + ,laPsA,ICRS,22,14,18.7514,-27,46,00.867,0.152533333333333,0.19,-5.8,0.00642, 5.43,-28,17653 + ,muPsA,ICRS,22,08,23.0089,-32,59,18.486,0.533666666666667,-2.888,11.6,0.02501, 4.50,-33,15922 + ,piPsA,ICRS,23,03,29.8161,-34,44,57.883,0.498666666666667,8.445,-14,0.03498, 5.11,-35,15630 +# Pisces +Alrischa ,alPsc,ICRS,02,02,02.8201,02,45,49.534,0.221933333333333,-0.042,33.29,0.02345, 4.33, 02, 317 +Fum Alsamakah,bePsc,ICRS,23,03,52.6140,03,49,12.163,0.0857333333333333,-1.013,.3,0.00662, 4.53, 03, 4818 +Samakah ,bePsc,ICRS,23,03,52.6140,03,49,12.163,0.0857333333333333,-1.013,.3,0.00662, 4.53, 03, 4818 +Simmah ,gaPsc,ICRS,23,17,09.9379,03,16,56.240,5.069,1.796,-13.6,0.02492, 3.69, 02, 4648 +Linteum ,dePsc,ICRS,00,48,40.9443,07,35,06.285,0.554266666666667,-5.048,32.3,0.01069, 4.43, 06, 107 +Kaht ,epPsc,ICRS,01,02,56.6084,07,53,24.488,-0.537133333333333,2.588,7.0,0.01714, 4.28, 07, 153 + ,zePsc,ICRS,01,13,43.8857, 07,34,31.274,0.9444, -5.562, 9.0,0.02209, 5.204, 06, 174 +Al Pherg ,etPsc,ICRS,01,31,29.0094,15,20,44.963,0.171533333333333,-0.329,14.8,0.01109, 3.62, 14, 231 + ,thPsc,ICRS,23,27,58.0951,06,22,44.372,-0.825533333333333,-4.326,5.8,0.02054, 4.28, 05, 5173 + ,ioPsc,ICRS,23,39,57.0409,05,37,34.650,2.5088,-43.7,5.0,0.07251, 4.13, 04, 5035 + ,kaPsc,ICRS,23,26,55.9553,01,15,20.189,0.570666666666667,-9.443,-3.2,0.02012, 4.94, 00, 4998 + ,laPsc,ICRS,23,42,02.8062,01,46,48.147,-0.863666666666667,-15.487,12.4,0.03238, 4.50, 00, 5037 + ,nuPsc,ICRS,01,41,25.8943,05,29,15.408,-0.151533333333333,0.361,.4,0.00886, 4.44, 04, 293 + ,xiPsc,ICRS,01,53,33.3504,03,11,15.132,0.157933333333333,2.39,30.3,0.01711, 4.62, 02, 290 +Torcularis Septentrionalis,omiPsc,ICRS,01,45,23.6305,09,09,27.849,0.472133333333333,3.899,13.6,0.01263, 4.26, 08, 273 + ,piPsc,ICRS,01,37,05.9167,12,08,29.525,-0.499333333333333,0.996,-1,0.02958, 5.63, 11, 205 +Anunitum ,taPsc,ICRS,01,11,39.6368,30,05,22.698,0.495266666666667,-3.761,29.8,0.02011, 4.51, 29, 190 + ,upPsc,ICRS,01,19,27.9951,27,15,50.611,0.174733333333333,-1.162,8.0,0.01049, 4.76, 26, 220 + ,phPsc,ICRS,01,13,44.9471,24,35,01.367,0.123866666666667,-2.126,5.9,0.00864, 4.676, 0, 0 + ,chPsc,ICRS,01,11,27.2202,21,02,04.740,0.277733333333333,-1.055,15.8,0.00742, 4.66, 20, 172 +Vernalis ,omePsc,ICRS,23,59,18.6896,06,51,47.956,0.989933333333333,-11.216,1.9,0.03078, 4.01, 06, 5227 + ,7Psc,ICRS,23,20,20.5831,05,22,52.706,0.523533333333333,-5.935,40.34,0.00956, 5.077, 0, 0 + ,19Psc,ICRS,23,46,23.5165,03,29,12.519,-0.23333333333333,-2.500,-11.0,0.00429, 5.04, 0, 0 +# Puppis +Naos ,zePup,ICRS,08,03,35.0467,-40,00,11.332,-0.205466666666667,1.677,-24.00,0.00233, 2.25,-39, 3939 +Suhail Hadar ,zePup,ICRS,08,03,35.0467,-40,00,11.332,-0.205466666666667,1.677,-24.00,0.00233, 2.25,-39, 3939 +Kaimana ,nuPup,ICRS,06,37,45.6713,-43,11,45.361,-0.00286666666666667,-0.399,28.2,0.00771, 3.17,-43, 2576 +Azmidiske ,xiPup,ICRS,07,49,17.6552,-24,51,35.229,-0.0370666666666667,-0.071,2.7,0.00242, 3.34,-24, 6030 +Ahadi ,piPup,ICRS,07,17,08.5564,-37,05,50.892,-0.0704666666666667,0.7,15.8,0.00298, 2.70,-36, 3489 +Turais ,rhPup,ICRS,08,07,32.6489,-24,18,15.567,-0.555266666666667,4.638,46.1,0.05199, 2.81,-23, 6828 + ,siPup,ICRS,07,29,13.8303,-43,18,05.157,-0.399066666666667,18.872,87.7,0.01774, 3.25,-43, 3260 +Al Rihla ,taPup,ICRS,06,49,56.1683,-50,36,52.415,0.2282,-6.585,36.4,0.01785, 2.93,-50, 2415 +Rehla ,taPup,ICRS,06,49,56.1683,-50,36,52.415,0.2282,-6.585,36.4,0.01785, 2.93,-50, 2415 +Anazitisi ,taPup,ICRS,06,49,56.1683,-50,36,52.415,0.2282,-6.585,36.4,0.01785, 2.93,-50, 2415 +# Pyxis + ,alPyx,ICRS,08,43,35.5375,-33,11,10.988,-0.0952,1.06,15.3,0.00386, 3.68,-32, 5651 + ,gaPyx,ICRS,08,50,31.9233,-27,42,35.440,-0.889933333333333,8.816,24.5,0.01563, 4.01,-27, 5986 + ,epPyx,ICRS,09,09,56.4101,-30,21,55.444,-0.0143333333333333,-4.886,-8,0.01535, 5.63,-29, 7194 + ,thPyx,ICRS,09,21,29.5909,-25,57,55.580,-0.0818666666666667,-0.92,20.0,0.00625, 4.72,-25, 7114 +# Reticulum + ,alRet,ICRS,04,14,25.4837,-62,28,25.889,0.2776,4.972,35.5,0.01998, 3.35,-62, 332 + ,beRet,ICRS,03,44,11.9775,-64,48,24.850,2.05586666666667,7.873,50.8,0.03271, 3.85,-65, 263 + ,deRet,ICRS,03,58,44.7494,-61,24,00.668,0.0652666666666667,-1.439,-1.4,0.00615, 4.56,-61, 290 + ,ze-1Ret,ICRS,03,17,46.1635,-62,34,31.159,8.9182,64.884,12.2,0.08251, 5.24,-63, 217 + ,etRet,ICRS,04,21,53.3267,-63,23,11.009,0.568,17.437,45.0,0.00858, 5.23,-63, 324 + ,kaRet,ICRS,03,29,22.6776,-62,56,15.099,2.55353333333333,37.312,12.0,0.04665, 4.72,-63, 234 + ,piScl,ICRS,01,42,08.5940,-32,19,37.093,-0.4986,-4.635,10.4,0.01502, 5.26,-32, 666 +# Sculptor + ,alScl,ICRS,00,58,36.3609,-29,21,26.817,0.1496,0.63,10.2,0.00485, 4.31,-30, 297 + ,beScl,ICRS,23,32,58.2593,-37,49,05.763,0.6426,3.758,1.7,0.01828, 4.37,-38,15527 + ,gaScl,ICRS,23,18,49.4404,-32,31,55.296,0.131,-7.857,15.6,0.01824, 4.41,-33,16476 + ,deScl,ICRS,23,48,55.5461,-28,07,48.964,0.666866666666667,-10.404,14,0.02273, 4.57,-28,18353 + ,epScl,ICRS,01,45,38.7571,-25,03,09.396,1.0632,-7.238,14.5,0.03646, 5.31,-25, 704 + ,thScl,ICRS,00,11,44.0086,-35,07,59.230,1.12673333333333,11.375,-1.7,0.04585, 5.25,-35, 42 + ,ka-2Scl,ICRS,00,11,34.4201,-27,47,59.052,0.0307333333333333,1.709,-5.7,0.00561, 5.56,-28, 26 + ,la-2Scl,ICRS,00,44,12.0993,-38,25,18.068,1.6468,12.068,26.5,0.00876, 5.97,-39, 181 + ,muScl,ICRS,23,40,38.1492,-32,04,23.249,-0.6094,-5.347,14.1,0.01122, 5.31,-32,17621 + ,siScl,ICRS,01,02,26.4332,-31,33,07.218,0.54,1.525,-8,0.01439, 5.52,-32, 410 +# Scorpius +Antares ,alSco,ICRS,16,29,24.4609,-26,25,55.209,-0.0677333333333333,-2.321,-3.4,0.0054, 0.96,-26,11359 +Graffias ,be-1Sco,ICRS,16,05,26.2307,-19,48,19.632,-0.045,-2.489,-1.0,0.00615, 2.62,-19, 4307 +Akrab ,be-1Sco,ICRS,16,05,26.2307,-19,48,19.632,-0.045,-2.489,-1.0,0.00615, 2.62,-19, 4307 +Acrab ,be-1Sco,ICRS,16,05,26.2307,-19,48,19.632,-0.045,-2.489,-1.0,0.00615, 2.62,-19, 4307 +Acrab ,be-1Sco,ICRS,16,05,26.2307,-19,48,19.632,-0.045,-2.489,-1.0,0.00615, 2.62,-19, 4307 + ,be-2Sco,ICRS,16,05,26.5538,-19,48,06.696,-0.2306,-0.747,-3.6,0.00288, 4.92,0, 0 +#Aculeus ,M6Sco,2000,17,40,6.0,-32,15,0.0,-0.015867,-0.719,-11.50,0.0, 4.2,0, 0 # NGC 6405, from Starlight +Aculeus ,M6Sco,ICRS,17,40,18.0,-32,12,0.0,-0.015867,-0.719,-11.50,0.0, 4.2,0, 0 # NGC 6405 +#Acumen ,M7Sco,2000,17,53,54.0,-34,49,0.0,0.0172,-0.454,-14.21,0.0, 3.3,0, 0 # NGC 6475, from Starlight +Acumen ,M7Sco,ICRS,17,53,48.0,-34,47,0.0,0.0172,-0.454,-14.21,0.0, 3.3,0, 0 # NGC 6475 +Dschubba ,deSco,ICRS,16,00,20.0063,-22,37,18.156,-0.0578,-3.69,-7,0.00812, 2.32,-22, 4068 +Wei ,epSco,ICRS,16,50,09.8130,-34,17,35.634,-4.07893333333333,-25.586,-2.5,0.04985, 2.29,-34,11285 + ,ze-2Sco,ICRS,16,54,35.0053,-42,21,40.726,-0.843666666667,-22.777,-18.7,0.02167, 3.62,0, 0 + ,etSco,ICRS,17,12,09.1935,-43,14,21.080,0.146733333333333,-28.742,-27.0,0.04556, 3.33,-43,11485 +Sargas ,thSco,ICRS,17,37,19.1306,-42,59,52.166,0.0404,-0.095,1.4,0.01199, 1.87,-42,12312 + ,io-1Sco,ICRS,17,47,35.0815,-40,07,37.191,0.00293333333333333,-0.64,-27.6,0.00182, 3.03,-40,11838 +Girtab ,kaSco,ICRS,17,42,29.2749,-39,01,47.939,-0.0432666666666667,-2.555,-14.0,0.00703, 2.41,-38,12137 +Shaula ,laSco,ICRS,17,33,36.5200,-37,06,13.756,-0.0593333333333333,-2.995,-3,0.00464, 1.63,-37,11673 + ,mu-1Sco,ICRS,16,51,52.2323,-38,02,50.567,-0.0589333333333333,-2.16,-25,0.00397, 3.08,-37,11033 +Jabbah ,nuSco,ICRS,16,11,59.7345,-19,27,38.5550, -0.064667,-2.525, 2.4,0.00747, 4.01,-19, 4333 +Grafias ,xiSco,ICRS,16,04,22.191,-11,22,22.60,-0.421333333333333,-2.7,-36.33,0, 5.07,-10, 4237 + ,piSco,ICRS,15,58,51.1129,-26,06,50.779,-0.08,-2.571,-3,0.0071, 2.89,-25,11228 + ,rhSco,ICRS,15,56,53.0765,-29,12,50.664,-0.1013333333333,-2.510,-0.4,0.00797, 3.864,0,0 +Alniyat ,siSco,ICRS,16,21,11.3161,-25,35,34.067,-0.0668666666666667,-1.803,-.4,0.00444, 2.89,-25,11485 + ,taSco,ICRS,16,35,52.9537,-28,12,57.658,-0.0572666666666667,-2.25,2.0,0.00759, 2.82,-27,11015 +Lesath ,upSco,ICRS,17,30,45.8357,-37,17,44.920,-0.0279333333333333,-2.914,8.0,0.00629, 2.69,-37,11638 +Jabhat al Akrab,ome-1Sco,ICRS,16,06,48.4259,-20,40,09.093,-0.0703333333333333,-2.373,-3.1,0.0077, 3.96,-20, 4405 +Jabhat al Akrab,ome-2Sco,ICRS,16,07,24.3274,-20,52,07.551,0.2912,-4.53,-5.4,0.01232, 4.32,-20, 4408 +# Scutum + ,alSct,ICRS,18,35,12.4267,-08,14,38.662,-0.126533333333333,-31.463,35.8,0.01872, 3.85,-08, 4638 + ,beSct,ICRS,18,47,10.4728,-04,44,52.322,-0.0514,-1.589,-21.5,0.00473, 4.22,-04, 4582 + ,gaSct,ICRS,18,29,11.8538,-14,33,56.928,0.0204666666666667,-0.348,-41,0.01119, 4.70,-14, 5071 + ,deSct,ICRS,18,42,16.4268,-09,03,09.175,0.0524666666666667,0.202,-44.8,0.01744, 4.72,-09, 4796 + ,epSct,ICRS,18,43,31.2527,-08,16,30.773,0.141933333333333,1.158,-11.2,0.00624, 4.90,-08, 4686 + ,zeSct,ICRS,18,23,39.5845,-08,56,03.780,0.345933333333333,5.229,-5.6,0.01708, 4.673,0, 0 +# Serpens +Unukalhai ,alSer,ICRS,15,44,16.0749,06,25,32.257,0.897733333333333,4.414,2.9,0.04454, 2.65, 06, 3088 +Cor Serpentis,alSer,ICRS,15,44,16.0749,06,25,32.257,0.897733333333333,4.414,2.9,0.04454, 2.65, 06, 3088 +Chow ,beSer,ICRS,15,46,11.2564,15,25,18.572,0.456933333333333,-4.131,-.8,0.02131, 3.67, 15, 2911 +Zhou ,beSer,ICRS,15,46,11.2564,15,25,18.572,0.456933333333333,-4.131,-.8,0.02131, 3.67, 15, 2911 +Ainalhai ,gaSer,ICRS,15,56,27.1828,15,39,41.821,2.0746,-128.216,6.7,0.08992, 3.85, 16, 2849 +Qin ,deSer,ICRS,15,34,48.1471,10,32,19.921,-0.4842,0.317,15.54,0.0, 3.79, 0,0 +Chin ,deSer,ICRS,15,34,48.1471,10,32,19.921,-0.4842,0.317,15.54,0.0, 3.79, 0,0 +Nulla Pambu ,epSer,ICRS,15,50,48.9661,04,28,39.829,0.8532,6.187,-9.3,0.04639, 3.71, 04, 3069 +Tang ,etSer,ICRS,18,21,18.6007,-02,53,55.770,-3.65046666666667,-70.071,8.9,0.05281, 3.26,-02, 4599 +Alya ,th-1Ser,ICRS,18,56,13.1824,04,12,12.942,0.251266666666667,2.698,-46.0,0.02473, 4.61, 04, 3916 + ,kaSer,ICRS,15,48,44.3768,18,08,29.629,-0.3452,-8.872,-38.7,0.00936, 4.09, 18, 3074 +Leiolepis ,muSer,ICRS,15,49,37.2084,-03,25,48.748,-0.6538,-2.741,-9.4,0.02094, 3.54,-02, 4052 +Leiolepidotus,muSer,ICRS,15,49,37.2084,-03,25,48.748,-0.6538,-2.741,-9.4,0.02094, 3.54,-02, 4052 +Nehushtan ,xiSer,ICRS,17,37,35.2015,-15,23,54.806,-0.262,-6.127,-42.8,0.03093, 3.54,-15, 4621 + ,siSer,ICRS,16,22,04.3490,01,01,44.541,-1.04013333333333,4.809,-49.8,0.03656, 4.82, 01, 3215 + ,ta-1Ser,ICRS,15,25,47.3967,15,25,40.930,-0.0934666666666667,-0.751,-19.8,0.00355, 5.17, 15, 2858 +# Sextans + ,deSex,ICRS,10,29,28.7022,-02,44,20.681,-0.3252,-1.276,19,0.01087, 5.21,-02, 3155 + ,epSex,ICRS,10,17,37.8022,-08,04,08.092,-1.06833333333333,0.278,15.2,0.01786, 5.24,-07, 3001 +# Sagitta +Sham ,alSge,ICRS,19,40,05.7918,18,00,50.006,0.1006,-1.972,1.7,0.00689, 4.37, 17, 4042 + ,beSge,ICRS,19,41,02.9393,17,28,33.748,0.0604,-3.39,-22.4,0.00699, 4.37, 17, 4048 + ,gaSge,ICRS,19,58,45.4275,19,29,31.732,0.429133333333333,2.258,-32.8,0.0119, 3.47, 19, 4229 + ,deSge,ICRS,19,47,23.2624,18,32,03.430,-0.0305333333333333,1.11,2.5,0.00728, 3.82, 18, 4240 +# Sagittarius +Rukbat ,alSgr,ICRS,19,23,53.1765,-40,36,57.384,0.2178,-12.081,-.7,0.0192, 3.97,-40,13245 +Arkab Prior,be-1Sgr,ICRS,19,22,38.2925,-44,27,32.273,0.0487333333333333,-2.243,-10.7,0.00862, 4.01,-44,13277 +Arkab Posterior,be-2Sgr,ICRS,19,23,13.1369,-44,47,59.203,0.618533333333333,-5.373,19,0.02352, 4.29,-45,13171 +Alnasl ,ga-2Sgr,ICRS,18,05,48.4869,-30,25,26.729,-0.371666666666667,-18.153,22.0,0.03394, 2.99,-30,15215 +Nash ,ga-2Sgr,ICRS,18,05,48.4869,-30,25,26.729,-0.371666666666667,-18.153,22.0,0.03394, 2.99,-30,15215 +Kaus Medis ,deSgr,ICRS,18,20,59.6417,-29,49,41.172,0.199733333333333,-2.638,-19.9,0.01067, 2.70,-29,14834 +Kaus Meridionalis,deSgr,ICRS,18,20,59.6417,-29,49,41.172,0.199733333333333,-2.638,-19.9,0.01067, 2.70,-29,14834 +Kaus Australis,epSgr,ICRS,18,24,10.3183,-34,23,04.618,-0.264066666666667,-12.405,-15,0.02255, 1.85,-34, 12784 +Ascella ,zeSgr,ICRS,19,02,36.7139,-29,52,48.379,-0.094,0.366,22,0.03661, 2.60,-30,16575 +Sephdar ,etSgr,ICRS,18,17,37.6351,-36,45,42.070,-0.8618,-16.661,.5,0.02187, 3.11,-36,12423 +Ira Furoris ,etSgr,ICRS,18,17,37.6351,-36,45,42.070,-0.8618,-16.661,.5,0.02187, 3.11,-36,12423 + ,th-1Sgr,ICRS,19,59,44.1786,-35,16,34.700,0.0401333333333333,-2.515,.9,0.00528, 4.37,-35,13831 + ,th-2Sgr,ICRS,19,59,51.3571,-35,41,52.077,0.7247333333333333,-6.913,-17.6,0.02081 5.309,0,0 + ,ioSgr,ICRS,19,55,15.6974,-41,52,05.837,0.1558,5.16,35.8,0.01724, 4.13,-42,14549 + ,ka-1Sgr,ICRS,20,22,27.5053,-42,02,58.374,0.2196,-8.198,-11.6,0.01335, 5.64,-42,14836 +Kaus Borealis,laSgr,ICRS,18,27,58.2405,-25,25,18.120,-0.298733333333333,-18.63,-43.2,0.0422, 2.81,-25,13149 +Polis ,muSgr,ICRS,18,13,45.8098,-21,03,31.801,0.0114666666666667,-0.139,-6.0,0.00011, 3.86,-21, 4908 +Ain al Rami,nu-1Sgr,ICRS,18,54,10.1771,-22,44,41.403,0.0196666666666667,-0.57,-12.1,0.00176, 4.83,-22, 4907 + ,xi-2Sgr,ICRS,18,57,43.8015,-21,06,23.955,0.232733333333333,-1.233,-19.9,0.00876, 3.51,-21, 5201 +Manubrium ,omiSgr,ICRS,19,04,40.9817,-21,44,29.384,0.5084,-5.808,25.2,0.02349, 3.77,-21, 5237 +Albaldah ,piSgr,ICRS,19,09,45.8331,-21,01,25.013,-0.0078,-3.683,-9.8,0.00741, 2.89,-21, 5275 +Nunki ,siSgr,ICRS,18,55,15.9257,-26,17,48.200,0.0924666666666667,-5.265,-11.2,0.01454, 2.02,-26,13595 +Hecatebolus ,taSgr,ICRS,19,06,56.4089,-27,40,13.523,-0.3386,-25.05,45.4,0.02709, 3.32,-27,13564 +Nanto ,phSgr,ICRS,18,45,39.3865,-26,59,26.802,0.341,0.045,21.5,0.01414, 3.17,-27,13170 + ,upSgr,ICRS,19,21,43.6231,-15,57,18.063,0.0119333333333333,-0.627,8.9,0.00195, 4.61,-16, 5283 +Terebellium ,omeSgr,ICRS,19,55,50.3577,-26,17,58.223,1.35973333333333,7.44,-21.0,0.04203, 4.70,-26,14637 +Gal. Center,SgrA*,2000,17,45,40.0383 ,-29,00,28.069, 0.000, 0.00, 0.0,0.0000,999.99, 0, 0 +Facies ,M22Sgr,ICRS,18,36,24.21,-23,54,12.2,0.065959,-0.7552,-148,0.0, 6.17,0, 0 # NGC 6656 +Spiculum ,M8Sgr,ICRS,18,04,30.00,-24,22,0.0,0.0060666667,-0.322,-13.32,0.0, 4.6,0, 0 # NGC 6530 + ,52Sgr,ICRS,19,36,42.4332,-24,53,01.043,0.458,-2.319,-19.0,0.01724, 4.598,0, 0 + ,59Sgr,ICRS,19,56,56.8312,-27,10,11.636,0.064,-1.495,-16.2,0.00270, 4.544,0, 0 + ,62Sgr,ICRS,20,02,39.4805,-27,42,35.441,0.2152,1.435,9.9,0.00728, 4.508,0, 0 +# Taurus +Aldebaran ,alTau,ICRS,04,35,55.2387,16,30,33.485,0.418533333333333,-18.935,54.3,0.05009, 0.85, 16, 629 +Elnath ,beTau,ICRS,05,26,17.5134,28,36,26.820,0.1552,-17.422,9.2,0.02489, 1.65, 28, 795 +El Nath ,beTau,ICRS,05,26,17.5134,28,36,26.820,0.1552,-17.422,9.2,0.02489, 1.65, 28, 795 +Alnath ,beTau,ICRS,05,26,17.5134,28,36,26.820,0.1552,-17.422,9.2,0.02489, 1.65, 28, 795 +Prima Hyadum ,gaTau,ICRS,04,19,47.6037,15,37,39.512,0.7686,-2.386,38.7,0.02117, 3.63, 15, 612 +Hyadum I ,gaTau,ICRS,04,19,47.6037,15,37,39.512,0.7686,-2.386,38.7,0.02117, 3.63, 15, 612 +Secunda Hyadum,de-1Tau,ICRS,04,22,56.0933,17,32,33.051,0.718333333333333,-2.884,38.8,0.02129, 3.76, 17, 712 +Hyadum II ,de-1Tau,ICRS,04,22,56.0933,17,32,33.051,0.718333333333333,-2.884,38.8,0.02129, 3.76, 17, 712 +Ain ,epTau,ICRS,04,28,36.9995,19,10,49.554,0.714866666666667,-3.677,39,0.02104, 3.54, 18, 640 +Al Hecka ,zeTau,ICRS,05,37,38.6858,21,08,33.177,0.0159333333333333,-1.804,20,0.00782, 3.00, 21, 908 +Alcyone ,etTau,ICRS,03,47,29.0765,24,06,18.494,0.129,-4.311,10.1,0.00887, 2.87, 23, 541 +Phaeo ,th-1Tau,ICRS,04,28,34.4959,15,57,43.851,0.6984,-1.501,39.8,0.02066, 3.847, 0, 0 +Phaesula ,th-2Tau,ICRS,04,28,39.7408,15,52,15.178,0.7244,-2.639,39.5,0.02189, 3.409, 21, 751 + ,ioTau,ICRS,05,03,05.7473,21,35,23.865,0.4596,-4.085,40.6,0.02001, 4.64, 21, 751 +Althaur ,laTau,ICRS,04,00,40.8157,12,29,25.248,-0.0543333333333333,-1.198,17.8,0.00881, 3.47, 12, 539 +Kattupothu ,muTau,ICRS,04,15,32.0573,08,53,32.485,0.135933333333333,-2.175,17.3,0.0075, 4.29, 08, 657 +Furibundus ,nuTau,ICRS,04,03,09.3801,05,59,21.498,0.0368,-0.163,-5.7,0.02524, 3.91, 05, 581 +Ushakaron ,xiTau,ICRS,03,27,10.1527,09,43,57.647,0.3574,-3.812,-2,0.01468, 3.74, 09, 439 +Atirsagne ,omiTau,ICRS,03,24,48.7938,09,01,43.931,-0.495,-8.031,-21.0,0.01542, 3.60, 08, 511 + ,taTau,ICRS,04,42,14.7017,22,57,24.934,-0.0189333333333333,-2.033,14.6,0.00814, 4.28, 22, 739 + ,rhTau,ICRS,04,33,50.9177,14,50,39.928,0.691266666666667,-2.594,39.6,0.02139, 4.65, 14, 720 + ,ome-1Tau,ICRS,04,09,09.9671,19,36,33.180,0.716266666666667,-3.164,24.8,0.01121, 5.50, 19, 672 +Celeano ,16Tau,ICRS,03,44,48.2154,24,17,22.093,0.1382,-4.4,2.9,0.00975, 5.46, 23, 505 +Electra ,17Tau,ICRS,03,44,52.5373,24,06,48.021,0.143666666666667,-4.492,12.4,0.0088, 3.70, 23, 507 +Taygeta ,19Tau,ICRS,03,45,12.4945,24,28,02.199,0.129,-4.163,5.5,0.00875, 4.30, 24, 547 +Maia ,20Tau,ICRS,03,45,49.6067,24,22,03.895,0.1406,-4.503,7.5,0.00906, 3.87, 23, 516 +Asterope ,21Tau,ICRS,03,45,54.4763,24,33,16.240,0.1296,-4.536,-.1,0.00843, 5.76, 24, 553 +Sterope I ,21Tau,ICRS,03,45,54.4763,24,33,16.240,0.1296,-4.536,-.1,0.00843, 5.76, 24, 553 +Sterope II ,22Tau,ICRS,03,46,02.9003,24,31,40.433,0.1322,-4.438,0,0.00921, 6.43, 24, 556 +Merope ,23Tau,ICRS,03,46,19.5739,23,56,54.090,0.141133333333333,-4.267,6.2,0.00908, 4.18, 23, 522 +Atlas ,27Tau,ICRS,03,49,09.7425,24,03,12.296,0.118466666666667,-4.47,8.5,0.00857, 3.63, 23, 557 +Pleione ,28Tau,ICRS,03,49,11.2161,24,08,12.163,0.124733333333,-4.674,4.4,0.00842, 5.048, 0, 0 +# Telescopium + ,alTel,ICRS,18,26,58.4163,-45,58,06.452,-0.1112,-5.333,-.2,0.01308, 3.51,-46,12379 + ,epTel,ICRS,18,11,13.7625,-45,57,15.903,-0.108533333333333,-3.726,-26.3,0.00798, 4.53,-45,12251 + ,ioTel,ICRS,19,35,12.9876,-48,05,57.126,-0.0469333333333333,-3.743,22.3,0.00819, 4.90,-48,13161 + ,laTel,ICRS,18,58,27.7664,-52,56,19.064,0.0768666666666667,-0.881,-2,0.00614, 5.03,-53, 9402 + ,nuTel,ICRS,19,48,01.1989,-56,21,45.401,0.616,-13.74,-12.4,0.01919, 5.35,-56, 9290 + ,xiTel,ICRS,20,07,23.1563,-52,52,50.855,-0.0848,0.688,36.0,0.0026, 4.94,-53, 9794 +# Triangulum Australe +Atria ,alTrA,ICRS,16,48,39.8949,-69,01,39.774,0.119,-3.292,-3.3,0.00785, 1.92,-68, 2822 + ,beTrA,ICRS,15,55,08.5623,-63,25,50.616,-1.2564,-40.192,.4,0.08124, 2.85,-63, 3723 + ,gaTrA,ICRS,15,18,54.5821,-68,40,46.362,-0.4432,-3.2,-3,0.01785, 2.89,-68, 2383 + ,deTrA,ICRS,16,15,26.2707,-63,41,08.454,0.0234,-1.349,-4.9,0.00525, 3.85,-63, 3854 + ,epTrA,ICRS,15,36,43.2225,-66,19,01.335,0.1634,-5.466,-15.5,0.01509, 4.11,-65, 3102 + ,zeTrA,ICRS,16,28,28.1435,-70,05,03.843,1.33253333333333,11.077,8.5,0.08261, 4.91,-69, 2558 +# Triangulum +Ras Mutallah ,alTri,ICRS,01,53,04.9079,29,34,43.785,0.0801333333333333,-23.369,-12.6,0.05087, 3.41, 28, 312 +Metallah ,alTri,ICRS,01,53,04.9079,29,34,43.785,0.0801333333333333,-23.369,-12.6,0.05087, 3.41, 28, 312 + ,beTri,ICRS,02,09,32.6269,34,59,14.269,0.991866666666667,-3.913,9.9,0.02624, 3.00, 34, 381 + ,gaTri,ICRS,02,17,18.8673,33,50,49.897,0.2994,-5.242,14,0.02773, 4.01, 33, 397 +# Tucana + ,alTuc,ICRS,22,18,30.0941,-60,15,34.515,-0.476533333333333,-3.815,42.2,0.01642, 2.86,-60, 7561 + ,gaTuc,ICRS,23,17,25.7733,-58,14,08.643,-0.232866666666667,7.959,18.4,0.0454, 3.99,-58, 8062 + ,epTuc,ICRS,23,59,54.9787,-65,34,37.675,0.3242,-2.233,11,0.00871, 4.50,-66, 3819 + ,zeTuc,ICRS,00,20,04.2601,-64,52,29.246,11.3823333333333,116.56,8.8,0.11638, 4.23,-65, 13 + ,ioTuc,ICRS,01,07,18.6637,-61,46,31.041,0.491933333333333,-1.124,-7.8,0.01168, 5.37,-62, 89 + ,la-2Tuc,ICRS,00,55,00.3126,-69,31,37.503,0.0528,-4.335,5.1,0.01552, 5.45,-70, 40 +# Ursa Major +Dubhe ,alUMa,ICRS,11,03,43.6687,61,45,03.720,-0.909733333333333,-3.525,-8.9,0.02638, 1.79, 62, 1161 +Merak ,beUMa,ICRS,11,01,50.4768,56,22,56.736,0.5444,3.374,-12.0,0.04107, 2.37, 57, 1302 +Phecda ,gaUMa,ICRS,11,53,49.8475,53,41,41.136,0.7184,1.116,-12.6,0.03899, 2.44, 54, 1475 +Megrez ,deUMa,ICRS,12,15,25.5601,57,01,57.421,0.6904,0.781,-13.4,0.04005, 3.31, 57, 1363 +Alioth ,epUMa,ICRS,12,54,01.7494,55,57,35.356,0.744933333333333,-0.899,-9.3,0.0403, 1.77, 56, 1627 +Mizar ,zeUMa,2000,13,23,55.539, 54,55,31.38, 1.411, -2.00, -6.0,0.0370, 2.27, 55, 1598 +Alkaid ,etUMa,ICRS,13,47,32.4377,49,18,47.754,-0.8082,-1.556,-10.9,0.03239, 1.86, 50, 2027 +Benetnash ,etUMa,ICRS,13,47,32.4377,49,18,47.754,-0.8082,-1.556,-10.9,0.03239, 1.86, 50, 2027 +Al Haud ,thUMa,ICRS,09,32,51.4343,51,40,38.281,-6.3134,-53.564,15.4,0.07415, 3.17, 52, 1401 +Talitha Borealis ,ioUMa,ICRS,08,59,12.4539,48,02,30.575,-2.94073333333333,-21.522,9.0,0.06832, 3.14, 48, 1707 +Talitha Australis,kaUMa,ICRS,09,03,37.5267,47,09,23.489,-0.249133333333333,-5.539,4.4,0.00771, 3.60, 47, 1633 +Tania Borealis ,laUMa,ICRS,10,17,05.7915,42,54,51.714,-1.13406666666667,-4.264,18.1,0.02427, 3.45, 43, 2005 +Tania Australis,muUMa,ICRS,10,22,19.7406,41,29,58.259,-0.536466666666667,3.41,-20.5,0.01311, 3.05, 42, 2115 +Alula Borealis ,nuUMa,ICRS,11,18,28.7368,33,05,39.500,-0.1774,2.751,-9.2,0.00774, 3.48, 33, 2098 +Alula Australis,xiUMa,ICRS,11,18,10.9,31,31,44,-2.86666666666667,-58.8,-18.2,0, 3.79, 32, 2132 +Muscida ,omiUMa,ICRS,08,30,15.8700,60,43,05.409,-0.8954,-10.773,19.8,0.01776, 3.36, 61, 1054 + ,rhUMa,ICRS,09,02,32.6921,67,37,46.628,-0.1472,1.815,4.6,0.01135, 4.76, 68, 551 + ,upUMa,ICRS,09,50,59.3578,59,02,19.448,-1.96293333333333,-15.175,27.3,0.02835, 3.80, 59, 1268 +El Kophrah ,chUMa,ICRS,11,46,03.0140,47,46,45.861,-0.922533333333333,2.837,-8.8,0.01664, 3.71, 48, 1966 + ,psUMa,ICRS,11,09,39.8084,44,29,54.553,-0.415666666666667,-2.738,-3.8,0.02221, 3.01, 45, 1897 +Alcor ,80Uma,ICRS,13,25,13.5379,54,59,16.648,0.802333333333333,-1.694,-8.9,0.04019, 4.01, 55, 1603 +Saidak ,80Uma,ICRS,13,25,13.5379,54,59,16.648,0.802333333333333,-1.694,-8.9,0.04019, 4.01, 55, 1603 +# Ursa Minor +Polaris ,alUMi,ICRS,02,31,49.0837,89,15,50.794,0.2948,-1.175,-17.4,0.00756, 2.02, 88, 8 +Kochab ,beUMi,ICRS,14,50,42.3264,74,09,19.818,-0.215266666666667,1.191,16.9,0.02579, 2.08, 74, 595 +Pherkad ,gaUMi,ICRS,15,20,43.7155,71,50,02.458,-0.1202,1.768,-3.9,0.00679, 3.05, 72, 679 +Yildun ,deUMi,ICRS,17,32,13.0005,86,35,11.258,0.0702666666666667,5.397,-7.6,0.01785, 4.36, 86, 269 +Urodelus ,epUMi,ICRS,16,45,58.2438,82,02,14.143,0.130266666666667,0.467,-11.4,0.00941, 4.23, 82, 498 +Alifa Al Farkadain,zeUMi,ICRS,15,44,03.5193,77,47,40.175,0.1338,-0.25,-13.1,0.00868, 4.32, 78, 527 +Farkadain ,zeUMi,ICRS,15,44,03.5193,77,47,40.175,0.1338,-0.25,-13.1,0.00868, 4.32, 78, 527 +Pharkadain ,zeUMi,ICRS,15,44,03.5193,77,47,40.175,0.1338,-0.25,-13.1,0.00868, 4.32, 78, 527 +Anwar al Farkadain,etUMi,ICRS,16,17,30.2878,75,45,19.190,-0.5996,25.78,-9.5,0.03352, 4.95, 76, 596 + ,laUMi,ICRS,17,16,56.4607,89,02,15.749,-0.153533333333333,-0.307,1.9,0.00372, 6.55, 88, 112 +Pherkad Minor,11UMi,ICRS,15,17,05.8886,71,49,26.044,0.0248666666666667,0.937,-16.1,0.00837, 5.02, 72, 678 +# Vela +Suhail al Muhlif,ga-2Vel,ICRS,08,09,31.9503,-47,20,11.716,-0.0395333333333333,0.99,35,0.00388, 1.82,-46, 3847 +Regor ,ga-2Vel,ICRS,08,09,31.9503,-47,20,11.716,-0.0395333333333333,0.99,35,0.00388, 1.82,-46, 3847 +Koo She ,deVel,ICRS,08,44,42.2264,-54,42,31.756,0.191866667,-10.414,2.2,0.04090, 1.95,0, 0 +Markeb ,kaVel,ICRS,09,22,06.8183,-55,00,38.405,-0.0714666666666667,1.124,21.9,0.00605, 2.50,-54, 2219 +Alsuhail ,laVel,ICRS,09,07,59.7585,-43,25,57.322,-0.154733333333333,1.428,18.4,0.00569, 2.21,-42, 4990 +Suhail ,laVel,ICRS,09,07,59.7585,-43,25,57.322,-0.154733333333333,1.428,18.4,0.00569, 2.21,-42, 4990 +Peregrini ,muVel,ICRS,10,46,46.1782,-49,52,12.919,0.417,-5.357,6.2,0.02818, 2.721,0, 0 +Alherem ,muVel,ICRS,10,46,46.1782,-49,52,12.919,0.417,-5.357,6.2,0.02818, 2.721,0, 0 +Xestus ,omiVel,ICRS,08,40,17.5854,-52,55,18.794,-0.164133333333333,3.509,16.1,0.00659, 3.62,-52, 1583 +Tseen Ke ,phVel,ICRS,09,56,51.7417,-54,34,04.046,-0.0875333333333333,0.283,13.9,0.00169, 3.54,-53, 3075 +# Virgo +Spica ,alVir,ICRS,13,25,11.5793,-11,09,40.759,-0.283333333333333,-3.173,1.0,0.01244, 0.97,-10, 3672 +Zavijava ,beVir,ICRS,11,50,41.7185,01,45,52.985,4.93966666666667,-27.118,4.6,0.09174, 3.61, 02, 2489 +Alaraph ,beVir,ICRS,11,50,41.7185,01,45,52.985,4.93966666666667,-27.118,4.6,0.09174, 3.61, 02, 2489 +Porrima ,gaVir,2000,12,41,40.000,-01,26,58.30, -4.112, 6.07, -20.0,0.0854, 2.74,-00, 2601 +Auva ,deVir,ICRS,12,55,36.2078,03,23,50.893,-3.14293333333333,-5.281,-17.8,0.01611, 3.38, 04, 2669 +Vindemiatrix ,epVir,ICRS,13,02,10.5971,10,57,32.941,-1.83366666666667,1.996,-14.0,0.0319, 2.83, 11, 2529 +Heze ,zeVir,ICRS,13,34,41.5920,-00,35,44.953,-1.85926666666667,4.856,-13.2,0.04455, 3.37, 00, 3076 +Zaniah ,etVir,ICRS,12,19,54.3569,-00,40,00.492,-0.394266666666667,-2.313,2.3,0.01306, 3.89, 00, 2926 + ,thVir,ICRS,13,09,56.9915,-05,32,20.435,-0.233866666666667,-3.28,-2.9,0.00786, 4.38,-04, 3430 +Syrma ,ioVir,ICRS,14,16,00.8697,-06,00,01.968,-0.172266666666667,-41.984,11.5,0.04674, 4.08,-05, 3843 + ,kaVir,ICRS,14,12,53.7458,-10,16,25.326,0.0536,14.079,-4.0,0.01459, 4.19,-09, 3878 +Khambalia ,laVir,ICRS,14,19,06.5916,-13,22,15.942,-0.114133333333333,2.939,-10.9,0.01747, 4.52,-12, 4018 +Rijl al Awwa ,muVir,ICRS,14,43,03.6234,-05,39,29.544,0.694866666666667,-31.99,5.4,0.05354, 3.88,-05, 3936 +Ril Alauva ,muVir,ICRS,14,43,03.6234,-05,39,29.544,0.694866666666667,-31.99,5.4,0.05354, 3.88,-05, 3936 + ,nuVir,ICRS,11,45,51.5590,06,31,45.755,-0.131,-18.002,50.7,0.01042, 4.03, 07, 2479 + ,omiVir,ICRS,12,05,12.5396,08,43,58.748,-1.4688,5.752,-29.8,0.01908, 4.12, 09, 2583 + ,piVir,ICRS,12,00,52.3901,06,36,51.561,-0.00166666666666667,-2.971,-10.4,0.00916, 4.66, 07, 2502 + ,rhVir,ICRS,12,41,53.0565,10,14,08.251,0.5508,-8.951,1.6,0.0271, 4.88, 11, 2485 + ,siVir,ICRS,13,17,36.2827,05,28,11.530,-0.0477333333333333,1,-26.8,0.00603, 4.80, 06, 2722 + ,taVir,ICRS,14,01,38.7933,01,32,40.315,0.116066666666667,-2.12,-2.0,0.01494, 4.26, 02, 2761 + ,phVir,ICRS,14,28,12.1381,-02,13,40.646,-0.9396,-0.292,-9.5,0.02415, 4.81,-01, 2957 + ,chVir,ICRS,12,39,14.7669,-07,59,44.032,-0.515333333333333,-2.466,-19.7,0.01024, 4.66,-07, 3452 + ,psVir,ICRS,12,54,21.1633,-09,32,20.380,-0.121733333333333,-1.972,17.6,0.00782, 4.79,-08, 3449 + ,109Vir,ICRS,14,46,14.9241,01,53,34.388,-0.7736,-2.175,-6.1,0.02535, 3.72,0, 0 +# Volans + ,alVol,ICRS,09,02,26.7959,-66,23,45.876,-0.0134,-9.58,4.9,0.02624, 4.00,-65, 1065 + ,beVol,ICRS,08,25,44.1946,-66,08,12.805,-0.238866666666667,-15.215,27.4,0.03021, 3.77,-65, 933 + ,ga-2Vol,ICRS,07,08,44.8659,-70,29,56.154,0.158066666666667,10.806,2.8,0.02302, 3.78,-70, 600 + ,deVol,ICRS,07,16,49.8245,-67,57,25.747,-0.0274,0.85,22.5,0.00494, 3.98,-67, 730 + ,zeVol,ICRS,07,41,49.2612,-72,36,21.953,0.222533333333333,1.529,48.1,0.02436, 3.95,-72, 627 + ,ioVol,ICRS,06,51,26.9863,-70,57,48.280,0.0268,2.556,18.5,0.00584, 5.40,-70, 572 +#Vulpecula +Anser ,alVul,ICRS,19,28,42.3299,24,39,53.657,-0.843,-10.699,-85.5,0.011, 4.44, 24, 3759 +# +# test stars from Astronomica Almanac +AA97_page_B40, ,2000,14,39,36.087,-60,50, 7.14,-49.486, 69.60, -22.2,0.752,0 , 0, 0 +# note, proper motion RA given by AA11 (-3678.06mas/yr) includes the 15cos(de0) +# factor, whereas AA06 (50.315s/cy) doesn't do so. +# The Swiss Ephemeris from version 1.77 on divides the proper motion in RA +# as given in this file by cos(de0). +# AA06: proper motion RA by -50.315"/cy corresponds to -24.520 great circle +AA06_page_B65, ,ICRS,14,39,36.496,-60,50, 2.31,-24.520, 48.29, -21.6,0.742,0 , 0, 0 +# AA11: proper motion RA by -50.314568"/cy corresponds to -24.5204 great circle +AA11_page_B73, ,ICRS,14,39,36.4958,-60,50, 2.309,-24.5204, 48.287, -21.6,0.742,0 , 0, 0 diff --git a/swe/src/sedeltat.txt.inactive b/swe/src/sedeltat.txt.inactive new file mode 100644 index 0000000..cc841c2 --- /dev/null +++ b/swe/src/sedeltat.txt.inactive @@ -0,0 +1,13 @@ +# This file allows to make new Delta T known to the Swiss Ephemeris. +# Note, these values override the values given in the internal Delta T +# table of the Swiss Ephemeris. +# +# If you want to use this file, change its file name and remove the +# the extension '.inactive'. As soon as you do so, the values below +# will be used, i.e. they will override the internal Delta T values +# of the Swiss Ephemeris. +# +# Format: year and seconds (decimal) +2007 65.15 +2008 65.46 +2009 65.78 diff --git a/swe/src/sefstars.txt b/swe/src/sefstars.txt new file mode 100644 index 0000000..afa8ddf --- /dev/null +++ b/swe/src/sefstars.txt @@ -0,0 +1,1258 @@ +Aldebaran ,alTau,ICRS,04,35,55.2387,+16,30,33.485,62.78,-189.35,54.26,50.09,0.985, 16, 629 +Algol ,bePer,ICRS,03,08,10.1315,+40,57,20.332,2.39,-1.44,4.0,35.14,2.12, 40, 673 +Antares ,alSco,ICRS,16,29,24.4609,-26,25,55.209,-10.16,-23.21,-3.4,5.40,1.09,-26,11359 +Regulus ,alLeo,ICRS,10,08,22.4593,+11,58,01.9027,-248.73,5.59,5.9,42.09,1.35, 12, 2149 +Sirius ,alCMa,ICRS,06,45,08.9173,-16,42,58.017,-546.05,-1223.14,-7.6,379.21,-1.47,-16, 1591 +Spica ,alVir,ICRS,13,25,11.5793,-11,09,40.759,-42.50,-31.73,1.0,12.44,1.04,-10, 3672 +# speed of SgrA* according to Reid (2004), "The Proper Motion of Sagittarius +# A*", p. 873: -3.151 +- 0.018 mas/yr, -5.547 +- 0.026 mas/yr. Component in +# RA must be multiplied with cos(decl). +Gal. Center,SgrA*,2000,17,45,40.0409,-29,00,28.118,-2.755718425, -5.547, 0.0,0.0000,999.99, 0, 0 +# Great Attractor, near Galaxy Cluster ACO 3627, at gal. coordinates +# 325.3, -7.2, 4844 km s-1 according to Kraan-Korteweg et al. 1996, +# Woudt 1998 +Great Attractor,GA,2000,16,15,02.836,-60,53,22.54,0.000, 0.00, 0.0,0.0000,999.99, 0, 0 +# Virgo Cluster, according to NED (Nasa Extragalactic Database) +Virgo Cluster,VC,2000,12,26,32.1,12,43,24,0.000, 0.00, 0.0,0.0000,999.99, 0, 0 +Andromeda Galaxy,M31,ICRS,00,42,44.330,+41,16,07.50,-35.99,-12.92,-301,,3.44, 0, 0 +# Prasepe (Beehive Cluster): http://seds.lpl.arizona.edu/messier/m/m044.html (note, the apparent dimension is 95.0 arc min) +Praesepe Cluster,M44,2000,08,40,6.000,19,59,0.00,0.000, 0.00, 0.0,0.0000,3.7, 0, 0 +# Prasepe (Beehive Cluster): http://obswww.unige.ch/webda/cgi-bin/ocl_page.cgi?cluster=m44 (note, the apparent dimension is 95.0 arc min) +Praesepe Cluster,M44,2000,08,40,6.000,19,59,0.00,0.000, 0.00, 0.0,0.0000,3.7, 0, 0 +# moved this to top of file, otherwise Polaris Australis will be found +Polaris ,alUMi,ICRS,02,31,49.0837,+89,15,50.794,44.22,-11.75,-17.4,7.56,2.005, 88, 8 +# +# Fixed stars brighter than Magnitude 5 +# This file is based on data provided by S. Moshier. +# 7 Mai 1999: +# File was improved by Valentin Abramov, Tartu, Estonia in April 1999. +# - The stars are ordered by constellation. +# - Most names come from Arabic and have several transliterations, +# e.g. Algieba and Al Jabhah. In such cases, the record has been +# duplicated and both spellings have been given. +# +# 11 Jan 2006 (Dieter Koch): +# File updated with star positions from the SIMBAD Astronomical Database. +# http://simbad.u-strasbg.fr/simbad/sim-fid +# +# The Galactic Center was taken from +# The Astrophysical Journal, Volume 518, Issue 1, pp. L33-L35. +# +# The data are: +# traditional name (no leading blanks in field) +# nomenclature name (no leading blanks in field) +# equinox (must be either '1950' or '2000' or 'ICRS') +# right ascension hours +# minutes +# seconds +# declination degrees +# minutes +# seconds +# proper motion in right asc., 0.001"/year * cos(decl0) +# in decl., 0.001"/year +# radial velocity in km/s +# annual parallax in 0.001"/year +# magnitude V +# DM zone (Durchmusterung zone; declination 1900) +# DM number +# +# To achieve higher speed for swe_fixstar(), you can copy the +# stars you prefer to the top of the list +# +# The following stars are given first to avoid that swe_fixstar() +# return e.g. Denebola when Deneb is required. +Deneb ,alCyg,ICRS,20,41,25.9147,+45,16,49.217,1.56,1.55,-4.5,1.01,1.25, 44, 3541 +Deneb Adige ,alCyg,ICRS,20,41,25.9147,+45,16,49.217,1.56,1.55,-4.5,1.01,1.25, 44, 3541 +Rigel ,beOri,ICRS,05,14,32.2723,-08,12,05.906,1.87,-0.56,20.7,4.22,0.12,-08, 1063 +Mira ,omiCet,ICRS,02,19,20.7927,-02,58,39.513,10.33,-239.48,63.8,7.79,3.04,-03, 353 +Ain ,epTau,ICRS,04,28,36.9995,+19,10,49.554,107.23,-36.77,38.15,21.04,3.540, 18, 640 +# +# Andromeda +Alpheratz ,alAnd,ICRS,00,08,23.2586,+29,05,25.555,135.68,-162.95,-11.7,33.60,2.06, 28, 4 +Sirrah ,alAnd,ICRS,00,08,23.2586,+29,05,25.555,135.68,-162.95,-11.7,33.60,2.06, 28, 4 +Mirach ,beAnd,ICRS,01,09,43.9236,+35,37,14.008,175.59,-112.23,0.06,16.36,2.06, 34, 198 +Almaak ,ga-1And,ICRS,02,03,53.9531,+42,19,47.009,43.08,-50.85,-11.7,9.19,2.26, 41, 395 +Almak ,ga-1And,ICRS,02,03,53.9531,+42,19,47.009,43.08,-50.85,-11.7,9.19,2.26, 41, 395 +Almac ,ga-1And,ICRS,02,03,53.9531,+42,19,47.009,43.08,-50.85,-11.7,9.19,2.26, 41, 395 +Almach ,ga-1And,ICRS,02,03,53.9531,+42,19,47.009,43.08,-50.85,-11.7,9.19,2.26, 41, 395 + ,deAnd,ICRS,00,39,19.6758,+30,51,39.686,115.38,-83.05,-7.3,32.19,3.28, 30, 91 + ,epAnd,ICRS,00,38,33.3458,+29,18,42.305,-229.42,-254.09,-83.6,19.34,4.37, 28, 103 + ,zeAnd,ICRS,00,47,20.3254,+24,16,01.841,-101.23,-81.89,-23.7,17.98,4.100, 23, 106 + ,ioAnd,ICRS,23,38,08.2013,+43,16,05.063,27.72,-1.21,-0.5,6.49,4.30, 42, 4720 + ,kaAnd,ICRS,23,40,24.5081,+44,20,02.154,81.33,-18.96,-9,19.22,4.137, 43, 4522 + ,laAnd,ICRS,23,37,33.8425,+46,27,29.347,159.22,-421.46,6.8,38.74,3.82, 45, 4283 + ,muAnd,ICRS,00,56,45.2115,+38,29,57.641,152.78,36.82,7.6,23.93,3.867, 37, 175 + ,nuAnd,ICRS,00,49,48.8473,+41,04,44.079,22.68,-18.05,-23.9,4.80,4.524, 40, 171 +Adhil ,xiAnd,ICRS,01,22,20.4198,+45,31,43.600,32.21,8.73,-12.59,16.68,4.875, 44, 287 + ,omiAnd,ICRS,23,01,55.2643,+42,19,33.525,22.47,0.24,-14.0,4.71,3.633, 41, 4664 + ,piAnd,ICRS,00,36,52.8497,+33,43,09.637,15.23,-3.56,8.7,4.97,4.335, 32, 101 + ,rhAnd,ICRS,00,21,07.2691,+37,58,06.971,58.32,-39.65,9.1,20.42,5.18, 37, 45 + ,siAnd,ICRS,00,18,19.6569,+36,47,06.807,-66.51,-42.48,-8.0,23.11,4.52, 35, 44 +Adhab ,upAnd,ICRS,01,36,47.8428,+41,24,19.652,-172.57,-381.03,-28.3,74.25,4.09, 40, 332 + ,psAnd,ICRS,23,46,02.0466,+46,25,12.993,9.05,-6.25,-24.8,2.49,4.982, 45, 4321 + ,omeAnd,ICRS,01,27,39.3817,+45,24,24.074,356.99,-109.32,10.8,35.33,4.83, 44, 307 +Andromeda Galaxy,M31,ICRS,00,42,44.330,+41,16,07.50,-35.99,-12.92,-301,,3.44, 0, 0 +# Antila + ,alAnt,ICRS,10,27,09.1011,-31,04,04.004,-80.42,9.63,12.2,8.90,4.280,-30, 8465 + ,epAnt,ICRS,09,29,14.7197,-35,57,04.808,-24.74,5.07,22.2,4.66,4.508,-35, 5724 + ,thAnt,ICRS,09,44,12.110,-27,46,10.30,-47.8,34.0,24.0,,4.79,-27, 6881 + ,ioAnt,ICRS,10,56,43.0511,-37,08,15.956,74.96,-124.50,-0.2,16.40,4.605,-36, 6808 +# Apus + ,alAps,ICRS,14,47,51.7087,-79,02,41.103,-5.67,-15.75,-1.1,7.93,3.825,-78, 893 + ,gaAps,ICRS,16,33,27.0835,-78,53,49.732,-125.68,-77.59,5.4,20.44,3.872,-78, 1103 + ,de-1Aps,ICRS,16,20,20.8056,-78,41,44.682,-9.91,-36.59,-12.0,4.26,4.76,-78, 1092 + ,thAps,ICRS,14,05,19.879,-76,47,48.33,-87.41,-31.23,9.0,9.93,5.70,-76, 799 + ,ioAps,ICRS,17,22,05.8760,-70,07,23.549,-1.73,-12.04,-4.3,2.85,5.41,-69, 2719 + ,ka-1Aps,ICRS,15,31,30.8214,-73,23,22.527,0.38,-18.28,62,3.20,5.49,-72, 1802 +# Aquila +Altair ,alAql,ICRS,19,50,46.9990,+08,52,05.959,536.87,385.57,-26.1,194.45,0.77, 08, 4236 +Alshain ,beAql,ICRS,19,55,18.7934,+06,24,24.348,46.35,-481.35,-39.8,72.95,3.710, 06, 4357 +Tarazed ,gaAql,ICRS,19,46,15.5795,+10,36,47.740,15.72,-3.08,-2.79,7.08,2.724, 10, 4043 +Al Mizan ,deAql,ICRS,19,25,29.9005,+03,06,53.191,253.07,80.67,-30.1,65.05,3.40, 02, 3879 +Deneb el Okab Borealis,epAql,ICRS,18,59,37.3574,+15,04,05.873,-52.68,-73.81,-48,21.22,4.025, 14, 3736 +Deneb el Okab Australis,zeAql,ICRS,19,05,24.6082,+13,51,48.521,-7.04,-95.31,-25,39.18,2.988, 13, 3899 +Dheneb ,zeAql,ICRS,19,05,24.6082,+13,51,48.521,-7.04,-95.31,-25,39.18,2.988, 13, 3899 +Bazak ,etAql,ICRS,19,52,28.3679,+01,00,20.378,6.94,-7.30,-14.8,2.78,3.88, 00, 4337 +Tseen Foo ,thAql,ICRS,20,11,18.2855,-00,49,17.260,35.48,6.05,-27.3,11.36,3.242,-01, 3911 +Al Thalimaim Posterior,ioAql,ICRS,19,36,43.2777,-01,17,11.763,1.89,-20.75,-21.4,10.61,4.349,-01, 3782 + ,kaAql,ICRS,19,36,53.4493,-07,01,38.918,1.29,-2.69,-19.4,2.24,4.960,-07, 5006 +Al Thalimaim Anterior,laAql,ICRS,19,06,14.9384,-04,52,57.195,-19.68,-90.37,-12,26.05,3.427,-05, 4876 + ,muAql,ICRS,19,34,05.3529,+07,22,44.189,212.76,-155.39,-24.73,29.50,4.45, 07, 4132 + ,rhAql,ICRS,20,14,16.6193,+15,11,51.391,55.69,57.98,-23.0,21.24,4.947, 14, 4227 + ,taAql,ICRS,20,04,08.3152,+07,16,40.677,14.24,12.97,-29.52,6.19,5.521, 06, 4416 + ,ome-1Aql,ICRS,19,17,48.9986,+11,35,43.519,0.25,12.62,-14.3,7.72,5.300, 11, 3790 +Bered ,12Aql,ICRS,19,01,40.8272,-05,44,20.814,-24.15,-39.73,-43.9,21.95,4.027, 0, 0 +# Aquarius +Sadalmelek ,alAqr,ICRS,22,05,47.0357,-00,19,11.463,17.90,-9.93,7.5,4.30,2.950,-01, 4246 +Sadalmelik ,alAqr,ICRS,22,05,47.0357,-00,19,11.463,17.90,-9.93,7.5,4.30,2.950,-01, 4246 +Sadalsuud ,beAqr,ICRS,21,31,33.5341,-05,34,16.220,22.79,-6.70,6.5,5.33,2.91,-06, 5770 +Sadalachbia ,gaAqr,ICRS,22,21,39.3754,-01,23,14.393,129.24,8.90,-15,20.67,3.847,-02, 5741 +Skat ,deAqr,ICRS,22,54,39.0125,-15,49,14.953,-44.08,-24.81,18.0,20.44,3.269,-16, 6173 +Albali ,epAqr,ICRS,20,47,40.5515,-09,29,44.793,31.89,-35.32,-16.0,14.21,3.770,-10, 5506 +Altager ,epAqr,ICRS,20,47,40.5515,-09,29,44.793,31.89,-35.32,-16.0,14.21,3.770,-10, 5506 +Sadaltager ,ze-1Aqr,ICRS,22,28,49.912,-00,01,11.90,191,37,28.9,,4.5,0, 0 +Hydria ,etAqr,ICRS,22,35,21.3806,-00,07,02.991,88.56,-56.10,-8,17.77,4.030,-00, 4384 +Deli ,etAqr,ICRS,22,35,21.3806,-00,07,02.991,88.56,-56.10,-8,17.77,4.030,-00, 4384 +Ancha ,thAqr,ICRS,22,16,50.0364,-07,46,59.845,118.95,-21.91,-14.7,17.04,4.175,-08, 5845 + ,ioAqr,ICRS,22,06,26.2297,-13,52,10.845,40.45,-57.16,-10,18.90,4.281,-14, 6209 +Situla ,kaAqr,ICRS,22,37,45.3810,-04,13,41.001,-68.36,-120.47,8.2,13.92,5.040,-04, 5716 +Hydor ,laAqr,ICRS,22,52,36.8759,-07,34,46.557,19.51,32.71,-8.8,8.33,3.766,-08, 5968 +Ekkhysis ,laAqr,ICRS,22,52,36.8759,-07,34,46.557,19.51,32.71,-8.8,8.33,3.766,-08, 5968 + ,muAqr,ICRS,20,52,39.2336,-08,58,59.944,47.06,-32.91,-9.1,21.01,4.723,-09, 5598 +Albulaan ,nuAqr,ICRS,21,09,35.6477,-11,22,18.095,92.31,-15.76,-11.8,19.93,4.519,-11, 5538 +Seat ,piAqr,ICRS,22,25,16.6232,+01,22,38.642,18.38,3.35,4,2.96,4.794, 00, 4872 + ,siAqr,ICRS,22,30,38.8161,-10,40,40.620,1.79,-26.26,11,12.29,4.825,-11, 5850 + ,ta-2Aqr,ICRS,22,49,35.5023,-13,35,33.475,-12.58,-38.80,1.0,8.58,4.053,-14, 6354 + ,phAqr,ICRS,23,14,19.3597,-06,02,56.410,46.22,-195.85,-0.4,14.68,4.22,-06, 6170 +Bunda ,xiAqr,ICRS,21,37,45.1093,-07,51,15.125,114.29,-24.44,-18,18.26,4.690,-08, 5701 + ,upAqr,ICRS,22,34,41.6369,-20,42,29.577,221.60,-146.58,-1.9,43.97,5.20,-21, 6251 + ,ps-1Aqr,ICRS,23,15,53.4947,-09,05,15.853,368.56,-17.02,-26.4,21.97,4.21,-09, 6156 + ,ps-3Aqr,ICRS,23,18,57.6767,-09,36,38.700,43.47,-7.80,-10,13.10,5.001,-10, 6094 + ,ome-2Aqr,ICRS,23,42,43.3441,-14,32,41.657,98.35,-66.78,3,21.16,4.483,-15, 6476 + ,3Aqr,ICRS,20,47,44.2360,-05,01,39.723,-3.30,-40.24,-22.0,7.33,4.478,0, 0 + ,88Aqr,ICRS,23,09,26.7971,-21,10,20.675,55.99,31.25,21.1,13.96,3.66,0, 0 + ,98Aqr,ICRS,23,22,58.2267,-20,06,02.088,-120.27,-96.70,-6.5,20.14,3.967,0, 0 +# Ara +Ara ,alAra,ICRS,17,31,50.4933,-49,52,34.121,-31.27,-67.15,0,13.46,2.836,-49,11511 + ,beAra,ICRS,17,25,17.9887,-55,31,47.583,-8.23,-24.71,-0.4,5.41,2.832,-55, 8100 + ,deAra,ICRS,17,31,05.9130,-60,41,01.853,-53.65,-99.37,10,17.42,3.60,-60, 6842 + ,ep-1Ara,ICRS,16,59,35.0477,-53,09,37.576,1.12,21.53,23.1,10.72,4.068,-52,10372 + ,zeAra,ICRS,16,58,37.2117,-55,59,24.507,-18.31,-35.29,-6.0,5.68,3.127,-55, 7766 + ,etAra,ICRS,16,49,47.1563,-59,02,28.961,39.59,-25.28,9.0,10.41,3.780,-58, 6906 + ,thAra,ICRS,18,06,37.8711,-50,05,29.318,-8.43,-9.26,3.4,3.22,3.663,-50,11720 + ,muAra,ICRS,17,44,08.7029,-51,50,02.591,-15.06,-191.17,-9.0,65.46,5.15,-51,11094 +# Aries +Hamal ,alAri,ICRS,02,07,10.4071,+23,27,44.723,190.73,-145.77,-14.64,49.48,2.00, 22, 306 +Sheratan ,beAri,ICRS,01,54,38.4091,+20,48,28.926,96.32,-108.80,-1.9,54.74,2.64, 20, 306 +Mesarthim ,gaAri,ICRS,01,53,31.8143,+19,17,37.866,79.43,-99.10,,15.96,3.88, 18, 243 +Botein ,deAri,ICRS,03,11,37.7655,+19,43,36.039,154.61,-8.39,23.05,19.44,4.350, 19, 477 + ,zeAri,ICRS,03,14,54.0961,+21,02,39.988,-29.83,-77.15,7,9.59,4.880, 20, 527 + ,thAri,ICRS,02,18,07.5365,+19,54,04.189,-16.07,0.90,6,8.42,5.575, 19, 340 + ,nuAri,ICRS,02,38,48.9945,+21,57,41.070,-7.08,-15.12,8,9.41,5.454, 21, 362 + ,siAri,ICRS,02,51,29.5869,+15,04,55.454,31.26,-23.29,17.0,6.80,5.514, 14, 480 + ,ta-1Ari,ICRS,03,21,13.6245,+21,08,49.510,21.68,-22.41,13.9,7.06,5.301, 20, 543 + ,41Ari,ICRS,02,49,59.0323,+27,15,37.825,65.47,-116.59,4,20.45,3.606, 20, 543 +# Auriga +Capella ,alAur,ICRS,05,16,41.3591,+45,59,52.768,75.52,-427.11,30.2,77.29,0.08, 45, 1077 +Menkalinan ,beAur,ICRS,05,59,31.7229,+44,56,50.758,-56.41,-0.88,-18.2,39.72,1.896, 44, 1328 +Prijipati ,deAur,ICRS,05,59,31.6366,+54,17,04.762,86.31,-134.05,8.2,23.22,3.720, 54, 970 +Maaz ,epAur,ICRS,05,01,58.1341,+43,49,23.910,0.18,-2.31,-2.5,1.60,3.039, 43, 1166 +Al Anz ,epAur,ICRS,05,01,58.1341,+43,49,23.910,0.18,-2.31,-2.5,1.60,3.039, 43, 1166 +Haedi ,zeAur,ICRS,05,02,28.6869,+41,04,33.015,8.88,-21.43,12.8,4.14,3.769, 40, 1142 +Haedus ,zeAur,ICRS,05,02,28.6869,+41,04,33.015,8.88,-21.43,12.8,4.14,3.769, 40, 1142 +Hoedus I ,zeAur,ICRS,05,02,28.6869,+41,04,33.015,8.88,-21.43,12.8,4.14,3.769, 40, 1142 +Sadatoni ,zeAur,ICRS,05,02,28.6869,+41,04,33.015,8.88,-21.43,12.8,4.14,3.769, 40, 1142 +Hoedus II ,etAur,ICRS,05,06,30.8928,+41,14,04.108,30.60,-68.41,7.3,14.87,3.158, 41, 1058 +Bogardus ,thAur,ICRS,05,59,43.2690,+37,12,45.307,42.09,-73.61,29.5,18.83,2.62, 41, 1058 +Manus ,thAur,ICRS,05,59,43.2690,+37,12,45.307,42.09,-73.61,29.5,18.83,2.62, 41, 1058 +Hasseleh ,ioAur,ICRS,04,56,59.6187,+33,09,57.925,3.63,-18.54,17.78,6.37,2.693, 32, 855 +Al Khabdhilinan,ioAur,ICRS,04,56,59.6187,+33,09,57.925,3.63,-18.54,17.78,6.37,2.693, 32, 855 + ,kaAur,ICRS,06,15,22.6891,+29,29,53.074,-70.90,-261.73,20.3,19.31,4.35, 29, 1154 + ,laAur,ICRS,05,19,08.4745,+40,05,56.586,519.33,-664.74,65.7,79.08,4.70, 39, 1248 + ,muAur,ICRS,05,13,25.7177,+38,29,04.193,-18.66,-72.41,21,20.08,4.831, 38, 1063 + ,nuAur,ICRS,05,51,29.3990,+39,08,54.529,8.48,0.39,11.38,15.17,3.950, 39, 1429 + ,xiAur,ICRS,05,54,50.7821,+55,42,25.008,-3.65,17.20,-11.8,13.54,4.968, 55, 1027 + ,omiAur,ICRS,05,45,54.0387,+49,49,34.519,-11.18,-11.31,-6.4,6.76,5.461, 49, 1398 + ,chAur,ICRS,05,32,43.6729,+32,11,31.278,-1.81,-4.00,-0.2,0.80,4.744, 32, 1024 + ,ps-1Aur,ICRS,06,24,53.9027,+49,17,16.415,0.82,-2.48,4.7,0.85,4.97, 49, 1488 + ,ps-5Aur,ICRS,06,46,44.3388,+43,34,38.737,-0.28,165.49,-24.0,60.56,5.252, 43, 1595 + ,ps-6Aur,ICRS,06,47,39.5761,+48,47,22.115,-5.25,6.40,-7.7,7.69,5.222, 48, 1436 +# Bootes +Arcturus ,alBoo,ICRS,14,15,39.6720,+19,10,56.677,-1093.43,-1999.43,-5.2,88.85,-0.04, 19, 2777 +Nekkar ,beBoo,ICRS,15,01,56.7623,+40,23,26.036,-40.20,-29.22,-19.9,14.91,3.488, 40, 2840 +Seginus ,gaBoo,ICRS,14,32,04.6719,+38,18,29.709,-115.55,151.87,-36.5,38.29,3.00, 38, 2565 +Haris ,gaBoo,ICRS,14,32,04.6719,+38,18,29.709,-115.55,151.87,-36.5,38.29,3.00, 38, 2565 +Princeps ,deBoo,ICRS,15,15,30.1630,+33,18,53.401,84.84,-110.57,-12.3,27.94,3.47, 33, 2561 +Izar ,epBoo,ICRS,14,44,59.2177,+27,04,27.201,-50.65,20.00,,15.55,2.39, 27, 2417 +Mirak ,epBoo,ICRS,14,44,59.2177,+27,04,27.201,-50.65,20.00,,15.55,2.39, 27, 2417 +Pulcherrima ,epBoo,ICRS,14,44,59.2177,+27,04,27.201,-50.65,20.00,,15.55,2.39, 27, 2417 +Mufrid ,etBoo,ICRS,13,54,41.0787,+18,23,51.781,-60.95,-358.10,-0.1,88.17,2.680, 19, 2725 +Muphrid ,etBoo,ICRS,13,54,41.0787,+18,23,51.781,-60.95,-358.10,-0.1,88.17,2.680, 19, 2725 +Asellus Primus ,thBoo,ICRS,14,25,11.7964,+51,51,02.677,-236.06,-399.08,-10.9,68.63,4.10, 52, 1804 +Asellus Secundus,ioBoo,ICRS,14,16,09.9294,+51,22,02.033,-149.98,89.42,-18.7,33.54,4.750, 52, 1784 +Asellus Tertius,ka-2Boo,ICRS,14,13,29.0078,+51,47,23.874,61.39,-10.57,-17.4,21.03,4.50, 52, 1782 + ,laBoo,ICRS,14,16,23.0187,+46,05,17.900,-187.42,159.01,-8.1,33.58,4.18, 46, 1949 +Alkalurops ,mu-1Boo,ICRS,15,24,29.4278,+37,22,37.800,-147.68,84.69,-12.5,26.96,4.307, 37, 2636 + ,nu-1Boo,ICRS,15,30,55.7593,+40,49,58.968,11.02,-8.81,-11.12,3.74,5.050, 41, 2609 +Hemelein Prima,rhBoo,ICRS,14,31,49.7899,+30,22,17.174,-100.44,120.22,-13.96,21.92,3.583, 31, 2628 +Al Hamalain ,rhBoo,ICRS,14,31,49.7899,+30,22,17.174,-100.44,120.22,-13.96,21.92,3.583, 31, 2628 +Hemelein Secunda,siBoo,ICRS,14,34,40.8171,+29,44,42.468,188.32,132.72,0.2,64.66,4.46, 30, 2536 + ,taBoo,ICRS,13,47,15.7429,+17,27,24.862,-480.34,54.18,-15.6,64.12,4.50, 18, 2782 +Ceginus ,phBoo,ICRS,15,37,49.5973,+40,21,12.358,60.45,59.57,-9.7,20.00,5.263, 40, 2907 + ,psBoo,ICRS,15,04,26.7417,+26,56,51.536,-176.31,-4.52,-26.39,13.04,4.520, 27, 2447 +Merga ,38Boo,ICRS,14,49,18.6693,+46,06,58.340,-7.35,-77.32,-4.7,21.34,5.769, 46, 1993 +# Caelum + ,alCae,ICRS,04,40,33.7125,-41,51,49.509,-141.18,-74.95,-0.6,49.67,4.456,-42, 1587 + ,beCae,ICRS,04,42,03.4806,-37,08,39.468,46.90,193.14,26.8,36.16,5.05,-37, 1867 + ,deCae,ICRS,04,30,50.0997,-44,57,13.498,2.44,-2.48,14.2,4.59,5.053,-45, 1567 +# Camelopardalis + ,alCam,ICRS,04,54,03.0113,+66,20,33.641,0.49,7.31,6.1,0.47,4.301, 66, 358 + ,beCam,ICRS,05,03,25.0901,+60,26,32.084,-6.11,-14.78,-1.7,3.27,4.032, 60, 856 + ,gaCam,ICRS,03,50,21.5091,+71,19,56.156,18.27,-42.00,-1,9.73,4.622, 70, 259 +# Capricornus +Algedi ,al-1Cap,ICRS,20,17,38.8694,-12,30,29.564,22.24,0.75,-26.1,4.75,4.249,-12, 5683 +Giedi Prima,al-1Cap,ICRS,20,17,38.8694,-12,30,29.564,22.24,0.75,-26.1,4.75,4.249,-12, 5683 +Algedi ,al-2Cap,ICRS,20,18,03.2554,-12,32,41.467,61.78,2.85,0.1,30.01,3.585,-12, 5685 +Giedi Secunda,al-2Cap,ICRS,20,18,03.2554,-12,32,41.467,61.78,2.85,0.1,30.01,3.585,-12, 5685 +Dabih ,beCap,ICRS,20,21,00.6757,-14,46,52.922,48.42,14.00,-18.9,9.48,3.08,-15, 5629 +Nashira ,gaCap,ICRS,21,40,05.4563,-16,39,44.308,187.39,-22.33,-31.2,23.48,3.68,-17, 6340 +Deneb Algedi ,deCap,ICRS,21,47,02.4451,-16,07,38.229,263.26,-296.23,-6.3,84.58,2.87,-16, 5943 +Castra ,epCap,ICRS,21,37,04.8311,-19,27,57.642,13.48,0.81,-23.7,4.92,4.50,-20, 6251 +Marakk ,zeCap,ICRS,21,26,40.0261,-22,24,40.797,-2.61,18.88,3.0,8.19,3.754,-22,15388 +Armus ,etCap,ICRS,21,04,24.3004,-19,51,17.966,-39.01,-24.45,23.8,20.64,4.856,-20, 6115 +Dorsum ,thCap,ICRS,21,05,56.8281,-17,13,58.299,79.64,-61.64,-10.9,20.61,4.073,-17, 6174 + ,ioCap,ICRS,21,22,14.7962,-16,50,04.353,30.83,5.26,11.5,15.13,4.299,-17, 6245 + ,laCap,ICRS,21,46,32.0983,-11,21,57.436,30.36,-9.25,1,11.10,5.570,-12, 6087 + ,muCap,ICRS,21,53,17.7717,-13,33,06.365,313.03,13.67,-21.5,36.15,5.08,-14, 6149 +Alshat ,nuCap,ICRS,20,20,39.8161,-12,45,32.687,15.71,-14.63,-2,11.98,4.754,-13, 5642 +Oculus ,piCap,ICRS,20,27,19.2098,-18,12,42.195,10.32,-10.87,-13,4.90,5.25,-18, 5685 +Bos ,rhCap,ICRS,20,28,51.6140,-17,48,49.273,-15.79,-7.66,18.4,33.04,4.803,-18, 5689 +Pazan ,psCap,ICRS,20,46,05.7330,-25,16,15.231,-51.38,-156.66,25.8,68.16,4.152,-25,15018 +Pazhan ,psCap,ICRS,20,46,05.7330,-25,16,15.231,-51.38,-156.66,25.8,68.16,4.152,-25,15018 + ,upCap,ICRS,20,40,02.9445,-18,08,19.172,-22.73,-21.63,-12.5,4.32,5.169,-18, 5738 +Baten Algiedi,omeCap,ICRS,20,51,49.2910,-26,55,08.877,-7.97,-2.54,9.0,5.19,4.124,-27,15082 + ,24Cap,ICRS,21,07,07.6679,-25,00,21.072,-27.19,-43.37,31.9,6.24,4.531,0,0 + ,36Cap,ICRS,21,28,43.4002,-21,48,25.848,133.97,-5.47,-22.2,18.18,4.513,0,0 +# Carina +Canopus ,alCar,ICRS,06,23,57.1099,-52,41,44.378,19.99,23.67,20.5,10.43,-0.72,-52, 914 +Miaplacidus ,beCar,ICRS,09,13,11.9755,-69,43,01.948,-157.66,108.91,-5,29.34,1.70,-69, 1023 +Avior ,epCar,ICRS,08,22,30.8356,-59,30,34.139,-25.34,22.72,11.6,5.16,1.953,-59, 1032 +Foramen ,etCar,ICRS,10,45,03.591,-59,41,04.26,-7.6,1.0,-25.0,,8.13,0, 0 +Vathorz Posterior,thCar,ICRS,10,42,57.4013,-64,23,40.020,-18.87,12.06,24,7.43,2.78,-63, 1599 +Scutulum ,ioCar,ICRS,09,17,05.4067,-59,16,30.825,-19.03,13.11,13.3,4.71,2.249,-58, 1465 +Tureis ,ioCar,ICRS,09,17,05.4067,-59,16,30.825,-19.03,13.11,13.3,4.71,2.249,-58, 1465 +Aspidiske ,ioCar,ICRS,09,17,05.4067,-59,16,30.825,-19.03,13.11,13.3,4.71,2.249,-58, 1465 +Drus ,chCar,ICRS,07,56,46.7143,-52,58,56.496,-28.38,16.76,19.4,8.43,3.444,-52, 1343 +Drys ,chCar,ICRS,07,56,46.7143,-52,58,56.496,-28.38,16.76,19.4,8.43,3.444,-52, 1343 +Simiram ,omeCar,ICRS,10,13,44.2179,-70,02,16.452,-35.73,7.55,7,8.81,3.30,-69, 1178 +Vathorz Prior,upCar,ICRS,09,47,06.1216,-65,04,19.224,-11.55,4.97,,2.01,2.96,0, 0 +# Cassiopeia +Schedar ,alCas,ICRS,00,40,30.4405,+56,32,14.392,50.36,-32.17,-4.31,14.27,2.252, 55, 139 +Shedir ,alCas,ICRS,00,40,30.4405,+56,32,14.392,50.36,-32.17,-4.31,14.27,2.252, 55, 139 +Schedir ,alCas,ICRS,00,40,30.4405,+56,32,14.392,50.36,-32.17,-4.31,14.27,2.252, 55, 139 +Caph ,beCas,ICRS,00,09,10.6851,+59,08,59.207,523.38,-180.44,11.3,59.89,2.27, 58, 3 +Tsih ,gaCas,ICRS,00,56,42.5317,+60,43,00.265,25.65,-3.82,-6.8,5.32,2.47, 59, 144 +Cih ,gaCas,ICRS,00,56,42.5317,+60,43,00.265,25.65,-3.82,-6.8,5.32,2.47, 59, 144 +Ruchbah ,deCas,ICRS,01,25,48.9523,+60,14,07.019,297.24,-49.50,6.7,32.81,2.680, 59, 248 +Rucha ,deCas,ICRS,01,25,48.9523,+60,14,07.019,297.24,-49.50,6.7,32.81,2.680, 59, 248 +Segin ,epCas,ICRS,01,54,23.7255,+63,40,12.365,31.98,-18.66,-8.1,7.38,3.342, 62, 320 + ,zeCas,ICRS,00,36,58.2846,+53,53,48.874,17.77,-9.15,2.0,5.46,3.666, 53, 105 +Achird ,etCas,ICRS,00,49,06.2912,+57,48,54.674,1087.07,-559.73,10.0,167.99,3.45, 57, 150 + ,kaCas,ICRS,00,32,59.9917,+62,55,54.418,3.99,-2.10,-2.3,0.79,4.189, 62, 102 +Marfak ,muCas,ICRS,01,08,16.3942,+54,55,13.221,3421.90,-1600.35,-97.2,132.42,5.12, 54, 223 + ,omiCas,ICRS,00,44,43.5177,+48,17,03.711,17.79,-7.62,-16.9,3.60,4.477, 47, 183 + ,rhCas,ICRS,23,54,23.0324,+57,29,57.776,-4.54,-3.45,-43.1,0.28,4.517, 56, 3111 + ,psCas,ICRS,01,25,56.0217,+68,07,48.045,75.07,26.82,-12.83,16.89,4.731, 67, 123 +# Centaurus +Rigil Kent ,alCen,ICRS,14,39,36.204,-60,50,08.23,-3608,686,-22.3,742,-0.1,-60, 5483 +Rigel Kentaurus,alCen,ICRS,14,39,36.204,-60,50,08.23,-3608,686,-22.3,742,-0.1,-60, 5483 +Toliman ,alCen,ICRS,14,39,36.204,-60,50,08.23,-3608,686,-22.3,742,-0.1,-60, 5483 +Bungula ,alCen,ICRS,14,39,36.204,-60,50,08.23,-3608,686,-22.3,742,-0.1,-60, 5483 +Hadar ,beCen,ICRS,14,03,49.4045,-60,22,22.942,-33.96,-25.06,5.9,6.21,0.60,-59, 5365 +Agena ,beCen,ICRS,14,03,49.4045,-60,22,22.942,-33.96,-25.06,5.9,6.21,0.60,-59, 5365 +Muhlifain ,gaCen,ICRS,12,41,31.0386,-48,57,35.598,-187.28,-1.20,-5.5,25.01,2.18,-48, 7597 + ,deCen,ICRS,12,08,21.4998,-50,43,20.732,-47.53,-6.42,11,8.25,2.561,-50, 6697 +Birdun ,epCen,ICRS,13,39,53.2584,-53,27,59.018,-14.60,-12.79,3.0,8.68,2.265,-52, 6655 + ,zeCen,ICRS,13,55,32.3857,-47,17,18.150,-57.14,-44.75,6.5,8.48,2.515,-46, 8949 + ,etCen,ICRS,14,35,30.4238,-42,09,28.168,-35.31,-32.44,-0.2,10.57,2.322,-41, 8917 +Menkent ,thCen,ICRS,14,06,40.9485,-36,22,11.836,-519.30,-517.86,1.3,53.52,2.06,-35, 9260 +Alhakim ,ioCen,ICRS,13,20,35.8176,-36,42,44.262,-340.76,-87.98,0.1,55.64,2.70,-36, 8497 +Ke Kwan ,kaCen,ICRS,14,59,09.6851,-42,06,15.098,-17.76,-21.33,8.0,6.05,3.13,-41, 9342 +Ma Ti ,laCen,ICRS,11,35,46.8847,-63,01,11.430,-33.84,-6.87,-1.4,7.96,3.117,-62, 2127 +Mati ,laCen,ICRS,11,35,46.8847,-63,01,11.430,-33.84,-6.87,-1.4,7.96,3.117,-62, 2127 + ,muCen,ICRS,13,49,36.9890,-42,28,25.434,-23.85,-19.22,9.1,6.19,3.456,-41, 8172 +Kabkent Secunda,nuCen,ICRS,13,49,30.2771,-41,41,15.753,-26.01,-20.38,9.0,6.87,3.390,0, 0 + ,xi-2Cen,ICRS,13,06,54.6393,-49,54,22.486,-26.24,-12.43,14.3,7.92,4.264,-49, 7644 + ,piCen,ICRS,11,21,00.4067,-54,29,27.669,-35.32,-2.20,9.4,10.15,3.90,-53, 4498 + ,siCen,ICRS,12,28,02.3819,-50,13,50.286,-32.49,-12.41,8,7.36,3.897,-49, 7115 +Kabkent Tertia,phCen,ICRS,13,58,16.2661,-42,06,02.712,-23.68,-19.82,5.7,7.01,3.806,0, 0 + ,psCen,ICRS,14,20,33.4316,-37,53,07.061,-64.50,-11.39,-5,13.19,4.049,-37, 9336 +Proxima Centauri,V645 Cen,ICRS,14,29,42.9487,-62,40,46.141,-3775.40,769.33,-22.4,772.33,11.05, 00, 0000 +# Cepheus +Alderamin ,alCep,ICRS,21,18,34.7715,+62,35,08.061,149.91,48.27,-10,66.84,2.460, 61, 2111 +Alphirk ,beCep,ICRS,21,28,39.5971,+70,33,38.578,12.60,8.73,-8.2,5.48,3.216, 69, 1173 +Alfirk ,beCep,ICRS,21,28,39.5971,+70,33,38.578,12.60,8.73,-8.2,5.48,3.216, 69, 1173 +Alrai ,gaCep,ICRS,23,39,20.8490,+77,37,56.193,-48.85,127.19,-42.4,72.50,3.220, 76, 928 +Errai ,gaCep,ICRS,23,39,20.8490,+77,37,56.193,-48.85,127.19,-42.4,72.50,3.220, 76, 928 +Alradif ,deCep,ICRS,22,29,10.2663,+58,24,54.715,16.47,3.55,-16.8,3.32,4.07, 57, 2548 +Alredif ,deCep,ICRS,22,29,10.2663,+58,24,54.715,16.47,3.55,-16.8,3.32,4.07, 57, 2548 +Phicares ,epCep,ICRS,22,15,02.1899,+57,02,36.912,476.45,49.99,-0.6,38.86,4.19, 0, 0 +Phicareus ,epCep,ICRS,22,15,02.1899,+57,02,36.912,476.45,49.99,-0.6,38.86,4.19, 0, 0 +Kurhah ,zeCep,ICRS,22,10,51.2767,+58,12,04.539,13.35,4.49,-17.83,4.49,3.359, 57, 2475 +Alagemin ,etCep,ICRS,20,45,17.3750,+61,50,19.615,86.09,817.98,-87.55,69.73,3.410, 61, 2050 +Alkidr ,thCep,ICRS,20,29,34.8851,+62,59,38.778,45.00,-13.31,-6.8,24.04,4.22, 62, 1821 +Alvahet ,ioCep,ICRS,22,49,40.8166,+66,12,01.468,-66.10,-124.74,-12.59,28.27,3.510, 65, 1814 + ,kaCep,ICRS,20,08,53.3469,+77,42,41.110,11.11,23.72,-22.8,9.97,4.395, 77, 764 +Erakis ,muCep,ICRS,21,43,30.4609,+58,46,48.166,5.24,-2.88,20.63,0.62,4.04, 58, 2316 +The Garnet Star,muCep,ICRS,21,43,30.4609,+58,46,48.166,5.24,-2.88,20.63,0.62,4.04, 58, 2316 + ,nuCep,ICRS,21,45,26.9255,+61,07,14.901,-3.08,-1.86,-20.8,0.64,4.312, 60, 2288 +Kurdah ,xiCep,ICRS,22,03,47.16,+64,37,39.9,214.46,89.29,-7.2,,6.5, 63, 1802 +Alkurhah ,xiCep,ICRS,22,03,47.16,+64,37,39.9,214.46,89.29,-7.2,,6.5, 63, 1802 +Al Kalb al Rai,rhCep,ICRS,22,29,52.9786,+78,49,27.425,3.47,-21.67,1,13.75,5.460, 78, 801 +# Cetus +Menkar ,alCet,ICRS,03,02,16.7721,+04,05,23.042,-11.81,-78.76,-26.08,14.82,2.514, 03, 419 +Diphda ,beCet,ICRS,00,43,35.3711,-17,59,11.777,232.79,32.71,13.0,34.04,2.04,-18, 115 +Difda ,beCet,ICRS,00,43,35.3711,-17,59,11.777,232.79,32.71,13.0,34.04,2.04,-18, 115 +Kaffaljidhma ,gaCet,ICRS,02,43,18.0390,+03,14,08.947,-146.43,-145.27,-5.1,39.78,3.47, 02, 422 +Phycochroma ,deCet,ICRS,02,39,28.9567,+00,19,42.638,14.44,-2.53,13.0,5.04,4.07,-00, 406 +Baten Kaitos ,zeCet,ICRS,01,51,27.6336,-10,20,06.136,38.78,-38.04,9.0,12.59,3.738,-11, 359 +Deneb Algenubi,etCet,ICRS,01,08,35.3916,-10,10,56.151,215.81,-138.33,11.5,27.73,3.45,-10, 240 +Altawk ,thCet,ICRS,01,24,01.4050,-08,10,59.724,-78.38,-206.88,17.2,28.48,3.60,-08, 244 +Deneb Kaitos ,ioCet,ICRS,00,19,25.6745,-08,49,26.117,-14.37,-37.84,18.6,11.26,3.558,-09, 48 +Shemali ,ioCet,ICRS,00,19,25.6745,-08,49,26.117,-14.37,-37.84,18.6,11.26,3.558,-09, 48 +# cannot match this star with Simbad. Why? +# ,ka-1Cet,ICRS,03,19,21.6960,03,22,12.712,1.79246666666667,9.353,19.9,0.10918, 4.83, 02, 518 +Menkar ,laCet,ICRS,02,59,42.9018,+08,54,26.513,9.22,-14.92,10.2,7.69,4.701, 08, 455 + ,muCet,ICRS,02,44,56.5423,+10,06,50.925,285.16,-30.40,30.4,38.71,4.20, 09, 359 + ,nuCet,ICRS,02,35,52.4721,+05,35,35.687,-28.89,-22.76,5.0,8.77,4.880, 04, 418 + ,xi-1Cet,ICRS,02,12,59.9955,+08,50,48.182,-26.23,-14.40,-4.2,9.01,4.374, 08, 345 + ,xi-2Cet,ICRS,02,28,09.5425,+08,27,36.193,41.72,-14.46,11.2,18.53,4.277, 07, 388 +Mira ,omiCet,ICRS,02,19,20.7927,-02,58,39.513,10.33,-239.48,63.8,7.79,3.04,-03, 353 +Al Sadr al Ketus,piCet,ICRS,02,44,07.3499,-13,51,31.307,-7.58,-8.40,15.4,7.40,4.235,-14, 519 + ,rhCet,ICRS,02,25,57.0053,-12,17,25.727,-11.71,-11.37,10,6.17,4.869,-12, 451 + ,siCet,ICRS,02,32,05.2283,-15,14,40.837,-80.92,-146.84,-29.4,38.73,4.745,-15, 449 + ,taCet,ICRS,01,44,04.0829,-15,56,14.928,-1721.94,854.17,-16.4,274.18,3.50,-16, 295 +Abyssus Aqueus,upCet,ICRS,02,00,00.3079,-21,04,40.194,133.01,-24.53,18.0,10.84,4.015,-21, 358 +Al Nitham ,ph-1Cet,ICRS,00,44,11.4013,-10,36,34.382,-6.96,-113.88,0.6,15.54,4.775,-11, 153 + ,ph-2Cet,ICRS,00,50,07.5910,-10,38,39.572,-224.67,-228.44,7.7,64.69,5.19,-11, 153 + ,chCet,ICRS,01,49,35.1027,-10,41,11.077,-148.90,-94.47,-0.9,42.35,4.664,-11, 352 +# Chameleon + ,beCha,ICRS,12,18,20.8242,-79,18,44.063,-38.07,12.00,23,12.05,4.235,-78, 741 + ,gaCha,ICRS,10,35,28.1062,-78,36,28.029,-38.00,11.53,-22.4,7.89,4.112,-77, 622 + ,de-2Cha,ICRS,10,45,47.0033,-80,32,24.676,-37.33,6.19,22.6,8.97,4.432,-79, 556 + ,etCha,ICRS,08,41,19.5122,-78,57,48.094,-29.31,27.58,14,10.32,5.455,-78, 372 + ,thCha,ICRS,08,20,38.5405,-77,29,04.118,-129.09,40.78,21.7,21.22,4.346,-77, 383 + ,piCha,ICRS,11,37,15.6355,-75,53,47.558,-128.21,-1.21,-9.8,23.75,5.654,-75, 744 +# Circinus + ,alCir,ICRS,14,42,30.4194,-64,58,30.499,-192.64,-234.06,7.2,60.97,3.19,-64, 2977 + ,beCir,ICRS,15,17,30.8494,-58,48,04.349,-98.39,-135.46,9.6,33.75,4.069,-58, 5875 +# Canis Major +Sirius ,alCMa,ICRS,06,45,08.9173,-16,42,58.017,-546.05,-1223.14,-7.6,379.21,-1.47,-16, 1591 +Mirzam ,beCMa,ICRS,06,22,41.9853,-17,57,21.304,-3.45,-0.47,33.7,6.53,2.0,-17, 1467 +Murzim ,beCMa,ICRS,06,22,41.9853,-17,57,21.304,-3.45,-0.47,33.7,6.53,2.0,-17, 1467 +Murzims ,beCMa,ICRS,06,22,41.9853,-17,57,21.304,-3.45,-0.47,33.7,6.53,2.0,-17, 1467 +Muliphein ,gaCMa,ICRS,07,03,45.4927,-15,37,59.830,-0.81,-11.20,32,8.11,4.097,-15, 1625 +Isis ,gaCMa,ICRS,07,03,45.4927,-15,37,59.830,-0.81,-11.20,32,8.11,4.097,-15, 1625 +Wezen ,deCMa,ICRS,07,08,23.4843,-26,23,35.519,-2.75,3.33,34.3,1.82,1.842,-26, 3916 +Adara ,epCMa,ICRS,06,58,37.5485,-28,58,19.501,2.63,2.29,27.3,7.57,1.513,-28, 3666 +Adhara ,epCMa,ICRS,06,58,37.5485,-28,58,19.501,2.63,2.29,27.3,7.57,1.513,-28, 3666 +Furud ,zeCMa,ICRS,06,20,18.7925,-30,03,48.122,8.00,3.81,32.2,9.70,3.00,-30, 3038 +Aludra ,etCMa,ICRS,07,24,05.7025,-29,18,11.173,-3.76,6.66,41.1,1.02,2.40,-29, 4328 + ,kaCMa,ICRS,06,49,50.4591,-32,30,30.520,-9.18,4.04,14,4.13,3.515,-32, 3404 + ,xi-2CMa,ICRS,06,35,03.3882,-22,57,53.255,13.11,16.52,26,7.92,4.50,-22, 1458 + ,omi-2CMa,ICRS,07,03,01.4726,-23,49,59.847,-1.56,4.28,48.4,1.27,3.00,-23, 4797 + ,siCMa,ICRS,07,01,43.1477,-27,56,05.389,-6.01,4.64,21.5,2.68,3.489,-27, 3544 + ,thCMa,ICRS,06,54,11.3978,-12,02,19.060,-139.04,-14.47,97.3,12.94,4.086,-11, 1681 +# Canis Minor +Procyon ,alCMi,ICRS,07,39,18.1183,+05,13,29.975,-716.58,-1034.60,-3.2,285.93,0.34, 05, 1739 +Gomeisa ,beCMi,ICRS,07,27,09.0427,+08,17,21.536,-50.28,-38.45,22,19.16,2.886, 08, 1774 + ,zeCMi,ICRS,07,51,41.9887,+01,46,00.726,-13.97,-3.78,32.3,7.76,5.13, 02, 1808 +# Cancer +Acubens ,alCnc,ICRS,08,58,29.2217,+11,51,27.723,41.45,-29.22,-13.8,18.79,4.259, 12, 1948 +Al Tarf ,beCnc,ICRS,08,16,30.9206,+09,11,07.961,-46.80,-48.65,22.94,11.23,3.520, 09, 1917 +Asellus Borealis ,gaCnc,ICRS,08,43,17.1461,+21,28,06.602,-106.94,-39.25,28.7,20.58,4.668, 21, 1895 +Asellus Australis,deCnc,ICRS,08,44,41.0996,+18,09,15.511,-17.10,-228.46,17.14,23.97,3.94, 18, 2027 +Tegmen ,zeCnc,ICRS,08,12,12.851,+17,38,52.75,74.3,-119.0,-5.7,,5.05, 18, 1867 +Tegmine ,zeCnc,ICRS,08,12,12.851,+17,38,52.75,74.3,-119.0,-5.7,,5.05, 18, 1867 + ,etCnc,ICRS,08,32,42.4969,+20,26,28.183,-44.65,-44.71,22.46,10.46,5.343, 20, 2109 +Decapoda ,ioCnc,ICRS,08,46,41.8205, 28,45,35.634,-20.69,-43.95,15.7,10.94, 4.028, 29, 1824 + ,kaCnc,ICRS,09,07,44.8123,+10,40,05.488,-20.36,-9.96,24.2,6.74,5.236, 11, 1984 + ,xiCnc,ICRS,09,09,21.5337,+22,02,43.604,-0.48,-0.70,-7.4,8.57,5.154, 22, 2061 + ,si-3Cnc,ICRS,08,59,32.6539,+32,25,06.813,-44.33,-34.61,23.3,10.19,5.233, 32, 1821 + ,chCnc,ICRS,08,20,03.8603,+27,13,03.745,-18.38,-376.25,32.5,55.17,5.10, 27, 1589 + ,ome-1Cnc,ICRS,08,00,55.8737,+25,23,34.209,17.78,6.49,1.9,2.90,5.868, 25, 1812 +# Columba +Phact ,alCol,ICRS,05,39,38.9399,-34,04,26.788,-0.10,-24.05,35,12.16,2.60,-34, 2375 +Wazn ,beCol,ICRS,05,50,57.5929,-35,46,05.911,55.74,404.66,88.9,37.94,3.12,-35, 2546 +Ghusn al Zaitun,deCol,ICRS,06,22,06.8283,-33,26,11.040,-24.19,-52.48,-2.6,13.75,3.853,0, 0 + ,gaCol,ICRS,05,57,32.2100,-35,16,59.807,-2.65,11.19,24.2,3.82,4.350,-35, 2612 + ,etCol,ICRS,05,59,08.8053,-42,48,54.488,18.53,-11.45,17.0,6.14,3.946,-42, 2266 +Al Kurud ,kaCol,ICRS,06,16,33.1357,-35,08,25.867,0.39,87.58,24.2,17.83,4.374,-35, 2800 +Tsze ,laCol,ICRS,05,53,06.8812,-33,48,04.899,-4.52,32.40,30.0,9.55,4.863,-33, 2599 + ,omiCol,ICRS,05,17,29.0900,-34,53,42.747,93.71,-336.53,21.1,29.63,4.83,-35, 2214 +# Coma Berenices +Diadem ,alCom,ICRS,13,09,59.2766,+17,31,45.953,-445.96,129.69,-17.7,69.81,4.32, 18, 2697 +Aldafirah ,beCom,ICRS,13,11,52.3935,+27,52,41.459,-801.95,882.68,6.1,109.23,4.26, 28, 2193 +Kissin ,gaCom,ICRS,12,26,56.2723,+28,16,06.322,-83.41,-80.99,3.38,19.18,4.350, 29, 2288 +# Corona Borealis +Alphecca ,alCrB,ICRS,15,34,41.2681,+26,42,52.895,120.38,-89.44,1.7,43.65,2.214, 27, 2512 +Alphekka ,alCrB,ICRS,15,34,41.2681,+26,42,52.895,120.38,-89.44,1.7,43.65,2.214, 27, 2512 +Gemma ,alCrB,ICRS,15,34,41.2681,+26,42,52.895,120.38,-89.44,1.7,43.65,2.214, 27, 2512 +Nusakan ,beCrB,ICRS,15,27,49.7308,+29,06,20.530,-181.39,86.84,-18.7,28.60,3.68, 29, 2670 + ,epCrB,ICRS,15,57,35.2518,+26,52,40.368,-76.55,-60.24,-32.42,14.20,4.130, 27, 2558 + ,thCrB,ICRS,15,32,55.7825,+31,21,32.880,-19.62,-8.94,-25,10.49,4.153, 31, 2750 + ,kaCrB,ICRS,15,51,13.9315,+35,39,26.575,-8.07,-347.41,-24.0,32.13,4.82, 36, 2652 +The Blaze Star,taCrB,ICRS,16,08,58.2990,+36,29,27.399,-40.71,343.47,-18.6,28.84,4.76, 36, 2699 +# Corona Australis +Alfecca Meridiana,alCrA,ICRS,19,09,28.3417,-37,54,16.108,85.73,-96.65,-18.4,25.15,4.102,-38,13350 + ,et-1CrA,ICRS,18,48,50.4902,-43,40,48.171,24.39,-20.84,-4,9.40,5.458,-43,12841 + ,thCrA,ICRS,18,33,30.1857,-42,18,45.035,32.48,-21.03,-2.1,3.76,4.620,-42,13378 +# Crater +Alkes ,alCrt,ICRS,10,59,46.4647,-18,17,55.620,-462.38,129.11,46.8,18.71,4.07,-17, 3273 +Alsharasif ,beCrt,ICRS,11,11,39.4893,-22,49,33.050,4.73,-99.06,,12.26,4.461,-22, 3095 + ,gaCrt,ICRS,11,24,52.9238,-17,41,02.435,-97.01,3.22,1,38.90,4.08,-16, 3244 +Labrum ,deCrt,ICRS,11,19,20.4475,-14,46,42.749,-124.47,206.61,-5.2,16.75,3.56,-13, 3345 + ,epCrt,ICRS,11,24,36.5911,-10,51,33.564,-24.14,24.46,3.1,8.95,4.823,0, 0 + ,etCrt,ICRS,11,56,00.9536,-17,09,02.983,-49.07,-8.23,15,11.42,5.168,-16, 3358 + ,thCrt,ICRS,11,36,40.9134,-09,48,08.089,-59.32,2.82,1,10.70,4.682,-08, 3202 + ,zeCrt,ICRS,11,44,45.7756,-18,21,02.428,27.15,-24.56,-4.6,9.31,4.717,-17, 3460 +# Crux +#Acrux ,al-1Cru,ICRS,12,26,35.871,-63,05,56.58,-0.235333333333333,-1.2,-11.2,0, 1.4,-62, 2745 # one star of a binary system +Acrux ,alCru,ICRS,12,26,35.8958,-63,05,56.730,-35.37,-14.73,,10.17,0.81,-62, 2745 # binary star system +Mimosa ,beCru,ICRS,12,47,43.2631,-59,41,19.549,-48.24,-12.82,15.6,9.25,1.297,-59, 4451 +Gacrux ,gaCru,ICRS,12,31,09.9593,-57,06,47.562,27.94,-264.33,21.4,37.09,1.63,-56, 5272 +Decrux ,deCru,ICRS,12,15,08.7157,-58,44,56.140,-36.68,-10.72,22.2,8.96,2.775,-58, 4189 +Juxta Crucem ,epCru,ICRS,12,21,21.6093,-60,24,04.128,-171.06,91.82,-4.6,14.30,3.59,0, 0 +# Corvus +Alchiba ,alCrv,ICRS,12,08,24.8170,-24,43,43.952,100.18,-39.33,4.4,67.71,4.00,-24,10174 +Alchita ,alCrv,ICRS,12,08,24.8170,-24,43,43.952,100.18,-39.33,4.4,67.71,4.00,-24,10174 +Kraz ,beCrv,ICRS,12,34,23.2346,-23,23,48.333,0.86,-56.00,-7.6,23.34,2.65,-22, 3401 +Gienah Corvi ,gaCrv,ICRS,12,15,48.3702,-17,32,30.946,-159.58,22.31,-4.2,19.78,2.59,-16, 3424 +Algorab ,deCrv,ICRS,12,29,51.8554,-16,30,55.557,-209.97,-139.30,9,37.11,2.95,-15, 3482 +Minkar ,epCrv,ICRS,12,10,07.4807,-22,37,11.159,-71.52,10.55,4.9,10.75,3.017,-21, 3487 +Avis Satyra ,etCrv,ICRS,12,32,04.2270,-16,11,45.627,-424.37,-58.41,-3.5,54.92,4.31,0, 0 +# Canes Venatici +Cor Caroli ,al-2CVn,ICRS,12,56,01.6674,+38,19,06.167,-233.43,54.98,-3.3,29.60,2.90, 39, 2580 +Asterion ,beCVn,ICRS,12,33,44.5446,+41,21,26.927,-705.06,292.91,6.9,119.46,4.26, 42, 2321 +Chara ,beCVn,ICRS,12,33,44.5446,+41,21,26.927,-705.06,292.91,6.9,119.46,4.26, 42, 2321 +# Cygnus +Deneb ,alCyg,ICRS,20,41,25.9147,+45,16,49.217,1.56,1.55,-4.5,1.01,1.25, 44, 3541 +Albireo ,be-1Cyg,ICRS,19,30,43.2806,+27,57,34.852,-7.09,-5.63,-24.07,8.46,3.085, 27, 3410 +Sador ,gaCyg,ICRS,20,22,13.7019,+40,15,24.045,2.43,-0.93,-7.5,2.14,2.237, 39, 4159 +Sadir ,gaCyg,ICRS,20,22,13.7019,+40,15,24.045,2.43,-0.93,-7.5,2.14,2.237, 39, 4159 +Sadr ,gaCyg,ICRS,20,22,13.7019,+40,15,24.045,2.43,-0.93,-7.5,2.14,2.237, 39, 4159 +Ruc ,deCyg,ICRS,19,44,58.4779,+45,07,50.915,43.22,48.44,-20.1,19.07,2.900, 0, 0 +Rukh ,deCyg,ICRS,19,44,58.4779,+45,07,50.915,43.22,48.44,-20.1,19.07,2.900, 0, 0 +Urakhga ,deCyg,ICRS,19,44,58.4779,+45,07,50.915,43.22,48.44,-20.1,19.07,2.900, 0, 0 +Al Fawaris ,deCyg,ICRS,19,44,58.4779,+45,07,50.915,43.22,48.44,-20.1,19.07,2.900, 0, 0 +Gienah Cygni ,epCyg,ICRS,20,46,12.6827,+33,58,12.922,356.17,330.28,-10.6,45.26,2.480, 33, 4018 +Gienah Ghurab,epCyg,ICRS,20,46,12.6827,+33,58,12.922,356.17,330.28,-10.6,45.26,2.480, 33, 4018 + ,zeCyg,ICRS,21,12,56.1862,+30,13,36.897,6.87,-68.12,17.4,21.62,3.20, 29, 4348 + ,etCyg,ICRS,19,56,18.3719,+35,05,00.325,-34.00,-27.60,-26.14,23.40,3.880, 34, 3798 + ,thCyg,ICRS,19,36,26.533,+50,13,15.97,-8.15,262.99,-28.0,53.78,4.48, 49, 3062 + ,io-2Cyg,ICRS,19,29,42.3591,+51,43,47.204,20.92,128.12,-19.5,26.63,3.769, 51, 2605 + ,kaCyg,ICRS,19,17,06.1688,+53,22,06.454,60.22,122.93,-29.3,26.48,3.80, 53, 2216 + ,nuCyg,ICRS,20,57,10.4183,+41,10,01.688,8.51,-23.97,-27.6,9.17,3.939, 40, 4364 + ,xiCyg,ICRS,21,04,55.8628,+43,55,40.267,8.60,0.35,-19.7,2.77,3.723, 43, 3800 +Azelfafage ,pi-1Cyg,ICRS,21,42,05.66458,+51,11,22.6415,5.29,-1.78,-8.2,1.94,4.66, 50, 3410 + ,pi-2Cyg,ICRS,21,46,47.6091,+49,18,34.453,3.61,-1.86,-12.3,2.82,4.18, 48, 3504 + ,rhCyg,ICRS,21,33,58.8525,+45,35,30.615,-24.48,-93.88,6.9,26.20,3.998, 44, 3865 + ,siCyg,ICRS,21,17,24.9529,+39,23,40.853,0.43,-3.61,-4.1,0.72,4.256, 38, 4431 + ,upCyg,ICRS,21,17,55.0764,+34,53,48.832,11.96,6.85,4,3.62,4.43, 34, 4371 +Ruchbah I ,ome-1Cyg,ICRS,20,30,03.5407,+48,57,05.648,10.01,7.64,-22,3.75,4.938, 48, 3142 +Ruchbah II ,ome-2Cyg,ICRS,20,31,18.8163,+49,13,13.070,8.79,-31.28,-64.15,8.07,5.468, 48, 3154 + ,61Cyg,ICRS,21,06,54.6,+38,44,45,4133.05,3201.78,,286,4.84, 38, 4343 +# Delphinus +Sualocin ,alDel,ICRS,20,39,38.2874,+15,54,43.459,54.14,7.91,-3.4,13.55,3.800, 15, 4222 +Rotanev ,beDel,ICRS,20,37,32.9411,+14,35,42.313,118.28,-47.65,-22.7,33.49,3.632, 14, 4369 + ,ga-2Del,ICRS,20,46,39.5023,+16,07,27.466,-25.88,-196.27,-6.41,32.14,4.27, 15, 4255 + ,deDel,ICRS,20,43,27.5339,+15,04,28.491,-19.61,-41.74,9.3,16.03,4.434, 14, 4403 +Deneb Dulphim,epDel,ICRS,20,33,12.7712,+11,18,11.746,10.75,-28.54,-19.3,9.09,4.032, 10, 4321 + ,kaDel,ICRS,20,39,07.7842,+10,05,10.331,323.59,21.07,-52.0,33.27,5.05, 09, 4600 +# Dorado + ,alDor,ICRS,04,33,59.7775,-55,02,41.909,58.06,12.73,25.6,18.56,3.256,-55, 663 + ,beDor,ICRS,05,33,37.5177,-62,29,23.371,1.06,12.56,7.2,3.14,3.77,-62, 487 + ,gaDor,ICRS,04,16,01.5857,-51,29,11.933,100.57,184.23,25.2,49.26,4.20,-51, 1066 + ,deDor,ICRS,05,44,46.3788,-65,44,07.893,-28.38,6.12,-3,22.48,4.35,-65, 496 + ,zeDor,ICRS,05,05,30.6558,-57,28,21.734,-31.87,117.42,-2.0,85.83,4.720,-57, 735 + ,thDor,ICRS,05,13,45.4542,-67,11,06.918,18.18,38.96,10.5,5.97,4.812,-67, 401 + ,nuDor,ICRS,06,08,44.2619,-68,50,36.274,-50.90,19.68,17.5,11.78,5.044,-68, 474 +# Draco +Thuban ,alDra,ICRS,14,04,23.3498,+64,22,33.062,-56.52,17.19,-13.0,10.56,3.680, 65, 978 +Alwaid ,beDra,ICRS,17,30,25.9620,+52,18,04.994,-15.59,11.57,-20.0,9.02,2.79, 52, 2065 +Rastaban ,beDra,ICRS,17,30,25.9620,+52,18,04.994,-15.59,11.57,-20.0,9.02,2.79, 52, 2065 +Eltanin ,gaDra,ICRS,17,56,36.3699,+51,29,20.022,-8.52,-23.05,-27.91,22.10,2.230, 51, 2282 +Etamin ,gaDra,ICRS,17,56,36.3699,+51,29,20.022,-8.52,-23.05,-27.91,22.10,2.230, 51, 2282 +Nodus II ,deDra,ICRS,19,12,33.3000,+67,39,41.549,94.49,92.30,24.8,32.54,3.082, 67, 1129 +Altais ,deDra,ICRS,19,12,33.3000,+67,39,41.549,94.49,92.30,24.8,32.54,3.082, 67, 1129 +Tyl ,epDra,ICRS,19,48,10.3521,+70,16,04.549,80.18,39.02,3.1,22.40,3.83, 69, 1070 +Nodus I ,zeDra,ICRS,17,08,47.1956,+65,42,52.860,-20.76,19.15,-17,9.60,3.174, 65, 1170 +Aldhibah ,zeDra,ICRS,17,08,47.1956,+65,42,52.860,-20.76,19.15,-17,9.60,3.174, 65, 1170 +Alsafi ,thDra,ICRS,16,01,53.3457,+58,33,54.905,-320.08,334.96,-8.5,47.79,4.000, 58, 1608 +Edasich ,ioDra,ICRS,15,24,55.7747,+58,57,57.836,-8.27,17.30,-10.71,31.92,3.310, 59, 1654 +Ed Asich ,ioDra,ICRS,15,24,55.7747,+58,57,57.836,-8.27,17.30,-10.71,31.92,3.310, 59, 1654 +Ketu ,kaDra,ICRS,12,33,28.9443,+69,47,17.656,-58.14,11.42,-11.4,6.55,3.881, 70, 703 +Giansar ,laDra,ICRS,11,31,24.2205,+69,19,51.873,-41.14,-18.79,6.58,9.76,3.828, 70, 665 +Gianfar ,laDra,ICRS,11,31,24.2205,+69,19,51.873,-41.14,-18.79,6.58,9.76,3.828, 70, 665 +Arrakis ,muDra,ICRS,17,05,20.1160,+54,28,12.153,-66.00,73.86,-17.3,37.08,4.92, 54, 1857 +Kuma ,nu-1Dra,ICRS,17,32,10.5697,+55,11,03.273,148.53,54.24,-15.2,32.96,4.888, 55, 1944 +Kuma ,nu-2Dra,ICRS,17,32,16.0258,+55,10,22.651,143.71,62.46,-16.0,32.64,4.865, 55, 1945 +Grumium ,xiDra,ICRS,17,53,31.7295,+56,52,21.514,93.65,78.44,-26.38,29.26,3.741, 56, 2033 + ,omiDra,ICRS,18,51,12.0955,+59,23,18.063,77.56,25.43,-19.5,10.12,4.642, 59, 1925 +Alsafi ,siDra,ICRS,19,32,21.5908,+69,39,40.232,598.26,-1738.71,26.7,173.40,4.680, 69, 1053 +Athafi ,siDra,ICRS,19,32,21.5908,+69,39,40.232,598.26,-1738.71,26.7,173.40,4.680, 69, 1053 + ,taDra,ICRS,19,15,33.0563,+73,21,19.685,-116.60,104.25,-33.70,21.73,4.459, 73, 857 + ,upDra,ICRS,18,54,23.8547,+71,17,49.891,48.59,42.11,-7.1,9.47,4.827, 71, 915 +Batentaban Borealis,chDra,ICRS,18,21,03.3826,+72,43,58.235,531.02,-351.60,32.5,124.11,3.580, 72, 839 +Dziban ,ps-1Dra,ICRS,17,41,56.3577,72,08,55.836,26.60,--269.77,-10.3,45.38,4.56, 72, 804 +Alathfar ,omeDra,ICRS,17,36,57.0921,+68,45,28.691,1.34,321.05,-14.0,42.62,4.80, 68, 949 +Al Athfar ,omeDra,ICRS,17,36,57.0921,+68,45,28.691,1.34,321.05,-14.0,42.62,4.80, 68, 949 +Aldhibain ,etDra,ICRS,16,23,59.4861,+61,30,51.167,-16.98,56.68,-14.3,37.18,2.736, 0, 0 +Batentaban Australis,phDra,ICRS,18,20,45.4304,+71,20,16.132,-5.91,35.79,-16,11.28,4.22, 0, 0 +# Equuleus +Kitalpha ,alEqu,ICRS,21,15,49.4317,+05,14,52.241,59.63,-94.33,-16.2,17.51,3.949, 04, 4635 + ,gaEqu,ICRS,21,10,20.5001,+10,07,53.686,49.07,-151.85,-17.0,28.38,4.712, 09, 4732 +# Eridanus +Achernar ,alEri,ICRS,01,37,42.8466,-57,14,12.327,88.02,-40.08,16,22.68,0.50,-57, 334 +Cursa ,beEri,ICRS,05,07,50.9851,-05,05,11.206,-83.39,-75.44,-9.2,36.71,2.79,-05, 1162 +Zaurak ,gaEri,ICRS,03,58,01.7664,-13,30,30.655,60.51,-111.34,61.7,14.75,2.978,-13, 781 +Rana ,deEri,ICRS,03,43,14.9018,-09,45,48.221,-91.71,742.24,-6.1,110.58,3.51,-10, 728 + ,epEri,ICRS,03,32,55.8442,-09,27,29.744,-976.36,17.98,15.5,310.74,3.73,-09, 697 +Azha ,etEri,ICRS,02,56,25.6497,-08,53,53.320,77.73,-219.99,-20.3,24.49,3.89,-09, 553 +Acamar ,th-1Eri,ICRS,02,58,15.696,-40,18,16.97,-44.6,19.0,11.9,28.00,3.2,-40, 771 +Zibal ,zeEri,ICRS,03,15,50.0245,-08,49,11.027,-3.82,45.52,-4,27.18,4.792,-09, 624 + ,ioEri,ICRS,02,40,40.0344,-39,51,19.352,135.17,-27.34,-9.3,22.42,4.124,-40, 689 + ,kaEri,ICRS,02,26,59.1223,-47,42,13.825,19.97,-5.44,27.7,6.17,4.234,-48, 637 + ,laEri,ICRS,05,09,08.7830,-08,45,14.691,0.00,-2.01,3,1.86,4.249,-08, 1040 + ,muEri,ICRS,04,45,30.1511,-03,15,16.767,17.27,-13.51,8.5,6.13,4.00,-03, 876 + ,nuEri,ICRS,04,36,19.1416,-03,21,08.853,1.73,-4.54,14.9,5.56,3.920,-03, 834 + ,xiEri,ICRS,04,23,40.8523,-03,44,43.693,-47.92,-56.73,-11,15.66,5.171,-04, 818 +Beid ,omi-1Eri,ICRS,04,11,51.9402,-06,50,15.292,11.92,81.28,11,25.98,4.040,-07, 764 +Keid ,omi-2Eri,ICRS,04,15,16.3201,-07,39,10.336,-2239.71,-3420.34,-42.2,198.25,4.41,-07, 780 + ,phEri,ICRS,02,16,30.5853,-51,30,43.793,90.75,-21.90,10.2,21.06,3.545,-52, 285 +Angetenar ,ta-2Eri,ICRS,02,51,02.3215,-21,00,14.470,-39.00,-16.63,-8.6,17.85,4.75,-21, 509 + ,ta-3Eri,ICRS,03,02,23.5002,-23,37,28.098,-145.96,-55.76,-9.8,37.85,4.096,-24, 1387 + ,ta-5Eri,ICRS,03,33,47.2761,-21,37,58.378,44.91,-27.47,14.0,11.02,4.30,-22, 628 + ,ta-6Eri,ICRS,03,46,50.8875,-23,14,59.002,-159.86,-528.54,6.5,55.79,4.20,-23, 1565 +Theemin ,up-2Eri,ICRS,04,35,33.0385,-30,33,44.429,-48.92,-12.75,-4.0,15.62,3.817,-30, 1901 + ,chEri,ICRS,01,55,57.4724,-51,36,32.025,681.23,284.26,-6.3,57.19,3.70,-52, 241 +Sceptrum ,53Eri,ICRS,04,38,10.8241,-14,18,14.471,-77.86,-178.06,41.8,29.84,3.85,-14, 933 +# Fornax +Fornacis ,alFor,ICRS,03,12,04.5277,-28,59,15.425,371.49,612.28,-20.5,70.86,3.85,-29, 1177 + ,beFor,ICRS,02,49,05.4195,-32,24,21.232,86.96,158.96,16.8,19.31,4.465,-32, 1025 + ,deFor,ICRS,03,42,14.9027,-31,56,18.101,5.16,14.23,26,4.45,4.970,-32, 1430 + ,kaFor,ICRS,02,22,32.5468,-23,48,58.774,197.34,-4.39,18.4,45.60,5.19,-24, 1038 + ,la-1For,ICRS,02,33,07.0265,-34,38,59.881,-17.41,-17.94,13.0,8.58,5.902,-35, 877 + ,muFor,ICRS,02,12,54.4705,-30,43,25.771,15.32,7.15,10,9.82,5.261,-31, 882 + ,nuFor,ICRS,02,04,29.4385,-29,17,48.548,12.56,8.54,18.5,9.03,4.683,-29, 706 + ,taFor,ICRS,03,38,47.6717,-27,56,34.995,21.55,25.85,39,7.81,6.01,-28, 1225 +# Gemini +Castor ,alGem,ICRS,07,34,35.8628,+31,53,17.795,-206.33,-148.18,,63.27,1.59, 32, 1581 +Pollux ,beGem,ICRS,07,45,18.9503,+28,01,34.315,-625.69,-45.96,3.23,96.74,1.15, 28, 1463 +Alhena ,gaGem,ICRS,06,37,42.7011,+16,23,57.308,-2.04,-66.92,-12.5,31.12,1.90, 16, 1223 +Almeisan ,gaGem,ICRS,06,37,42.7011,+16,23,57.308,-2.04,-66.92,-12.5,31.12,1.90, 16, 1223 +Wasat ,deGem,ICRS,07,20,07.3775,+21,58,56.354,-18.72,-7.76,4.1,55.45,3.53, 22, 1645 +Mebsuta ,epGem,ICRS,06,43,55.9260,+25,07,52.047,-5.93,-12.81,9.9,3.61,3.019, 25, 1406 +Mekbuda ,zeGem,ICRS,07,04,06.5318,+20,34,13.069,-5.72,-0.96,6.7,2.79,4.01, 20, 1687 +Propus etaGem,etGem,ICRS,06,14,52.6572,+22,30,24.476,-62.53,-10.24,19.0,9.34,3.32, 22, 1241 +Nageba ,thGem,ICRS,06,52,47.3382,+33,57,40.514,-2.66,-47.67,21,16.59,3.60, 34, 1481 +Propus iotGem,ioGem,ICRS,07,25,43.5961,+27,47,53.089,-121.28,-84.43,8.4,25.90,3.793, 28, 1385 +Al Krikab ,kaGem,ICRS,07,44,26.8542,+24,23,52.773,-22.45,-56.24,20.6,22.73,3.57, 24, 1759 +Kebash ,laGem,ICRS,07,18,05.5787,+16,32,25.379,-46.09,-37.90,-9.2,34.59,3.581, 16, 1443 +Alkibash ,laGem,ICRS,07,18,05.5787,+16,32,25.379,-46.09,-37.90,-9.2,34.59,3.581, 16, 1443 +Tejat ,muGem,ICRS,06,22,57.6270,+22,30,48.909,56.84,-108.79,54.38,14.07,2.914, 22, 1304 + ,nuGem,ICRS,06,28,57.7867,+20,12,43.679,-5.98,-14.08,39.4,6.49,4.14, 20, 1441 +Alzirr ,xiGem,ICRS,06,45,17.3647,+12,53,44.128,-115.16,-190.91,25.3,57.02,3.40, 13, 1396 + ,piGem,ICRS,07,47,30.3235,+33,24,56.509,-18.81,-28.63,-13.36,5.80,5.150, 33, 1585 + ,rhGem,ICRS,07,29,06.7191,+31,47,04.381,159.33,193.82,-4.4,54.06,4.16, 32, 1562 + ,siGem,ICRS,07,43,18.7265,+28,53,00.635,61.84,-231.26,45.8,26.68,4.28, 0, 0 + ,taGem,ICRS,07,11,08.3707,+30,14,42.587,-31.00,-48.40,21.83,10.81,4.398, 0, 0 + ,upGem,ICRS,07,35,55.3464,+26,53,44.667,-39.58,-108.08,-21.61,13.57,4.080, 27, 1424 + ,phGem,ICRS,07,53,29.8143,+26,45,56.818,-34.02,-31.17,8.0,12.82,4.977, 27, 1499 + ,chGem,ICRS,08,03,31.0803,+27,47,39.596,-28.53,-35.25,-10.9,12.66,4.944, 28, 1532 + ,omeGem,ICRS,07,02,24.7805,+24,12,55.604,-6.46,-0.40,-8.5,1.97,5.188, 24, 1502 +# Grus +Alnair ,alGru,ICRS,22,08,13.9855,-46,57,39.512,127.60,-147.91,11.8,32.16,1.740,-47,14063 +Gruid ,beGru,ICRS,22,42,40.0507,-46,53,04.477,135.68,-4.51,1.6,19.17,2.13,-47,14308 +Al Dhanab ,gaGru,ICRS,21,53,55.7245,-37,21,53.468,95.88,-12.10,-2.1,16.07,3.01,-37,14536 +Ras Alkurki ,gaGru,ICRS,21,53,55.7245,-37,21,53.468,95.88,-12.10,-2.1,16.07,3.01,-37,14536 + ,de-1Gru,ICRS,22,29,16.1747,-43,29,44.033,25.62,-4.23,4.9,11.03,3.969,-44,14931 + ,epGru,ICRS,22,48,33.2983,-51,19,00.710,108.47,-65.93,0,25.16,3.489,-51,13389 + ,zeGru,ICRS,23,00,52.8116,-52,45,14.893,-65.09,-12.91,-1.1,28.99,4.125,-53,10382 + ,ioGru,ICRS,23,10,21.5377,-45,14,48.161,132.42,-26.27,-4.4,17.63,3.890,-45,14947 + ,laGru,ICRS,22,06,06.8854,-39,32,36.072,-24.16,-125.17,38.8,13.20,4.476,-40,14639 + ,nuGru,ICRS,22,28,39.2099,-39,07,54.450,37.24,-160.72,10.6,12.42,5.477,-39,14723 + ,omiGru,ICRS,23,26,36.5762,-52,43,17.770,33.16,130.07,18,31.28,5.536,-53,10461 +# Hercules +Ras Algethi ,alHer,ICRS,17,14,38.8584,+14,23,25.198,-6.71,32.78,,8.53,3.06, 14, 3207 +Rasalgethi ,alHer,ICRS,17,14,38.8584,+14,23,25.198,-6.71,32.78,,8.53,3.06, 14, 3207 +Kornephoros ,beHer,ICRS,16,30,13.1999,+21,29,22.608,-98.43,-14.49,-25.5,22.07,2.786, 21, 2934 +Rutilicus ,zeHer,ICRS,16,41,17.1603,+31,36,09.812,-462.64,345.08,-69.9,92.64,2.800, 0, 0 + ,gaHer,ICRS,16,21,55.2144,+19,09,11.269,-47.44,44.61,-35.3,16.69,3.742, 19, 3086 +Sarin ,deHer,ICRS,17,15,01.9106,+24,50,21.135,-21.14,-157.68,-40.0,41.55,3.126, 25, 3221 +Kajam epsHer ,epHer,ICRS,17,00,17.3738,+30,55,35.057,-47.68,26.89,-25.1,20.04,3.906, 31, 2947 +Sofian ,etHer,ICRS,16,42,53.7653,+38,55,20.116,35.58,-84.98,8.3,29.11,3.487, 39, 3029 +Rukbalgethi Genubi,thHer,ICRS,17,56,15.1805,+37,15,01.941,2.74,7.24,-28.32,4.87,3.851, 37, 2982 +Al Jathiyah ,ioHer,ICRS,17,39,27.8864,+46,00,22.795,-7.17,3.97,-20.0,6.58,3.800, 46, 2349 +Marsik ,kaHer,ICRS,16,08, 4.5255, 17,02,49.129,-34.29,-5.46,-11.0,8.4,5.00, 17, 2964 +Marfik ,kaHer,ICRS,16,08, 4.5255, 17,02,49.129,-34.29,-5.46,-11.0,8.4,5.00, 17, 2964 +Masym ,laHer,ICRS,17,30,44.3099,+26,06,38.323,18.39,16.78,-26.51,8.88,4.402, 26, 3034 +Maasym ,laHer,ICRS,17,30,44.3099,+26,06,38.323,18.39,16.78,-26.51,8.88,4.402, 26, 3034 +Melkarth ,muHer,ICRS,17,46,27.5269,+27,43,14.434,-291.42,-750.03,-15.6,119.05,3.417, 27, 2888 + ,xiHer,ICRS,17,57,45.8857,+29,14,52.367,82.33,-18.73,-1.72,24.12,3.705, 29, 3156 + ,omiHer,ICRS,18,07,32.5507,+28,45,44.959,-0.17,7.51,-29.5,9.39,3.837, 28, 2925 +Fudail ,piHer,ICRS,17,15,02.8343,+36,48,32.983,-27.35,2.70,-25.57,8.89,3.156, 36, 2844 + ,siHer,ICRS,16,34,06.1821,+42,26,13.348,-9.03,59.80,-10.9,10.79,4.200, 42, 2724 +Rukbalgethi Shemali,taHer,ICRS,16,19,44.4368,+46,18,48.119,-13.15,39.31,-13.8,10.37,3.900, 46, 2169 + ,phHer,ICRS,16,08,46.1779,+44,56,05.662,-25.98,35.86,-15.6,14.27,4.232, 45, 2376 + ,chHer,ICRS,15,52,40.5415,+42,27,05.465,439.01,629.55,-55.4,63.08,4.62, 42, 2648 +Kajam omeHer ,omeHer,ICRS,16,25,24.9533,+14,01,59.770,39.39,-59.89,-5.9,13.87,4.574, 14, 3049 +Cujam ,omeHer,ICRS,16,25,24.9533,+14,01,59.770,39.39,-59.89,-5.9,13.87,4.574, 14, 3049 +Apex ,HerA*,1950,18,04,00.00 , 30,00,00.0 , 0.000, 0.00, 0.0,0.0000,999.99, 0, 0 +# Horologium + ,alHor,ICRS,04,14,00.1143,-42,17,39.725,41.89,-203.65,21.7,27.85,3.86,-42, 1425 + ,zeHor,ICRS,02,40,39.6129,-54,32,59.681,32.76,5.24,-1.1,20.49,5.21,-55, 446 + ,laHor,ICRS,02,24,53.9107,-60,18,43.011,-71.08,-131.04,6,20.40,5.372,-60, 199 + ,muHor,ICRS,03,03,36.8195,-59,44,15.991,-72.81,-63.89,17.3,23.67,5.128,-60, 236 +# Hydra +Alphard ,alHya,ICRS,09,27,35.2433,-08,39,30.969,-14.49,33.25,-4.3,18.40,2.004,-08, 2680 +Cor Hydrae ,alHya,ICRS,09,27,35.2433,-08,39,30.969,-14.49,33.25,-4.3,18.40,2.004,-08, 2680 + ,beHya,ICRS,11,52,54.5205,-33,54,29.248,-58.02,2.40,-1,8.93,4.276,0, 0 +Cauda Hydrae ,gaHya,ICRS,13,18,55.2968,-23,10,17.444,68.41,-41.09,-5.4,24.69,3.00,-22, 3554 +Dhanab al Shuja,gaHya,ICRS,13,18,55.2968,-23,10,17.444,68.41,-41.09,-5.4,24.69,3.00,-22, 3554 +Mautinah ,deHya,ICRS,08,37,39.3662,+05,42,13.614,-70.27,-6.99,11.3,18.21,4.137, 06, 2001 +Ashlesha ,epHya,ICRS,08,46,46.5106,+06,25,07.713,-231.04,-40.17,36.4,24.13,3.38, 0, 0 +Hydrobius ,zeHya,ICRS,08,55,23.6263,+05,56,44.028,-99.76,14.65,22.8,21.64,3.127, 06, 2060 + ,etHya,ICRS,08,43,13.4752,+03,23,55.184,-19.14,-1.29,21,6.99,4.300, 0, 0 + ,thHya,ICRS,09,14,21.8590,+02,18,51.409,112.57,-306.07,-10,25.34,3.88, 02, 2167 + ,ioHya,ICRS,09,39,51.3619,-01,08,34.117,47.81,-62.92,23.2,11.83,3.909,-00, 2231 + ,kaHya,ICRS,09,40,18.3633,-14,19,56.252,-26.32,-19.25,18,6.33,5.046,-13, 2917 + ,laHya,ICRS,10,10,35.2775,-12,21,14.699,-200.33,-100.28,19.4,28.44,3.61,-11, 2820 + ,muHya,ICRS,10,26,05.4267,-16,50,10.646,-128.51,-80.06,39.6,13.14,3.833,-16, 3052 +Pleura ,nuHya,ICRS,10,49,37.4884,-16,11,37.134,92.77,199.02,-1.2,23.54,3.11,-15, 3138 + ,xiHya,ICRS,11,33,00.1155,-31,51,27.451,-209.09,-41.60,-4.6,25.23,3.54,-31, 9083 + ,omiHya,ICRS,11,40,12.7891,-34,44,40.775,-44.04,-1.84,5.9,6.59,4.693,-34, 7610 +Sataghni ,piHya,ICRS,14,06,22.2971,-26,40,56.500,43.05,-140.82,27.2,32.17,3.263,-26,10095 +Al Minliar al Shuja,siHya,ICRS,08,38,45.4377,+03,20,29.167,-19.03,-16.29,27.28,9.25,4.452, 03, 2026 +Minchir ,siHya,ICRS,08,38,45.4377,+03,20,29.167,-19.03,-16.29,27.28,9.25,4.452, 03, 2026 +Ukdah ,ta-1Hya,ICRS,09,29,08.8977,-02,46,08.270,100.93,-3.15,9.8,58.48,4.60,-02, 2901 +Ukdah ,ta-2Hya,ICRS,09,31,58.9281,-01,11,04.790,-11.42,-3.87,5.6,7.11,4.555,-00, 2211 + ,up-1Hya,ICRS,09,51,28.6937,-14,50,47.771,18.68,-21.88,-14.5,11.92,4.117,0, 0 + ,up-2Hya,ICRS,10,05,07.4700,-13,03,52.654,-37.48,19.90,28,11.77,4.594,-12, 3073 + ,ch-1Hya,ICRS,11,05,19.9074,-27,17,37.004,-190.74,-6.87,17,22.98,4.94,-26, 8338 +# Hydrus + ,alHyi,ICRS,01,58,46.1935,-61,34,11.493,262.54,26.89,7,45.74,2.90,-62, 162 + ,beHyi,ICRS,00,25,45.0719,-77,15,15.284,2219.86,325.28,22.7,133.78,2.80,-77, 16 + ,gaHyi,ICRS,03,47,14.3412,-74,14,20.264,51.07,115.27,15.8,15.23,3.24,-74, 276 + ,deHyi,ICRS,02,21,44.9427,-68,39,33.905,-50.07,2.38,6,24.10,4.081,-69, 113 + ,epHyi,ICRS,02,39,35.3613,-68,16,01.006,87.40,0.56,6,21.27,4.106,-68, 161 + ,et-2Hyi,ICRS,01,54,56.1314,-67,38,50.292,76.00,73.17,-16.2,15.04,4.695,-68, 101 + ,thHyi,ICRS,03,02,15.4484,-71,54,08.844,27.18,15.95,11.8,6.21,5.497,-72, 219 + ,ioHyi,ICRS,03,15,57.6605,-77,23,18.435,113.20,62.00,19.4,34.02,5.519,-77, 134 + ,kaHyi,ICRS,02,22,52.3051,-73,38,44.852,-81.59,11.84,22,10.26,5.995,-74, 194 + ,laHyi,ICRS,00,48,35.4173,-74,55,24.375,133.21,-34.59,9.5,15.94,5.094,-75, 64 + ,muHyi,ICRS,02,31,40.5442,-79,06,33.775,137.14,-54.42,-14.5,11.18,5.278,-79, 66 +# Indus + ,alInd,ICRS,20,37,34.0320,-47,17,29.406,49.20,66.07,-1.3,32.21,3.116,-47,13477 + ,beInd,ICRS,20,54,48.6031,-58,27,14.957,21.06,-24.75,-4.9,5.41,3.658,-58, 7788 + ,gaInd,ICRS,21,26,15.4395,-54,39,37.654,1.24,38.69,6.8,15.68,6.096,-55, 9586 + ,deInd,ICRS,21,57,55.0747,-54,59,33.272,43.00,-3.67,15,17.65,4.40,-55, 9733 + ,epInd,ICRS,22,03,21.6571,-56,47,09.514,3961.41,-2538.33,-40.4,275.79,4.69,-57,10015 + ,etInd,ICRS,20,44,02.3337,-51,55,15.495,155.49,-53.64,-1.6,41.38,4.519,-52,11752 + ,omiInd,ICRS,21,50,47.1841,-69,37,45.898,-24.77,-4.73,20.2,5.84,5.521,-70, 2873 + ,rhInd,ICRS,22,54,39.481,-70,04,25.35,-43.19,73.20,-3.0,37.71,6.064,-70, 2971 +# Lacerta + ,alLac,ICRS,22,31,17.5010,+50,16,56.969,137.22,17.15,-4.0,31.86,3.777, 49, 3875 + ,beLac,ICRS,22,23,33.6235,+52,13,44.567,-13.56,-186.37,-10.4,19.21,4.43, 51, 3358 +# Leo +Regulus ,alLeo,ICRS,10,08,22.4593,+11,58,01.9027,-248.73,5.59,5.9,42.09,1.35, 12, 2149 +Denebola ,beLeo,ICRS,11,49,03.5776,+14,34,19.417,-499.02,-113.78,-0.2,90.16,2.14, 15, 2383 +Algieba ,ga-1Leo,ICRS,10,19,58.427,+19,50,28.53,294.9,-154.0,-36.7,25.96,2.12, 20, 2467 +Dhur ,deLeo,ICRS,11,14,06.5013,+20,31,25.381,143.31,-130.43,-20.2,56.52,2.56, 21, 2298 +Zosma ,deLeo,ICRS,11,14,06.5013,+20,31,25.381,143.31,-130.43,-20.2,56.52,2.56, 21, 2298 +Ras Elased Australis,epLeo,ICRS,09,45,51.0730,+23,46,27.317,-46.09,-9.57,4.3,13.01,2.975, 24, 2129 +Adhafera ,zeLeo,ICRS,10,16,41.4169,+23,25,02.318,19.84,-7.30,-15.6,12.56,3.443, 24, 2209 +Algieba ,etLeo,ICRS,10,07,19.9523,+16,45,45.592,-1.94,-0.53,3.3,1.53,3.511, 17, 2171 +Al Jabhah ,etLeo,ICRS,10,07,19.9523,+16,45,45.592,-1.94,-0.53,3.3,1.53,3.511, 17, 2171 +Tse Tseng ,ioLeo,ICRS,11,23,55.4523,+10,31,46.231,140.75,-77.80,-10.3,41.26,4.00, 11, 2348 +Tsze Tseang ,ioLeo,ICRS,11,23,55.4523,+10,31,46.231,140.75,-77.80,-10.3,41.26,4.00, 11, 2348 +Alminhar ,kaLeo,ICRS,09,24,39.2591,+26,10,56.367,-31.13,-48.06,27.94,15.28,4.473, 26, 1939 +Al Minliar al Asad,kaLeo,ICRS,09,24,39.2591,+26,10,56.367,-31.13,-48.06,27.94,15.28,4.473, 26, 1939 +Alterf ,laLeo,ICRS,09,31,43.2281,+22,58,04.694,-19.38,-39.04,24.27,9.69,4.317, 23, 2107 +Ras Elased Borealis,muLeo,ICRS,09,52,45.8173,+26,00,25.025,-216.29,-54.92,13.63,24.52,3.88, 26, 2019 +Rasalas ,muLeo,ICRS,09,52,45.8173,+26,00,25.025,-216.29,-54.92,13.63,24.52,3.88, 26, 2019 + ,xiLeo,ICRS,09,31,56.7388,+11,17,59.376,-89.92,-84.00,34.85,13.67,4.973, 11, 2053 +Subra ,omiLeo,ICRS,09,41,09.0328,+09,53,32.309,-143.67,-37.45,,24.12,3.531, 10, 2044 +Shishimai ,siLeo,ICRS,11,21,08.1943,+06,01,45.558,-91.76,-12.83,-5.3,15.24,4.044, 06, 2437 +Coxa ,thLeo,ICRS,11,14,14.4052,+15,25,46.453,-59.01,-79.37,7.6,18.36,3.324, 16, 2234 +Chertan ,thLeo,ICRS,11,14,14.4052,+15,25,46.453,-59.01,-79.37,7.6,18.36,3.324, 16, 2234 +Cestan ,thLeo,ICRS,11,14,14.4052,+15,25,46.453,-59.01,-79.37,7.6,18.36,3.324, 16, 2234 +Chort ,thLeo,ICRS,11,14,14.4052,+15,25,46.453,-59.01,-79.37,7.6,18.36,3.324, 16, 2234 + ,piLeo,ICRS,10,00,12.8066,+08,02,39.203,-30.06,-22.11,22.36,6.21,4.688, 08, 2301 +Shir ,rhLeo,ICRS,10,32,48.6719,+09,18,23.708,-5.57,-3.59,42.0,0.57,3.870, 10, 2166 + ,taLeo,ICRS,11,27,56.2400,+02,51,22.555,17.32,-10.41,-9.1,5.25,4.950, 03, 2504 + ,upLeo,ICRS,11,36,56.9306,-00,49,25.495,1.30,43.43,1.0,18.31,4.310,-00, 2458 + ,phLeo,ICRS,11,16,39.7009,-03,39,05.764,-108.15,-35.76,-3,16.69,4.467,-02, 3315 + ,chLeo,ICRS,11,05,01.0273,+07,20,09.626,-344.41,-47.40,4.7,34.54,4.63, 08, 2455 + ,psLeo,ICRS,09,43,43.9046,+14,01,18.091,5.18,-6.13,10.31,4.57,5.384, 14, 2136 +# Lepus +Arneb ,alLep,ICRS,05,32,43.8159,-17,49,20.239,3.27,1.54,23.9,2.54,2.597,-17, 1166 +Nihal ,beLep,ICRS,05,28,14.7232,-20,45,33.988,-5.03,-85.92,-13.6,20.49,2.840,-20, 1096 + ,gaLep,ICRS,05,44,27.7904,-22,26,54.176,-292.43,-368.46,-9.7,111.49,3.60,-22, 1211 + ,deLep,ICRS,05,51,19.2957,-20,52,44.719,228.95,-647.93,99.3,29.05,3.81,-20, 1211 +Sasin ,epLep,ICRS,05,05,27.6643,-22,22,15.717,19.27,-72.35,1.0,14.39,3.192,-22, 1000 + ,zeLep,ICRS,05,46,57.3408,-14,49,19.020,-14.84,-1.18,20,46.47,3.545,-14, 1232 + ,etLep,ICRS,05,56,24.2929,-14,10,03.721,-42.23,139.02,-2.4,66.47,3.719,-14, 1286 + ,laLep,ICRS,05,19,34.5245,-13,10,36.439,-2.49,-4.74,20.2,3.03,4.270,-13, 1127 + ,muLep,ICRS,05,12,55.9009,-16,12,19.686,45.66,-16.13,27.7,17.69,3.279,-16, 1072 +# Libra + ,al-1Lib,ICRS,14,50,41.1813,-15,59,50.053,-135.93,-59.47,-23,42.26,5.152,-15, 3965 +Zubenelgenubi,al-2Lib,ICRS,14,50,52.7131,-16,02,30.401,-105.69,-69.00,-10,42.25,2.753, -15, 3966 +Zuben Elgenubi,al-2Lib,ICRS,14,50,52.7131,-16,02,30.401,-105.69,-69.00,-10,42.25,2.753, -15, 3966 +Zubeneshamali,beLib,ICRS,15,17,00.4148,-09,22,58.503,-96.39,-20.76,-35.2,20.38,2.605,-08, 3935 +Zuben Eschamali,beLib,ICRS,15,17,00.4148,-09,22,58.503,-96.39,-20.76,-35.2,20.38,2.605,-08, 3935 +Zubenelakrab ,gaLib,ICRS,15,35,31.5790,-14,47,22.333,65.67,6.93,-27.5,21.42,3.925,-14, 4237 +Zuben Elakrab ,gaLib,ICRS,15,35,31.5790,-14,47,22.333,65.67,6.93,-27.5,21.42,3.925,-14, 4237 +Zubenelakribi,deLib,ICRS,15,00,58.3486,-08,31,08.195,-66.20,-3.40,-38.7,10.72,4.95,-07, 3938 +Zuben Elakribi,deLib,ICRS,15,00,58.3486,-08,31,08.195,-66.20,-3.40,-38.7,10.72,4.95,-07, 3938 + ,ze-1Lib,ICRS,15,28,15.4082,-16,42,59.343,16.66,-33.36,-21.4,3.59,5.656,-16, 4089 + ,io-1Lib,ICRS,15,12,13.2901,-19,47,30.158,-35.59,-32.55,-11.6,8.66,4.54,-19, 4047 + ,kaLib,ICRS,15,41,56.7981,-19,40,43.781,-33.21,-104.33,-3.8,8.16,4.765,-19, 4188 + ,laLib,ICRS,15,53,20.0586,-20,10,01.345,-3.61,-19.00,6,9.15,5.029,-19, 4249 +Zubenhakrabi ,nuLib,ICRS,15,06,37.5962,-16,15,24.544,-36.41,-23.28,-15.1,4.26,5.202,-15, 4026 +Zuben Hakrabi ,nuLib,ICRS,15,06,37.5962,-16,15,24.544,-36.41,-23.28,-15.1,4.26,5.202,-15, 4026 + ,xi-2Lib,ICRS,14,56,46.1118,-11,24,34.922,7.93,11.21,14.6,6.06,5.479,-10, 3989 +Brachium ,siLib,ICRS,15,04,04.2155,-25,16,55.073,-71.85,-44.69,-4.3,11.17,3.30,-24,11834 + ,taLib,ICRS,15,38,39.3695,-29,46,39.914,-22.10,-26.54,3.2,7.33,3.644,0,0 + ,upLib,ICRS,15,37,01.4498,-28,08,06.286,-13.26,-3.48,-24.9,16.76,3.609,-27,10464 +# Leo Minor + ,beLMi,ICRS,10,27,52.9997,+36,42,25.962,-127.52,-109.62,5.6,22.34,4.215, 37, 2080 +Praecipua ,46 LMi,ICRS,10,53,18.7051,34,12,53.536, 92.47,-286.06,15.69,33.4, 3.83, 34, 2172 +# Lupus +Kakkab ,alLup,ICRS,14,41,55.7556,-47,23,17.520,-21.15,-24.22,5.2,5.95,2.276,-46, 9501 +Men ,alLup,ICRS,14,41,55.7556,-47,23,17.520,-21.15,-24.22,5.2,5.95,2.276,-46, 9501 +Kekouan ,beLup,ICRS,14,58,31.9269,-43,08,02.256,-34.06,-38.30,0.2,6.23,2.665,-42, 9853 +Thusia ,gaLup,ICRS,15,35,08.4479,-41,10,00.325,-16.05,-25.52,2.3,5.75,2.765,0,0 +Hilasmus ,deLup,ICRS,15,21,22.3217,-40,38,51.064,-19.11,-24.05,0.2,6.39,3.203,-40, 9538 + ,zeLup,ICRS,15,12,17.0949,-52,05,57.290,-113.94,-71.00,-10.0,28.06,3.410,-51, 8830 + ,thLup,ICRS,16,06,35.5448,-36,48,08.238,-15.84,-31.06,15.2,7.94,4.205,-36,10642 + ,ka-1Lup,ICRS,15,11,56.0757,-48,44,16.147,-96.52,-47.97,-6,17.89,3.849,-48, 9704 + ,ph-1Lup,ICRS,15,21,48.3700,-36,15,40.955,-91.85,-86.03,-29.4,9.99,3.580,-35,10236 + ,ph-2Lup,ICRS,15,23,09.3501,-36,51,30.559,-18.05,-21.53,2.3,5.38,4.520,-36,10103 + ,ta-1Lup,ICRS,14,26,08.2239,-45,13,17.127,-13.51,-14.02,-215.0,3.15,4.546,-44, 9322 + ,chLup,ICRS,15,50,57.5376,-33,37,37.796,-5.92,-24.91,5,15.86,3.957,-33,10754 +# Lynx +Alvashak ,alLyn,ICRS,09,21,03.3013,+34,23,33.223,-222.80,14.78,38.47,14.69,3.16, 35, 1979 +Al Fahd ,alLyn,ICRS,09,21,03.3013,+34,23,33.223,-222.80,14.78,38.47,14.69,3.16, 35, 1979 +Alsciaukat ,31Lyn,ICRS,08,22,50.1096,+43,11,17.270,-25.62,-99.44,24.56,8.39,4.258, 43, 1815 +Mabsuthat ,31Lyn,ICRS,08,22,50.1096,+43,11,17.270,-25.62,-99.44,24.56,8.39,4.258, 43, 1815 +Mabsuthat ,kaLyn,ICRS,08,22,50.1096,+43,11,17.270,-25.62,-99.44,24.56,8.39,4.258, 43, 1815 +Maculosa ,38Lyn,ICRS,09,18,50.6436,+36,48,09.348,-32.61,-123.78,4.0,26.75,3.82, 0, 0 +Maculata ,38Lyn,ICRS,09,18,50.6436,+36,48,09.348,-32.61,-123.78,4.0,26.75,3.82, 0, 0 +# Lyra +Vega ,alLyr,ICRS,18,36,56.3364,+38,47,01.291,201.03,287.47,-13.9,128.93,0.03, 38, 3238 +Sheliak ,beLyr,ICRS,18,50,04.7947,+33,21,45.601,1.10,-4.46,-19.2,3.70,3.52, 33, 3223 +Sulaphat ,gaLyr,ICRS,18,58,56.6227,+32,41,22.407,-2.76,1.77,-21.1,5.14,3.250, 32, 3286 +Sulafat ,gaLyr,ICRS,18,58,56.6227,+32,41,22.407,-2.76,1.77,-21.1,5.14,3.250, 32, 3286 +Aladfar ,etLyr,ICRS,19,13,45.4875,+39,08,45.486,-1.59,-0.61,-8.1,3.13,4.397, 38, 3490 + ,thLyr,ICRS,19,16,22.0951,+38,08,01.431,-0.49,1.23,-27.42,4.24,4.347, 37, 3398 + ,ioLyr,ICRS,19,07,18.1291,+36,06,00.566,-0.64,-4.28,-18,3.92,5.249, 35, 3485 + ,kaLyr,ICRS,18,19,51.7095,+36,03,52.371,-16.14,41.32,-24.15,13.71,4.323, 36, 3094 +Alathfar ,muLyr,ICRS,18,24,13.7857,+39,30,26.059,-21.31,-4.56,-24.0,7.39,5.12, 39, 3410 +# Mensa + ,alMen,ICRS,06,10,14.4735,-74,45,10.963,121.84,-212.80,34.9,98.54,5.09,-74, 374 + ,gaMen,ICRS,05,31,53.0156,-76,20,27.470,143.19,287.74,56.7,32.43,5.17,-76, 333 + ,deMen,ICRS,04,17,59.2737,-80,12,50.518,28.26,61.02,-20,8.00,5.694,-80, 116 + ,etMen,ICRS,04,55,11.2017,-74,56,12.667,27.60,61.88,25.8,4.58,5.474,-75, 290 + ,zeMen,ICRS,06,40,02.8901,-80,48,48.933,-5.08,53.37,7,8.07,5.612,-80, 196 + ,muMen,ICRS,04,43,03.9634,-70,55,51.698,9.30,34.77,-1.0,6.75,5.515,-71, 282 + ,xiMen,ICRS,04,58,50.9645,-82,28,13.845,-5.10,4.12,-5,9.34,5.841,-82, 106 +# Microscopium + ,gaMic,ICRS,21,01,17.4602,-32,15,27.962,-2.09,-0.19,17.6,14.59,4.677,-32,16353 + ,epMic,ICRS,21,17,56.2848,-32,10,21.141,55.46,-22.12,-1,19.76,4.721,-32,16498 + ,zeMic,ICRS,21,02,57.9539,-38,37,53.210,-27.86,-108.81,4.6,28.32,5.330,-39,14089 + ,th-1Mic,ICRS,21,20,45.6423,-40,48,34.076,76.18,17.66,2.3,17.49,4.809,-41,14475 + ,ioMic,ICRS,20,48,29.1421,-43,59,18.758,175.78,-112.17,-14.9,24.35,5.13,-44,14145 +# Monoceros + ,alMon,ICRS,07,41,14.8324,-09,33,04.071,-74.80,-19.64,10.5,22.61,3.93,-09, 2172 + ,deMon,ICRS,07,11,51.8603,-00,29,33.952,-0.22,6.68,15,8.70,4.15,-00, 1636 + ,epMon,ICRS,06,23,46.0855,04,35,34.314,-20.88,10.75,14.6,25.39, 4.414, 04, 1236 +# Musca + ,alMus,ICRS,12,37,11.0184,-69,08,08.030,-39.87,-12.44,13,10.67,2.677,-68, 1702 + ,gaMus,ICRS,12,32,28.0147,-72,07,58.758,-50.59,-5.16,2.5,10.07,3.830,-71, 1336 + ,deMus,ICRS,13,02,16.2633,-71,32,55.879,263.57,-23.27,36.5,35.91,3.62,-70, 1548 + ,etMus,ICRS,13,15,14.9405,-67,53,40.521,-36.92,-10.63,-8,8.04,4.774,-67, 2224 + ,laMus,ICRS,11,45,36.4191,-66,43,43.546,-100.42,33.21,16.3,25.42,3.634,-66, 1640 +# Norma + ,ga-2Nor,ICRS,16,19,50.4225,-50,09,19.828,-159.36,-52.84,-28.9,25.58,4.017,-49,10536 + ,deNor,ICRS,16,06,29.4381,-45,10,23.467,17.47,37.03,-15.5,26.41,4.726,-44,10625 + ,kaNor,ICRS,16,13,28.7289,-54,37,49.683,-5.33,-22.48,-13.5,7.45,4.957,-54, 7245 +# Octans + ,alOct,ICRS,21,04,43.0645,-77,01,25.562,13.83,-369.37,45.0,22.07,5.15,-77, 1474 + ,beOct,ICRS,22,46,03.5079,-81,22,53.815,-55.35,0.88,23.9,23.23,4.141,-82, 889 + ,etOct,ICRS,10,59,13.7676,-84,35,38.015,-64.13,-8.02,-2.6,9.17,6.195,-83, 386 + ,epOct,ICRS,22,20,01.6781,-80,26,23.089,56.36,-42.78,11.7,12.15,5.183,-81, 995 + ,thOct,ICRS,00,01,35.7037,-77,03,56.608,-56.52,-176.95,23.7,14.77,4.793,-77, 1596 + ,zeOct,ICRS,08,56,40.9863,-85,39,47.348,-116.27,33.75,-3.6,20.73,5.430,-85, 183 + ,ioOct,ICRS,12,54,58.8107,-85,07,24.127,67.47,22.11,53.4,8.79,5.469,-84, 407 + ,kaOct,ICRS,13,40,55.4795,-85,47,09.756,-87.65,-21.03,-9,12.71,5.563,-85, 384 + ,nuOct,ICRS,21,41,28.6463,-77,23,24.167,64.83,-240.37,34.4,47.22,3.76,-77, 1510 + ,rhOct,ICRS,15,43,16.9294,-84,27,54.983,137.00,96.75,-11,15.02,5.575,-84, 510 +Polaris Australis,siOct,ICRS,21,08,46.8457,-88,57,23.396,25.96,5.02,11.9,12.07,5.42,-89, 47 + ,taOct,ICRS,23,28,03.7830,-87,28,55.970,16.29,11.48,31.0,6.24,5.49,-88, 204 + ,upOct,ICRS,22,31,37.5157,-85,58,02.111,-37.64,61.25,19.0,9.88,5.766,-86, 406 + ,chOct,ICRS,18,54,47.1361,-87,36,21.037,-36.69,-135.22,33.6,13.06,5.288,-87, 274 +# Ophiuchus +Rasalhague ,alOph,ICRS,17,34,56.06945,+12,33,36.1346,108.07,-221.57,12.6,69.84,2.10, 12, 3252 +Celbalrai ,beOph,ICRS,17,43,28.3531,+04,34,02.290,-40.67,158.80,-12.53,39.78,2.750, 04, 3489 +Kelb Alrai ,beOph,ICRS,17,43,28.3531,+04,34,02.290,-40.67,158.80,-12.53,39.78,2.750, 04, 3489 +Al Durajah ,gaOph,ICRS,17,47,53.55973,+02,42,26.2000,-24.64,-74.42,-5.0,34.42,3.75, 02, 3403 +Yed Prior ,deOph,ICRS,16,14,20.7395,-03,41,39.563,-45.83,-142.91,-19.9,19.16,2.74,-03, 3903 +Yed Posterior,epOph,ICRS,16,18,19.2890,-04,41,33.038,82.39,40.08,-10.3,30.34,3.240,-04, 4086 +Han ,zeOph,ICRS,16,37,09.5378,-10,34,01.524,13.07,25.44,-15,7.12,2.578,-10, 4350 +Sabik ,etOph,ICRS,17,10,22.6873,-15,43,29.677,41.16,97.65,-0.9,38.77,2.43,-15, 4467 +Imad ,thOph,ICRS,17,22,00.5784,-24,59,58.364,-8.84,-23.64,-2,5.79,3.248,-24,13292 + ,ioOph,ICRS,16,54,00.4715,+10,09,55.293,-53.75,-34.68,-21,13.95,4.38, 10, 3092 +Helkath ,kaOph,ICRS,16,57,40.0973,+09,22,30.118,-293.04,-9.70,-55.86,37.99,3.20, 09, 3298 +Marfik ,laOph,ICRS,16,30,54.8229,+01,59,02.123,-31.37,-73.00,-13.5,19.63,3.90, 3118 +Sinistra ,nuOph,ICRS,17,59,01.592,-09,46,25.05,-10.31,-116.12,12.6,21.35,3.309,-09, 4632 + ,xiOph,ICRS,17,21,00.3741,-21,06,46.557,262.01,-204.74,-9.0,57.48,4.39,0, 0 + ,siOph,ICRS,17,26,30.8803,+04,08,25.295,1.25,7.09,-27.81,2.78,4.336, 04, 3422 +#Barnard's star,V799 Oph,ICRS,17,38,27.60,+04,39,42.2,,,,,,+04, 3561a +Barnard's star,V2500 Oph,ICRS,17,57,48.96543,+04,40,05.8361,-798.58,10328.12,-106.8,548.31,9.511,0, 0 + ,44Oph,ICRS,17,26,22.2161,-24,10,31.114,-1.97,-117.69,-37.2,38.96,4.166, 0, 0 + ,45Oph,ICRS,17,27,21.274,-29,52,01.25,14.38,-137.41,37.3,29.26,4.286, 0, 0 +# Orion +Betelgeuse ,alOri,ICRS,05,55,10.3053,+07,24,25.426,27.33,10.86,21.91,7.63,0.42, 07, 1055 +Beteigeuse ,alOri,ICRS,05,55,10.3053,+07,24,25.426,27.33,10.86,21.91,7.63,0.42, 07, 1055 +Rigel ,beOri,ICRS,05,14,32.2723,-08,12,05.906,1.87,-0.56,20.7,4.22,0.12,-08, 1063 +Bellatrix ,gaOri,ICRS,05,25,07.8631,+06,20,58.928,-8.75,-13.28,18.2,13.42,1.64, 06, 919 +Mintaka ,deOri,ICRS,05,32, 0.4007,-00,17,56.731,1.67,-0.56,16.0,3.56,2.23,-00, 983 +Alnilam ,epOri,ICRS,05,36,12.8135,-01,12,06.911,1.49,-1.06,25.90,2.43,1.70,-01, 969 +Alnitak ,zeOri,ICRS,05,40,45.5271,-01,56,33.260,3.99,2.54,,3.99,1.79,-02, 1338 +Trapezium ,th-1COri,ICRS,05,35,16.463,-05,23,23.18,-0.92,-0.13,28.0,-1.85, 5.13,0, 0 +Hatsya ,ioOri,ICRS,05,35,25.9825,-05,54,35.645,2.27,-0.62,21.5,2.46,2.77,-06, 1241 +Nair al Saif ,ioOri,ICRS,05,35,25.9825,-05,54,35.645,2.27,-0.62,21.5,2.46,2.77,-06, 1241 +Saiph ,kaOri,ICRS,05,47,45.3889,-09,40,10.577,1.55,-1.20,20.5,4.52,2.049,-09, 1235 +Heka ,laOri,ICRS,05,35,08.2771,+09,56,02.970,-1.03,-1.86,,3.09,3.39, 09, 879 +Meissa ,laOri,ICRS,05,35,08.2771,+09,56,02.970,-1.03,-1.86,,3.09,3.39, 09, 879 + ,muOri,ICRS,06,02,22.9988,+09,38,50.196,14.19,-37.44,45,21.49,4.130, 14, 1152 + ,nuOri,ICRS,06,07,34.3249,+14,46,06.498,4.95,-21.18,24.1,6.10,4.403, 0, 0 + ,xiOri,ICRS,06,11,56.3958,+14,12,31.554,-1.59,-20.23,24,5.14,4.442, 0, 0 + ,omi-1Ori,ICRS,04,52,31.9621,+14,15,02.311,-2.62,-56.13,-8.40,6.02,4.752, 14, 777 + ,pi-1Ori,ICRS,04,54,53.7279,+10,09,02.999,40.08,-128.37,13,27.04,4.656, 0, 0 + ,pi-2Ori,ICRS,04,50,36.7217,+08,54,00.633,-0.87,-31.57,24,16.84,4.353, 0, 0 +Tabit ,pi-3Ori,ICRS,04,49,50.4106,+06,57,40.592,463.42,11.62,24.1,124.60,3.190, 06, 762 +Tabit ,pi-4Ori,ICRS,04,51,12.3639,+05,36,18.374,-3.62,1.03,23.3,2.59,3.680, 05, 745 + ,pi-5Ori,ICRS,04,54,15.0965,+02,26,26.419,1.43,0.23,23.4,2.43,3.72, 02, 810 + ,pi-6Ori,ICRS,04,58,32.9019,+01,42,50.457,-1.59,-7.93,15.36,3.42,4.474, 0, 0 + ,taOri,ICRS,05,17,36.3899,-06,50,39.874,-15.31,-9.57,20.1,5.88,3.59,-07, 1028 +Thabit ,upOri,ICRS,05,31,55.8600,-07,18,05.533,-0.54,-4.44,17.4,2.11,4.62,-07, 1106 + ,ph-1Ori,ICRS,05,34,49.2371,+09,29,22.485,-1.24,-2.49,33.2,3.31,4.398, 09, 877 + ,ch-2Ori,ICRS,06,03,55.1849,+20,08,18.427,2.19,-2.81,16.8,0.10,4.646, 0, 0 + ,71Ori,ICRS,06,14,50.8767,+19,09,23.213,-95.78,-181.58,35.7,47.33,5.20, 0, 0 +# Pavo +Peacock ,alPav,ICRS,20,25,38.8578,-56,44,06.324,7.71,-86.15,2.0,17.80,1.910,-57, 9674 + ,bePav,ICRS,20,44,57.4944,-66,12,11.565,-42.40,10.57,9.8,23.71,3.426,-66, 3501 + ,gaPav,ICRS,21,26,26.6056,-65,21,58.314,81.08,800.73,-30.2,108.50,4.22,-65, 3918 + ,dePav,ICRS,20,08,43.6084,-66,10,55.446,1210.50,-1130.27,-21.7,163.74,3.56,-66, 3474 + ,epPav,ICRS,20,00,35.5532,-72,54,37.813,80.54,-131.34,-1.5,30.73,3.950,-73, 2086 + ,zePav,ICRS,18,43,02.1361,-71,25,41.208,1.25,-158.29,-16.3,15.55,4.012,-71, 2353 + ,etPav,ICRS,17,45,43.9873,-64,43,25.937,-11.08,-56.37,-7.6,8.79,3.597,-64, 3662 + ,laPav,ICRS,18,52,13.0349,-62,11,15.337,-1.33,-13.53,9,1.80,4.207,-62, 5983 + ,xiPav,ICRS,18,23,13.6212,-61,29,38.043,0.53,1.70,12.2,7.76,4.379,-61, 6140 + ,omiPav,ICRS,21,13,20.5095,-70,07,34.560,41.42,-20.34,-19,3.67,5.092,-70, 2835 +# Phoenix +Ankaa ,alPhe,ICRS,00,26,17.0509,-42,18,21.533,232.75,-353.62,74.6,42.14,2.37,-42, 116 +# cannot match this star with Simbad, why? +# ,gaPhe,ICRS,01,28,21.9271,-43,19,05.642,-0.1214,-20.771,25.8,0.01394, 3.41,-43, 449 + ,dePhe,ICRS,01,31,15.1046,-49,04,21.728,138.22,154.20,-7.3,22.15,3.949,-49, 425 + ,epPhe,ICRS,00,09,24.6420,-45,44,50.734,122.15,-180.13,-9.2,23.28,3.88,-46, 18 + ,etPhe,ICRS,00,43,21.2385,-57,27,47.016,-5.16,15.50,2,13.57,4.365,-58, 42 + ,ioPhe,ICRS,23,35,04.5640,-42,36,54.269,42.18,10.78,19.4,11.92,4.711,-43,15420 + ,la-1Phe,ICRS,00,31,24.9807,-48,48,12.652,140.74,19.47,-2,18.97,4.77,-49, 115 + ,muPhe,ICRS,00,41,19.5517,-46,05,06.025,-28.92,1.04,18.8,13.19,4.606,-46, 180 + ,piPhe,ICRS,23,58,55.7793,-52,44,44.905,57.93,61.46,-14.1,12.70,5.139,-53,10561 + ,upPhe,ICRS,01,07,47.8533,-41,29,12.898,36.00,7.85,14,16.48,5.214,-42, 391 + ,phPhe,ICRS,01,54,22.0331,-42,29,49.020,-34.32,-28.34,12.0,10.55,5.112,-43, 583 + ,psPhe,ICRS,01,53,38.7417,-46,18,09.607,-92.38,-91.46,1.5,10.15,4.443,-46, 552 +# cannot match this star with Simbad. why? + ,omePhe,ICRS,01,02, 1.8208,-57,00, 8.601, 0.0442667, 1.653, 13.0,0.00886, 6.109,-57, 220 +# Pegasus +Markab ,alPeg,ICRS,23,04,45.6538,+15,12,18.952,61.10,-42.56,-3.5,23.36,2.49, 14, 4926 +Scheat ,bePeg,ICRS,23,03,46.4575,+28,04,58.041,187.76,137.61,8.01,16.37,2.42, 27, 4480 +Algenib ,gaPeg,ICRS,00,13,14.1528,+15,11,00.945,4.70,-8.24,4.1,9.79,2.83, 14, 14 +Enif ,epPeg,ICRS,21,44,11.1581,+09,52,30.041,30.02,1.38,3.39,4.85,2.404, 09, 4891 +Homam ,zePeg,ICRS,22,41,27.7208,+10,49,52.912,77.38,-10.98,7,15.64,3.40, 10, 4797 +Matar ,etPeg,ICRS,22,43,00.1374,+30,13,16.483,13.11,-26.11,4.3,15.18,2.948, 29, 4741 +Biham ,thPeg,ICRS,22,10,11.9852,+06,11,52.314,281.96,31.23,-6,33.77,3.50, 05, 4961 +Baham ,thPeg,ICRS,22,10,11.9852,+06,11,52.314,281.96,31.23,-6,33.77,3.50, 05, 4961 + ,ioPeg,ICRS,22,07,00.6661,+25,20,42.402,296.73,26.93,-4.3,85.06,3.770, 24, 4533 +Jih ,kaPeg,ICRS,21,44,38.7344,+25,38,42.128,46.66,13.47,-8.1,28.34,4.159, 0, 0 +Sadalbari ,laPeg,ICRS,22,46,31.8787,+23,33,56.354,56.99,-10.46,-3.9,8.26,3.961, 22, 4709 + ,muPeg,ICRS,22,50,00.1928,+24,36,05.685,144.11,-43.44,13.54,27.95,3.513, 23, 4615 + ,pi-1Peg,ICRS,22,09,59.2441,+33,10,41.606,-12.34,-17.94,2.0,12.96,4.292, 32, 4349 + ,pi-2Peg,ICRS,22,09,59.2441,+33,10,41.606,-12.34,-17.94,2.0,12.96,4.292, 32, 4352 +Kerb ,taPeg,ICRS,23,20,38.2426,+23,44,25.213,30.48,-9.14,16.0,19.50,4.592, 22, 4810 +Salm ,taPeg,ICRS,23,20,38.2426,+23,44,25.213,30.48,-9.14,16.0,19.50,4.592, 22, 4810 + ,upPeg,ICRS,23,25,22.7841,+23,24,14.764,193.12,36.47,-11.1,18.83,4.40, 22, 4833 + ,phPeg,ICRS,23,52,29.2882,+19,07,13.033,-6.42,-34.22,-7.75,7.46,5.096, 18, 5231 + ,chPeg,ICRS,00,14,36.1645,+20,12,24.126,90.66,1.88,-46.67,10.01,4.800, 19, 27 + ,psPeg,ICRS,23,57,45.5264,+25,08,29.044,-36.06,-32.25,-6.59,7.54,4.671, 24, 4865 +# Perseus +Mirfak ,alPer,ICRS,03,24,19.3703,+49,51,40.247,24.11,-26.01,-2.4,5.51,1.816, 49, 917 +Mirphak ,alPer,ICRS,03,24,19.3703,+49,51,40.247,24.11,-26.01,-2.4,5.51,1.816, 49, 917 +Algol ,bePer,ICRS,03,08,10.1315,+40,57,20.332,2.39,-1.44,4.0,35.14,2.12, 40, 673 + ,gaPer,ICRS,03,04,47.7907,+53,30,23.184,0.50,-4.19,2.5,12.72,2.947, 52, 654 + ,dePer,ICRS,03,42,55.5028,+47,47,15.185,23.83,-41.93,4,6.18,2.99, 47, 876 + ,epPer,ICRS,03,57,51.2307,+40,00,36.773,12.61,-24.06,,6.06,2.901, 39, 895 +Atik ,zePer,ICRS,03,54,07.9215,+31,53,01.088,4.41,-9.15,,3.32,2.883, 31, 666 +Miram ,etPer,ICRS,02,50,41.8101,+55,53,43.786,16.64,-13.76,-1.07,2.45,3.774, 55, 714 + ,thPer,ICRS,02,44,11.9863,+49,13,42.412,334.02,-89.96,25.0,89.03,4.12, 48, 746 + ,ioPer,ICRS,03,09,04.0197,+49,36,47.799,1262.18,-91.60,50.0,94.93,4.05, 49, 857 +Misam ,kaPer,ICRS,03,09,29.7715,+44,51,27.157,173.01,-142.05,29.2,29.05,3.80, 44, 631 + ,laPer,ICRS,04,06,35.0434,+50,21,04.543,-13.03,-36.37,6.1,9.41,4.29, 49, 1101 + ,muPer,ICRS,04,14,53.8621,+48,24,33.591,5.04,-17.35,,4.51,4.18, 48, 1063 + ,nuPer,ICRS,03,45,11.6319,+42,34,42.775,-14.59,1.75,-12.7,5.86,3.781, 42, 815 +Menkib ,xiPer,ICRS,03,58,57.9011,+35,47,27.717,1.92,2.30,70.1,1.84,4.060, 35, 775 +Atiks ,omiPer,ICRS,03,44,19.1320,+32,17,17.693,8.11,-10.32,18.5,2.21,3.855, 31, 642 +Gorgona Secunda,piPer,ICRS,02,58,45.6701,+39,39,45.823,25.88,-40.67,14.2,10.02,4.685, 39, 681 +Gorgona Tertia ,rhPer,ICRS,03,05,10.5934,+38,50,24.986,128.69,-106.61,29.10,10.03,3.42, 38, 630 + ,siPer,ICRS,03,30,34.4835,+47,59,42.778,1.56,18.13,14.36,9.23,4.354, 47, 843 + ,taPer,ICRS,02,54,15.4605,+52,45,44.924,-1.99,-4.53,2.2,13.15,3.944, 52, 641 + ,phPer,ICRS,01,43,39.6375,+50,41,19.437,24.08,-13.59,0.8,4.55,4.09, 49, 444 +Gorgona Quatra,omePer,ICRS,03,11,17.3816,+39,36,41.697,-0.41,-1.03,-39.82,10.69,3.7, 39, 724 +Capulus ,NGC869,ICRS,2,19,6.0,57,9,0.0,-0.41,-1.03,-39.82,0.0,3.7,0, 0 # NGC 869 , from Starlight / Sarah Ashton +Capulus ,M34,ICRS,2,42,6.0,42,46,0.0,0.03,-7.43,0.0,0.0, 5.2,0, 0 # NGC 1039 + ,16Per,ICRS,02,50,35.0597,+38,19,07.117,195.68,-108.92,14.0,25.54,4.20,0, 0 +# Pictor + ,alPic,ICRS,06,48,11.4523,-61,56,29.010,-68.39,242.03,20.6,32.96,3.30,-61, 720 + ,gaPic,ICRS,05,49,49.6623,-56,09,59.987,81.61,-71.77,15.7,18.78,4.504,-56, 946 + ,dePic,ICRS,06,10,17.9089,-54,58,07.121,-4.11,6.53,30.6,1.97,4.81,-54, 980 + ,zePic,ICRS,05,19,22.1349,-50,36,21.483,23.00,227.38,45.1,27.70,5.45,-50, 1723 + ,et-2Pic,ICRS,05,04,58.0144,-49,34,40.215,68.74,-3.03,36.0,6.88,5.055,-49, 1562 +# Piscis Austrinus +Fomalhaut ,alPsA,ICRS,22,57,39.0465,-29,37,20.050,329.22,-164.21,6.5,130.08,1.16,-30,19370 +Tien Kang ,bePsA,ICRS,22,31,30.3307,-32,20,45.864,59.64,-18.70,6.3,21.99,4.289,-32,17126 +Aboras ,dePsA,ICRS,22,55,56.8995,-32,32,22.662,10.84,30.32,-11.6,19.14,4.226,0,0 + ,epPsA,ICRS,22,40,39.3400,-27,02,37.021,22.01,-0.88,3,4.38,4.180,-27,16010 + ,ioPsA,ICRS,21,44,56.8099,-33,01,32.814,31.79,-94.00,1.9,15.93,4.335,-33,15734 + ,laPsA,ICRS,22,14,18.7514,-27,46,00.867,22.88,1.90,-5.8,6.42,5.43,-28,17653 + ,muPsA,ICRS,22,08,23.0089,-32,59,18.486,80.05,-28.88,11.6,25.01,4.497,-33,15922 + ,piPsA,ICRS,23,03,29.8161,-34,44,57.883,74.80,84.45,-14,34.98,5.135,-35,15630 +# Pisces +Alrischa ,alPsc,ICRS,02,02,02.8201,+02,45,49.534,33.29,-0.42,,23.45,3.82, 02, 317 +Al Rescha ,alPsc,ICRS,02,02,02.8201,+02,45,49.534,33.29,-0.42,,23.45,3.82, 02, 317 +Fum Alsamakah,bePsc,ICRS,23,03,52.6140,+03,49,12.163,12.86,-10.13,0.3,6.62,4.486, 03, 4818 +Samakah ,bePsc,ICRS,23,03,52.6140,+03,49,12.163,12.86,-10.13,0.3,6.62,4.486, 03, 4818 +Simmah ,gaPsc,ICRS,23,17,09.9379,+03,16,56.240,760.35,17.96,-13.6,24.92,3.69, 02, 4648 +Linteum ,dePsc,ICRS,00,48,40.9443,+07,35,06.285,83.14,-50.48,32.40,10.69,4.439, 06, 107 +Kaht ,epPsc,ICRS,01,02,56.6084,+07,53,24.488,-80.57,25.88,7.47,17.14,4.28, 07, 153 + ,zePsc,ICRS,01,13,43.8857, 07,34,31.274,141.66,-55.62,0.0,22.09, 5.204, 06, 174 +Al Pherg ,etPsc,ICRS,01,31,29.0094,+15,20,44.963,25.73,-3.29,14.8,11.09,3.620, 14, 231 + ,thPsc,ICRS,23,27,58.0951,+06,22,44.372,-123.83,-43.26,6.05,20.54,4.280, 05, 5173 + ,ioPsc,ICRS,23,39,57.0409,+05,37,34.650,376.32,-437.00,5.0,72.51,4.120, 04, 5035 + ,kaPsc,ICRS,23,26,55.9553,+01,15,20.189,85.60,-94.43,-3.2,20.12,4.927, 00, 4998 + ,laPsc,ICRS,23,42,02.8062,+01,46,48.147,-129.55,-154.87,12.4,32.38,4.50, 00, 5037 + ,nuPsc,ICRS,01,41,25.8943,+05,29,15.408,-22.73,3.61,0.76,8.86,4.448, 04, 293 + ,xiPsc,ICRS,01,53,33.3504,+03,11,15.132,23.69,23.90,30.3,17.11,4.621, 02, 290 +Torcularis Septentrionalis,omiPsc,ICRS,01,45,23.6305,+09,09,27.849,70.82,38.99,15.52,12.63,4.272, 08, 273 + ,piPsc,ICRS,01,37,05.9167,+12,08,29.525,-74.90,9.96,-1,29.58,5.551, 11, 205 +Anunitum ,taPsc,ICRS,01,11,39.6368,+30,05,22.698,74.29,-37.61,29.8,20.11,4.523, 29, 190 + ,upPsc,ICRS,01,19,27.9951,+27,15,50.611,26.21,-11.62,8.0,10.49,4.752, 26, 220 + ,phPsc,ICRS,01,13,44.9471,+24,35,01.367,18.58,-21.26,5.9,8.64,4.676, 0, 0 + ,chPsc,ICRS,01,11,27.2202,+21,02,04.740,41.66,-10.55,15.04,7.42,4.666, 20, 172 +Vernalis ,omePsc,ICRS,23,59,18.6896,+06,51,47.956,148.49,-112.16,1.9,30.78,4.036, 06, 5227 + ,7Psc,ICRS,23,20,20.5831,+05,22,52.706,78.53,-59.35,40.34,9.56,5.077, 0, 0 + ,19Psc,ICRS,23,46,23.5165,+03,29,12.519,-35.00,-25.00,-11.0,4.29,5.04, 0, 0 +# Puppis +Naos ,zePup,ICRS,08,03,35.0467,-40,00,11.332,-30.82,16.77,-24.00,2.33,2.210,-39, 3939 +Suhail Hadar ,zePup,ICRS,08,03,35.0467,-40,00,11.332,-30.82,16.77,-24.00,2.33,2.210,-39, 3939 +Kaimana ,nuPup,ICRS,06,37,45.6713,-43,11,45.361,-0.43,-3.99,28.2,7.71,3.171,-43, 2576 +Azmidiske ,xiPup,ICRS,07,49,17.6552,-24,51,35.229,-5.56,-0.71,2.7,2.42,3.337,-24, 6030 +Ahadi ,piPup,ICRS,07,17,08.5564,-37,05,50.892,-10.57,7.00,15.8,2.98,2.729,-36, 3489 +Turais ,rhPup,ICRS,08,07,32.6489,-24,18,15.567,-83.29,46.38,46.1,51.99,2.81,-23, 6828 + ,siPup,ICRS,07,29,13.8303,-43,18,05.157,-59.86,188.72,87.7,17.74,3.25,-43, 3260 +Al Rihla ,taPup,ICRS,06,49,56.1683,-50,36,52.415,34.23,-65.85,36.4,17.85,2.93,-50, 2415 +Rehla ,taPup,ICRS,06,49,56.1683,-50,36,52.415,34.23,-65.85,36.4,17.85,2.93,-50, 2415 +Anazitisi ,taPup,ICRS,06,49,56.1683,-50,36,52.415,34.23,-65.85,36.4,17.85,2.93,-50, 2415 +# Pyxis + ,alPyx,ICRS,08,43,35.5375,-33,11,10.988,-14.28,10.60,15.3,3.86,3.675,-32, 5651 + ,gaPyx,ICRS,08,50,31.9233,-27,42,35.440,-133.49,88.16,24.5,15.63,4.026,-27, 5986 + ,epPyx,ICRS,09,09,56.4101,-30,21,55.444,-2.15,-48.86,-8,15.35,5.602,-29, 7194 + ,thPyx,ICRS,09,21,29.5909,-25,57,55.580,-12.28,-9.20,20.0,6.25,4.728,-25, 7114 +# Reticulum + ,alRet,ICRS,04,14,25.4837,-62,28,25.889,41.64,49.72,35.5,19.98,3.343,-62, 332 + ,beRet,ICRS,03,44,11.9775,-64,48,24.850,308.38,78.73,50.8,32.71,3.85,-65, 263 + ,deRet,ICRS,03,58,44.7494,-61,24,00.668,9.79,-14.39,-1.4,6.15,4.572,-61, 290 + ,ze-1Ret,ICRS,03,17,46.1635,-62,34,31.159,1337.73,648.84,12.2,82.51,5.54,-63, 217 + ,etRet,ICRS,04,21,53.3267,-63,23,11.009,85.20,174.37,45.0,8.58,5.24,-63, 324 + ,kaRet,ICRS,03,29,22.6776,-62,56,15.099,383.03,373.12,12.0,46.65,4.71,-63, 234 + ,piScl,ICRS,01,42,08.5940,-32,19,37.093,-74.79,-46.35,10.4,15.02,5.263,-32, 666 +# Sculptor + ,alScl,ICRS,00,58,36.3609,-29,21,26.817,22.44,6.30,10.2,4.85,4.297,-30, 297 + ,beScl,ICRS,23,32,58.2593,-37,49,05.763,96.39,37.58,1.7,18.28,4.370,-38,15527 + ,gaScl,ICRS,23,18,49.4404,-32,31,55.296,19.65,-78.57,15.6,18.24,4.415,-33,16476 + ,deScl,ICRS,23,48,55.5461,-28,07,48.964,100.03,-104.04,14,22.73,4.577,-28,18353 + ,epScl,ICRS,01,45,38.7571,-25,03,09.396,159.48,-72.38,14.5,36.46,5.31,-25, 704 + ,thScl,ICRS,00,11,44.0086,-35,07,59.230,169.01,113.75,-1.7,45.85,5.249,-35, 42 + ,ka-2Scl,ICRS,00,11,34.4201,-27,47,59.052,4.61,17.09,-5.7,5.61,5.417,-28, 26 + ,la-2Scl,ICRS,00,44,12.0993,-38,25,18.068,247.02,120.68,26.5,8.76,5.96,-39, 181 + ,muScl,ICRS,23,40,38.1492,-32,04,23.249,-91.41,-53.47,14.1,11.22,5.312,-32,17621 + ,siScl,ICRS,01,02,26.4332,-31,33,07.218,81.00,15.25,-8,14.39,5.509,-32, 410 +# Scorpius +Antares ,alSco,ICRS,16,29,24.4609,-26,25,55.209,-10.16,-23.21,-3.4,5.40,1.09,-26,11359 +Graffias ,be-1Sco,ICRS,16,05,26.5538,-19,48,06.696,-34.59,-7.47,-3.6,2.88,4.89,-19, 4307 +Akrab ,be-1Sco,ICRS,16,05,26.5538,-19,48,06.696,-34.59,-7.47,-3.6,2.88,4.89,-19, 4307 +Acrab ,be-1Sco,ICRS,16,05,26.5538,-19,48,06.696,-34.59,-7.47,-3.6,2.88,4.89,-19, 4307 +Acrab ,be-1Sco,ICRS,16,05,26.5538,-19,48,06.696,-34.59,-7.47,-3.6,2.88,4.89,-19, 4307 + ,be-2Sco,ICRS,16,05,26.5538,-19,48,06.696,-34.59,-7.47,-3.6,2.88,4.89,0, 0 +#Aculeus ,M6,2000,17,40,6.0,-32,15,0.0,-2.38,-0.719,-11.50,0.0, 4.2,0, 0 # NGC 6405, from Starlight +Aculeus ,M6,ICRS,17,40,18.0,-32,12,0.0,-2.38,-07.19,-11.50,0.0, 4.2,0, 0 # NGC 6405 +#Acumen ,M7,2000,17,53,54.0,-34,49,0.0,2.58,-4.54,-14.21,0.0, 3.3,0, 0 # NGC 6475, from Starlight +Acumen ,M7,ICRS,17,53,48.0,-34,47,0.0,2.58,-4.54,-14.21,0.0, 3.3,0, 0 # NGC 6475 +Dschubba ,deSco,ICRS,16,00,20.0063,-22,37,18.156,-8.67,-36.90,-7,8.12,2.291,-22, 4068 +Wei ,epSco,ICRS,16,50,09.8130,-34,17,35.634,-611.84,-255.86,-2.5,49.85,2.29,-34,11285 + ,ze-2Sco,ICRS,16,54,35.0053,-42,21,40.726,-126.55,-227.77,-18.7,21.67,3.62,0, 0 + ,etSco,ICRS,17,12,09.1935,-43,14,21.080,22.01,-287.42,-27.0,45.56,3.33,-43,11485 +Sargas ,thSco,ICRS,17,37,19.1306,-42,59,52.166,6.06,-0.95,1.4,11.99,1.862,-42,12312 + ,io-1Sco,ICRS,17,47,35.0815,-40,07,37.191,0.44,-6.40,-27.6,1.82,3.020,-40,11838 +Girtab ,kaSco,ICRS,17,42,29.2749,-39,01,47.939,-6.49,-25.55,-14.0,7.03,2.375,-38,12137 +Shaula ,laSco,ICRS,17,33,36.520,-37,06,13.76,-8.90,-29.95,-3,4.64,1.62,-37,11673 + ,mu-1Sco,ICRS,16,51,52.2323,-38,02,50.567,-8.84,-21.60,-25,3.97,2.98,-37,11033 +Jabbah ,nuSco,ICRS,16,11,59.7345,-19,27,38.550, -9.70,-25.25,2.4,7.47, 4.00,-19, 4333 +Grafias ,xiSco,ICRS,16,04,22.191,-11,22,22.60,-63.2,-27.0,-36.33,,4.17,-10, 4237 + ,piSco,ICRS,15,58,51.1129,-26,06,50.779,-12.00,-25.71,-3,7.10,2.89,-25,11228 + ,rhSco,ICRS,15,56,53.0765,-29,12,50.664,-15.20,-25.10,-0.4,7.97,3.864,0,0 +Alniyat ,siSco,ICRS,16,21,11.3161,-25,35,34.067,-10.03,-18.03,-0.4,4.44,2.912,-25,11485 + ,taSco,ICRS,16,35,52.9537,-28,12,57.658,-8.59,-22.50,2.0,7.59,2.814,-27,11015 +Lesath ,upSco,ICRS,17,30,45.83712,-37,17,44.9285,-2.37,-30.09,8.0,6.29,2.70,-37,11638 +Jabhat al Akrab,ome-1Sco,ICRS,16,06,48.4259,-20,40,09.093,-10.55,-23.73,-3.1,7.70,3.946,-20, 4405 +Jabhat al Akrab,ome-2Sco,ICRS,16,07,24.3274,-20,52,07.551,43.68,-45.30,-5.4,12.32,4.328,-20, 4408 +# Scutum + ,alSct,ICRS,18,35,12.4267,-08,14,38.662,-18.98,-314.63,35.8,18.72,3.85,-08, 4638 + ,beSct,ICRS,18,47,10.4728,-04,44,52.322,-7.71,-15.89,-21.5,4.73,4.231,-04, 4582 + ,gaSct,ICRS,18,29,11.8538,-14,33,56.928,3.07,-3.48,-41,11.19,4.686,-14, 5071 + ,deSct,ICRS,18,42,16.4268,-09,03,09.175,7.87,2.02,-44.8,17.44,4.71,-09, 4796 + ,epSct,ICRS,18,43,31.2527,-08,16,30.773,21.29,11.58,-11.2,6.24,4.900,-08, 4686 + ,zeSct,ICRS,18,23,39.5845,-08,56,03.780,51.89,52.29,-5.6,17.08,4.673,0, 0 +# Serpens +Unukalhai ,alSer,ICRS,15,44,16.0749,+06,25,32.257,134.66,44.14,2.63,44.54,2.630, 06, 3088 +Cor Serpentis,alSer,ICRS,15,44,16.0749,+06,25,32.257,134.66,44.14,2.63,44.54,2.630, 06, 3088 +Chow ,beSer,ICRS,15,46,11.2564,+15,25,18.572,68.54,-41.31,-0.8,21.31,3.660, 15, 2911 +Zhou ,beSer,ICRS,15,46,11.2564,+15,25,18.572,68.54,-41.31,-0.8,21.31,3.660, 15, 2911 +Ainalhai ,gaSer,ICRS,15,56,27.1828,+15,39,41.821,311.19,-1282.16,6.7,89.92,3.85, 16, 2849 +Qin ,deSer,ICRS,15,34,48.1471,+10,32,19.921,-72.63,3.17,,15.54,3.79, 0,0 +Chin ,deSer,ICRS,15,34,48.1471,+10,32,19.921,-72.63,3.17,,15.54,3.79, 0,0 +Nulla Pambu ,epSer,ICRS,15,50,48.9661,+04,28,39.829,127.98,61.87,-9.3,46.39,3.713, 04, 3069 +Tang ,etSer,ICRS,18,21,18.6007,-02,53,55.770,-547.57,-700.71,8.9,52.81,3.26,-02, 4599 +Alya ,th-1Ser,ICRS,18,56,13.1824,+04,12,12.942,37.69,26.98,-46.0,24.73,4.62, 04, 3916 + ,kaSer,ICRS,15,48,44.3768,+18,08,29.629,-51.78,-88.72,-38.58,9.36,4.109, 18, 3074 +Leiolepis ,muSer,ICRS,15,49,37.2084,-03,25,48.748,-98.07,-27.41,-9.4,20.94,3.548,-02, 4052 +Leiolepidotus,muSer,ICRS,15,49,37.2084,-03,25,48.748,-98.07,-27.41,-9.4,20.94,3.548,-02, 4052 +Nehushtan ,xiSer,ICRS,17,37,35.2015,-15,23,54.806,-39.30,-61.27,-42.8,30.93,3.539,-15, 4621 + ,siSer,ICRS,16,22,04.3490,+01,01,44.541,-156.02,48.09,-49.8,36.56,4.820, 01, 3215 + ,ta-1Ser,ICRS,15,25,47.3967,+15,25,40.930,-14.02,-7.51,-16.51,3.55,5.167, 15, 2858 +# Sextans + ,deSex,ICRS,10,29,28.7022,-02,44,20.681,-48.78,-12.76,19,10.87,5.180,-02, 3155 + ,epSex,ICRS,10,17,37.8022,-08,04,08.092,-160.25,2.78,15.2,17.86,5.246,-07, 3001 +# Sagitta +Sham ,alSge,ICRS,19,40,05.7918,+18,00,50.006,15.09,-19.72,1.7,6.89,4.392, 17, 4042 + ,beSge,ICRS,19,41,02.9393,+17,28,33.748,9.06,-33.90,-22.4,6.99,4.387, 17, 4048 + ,gaSge,ICRS,19,58,45.4275,+19,29,31.732,64.37,22.58,-34.00,11.90,3.525, 19, 4229 + ,deSge,ICRS,19,47,23.2624,+18,32,03.430,-4.58,11.10,2.5,7.28,3.82, 18, 4240 +# Sagittarius +Rukbat ,alSgr,ICRS,19,23,53.1765,-40,36,57.384,32.67,-120.81,-0.7,19.20,3.950,-40,13245 +Arkab Prior,be-1Sgr,ICRS,19,22,38.2925,-44,27,32.273,7.31,-22.43,-10.7,8.62,3.954,-44,13277 +Arkab Posterior,be-2Sgr,ICRS,19,23,13.1369,-44,47,59.203,92.78,-53.73,19,23.52,4.281,-45,13171 +Alnasl ,ga-2Sgr,ICRS,18,05,48.4869,-30,25,26.729,-55.75,-181.53,22.0,33.94,2.99,-30,15215 +Nash ,ga-2Sgr,ICRS,18,05,48.4869,-30,25,26.729,-55.75,-181.53,22.0,33.94,2.99,-30,15215 +Kaus Medis ,deSgr,ICRS,18,20,59.6417,-29,49,41.172,29.96,-26.38,-19.9,10.67,2.710,-29,14834 +Kaus Meridionalis,deSgr,ICRS,18,20,59.6417,-29,49,41.172,29.96,-26.38,-19.9,10.67,2.710,-29,14834 +Kaus Australis,epSgr,ICRS,18,24,10.3183,-34,23,04.618,-39.61,-124.05,-15,22.55,1.80,-34, 12784 +Ascella ,zeSgr,ICRS,19,02,36.7139,-29,52,48.379,-14.10,3.66,22,36.61,2.607,-30,16575 +Sephdar ,etSgr,ICRS,18,17,37.6351,-36,45,42.070,-129.27,-166.61,0.5,21.87,3.11,-36,12423 +Ira Furoris ,etSgr,ICRS,18,17,37.6351,-36,45,42.070,-129.27,-166.61,0.5,21.87,3.11,-36,12423 + ,th-1Sgr,ICRS,19,59,44.1786,-35,16,34.700,6.02,-25.15,0.9,5.28,4.354,-35,13831 + ,th-2Sgr,ICRS,19,59,51.3571,-35,41,52.077,108.71,-69.13,-17.6,20.81, 5.309,0,0 + ,ioSgr,ICRS,19,55,15.6974,-41,52,05.837,23.37,51.60,35.8,17.24,4.127,-42,14549 + ,ka-1Sgr,ICRS,20,22,27.5053,-42,02,58.374,32.94,-81.98,-11.6,13.35,5.580,-42,14836 +Kaus Borealis,laSgr,ICRS,18,27,58.2405,-25,25,18.120,-44.81,-186.30,-43.2,42.20,2.833,-25,13149 +Polis ,muSgr,ICRS,18,13,45.8098,-21,03,31.801,1.72,-1.39,-6.0,0.11,3.841,-21, 4908 +Ain al Rami,nu-1Sgr,ICRS,18,54,10.1771,-22,44,41.403,2.95,-5.70,-12.1,1.76,4.859,-22, 4907 + ,xi-2Sgr,ICRS,18,57,43.8015,-21,06,23.955,34.91,-12.33,-19.9,8.76,3.530,-21, 5201 +Manubrium ,omiSgr,ICRS,19,04,40.9817,-21,44,29.384,76.26,-58.08,25.2,23.49,3.771,-21, 5237 +Albaldah ,piSgr,ICRS,19,09,45.8331,-21,01,25.013,-1.17,-36.83,-9.8,7.41,2.89,-21, 5275 +Nunki ,siSgr,ICRS,18,55,15.9257,-26,17,48.200,13.87,-52.65,-11.2,14.54,2.058,-26,13595 +Hecatebolus ,taSgr,ICRS,19,06,56.4089,-27,40,13.523,-50.79,-250.50,45.4,27.09,3.32,-27,13564 +Nanto ,phSgr,ICRS,18,45,39.3865,-26,59,26.802,51.15,0.45,21.5,14.14,3.161,-27,13170 + ,upSgr,ICRS,19,21,43.615,-15,57,17.76,1.79,-6.27,8.9,1.95,4.578,-16, 5283 +Terebellium ,omeSgr,ICRS,19,55,50.3577,-26,17,58.223,203.96,74.40,-21.0,42.03,4.70,-26,14637 +Gal. Center,SgrA*,2000,17,45,40.0409,-29,00,28.118,0.000, 0.00, 0.0,0.0000,999.99, 0, 0 +Facies ,M22,ICRS,18,36,24.21,-23,54,12.2,0.0,0.0,-148,0.0, 6.17,0, 0 # NGC 6656 +Spiculum ,M8,ICRS,18,04,30.00,-24,22,0.0,0.91,-3.22,-13.32,0.0,4.6,0, 0 # NGC 6530 + ,52Sgr,ICRS,19,36,42.4332,-24,53,01.043,68.70,-23.19,-19.0,17.24,4.598,0, 0 + ,59Sgr,ICRS,19,56,56.8312,-27,10,11.636,9.60,-14.95,-16.2,2.70,4.544,0, 0 + ,62Sgr,ICRS,20,02,39.4805,-27,42,35.441,32.28,14.35,9.9,7.28,4.508,0, 0 +# Taurus +Aldebaran ,alTau,ICRS,04,35,55.2387,+16,30,33.485,62.78,-189.35,54.26,50.09,0.985, 16, 629 +Elnath ,beTau,ICRS,05,26,17.5134,+28,36,26.820,23.28,-174.22,9.2,24.89,1.68, 28, 795 +El Nath ,beTau,ICRS,05,26,17.5134,+28,36,26.820,23.28,-174.22,9.2,24.89,1.68, 28, 795 +Alnath ,beTau,ICRS,05,26,17.5134,+28,36,26.820,23.28,-174.22,9.2,24.89,1.68, 28, 795 +Prima Hyadum ,gaTau,ICRS,04,19,47.6037,+15,37,39.512,115.29,-23.86,38.7,21.17,3.654, 15, 612 +Hyadum I ,gaTau,ICRS,04,19,47.6037,+15,37,39.512,115.29,-23.86,38.7,21.17,3.654, 15, 612 +Secunda Hyadum,de-1Tau,ICRS,04,22,56.0933,+17,32,33.051,107.75,-28.84,38.8,21.29,3.764, 17, 712 +Hyadum II ,de-1Tau,ICRS,04,22,56.0933,+17,32,33.051,107.75,-28.84,38.8,21.29,3.764, 17, 712 +Ain ,epTau,ICRS,04,28,36.9995,+19,10,49.554,107.23,-36.77,38.15,21.04,3.540, 18, 640 +Al Hecka ,zeTau,ICRS,05,37,38.6858,+21,08,33.177,2.39,-18.04,20,7.82,3.03, 21, 908 +Alcyone ,etTau,ICRS,03,47,29.0765,+24,06,18.494,19.35,-43.11,10.1,8.87,2.873, 23, 541 +Phaeo ,th-1Tau,ICRS,04,28,34.4959,+15,57,43.851,104.76,-15.01,39.8,20.66,3.840, 0, 0 +Phaesula ,th-2Tau,ICRS,04,28,39.7408,+15,52,15.178,108.66,-26.39,39.5,21.89,3.410, 21, 751 + ,ioTau,ICRS,05,03,05.7473,+21,35,23.865,68.94,-40.85,40.6,20.01,4.626, 21, 751 +Althaur ,laTau,ICRS,04,00,40.8157,+12,29,25.248,-8.15,-11.98,17.8,8.81,3.408, 12, 539 +Kattupothu ,muTau,ICRS,04,15,32.0573,+08,53,32.485,20.39,-21.75,17.3,7.50,4.280, 08, 657 +Furibundus ,nuTau,ICRS,04,03,09.3801,+05,59,21.498,5.52,-1.63,-5.7,25.24,3.898, 05, 581 +Ushakaron ,xiTau,ICRS,03,27,10.1527,+09,43,57.647,53.61,-38.12,-2,14.68,3.727, 09, 439 +Atirsagne ,omiTau,ICRS,03,24,48.7938,+09,01,43.931,-74.25,-80.31,-21.0,15.42,3.600, 08, 511 + ,taTau,ICRS,04,42,14.7017,+22,57,24.934,-2.84,-20.33,14.6,8.14,4.264, 22, 739 + ,rhTau,ICRS,04,33,50.9177,+14,50,39.928,103.69,-25.94,39.6,21.39,4.657, 14, 720 + ,ome-1Tau,ICRS,04,09,09.9671,+19,36,33.180,107.44,-31.64,24.75,11.21,5.510, 19, 672 +Celeano ,16Tau,ICRS,03,44,48.2154,+24,17,22.093,20.73,-44.00,2.9,9.75,5.448, 23, 505 +Electra ,17Tau,ICRS,03,44,52.5373,+24,06,48.021,21.55,-44.92,12.4,8.80,3.705, 23, 507 +Taygeta ,19Tau,ICRS,03,45,12.4945,+24,28,02.199,19.35,-41.63,5.5,8.75,4.291, 24, 547 +Maia ,20Tau,ICRS,03,45,49.6067,+24,22,03.895,21.09,-45.03,7.5,9.06,3.871, 23, 516 +Asterope ,21Tau,ICRS,03,45,54.4763,+24,33,16.240,19.44,-45.36,-0.1,8.43,5.761, 24, 553 +Sterope I ,21Tau,ICRS,03,45,54.4763,+24,33,16.240,19.44,-45.36,-0.1,8.43,5.761, 24, 553 +Sterope II ,22Tau,ICRS,03,46,02.9003,+24,31,40.433,19.83,-44.38,0,9.21,6.430, 24, 556 +Merope ,23Tau,ICRS,03,46,19.5739,+23,56,54.090,21.17,-42.67,6.2,9.08,4.164, 23, 522 +Atlas ,27Tau,ICRS,03,49,09.7425,+24,03,12.296,17.77,-44.70,8.5,8.57,3.62, 23, 557 +Pleione ,28Tau,ICRS,03,49,11.2161,+24,08,12.163,18.71,-46.74,4.4,8.42,5.048, 0, 0 +# Telescopium + ,alTel,ICRS,18,26,58.4163,-45,58,06.452,-16.68,-53.33,-0.2,13.08,3.477,-46,12379 + ,epTel,ICRS,18,11,13.7625,-45,57,15.903,-16.28,-37.26,-26.3,7.98,4.521,-45,12251 + ,ioTel,ICRS,19,35,12.9876,-48,05,57.126,-7.04,-37.43,22.3,8.19,4.891,-48,13161 + ,laTel,ICRS,18,58,27.7664,-52,56,19.064,11.53,-8.81,-2,6.14,4.840,-53, 9402 + ,nuTel,ICRS,19,48,01.1989,-56,21,45.401,92.40,-137.40,-12.4,19.19,5.340,-56, 9290 + ,xiTel,ICRS,20,07,23.1563,-52,52,50.855,-12.72,6.88,36.0,2.60,4.939,-53, 9794 +# Triangulum Australe +Atria ,alTrA,ICRS,16,48,39.8949,-69,01,39.774,17.85,-32.92,-3.3,7.85,1.92,-68, 2822 + ,beTrA,ICRS,15,55,08.5623,-63,25,50.616,-188.46,-401.92,0.4,81.24,2.85,-63, 3723 + ,gaTrA,ICRS,15,18,54.5821,-68,40,46.362,-66.48,-32.00,-3,17.85,2.881,-68, 2383 + ,deTrA,ICRS,16,15,26.2707,-63,41,08.454,3.51,-13.49,-4.9,5.25,3.858,-63, 3854 + ,epTrA,ICRS,15,36,43.2225,-66,19,01.335,24.51,-54.66,-15.5,15.09,4.113,-65, 3102 + ,zeTrA,ICRS,16,28,28.1435,-70,05,03.843,199.88,110.77,8.5,82.61,4.91,-69, 2558 +# Triangulum +Ras Mutallah ,alTri,ICRS,01,53,04.9079,+29,34,43.785,12.02,-233.69,-12.6,50.87,3.41, 28, 312 +Metallah ,alTri,ICRS,01,53,04.9079,+29,34,43.785,12.02,-233.69,-12.6,50.87,3.41, 28, 312 + ,beTri,ICRS,02,09,32.6269,+34,59,14.269,148.78,-39.13,9.9,26.24,3.00, 34, 381 + ,gaTri,ICRS,02,17,18.8673,+33,50,49.897,44.91,-52.42,14,27.73,4.00, 33, 397 +# Tucana + ,alTuc,ICRS,22,18,30.0941,-60,15,34.515,-71.48,-38.15,42.2,16.42,2.86,-60, 7561 + ,gaTuc,ICRS,23,17,25.7733,-58,14,08.643,-34.93,79.59,18.4,45.40,4.003,-58, 8062 + ,epTuc,ICRS,23,59,54.9787,-65,34,37.675,48.63,-22.33,11,8.71,4.490,-66, 3819 + ,zeTuc,ICRS,00,20,04.2601,-64,52,29.246,1707.35,1165.60,8.8,116.38,4.20,-65, 13 + ,ioTuc,ICRS,01,07,18.6637,-61,46,31.041,73.79,-11.24,-7.8,11.68,5.352,-62, 89 + ,la-2Tuc,ICRS,00,55,00.3126,-69,31,37.503,7.92,-43.35,5.1,15.52,5.461,-70, 40 +# Ursa Major +Dubhe ,alUMa,ICRS,11,03,43.6687,+61,45,03.720,-136.46,-35.25,-8.9,26.38,1.79, 62, 1161 +Merak ,beUMa,ICRS,11,01,50.4768,+56,22,56.736,81.66,33.74,-12.0,41.07,2.346, 57, 1302 +Phecda ,gaUMa,ICRS,11,53,49.8475,+53,41,41.136,107.76,11.16,-12.6,38.99,2.440, 54, 1475 +Megrez ,deUMa,ICRS,12,15,25.5601,+57,01,57.421,103.56,7.81,-13.4,40.05,3.320, 57, 1363 +Alioth ,epUMa,ICRS,12,54,01.7494,+55,57,35.356,111.74,-8.99,-9.3,40.30,1.760, 56, 1627 +Mizar ,zeUMa,ICRS,13,23,55.5429, 54,55,31.302,121.23,-22.01, -5.6,41.73, 2.27, 55, 1598 +Alkaid ,etUMa,ICRS,13,47,32.4377,+49,18,47.754,-121.23,-15.56,-10.9,32.39,1.852, 50, 2027 +Benetnash ,etUMa,ICRS,13,47,32.4377,+49,18,47.754,-121.23,-15.56,-10.9,32.39,1.852, 50, 2027 +Al Haud ,thUMa,ICRS,09,32,51.4343,+51,40,38.281,-947.01,-535.64,15.4,74.15,3.20, 52, 1401 +Talitha Borealis ,ioUMa,ICRS,08,59,12.4539,+48,02,30.575,-441.11,-215.22,9.0,68.32,3.10, 48, 1707 +Talitha Australis,kaUMa,ICRS,09,03,37.5267,+47,09,23.489,-37.37,-55.39,4.4,7.71,3.60, 47, 1633 +Tania Borealis ,laUMa,ICRS,10,17,05.7915,+42,54,51.714,-170.11,-42.64,18.1,24.27,3.442, 43, 2005 +Tania Australis,muUMa,ICRS,10,22,19.7406,+41,29,58.259,-80.47,34.10,-20.5,13.11,3.066, 42, 2115 +Alula Borealis ,nuUMa,ICRS,11,18,28.7368,+33,05,39.500,-26.61,27.51,-9.63,7.74,3.504, 33, 2098 +Alula Australis,xiUMa,ICRS,11,18,10.9,+31,31,44,-430,-588,-18.2,,3.78, 32, 2132 +Muscida ,omiUMa,ICRS,08,30,15.8700,+60,43,05.409,-134.31,-107.73,19.8,17.76,3.362, 61, 1054 + ,rhUMa,ICRS,09,02,32.6921,+67,37,46.628,-22.08,18.15,4.75,11.35,4.784, 68, 551 + ,upUMa,ICRS,09,50,59.3578,+59,02,19.448,-294.44,-151.75,27.3,28.35,3.80, 59, 1268 +El Kophrah ,chUMa,ICRS,11,46,03.0140,+47,46,45.861,-138.38,28.37,-9.06,16.64,3.707, 48, 1966 + ,psUMa,ICRS,11,09,39.8084,+44,29,54.553,-62.35,-27.38,-3.39,22.21,3.005, 45, 1897 +Alcor ,80Uma,ICRS,13,25,13.5379,+54,59,16.648,120.35,-16.94,-8.9,40.19,4.010, 55, 1603 +Saidak ,80Uma,ICRS,13,25,13.5379,+54,59,16.648,120.35,-16.94,-8.9,40.19,4.010, 55, 1603 +# Ursa Minor +Polaris ,alUMi,ICRS,02,31,49.0837,+89,15,50.794,44.22,-11.75,-17.4,7.56,2.005, 88, 8 +Kochab ,beUMi,ICRS,14,50,42.3264,+74,09,19.818,-32.29,11.91,16.96,25.79,2.078, 74, 595 +Pherkad ,gaUMi,ICRS,15,20,43.7155,+71,50,02.458,-18.03,17.68,-3.9,6.79,3.027, 72, 679 +Yildun ,deUMi,ICRS,17,32,13.0005,+86,35,11.258,10.54,53.97,-7.6,17.85,4.348, 86, 269 +Urodelus ,epUMi,ICRS,16,45,58.2438,+82,02,14.143,19.54,4.67,-11.4,9.41,4.222, 82, 498 +Alifa Al Farkadain,zeUMi,ICRS,15,44,03.5193,+77,47,40.175,20.07,-2.50,-13.1,8.68,4.283, 78, 527 +Farkadain ,zeUMi,ICRS,15,44,03.5193,+77,47,40.175,20.07,-2.50,-13.1,8.68,4.283, 78, 527 +Pharkadain ,zeUMi,ICRS,15,44,03.5193,+77,47,40.175,20.07,-2.50,-13.1,8.68,4.283, 78, 527 +Anwar al Farkadain,etUMi,ICRS,16,17,30.2878,+75,45,19.190,-89.94,257.80,-9.5,33.52,4.95, 76, 596 + ,laUMi,ICRS,17,16,56.4607,+89,02,15.749,-23.03,-3.07,0.29,3.72,6.35, 88, 112 +Pherkad Minor,11UMi,ICRS,15,17,05.8886,+71,49,26.044,3.73,9.37,-17.87,8.37,5.024, 72, 678 +# Vela +Suhail al Muhlif,ga-2Vel,ICRS,08,09,31.9503,-47,20,11.716,-5.93,9.90,35,3.88,1.808,-46, 3847 +Regor ,ga-2Vel,ICRS,08,09,31.9503,-47,20,11.716,-5.93,9.90,35,3.88,1.808,-46, 3847 +Koo She ,deVel,ICRS,08,44,42.2264,-54,42,31.756,28.78,-104.14,2.2,40.90,1.95,0, 0 +Markeb ,kaVel,ICRS,09,22,06.8183,-55,00,38.405,-10.72,11.24,21.9,6.05,2.464,-54, 2219 +Alsuhail ,laVel,ICRS,09,07,59.7585,-43,25,57.322,-23.21,14.28,18.4,5.69,2.226,-42, 4990 +Suhail ,laVel,ICRS,09,07,59.7585,-43,25,57.322,-23.21,14.28,18.4,5.69,2.226,-42, 4990 +Peregrini ,muVel,ICRS,10,46,46.1782,-49,52,12.919,62.55,-53.57,6.2,28.18, 2.721,0, 0 +Alherem ,muVel,ICRS,10,46,46.1782,-49,52,12.919,62.55,-53.57,6.2,28.18, 2.721,0, 0 +Xestus ,omiVel,ICRS,08,40,17.5854,-52,55,18.794,-24.62,35.09,16.1,6.59,3.63,-52, 1583 +Tseen Ke ,phVel,ICRS,09,56,51.7417,-54,34,04.046,-13.13,2.83,13.9,1.69,3.50,-53, 3075 +# Virgo +Spica ,alVir,ICRS,13,25,11.5793,-11,09,40.759,-42.50,-31.73,1.0,12.44,1.04,-10, 3672 +Zavijava ,beVir,ICRS,11,50,41.7185,+01,45,52.985,740.95,-271.18,4.6,91.74,3.61, 02, 2489 +Alaraph ,beVir,ICRS,11,50,41.7185,+01,45,52.985,740.95,-271.18,4.6,91.74,3.61, 02, 2489 +Porrima ,gaVir,ICRS,12,41,39.642,-01,26,57.75,-616.66,60.66, 0.0,84.53, 2.74,-00, 2601 +Auva ,deVir,ICRS,12,55,36.2078,+03,23,50.893,-471.44,-52.81,-18.87,16.11,3.38, 04, 2669 +Vindemiatrix ,epVir,ICRS,13,02,10.5971,+10,57,32.941,-275.05,19.96,-14.0,31.90,2.83, 11, 2529 +Heze ,zeVir,ICRS,13,34,41.5920,-00,35,44.953,-278.89,48.56,-13.2,44.55,3.40, 00, 3076 +Zaniah ,etVir,ICRS,12,19,54.3569,-00,40,00.492,-59.14,-23.13,2.3,13.06,3.890, 00, 2926 + ,thVir,ICRS,13,09,56.9915,-05,32,20.435,-35.08,-32.80,-2.9,7.86,4.381,-04, 3430 +Syrma ,ioVir,ICRS,14,16,00.8697,-06,00,01.968,-25.84,-419.84,11.5,46.74,4.10,-05, 3843 + ,kaVir,ICRS,14,12,53.7458,-10,16,25.326,8.04,140.79,-4.0,14.59,4.192,-09, 3878 +Khambalia ,laVir,ICRS,14,19,06.5916,-13,22,15.942,-17.12,29.39,-10.9,17.47,4.520,-12, 4018 +Rijl al Awwa ,muVir,ICRS,14,43,03.6234,-05,39,29.544,104.23,-319.90,5.4,53.54,3.90,-05, 3936 +Ril Alauva ,muVir,ICRS,14,43,03.6234,-05,39,29.544,104.23,-319.90,5.4,53.54,3.90,-05, 3936 + ,nuVir,ICRS,11,45,51.5590,+06,31,45.755,-19.65,-180.02,50.28,10.42,4.050, 07, 2479 + ,omiVir,ICRS,12,05,12.5396,+08,43,58.748,-220.32,57.52,-29.8,19.08,4.13, 09, 2583 + ,piVir,ICRS,12,00,52.3901,+06,36,51.561,-0.25,-29.71,-10.4,9.16,4.659, 07, 2502 + ,rhVir,ICRS,12,41,53.0565,+10,14,08.251,82.62,-89.51,1.6,27.10,4.872, 11, 2485 + ,siVir,ICRS,13,17,36.2827,+05,28,11.530,-7.16,10.00,-26.8,6.03,4.801, 06, 2722 + ,taVir,ICRS,14,01,38.7933,+01,32,40.315,17.41,-21.20,-2.0,14.94,4.244, 02, 2761 + ,phVir,ICRS,14,28,12.1381,-02,13,40.646,-140.94,-2.92,-9.5,24.15,4.844,-01, 2957 + ,chVir,ICRS,12,39,14.7669,-07,59,44.032,-77.30,-24.66,-19.7,10.24,4.657,-07, 3452 + ,psVir,ICRS,12,54,21.1633,-09,32,20.380,-18.26,-19.72,17.6,7.82,4.808,-08, 3449 + ,109Vir,ICRS,14,46,14.9241,+01,53,34.388,-116.04,-21.75,-6.1,25.35,3.72,0, 0 +# Volans + ,alVol,ICRS,09,02,26.7959,-66,23,45.876,-2.01,-95.80,4.9,26.24,4.004,-65, 1065 + ,beVol,ICRS,08,25,44.1946,-66,08,12.805,-35.83,-152.15,27.4,30.21,3.775,-65, 933 + ,ga-2Vol,ICRS,07,08,44.8659,-70,29,56.154,23.71,108.06,2.8,23.02,3.768,-70, 600 + ,deVol,ICRS,07,16,49.8245,-67,57,25.747,-4.11,8.50,22.5,4.94,3.976,-67, 730 + ,zeVol,ICRS,07,41,49.2612,-72,36,21.953,33.38,15.29,48.1,24.36,3.960,-72, 627 + ,ioVol,ICRS,06,51,26.9863,-70,57,48.280,4.02,25.56,18.5,5.84,5.393,-70, 572 +#Vulpecula +Anser ,alVul,ICRS,19,28,42.3299,+24,39,53.657,-126.45,-106.99,-85.53,11.00,4.451, 24, 3759 +# +# test star from Astronomica Almanac 2011 +AA11_page_B73, ,ICRS,14,39,36.4958,-60,50, 2.309,-3678.06, 482.87, -21.6,742,0 , 0, 0 diff --git a/swe/src/seleapsec.txt b/swe/src/seleapsec.txt new file mode 100644 index 0000000..dd362c0 --- /dev/null +++ b/swe/src/seleapsec.txt @@ -0,0 +1,5 @@ +# This file contains the dates of leap seconds to be taken into account +# by the Swiss Ephemeris. +# For each new leap second add the date of its insertion in the format +# yyyymmdd, e.g. "20081231" for 21 december 2008 +20081231 diff --git a/swe/src/seorbel.txt b/swe/src/seorbel.txt new file mode 100644 index 0000000..cbba37a --- /dev/null +++ b/swe/src/seorbel.txt @@ -0,0 +1,78 @@ + # Orbital elements of ficticious planets + # 27 Jan. 2000 + # + # This file is part of the Swiss Ephemeris, from Version 1.52 on. + # + # Warning! These planets do not exist! + # + # The user can add his or her own elements. + # 960 is the maximum number of ficticious planets. + # + # The elements order is as follows: + # 1. epoch of elements (Julian day) + # 2. equinox (Julian day or "J1900" or "B1950" or "J2000") + # 3. mean anomaly at epoch + # 4. semi-axis + # 5. eccentricity + # 6. argument of perihelion (ang. distance of perihelion from node) + # 7. ascending node + # 8. inclination + # 9. name of planet + # + # use '#' for comments + # to compute a body with swe_calc(), use planet number + # ipl = SE_FICT_OFFSET_1 + number_of_elements_set, + # e.g. number of Kronos is ipl = 39 + 4 = 43 + # + # Witte/Sieggruen planets, refined by James Neely +#2456200.5, J2000, 143.49291, 1.4579341, 0.2225740, 178.78899, 304.33810, 10.82816, Eros # 1 +J1900, J1900, 163.7409, 40.99837, 0.00460, 171.4333, 129.8325, 1.0833, Cupido # 1 +J1900, J1900, 27.6496, 50.66744, 0.00245, 148.1796, 161.3339, 1.0500, Hades # 2 +J1900, J1900, 165.1232, 59.21436, 0.00120, 299.0440, 0.0000, 0.0000, Zeus # 3 +J1900, J1900, 169.0193, 64.81960, 0.00305, 208.8801, 0.0000, 0.0000, Kronos # 4 +J1900, J1900, 138.0533, 70.29949, 0.00000, 0.0000, 0.0000, 0.0000, Apollon # 5 +J1900, J1900, 351.3350, 73.62765, 0.00000, 0.0000, 0.0000, 0.0000, Admetos # 6 +J1900, J1900, 55.8983, 77.25568, 0.00000, 0.0000, 0.0000, 0.0000, Vulcanus # 7 +J1900, J1900, 165.5163, 83.66907, 0.00000, 0.0000, 0.0000, 0.0000, Poseidon # 8 + # + # Isis-Transpluto; elements from "Die Sterne" 3/1952, p. 70ff. + # Strubell does not give an equinox. 1945 is taken in order to + # reproduce the as best as ASTRON ephemeris. (This is a strange + # choice, though.) + # The epoch according to Strubell is 1772.76. + # 1772 is a leap year! + # The fraction is counted from 1 Jan. 1772 +2368547.66, 2431456.5, 0.0, 77.775, 0.3, 0.7, 0, 0, Isis-Transpluto # 9 + # Nibiru, elements from Christian Woeltge, Hannover +1856113.380954, 1856113.380954, 0.0, 234.8921, 0.981092, 103.966, -44.567, 158.708, Nibiru # 10 + # Harrington, elements from Astronomical Journal 96(4), Oct. 1988 +2374696.5, J2000, 0.0, 101.2, 0.411, 208.5, 275.4, 32.4, Harrington # 11 + # according to W.G. Hoyt, "Planets X and Pluto", Tucson 1980, p. 63 +2395662.5, 2395662.5, 34.05, 36.15, 0.10761, 284.75, 0, 0, Leverrier (Neptune) # 12 +2395662.5, 2395662.5, 24.28, 37.25, 0.12062, 299.11, 0, 0, Adams (Neptune) # 13 +2425977.5, 2425977.5, 281, 43.0, 0.202, 204.9, 0, 0, Lowell (Pluto) # 14 +2425977.5, 2425977.5, 48.95, 55.1, 0.31, 280.1, 100, 15, Pickering (Pluto) # 15 +# intramercurian hypothetical Vulcan acc. to L.H. Weston +J1900,JDATE, 252.8987988 + 707550.7341 * T, 0.13744, 0.019, 322.212069+1670.056*T, 47.787931-1670.056*T, 7.5, Vulcan # 16 +# Selena/White Moon +J2000,JDATE, 242.2205555 + 5143.5418158 * T, 0.05280098949, 0.0, 0.0, 0.0, 0.0, Selena/White Moon, geo # 17 +# Hypothetical planet Proserpina, according to http://www.geocities.com/Hollywood/Academy/7519/proserpina.html +# J1900, 170.73 + 51.05 * T +J1900,JDATE, 170.73, 79.225630, 0, 0, 0, 0, Proserpina #18 +# Waldemath's Second Earth Moon +# Elements were derived by D.Koch from Waldemaths original elements as given in +# David Walters' book on Vulcan. They differ from Solar Fire (Graham Dawsons) +# elements, which are based on the assumption that the "mean longitude" given +# by Waldemath is an observation (a true longitude) +# Neither Swisseph nor Solar fire elements agree with Delphine Jay's ephemeris, +# which is obviously wrong. +2414290.95827875,2414290.95827875, 70.3407215 + 109023.2634989 * T, 0.0068400705250028, 0.1587, 8.14049594 + 2393.47417444 * T, 136.24878256 - 1131.71719709 * T, 2.5, Waldemath, geo # 19 +############################################## +# The following elements are for test only +# (Selena without T) +2454000.5,J2000,268.05505,57.3693459,0.1104221,284.48762,252.36907,46.75377,2004XR190 +J2000,JDATE, 242.2205555, 0.05279142865925, 0.0, 0.0, 0.0, 0.0, Selena/White Moon, geo # 17 +# (Selena with T, gives exactly the same position) +J2000,JDATE, 242.2205555 + 5143.5418158 * T, 0.05279142865925, 0.0, 0.0, 0.0, 0.0, Selena/White Moon with T Terms, geo # 17 +J2000, JDATE, 174.794787 + 149472.5157715 * T, 0.38709831, 0.20563175 + 0.000020406 * T, 29.125226 + 0.3702885 * T, 48.330893 + 1.186189 * T, 7.004986 + 0.0018215 * T, Mercury elem. for equ. of date # 18 +J2000, J2000, 174.794787 + 149472.5157715 * T, 0.38709831, 0.20563175 + 0.000020406 * T, 29.125226 + 0.2842872 * T, 48.330893 - 0.1254229 * T, 7.004986 - 0.0059516 * T, Mercury Test J2000 Elements# 18 diff --git a/swe/src/swecl.c b/swe/src/swecl.c new file mode 100644 index 0000000..bbe9c18 --- /dev/null +++ b/swe/src/swecl.c @@ -0,0 +1,5031 @@ +/* SWISSEPH + $Header: /home/dieter/sweph/RCS/swecl.c,v 1.75 2008/08/26 07:23:27 dieter Exp $ + + Ephemeris computations + Author: Dieter Koch + +************************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + +#include "swejpl.h" +#include "swephexp.h" +#include "sweph.h" +#include "swephlib.h" + +#define SEFLG_EPHMASK (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH) +static int find_maximum(double y00, double y11, double y2, double dx, + double *dxret, double *yret); +static int find_zero(double y00, double y11, double y2, double dx, + double *dxret, double *dxret2); +static double calc_dip(double geoalt, double atpress, double attemp, double lapse_rate); +static double calc_astronomical_refr(double geoalt,double atpress, double attemp); +static double const_lapse_rate = SE_LAPSE_RATE; /* for refraction */ + +#if 0 +#define DSUN (1391978489.9 / AUNIT) /* this value is consistent with + * 959.63 arcsec at AU distance (Astr. Alm.) */ +#else +#define DSUN (1392000000.0 / AUNIT) +#endif +#define DMOON (3476300.0 / AUNIT) +#define DEARTH (6378140.0 * 2 / AUNIT) +#define RSUN (DSUN / 2) +#define RMOON (DMOON / 2) +#define REARTH (DEARTH / 2) +/*#define SEI_OCC_FAST (16 * 1024L)*/ +static int32 eclipse_where( double tjd_ut, int32 ipl, char *starname, int32 ifl, double *geopos, + double *dcore, char *serr); +static int32 eclipse_how( double tjd_ut, int32 ipl, char *starname, int32 ifl, + double geolon, double geolat, double geohgt, + double *attr, char *serr); +static int32 eclipse_when_loc(double tjd_start, int32 ifl, double *geopos, + double *tret, double *attr, AS_BOOL backward, char *serr); +static int32 occult_when_loc(double tjd_start, int32 ipl, char *starname, int32 ifl, + double *geopos, double *tret, double *attr, AS_BOOL backward, char *serr); +static int32 lun_eclipse_how(double tjd_ut, int32 ifl, double *attr, + double *dcore, char *serr); +static int32 calc_mer_trans( + double tjd_ut, int32 ipl, int32 epheflag, int32 rsmi, + double *geopos, + char *starname, + double *tret, + char *serr); +static int32 calc_planet_star(double tjd_et, int32 ipl, char *starname, int32 iflag, double *x, char *serr); + +struct saros_data {int series_no; double tstart;}; + +#define SAROS_CYCLE 6585.3213 +#define NSAROS_SOLAR 181 +struct saros_data saros_data_solar[NSAROS_SOLAR] = { +{0, 641886.5}, /* 23 May -2955 */ +{1, 672214.5}, /* 04 Jun -2872 */ +{2, 676200.5}, /* 04 May -2861 */ +{3, 693357.5}, /* 24 Apr -2814 */ +{4, 723685.5}, /* 06 May -2731 */ +{5, 727671.5}, /* 04 Apr -2720 */ +{6, 744829.5}, /* 27 Mar -2673 */ +{7, 775157.5}, /* 08 Apr -2590 */ +{8, 779143.5}, /* 07 Mar -2579 */ +{9, 783131.5}, /* 06 Feb -2568 */ +{10, 820044.5}, /* 28 Feb -2467 */ +{11, 810859.5}, /* 06 Jan -2492 */ +{12, 748993.5}, /* 20 Aug -2662 */ +{13, 792492.5}, /* 23 Sep -2543 */ +{14, 789892.5}, /* 11 Aug -2550 */ +{15, 787294.5}, /* 01 Jul -2557 */ +{16, 824207.5}, /* 23 Jul -2456 */ +{17, 834779.5}, /* 03 Jul -2427 */ +{18, 838766.5}, /* 02 Jun -2416 */ +{19, 869094.5}, /* 15 Jun -2333 */ +{20, 886251.5}, /* 05 Jun -2286 */ +{21, 890238.5}, /* 05 May -2275 */ +{22, 927151.5}, /* 28 May -2174 */ +{23, 937722.5}, /* 07 May -2145 */ +{24, 941709.5}, /* 06 Apr -2134 */ +{25, 978623.5}, /* 30 Apr -2033 */ +{26, 989194.5}, /* 08 Apr -2004 */ +{27, 993181.5}, /* 09 Mar -1993 */ +{28, 1023510.5}, /* 22 Mar -1910 */ +{29, 1034081.5}, /* 01 Mar -1881 */ +{30, 972214.5}, /* 12 Oct -2051 */ +{31, 1061811.5}, /* 31 Jan -1805 */ +{32, 1006529.5}, /* 24 Sep -1957 */ +{33, 997345.5}, /* 02 Aug -1982 */ +{34, 1021088.5}, /* 04 Aug -1917 */ +{35, 1038245.5}, /* 25 Jul -1870 */ +{36, 1042231.5}, /* 23 Jun -1859 */ +{37, 1065974.5}, /* 25 Jun -1794 */ +{38, 1089716.5}, /* 26 Jun -1729 */ +{39, 1093703.5}, /* 26 May -1718 */ +{40, 1117446.5}, /* 28 May -1653 */ +{41, 1141188.5}, /* 28 May -1588 */ +{42, 1145175.5}, /* 28 Apr -1577 */ +{43, 1168918.5}, /* 29 Apr -1512 */ +{44, 1192660.5}, /* 30 Apr -1447 */ +{45, 1196647.5}, /* 30 Mar -1436 */ +{46, 1220390.5}, /* 01 Apr -1371 */ +{47, 1244132.5}, /* 02 Apr -1306 */ +{48, 1234948.5}, /* 08 Feb -1331 */ +{49, 1265277.5}, /* 22 Feb -1248 */ +{50, 1282433.5}, /* 11 Feb -1201 */ +{51, 1207395.5}, /* 02 Sep -1407 */ +{52, 1217968.5}, /* 14 Aug -1378 */ +{53, 1254881.5}, /* 06 Sep -1277 */ +{54, 1252282.5}, /* 25 Jul -1284 */ +{55, 1262855.5}, /* 06 Jul -1255 */ +{56, 1293182.5}, /* 17 Jul -1172 */ +{57, 1297169.5}, /* 17 Jun -1161 */ +{58, 1314326.5}, /* 07 Jun -1114 */ +{59, 1344654.5}, /* 19 Jun -1031 */ +{60, 1348640.5}, /* 18 May -1020 */ +{61, 1365798.5}, /* 10 May -0973 */ +{62, 1396126.5}, /* 22 May -0890 */ +{63, 1400112.5}, /* 20 Apr -0879 */ +{64, 1417270.5}, /* 11 Apr -0832 */ +{65, 1447598.5}, /* 24 Apr -0749 */ +{66, 1444999.5}, /* 12 Mar -0756 */ +{67, 1462157.5}, /* 04 Mar -0709 */ +{68, 1492485.5}, /* 16 Mar -0626 */ +{69, 1456959.5}, /* 09 Dec -0724 */ +{70, 1421434.5}, /* 05 Sep -0821 */ +{71, 1471518.5}, /* 19 Oct -0684 */ +{72, 1455748.5}, /* 16 Aug -0727 */ +{73, 1466320.5}, /* 27 Jul -0698 */ +{74, 1496648.5}, /* 08 Aug -0615 */ +{75, 1500634.5}, /* 07 Jul -0604 */ +{76, 1511207.5}, /* 18 Jun -0575 */ +{77, 1548120.5}, /* 11 Jul -0474 */ +{78, 1552106.5}, /* 09 Jun -0463 */ +{79, 1562679.5}, /* 21 May -0434 */ +{80, 1599592.5}, /* 13 Jun -0333 */ +{81, 1603578.5}, /* 12 May -0322 */ +{82, 1614150.5}, /* 22 Apr -0293 */ +{83, 1644479.5}, /* 05 May -0210 */ +{84, 1655050.5}, /* 14 Apr -0181 */ +{85, 1659037.5}, /* 14 Mar -0170 */ +{86, 1695950.5}, /* 06 Apr -0069 */ +{87, 1693351.5}, /* 23 Feb -0076 */ +{88, 1631484.5}, /* 06 Oct -0246 */ +{89, 1727666.5}, /* 04 Feb 0018 */ +{90, 1672384.5}, /* 28 Sep -0134 */ +{91, 1663200.5}, /* 06 Aug -0159 */ +{92, 1693529.5}, /* 19 Aug -0076 */ +{93, 1710685.5}, /* 09 Aug -0029 */ +{94, 1714672.5}, /* 09 Jul -0018 */ +{95, 1738415.5}, /* 11 Jul 0047 */ +{96, 1755572.5}, /* 01 Jul 0094 */ +{97, 1766144.5}, /* 11 Jun 0123 */ +{98, 1789887.5}, /* 12 Jun 0188 */ +{99, 1807044.5}, /* 03 Jun 0235 */ +{100, 1817616.5}, /* 13 May 0264 */ +{101, 1841359.5}, /* 15 May 0329 */ +{102, 1858516.5}, /* 05 May 0376 */ +{103, 1862502.5}, /* 04 Apr 0387 */ +{104, 1892831.5}, /* 17 Apr 0470 */ +{105, 1903402.5}, /* 27 Mar 0499 */ +{106, 1887633.5}, /* 23 Jan 0456 */ +{107, 1924547.5}, /* 15 Feb 0557 */ +{108, 1921948.5}, /* 04 Jan 0550 */ +{109, 1873251.5}, /* 07 Sep 0416 */ +{110, 1890409.5}, /* 30 Aug 0463 */ +{111, 1914151.5}, /* 30 Aug 0528 */ +{112, 1918138.5}, /* 31 Jul 0539 */ +{113, 1935296.5}, /* 22 Jul 0586 */ +{114, 1959038.5}, /* 23 Jul 0651 */ +{115, 1963024.5}, /* 21 Jun 0662 */ +{116, 1986767.5}, /* 23 Jun 0727 */ +{117, 2010510.5}, /* 24 Jun 0792 */ +{118, 2014496.5}, /* 24 May 0803 */ +{119, 2031654.5}, /* 15 May 0850 */ +{120, 2061982.5}, /* 27 May 0933 */ +{121, 2065968.5}, /* 25 Apr 0944 */ +{122, 2083126.5}, /* 17 Apr 0991 */ +{123, 2113454.5}, /* 29 Apr 1074 */ +{124, 2104269.5}, /* 06 Mar 1049 */ +{125, 2108256.5}, /* 04 Feb 1060 */ +{126, 2151755.5}, /* 10 Mar 1179 */ +{127, 2083302.5}, /* 10 Oct 0991 */ +{128, 2080704.5}, /* 29 Aug 0984 */ +{129, 2124203.5}, /* 03 Oct 1103 */ +{130, 2121603.5}, /* 20 Aug 1096 */ +{131, 2132176.5}, /* 01 Aug 1125 */ +{132, 2162504.5}, /* 13 Aug 1208 */ +{133, 2166490.5}, /* 13 Jul 1219 */ +{134, 2177062.5}, /* 22 Jun 1248 */ +{135, 2207390.5}, /* 05 Jul 1331 */ +{136, 2217962.5}, /* 14 Jun 1360 */ +{137, 2228534.5}, /* 25 May 1389 */ +{138, 2258862.5}, /* 06 Jun 1472 */ +{139, 2269434.5}, /* 17 May 1501 */ +{140, 2273421.5}, /* 16 Apr 1512 */ +{141, 2310334.5}, /* 19 May 1613 */ +{142, 2314320.5}, /* 17 Apr 1624 */ +{143, 2311722.5}, /* 07 Mar 1617 */ +{144, 2355221.5}, /* 11 Apr 1736 */ +{145, 2319695.5}, /* 04 Jan 1639 */ +{146, 2284169.5}, /* 19 Sep 1541 */ +{147, 2314498.5}, /* 12 Oct 1624 */ +{148, 2325069.5}, /* 21 Sep 1653 */ +{149, 2329056.5}, /* 21 Aug 1664 */ +{150, 2352799.5}, /* 24 Aug 1729 */ +{151, 2369956.5}, /* 14 Aug 1776 */ +{152, 2380528.5}, /* 26 Jul 1805 */ +{153, 2404271.5}, /* 28 Jul 1870 */ +{154, 2421428.5}, /* 19 Jul 1917 */ +{155, 2425414.5}, /* 17 Jun 1928 */ +{156, 2455743.5}, /* 01 Jul 2011 */ +{157, 2472900.5}, /* 21 Jun 2058 */ +{158, 2476886.5}, /* 20 May 2069 */ +{159, 2500629.5}, /* 23 May 2134 */ +{160, 2517786.5}, /* 13 May 2181 */ +{161, 2515187.5}, /* 01 Apr 2174 */ +{162, 2545516.5}, /* 15 Apr 2257 */ +{163, 2556087.5}, /* 25 Mar 2286 */ +{164, 2487635.5}, /* 24 Oct 2098 */ +{165, 2504793.5}, /* 16 Oct 2145 */ +{166, 2535121.5}, /* 29 Oct 2228 */ +{167, 2525936.5}, /* 06 Sep 2203 */ +{168, 2543094.5}, /* 28 Aug 2250 */ +{169, 2573422.5}, /* 10 Sep 2333 */ +{170, 2577408.5}, /* 09 Aug 2344 */ +{171, 2594566.5}, /* 01 Aug 2391 */ +{172, 2624894.5}, /* 13 Aug 2474 */ +{173, 2628880.5}, /* 12 Jul 2485 */ +{174, 2646038.5}, /* 04 Jul 2532 */ +{175, 2669780.5}, /* 05 Jul 2597 */ +{176, 2673766.5}, /* 04 Jun 2608 */ +{177, 2690924.5}, /* 27 May 2655 */ +{178, 2721252.5}, /* 09 Jun 2738 */ +{179, 2718653.5}, /* 28 Apr 2731 */ +{180, 2729226.5}, /* 08 Apr 2760 */ +}; + +#define NSAROS_LUNAR 180 +struct saros_data saros_data_lunar[NSAROS_LUNAR] = { +{1, 782437.5}, /* 14 Mar -2570 */ +{2, 799593.5}, /* 03 Mar -2523 */ +{3, 783824.5}, /* 30 Dec -2567 */ +{4, 754884.5}, /* 06 Oct -2646 */ +{5, 824724.5}, /* 22 Dec -2455 */ +{6, 762857.5}, /* 04 Aug -2624 */ +{7, 773430.5}, /* 16 Jul -2595 */ +{8, 810343.5}, /* 08 Aug -2494 */ +{9, 807743.5}, /* 26 Jun -2501 */ +{10, 824901.5}, /* 17 Jun -2454 */ +{11, 855229.5}, /* 29 Jun -2371 */ +{12, 859215.5}, /* 28 May -2360 */ +{13, 876373.5}, /* 20 May -2313 */ +{14, 906701.5}, /* 01 Jun -2230 */ +{15, 910687.5}, /* 30 Apr -2219 */ +{16, 927845.5}, /* 21 Apr -2172 */ +{17, 958173.5}, /* 04 May -2089 */ +{18, 962159.5}, /* 02 Apr -2078 */ +{19, 979317.5}, /* 24 Mar -2031 */ +{20, 1009645.5}, /* 05 Apr -1948 */ +{21, 1007046.5}, /* 22 Feb -1955 */ +{22, 1017618.5}, /* 02 Feb -1926 */ +{23, 1054531.5}, /* 25 Feb -1825 */ +{24, 979493.5}, /* 16 Sep -2031 */ +{25, 976895.5}, /* 06 Aug -2038 */ +{26, 1020394.5}, /* 09 Sep -1919 */ +{27, 1017794.5}, /* 28 Jul -1926 */ +{28, 1028367.5}, /* 09 Jul -1897 */ +{29, 1058695.5}, /* 21 Jul -1814 */ +{30, 1062681.5}, /* 19 Jun -1803 */ +{31, 1073253.5}, /* 30 May -1774 */ +{32, 1110167.5}, /* 23 Jun -1673 */ +{33, 1114153.5}, /* 22 May -1662 */ +{34, 1131311.5}, /* 13 May -1615 */ +{35, 1161639.5}, /* 25 May -1532 */ +{36, 1165625.5}, /* 24 Apr -1521 */ +{37, 1176197.5}, /* 03 Apr -1492 */ +{38, 1213111.5}, /* 27 Apr -1391 */ +{39, 1217097.5}, /* 26 Mar -1380 */ +{40, 1221084.5}, /* 24 Feb -1369 */ +{41, 1257997.5}, /* 18 Mar -1268 */ +{42, 1255398.5}, /* 04 Feb -1275 */ +{43, 1186946.5}, /* 07 Sep -1463 */ +{44, 1283128.5}, /* 06 Jan -1199 */ +{45, 1227845.5}, /* 29 Aug -1351 */ +{46, 1225247.5}, /* 19 Jul -1358 */ +{47, 1255575.5}, /* 31 Jul -1275 */ +{48, 1272732.5}, /* 21 Jul -1228 */ +{49, 1276719.5}, /* 21 Jun -1217 */ +{50, 1307047.5}, /* 03 Jul -1134 */ +{51, 1317619.5}, /* 13 Jun -1105 */ +{52, 1328191.5}, /* 23 May -1076 */ +{53, 1358519.5}, /* 05 Jun -0993 */ +{54, 1375676.5}, /* 26 May -0946 */ +{55, 1379663.5}, /* 25 Apr -0935 */ +{56, 1409991.5}, /* 07 May -0852 */ +{57, 1420562.5}, /* 16 Apr -0823 */ +{58, 1424549.5}, /* 16 Mar -0812 */ +{59, 1461463.5}, /* 09 Apr -0711 */ +{60, 1465449.5}, /* 08 Mar -0700 */ +{61, 1436509.5}, /* 13 Dec -0780 */ +{62, 1493179.5}, /* 08 Feb -0624 */ +{63, 1457653.5}, /* 03 Nov -0722 */ +{64, 1435298.5}, /* 20 Aug -0783 */ +{65, 1452456.5}, /* 11 Aug -0736 */ +{66, 1476198.5}, /* 12 Aug -0671 */ +{67, 1480184.5}, /* 11 Jul -0660 */ +{68, 1503928.5}, /* 14 Jul -0595 */ +{69, 1527670.5}, /* 15 Jul -0530 */ +{70, 1531656.5}, /* 13 Jun -0519 */ +{71, 1548814.5}, /* 04 Jun -0472 */ +{72, 1579142.5}, /* 17 Jun -0389 */ +{73, 1583128.5}, /* 16 May -0378 */ +{74, 1600286.5}, /* 07 May -0331 */ +{75, 1624028.5}, /* 08 May -0266 */ +{76, 1628015.5}, /* 07 Apr -0255 */ +{77, 1651758.5}, /* 09 Apr -0190 */ +{78, 1675500.5}, /* 10 Apr -0125 */ +{79, 1672901.5}, /* 27 Feb -0132 */ +{80, 1683474.5}, /* 07 Feb -0103 */ +{81, 1713801.5}, /* 19 Feb -0020 */ +{82, 1645349.5}, /* 21 Sep -0208 */ +{83, 1649336.5}, /* 22 Aug -0197 */ +{84, 1686249.5}, /* 13 Sep -0096 */ +{85, 1683650.5}, /* 02 Aug -0103 */ +{86, 1694222.5}, /* 13 Jul -0074 */ +{87, 1731136.5}, /* 06 Aug 0027 */ +{88, 1735122.5}, /* 05 Jul 0038 */ +{89, 1745694.5}, /* 15 Jun 0067 */ +{90, 1776022.5}, /* 27 Jun 0150 */ +{91, 1786594.5}, /* 07 Jun 0179 */ +{92, 1797166.5}, /* 17 May 0208 */ +{93, 1827494.5}, /* 30 May 0291 */ +{94, 1838066.5}, /* 09 May 0320 */ +{95, 1848638.5}, /* 19 Apr 0349 */ +{96, 1878966.5}, /* 01 May 0432 */ +{97, 1882952.5}, /* 31 Mar 0443 */ +{98, 1880354.5}, /* 18 Feb 0436 */ +{99, 1923853.5}, /* 24 Mar 0555 */ +{100, 1881741.5}, /* 06 Dec 0439 */ +{101, 1852801.5}, /* 11 Sep 0360 */ +{102, 1889715.5}, /* 05 Oct 0461 */ +{103, 1893701.5}, /* 03 Sep 0472 */ +{104, 1897688.5}, /* 04 Aug 0483 */ +{105, 1928016.5}, /* 16 Aug 0566 */ +{106, 1938588.5}, /* 27 Jul 0595 */ +{107, 1942575.5}, /* 26 Jun 0606 */ +{108, 1972903.5}, /* 08 Jul 0689 */ +{109, 1990059.5}, /* 27 Jun 0736 */ +{110, 1994046.5}, /* 28 May 0747 */ +{111, 2024375.5}, /* 10 Jun 0830 */ +{112, 2034946.5}, /* 20 May 0859 */ +{113, 2045518.5}, /* 29 Apr 0888 */ +{114, 2075847.5}, /* 13 May 0971 */ +{115, 2086418.5}, /* 21 Apr 1000 */ +{116, 2083820.5}, /* 11 Mar 0993 */ +{117, 2120733.5}, /* 03 Apr 1094 */ +{118, 2124719.5}, /* 02 Mar 1105 */ +{119, 2062852.5}, /* 14 Oct 0935 */ +{120, 2086596.5}, /* 16 Oct 1000 */ +{121, 2103752.5}, /* 06 Oct 1047 */ +{122, 2094568.5}, /* 14 Aug 1022 */ +{123, 2118311.5}, /* 16 Aug 1087 */ +{124, 2142054.5}, /* 17 Aug 1152 */ +{125, 2146040.5}, /* 17 Jul 1163 */ +{126, 2169783.5}, /* 18 Jul 1228 */ +{127, 2186940.5}, /* 09 Jul 1275 */ +{128, 2197512.5}, /* 18 Jun 1304 */ +{129, 2214670.5}, /* 10 Jun 1351 */ +{130, 2238412.5}, /* 10 Jun 1416 */ +{131, 2242398.5}, /* 10 May 1427 */ +{132, 2266142.5}, /* 12 May 1492 */ +{133, 2289884.5}, /* 13 May 1557 */ +{134, 2287285.5}, /* 01 Apr 1550 */ +{135, 2311028.5}, /* 13 Apr 1615 */ +{136, 2334770.5}, /* 13 Apr 1680 */ +{137, 2292659.5}, /* 17 Dec 1564 */ +{138, 2276890.5}, /* 15 Oct 1521 */ +{139, 2326974.5}, /* 09 Dec 1658 */ +{140, 2304619.5}, /* 25 Sep 1597 */ +{141, 2308606.5}, /* 25 Aug 1608 */ +{142, 2345520.5}, /* 19 Sep 1709 */ +{143, 2349506.5}, /* 18 Aug 1720 */ +{144, 2360078.5}, /* 29 Jul 1749 */ +{145, 2390406.5}, /* 11 Aug 1832 */ +{146, 2394392.5}, /* 11 Jul 1843 */ +{147, 2411550.5}, /* 02 Jul 1890 */ +{148, 2441878.5}, /* 15 Jul 1973 */ +{149, 2445864.5}, /* 13 Jun 1984 */ +{150, 2456437.5}, /* 25 May 2013 */ +{151, 2486765.5}, /* 06 Jun 2096 */ +{152, 2490751.5}, /* 07 May 2107 */ +{153, 2501323.5}, /* 16 Apr 2136 */ +{154, 2538236.5}, /* 10 May 2237 */ +{155, 2529052.5}, /* 18 Mar 2212 */ +{156, 2473771.5}, /* 08 Nov 2060 */ +{157, 2563367.5}, /* 01 Mar 2306 */ +{158, 2508085.5}, /* 21 Oct 2154 */ +{159, 2505486.5}, /* 09 Sep 2147 */ +{160, 2542400.5}, /* 03 Oct 2248 */ +{161, 2546386.5}, /* 02 Sep 2259 */ +{162, 2556958.5}, /* 12 Aug 2288 */ +{163, 2587287.5}, /* 27 Aug 2371 */ +{164, 2597858.5}, /* 05 Aug 2400 */ +{165, 2601845.5}, /* 06 Jul 2411 */ +{166, 2632173.5}, /* 18 Jul 2494 */ +{167, 2649330.5}, /* 09 Jul 2541 */ +{168, 2653317.5}, /* 08 Jun 2552 */ +{169, 2683645.5}, /* 22 Jun 2635 */ +{170, 2694217.5}, /* 01 Jun 2664 */ +{171, 2698203.5}, /* 01 May 2675 */ +{172, 2728532.5}, /* 15 May 2758 */ +{173, 2739103.5}, /* 24 Apr 2787 */ +{174, 2683822.5}, /* 16 Dec 2635 */ +{175, 2740492.5}, /* 11 Feb 2791 */ +{176, 2724722.5}, /* 09 Dec 2747 */ +{177, 2708952.5}, /* 05 Oct 2704 */ +{178, 2732695.5}, /* 07 Oct 2769 */ +{179, 2749852.5}, /* 27 Sep 2816 */ +{180, 2753839.5}, /* 28 Aug 2827 */ +}; + +/* Computes geographic location and type of solar eclipse + * for a given tjd + * iflag: to indicate ephemeris to be used + * (SEFLG_JPLEPH, SEFLG_SWIEPH, SEFLG_MOSEPH) + * + * Algorithms for the central line is taken from Montenbruck, pp. 179ff., + * with the exception, that we consider refraction for the maxima of + * partial and noncentral eclipses. + * Geographical positions are referred to sea level / the mean ellipsoid. + * + * Errors: + * - from uncertainty of JPL-ephemerides (0.01 arcsec): + * about 40 meters + * - from displacement of shadow points by atmospheric refraction: + * a few meters + * - from deviation of the geoid from the ellipsoid + * a few meters + * - from polar motion + * a few meters + * For geographical locations that are interesting for observation, + * the error is always < 100 m. + * However, if the sun is close to the horizon, + * all of these errors can grow up to a km or more. + * + * Function returns: + * -1 (ERR) on error (e.g. if swe_calc() for sun or moon fails) + * 0 if there is no solar eclipse at tjd + * SE_ECL_TOTAL + * SE_ECL_ANNULAR + * SE_ECL_TOTAL | SE_ECL_CENTRAL + * SE_ECL_TOTAL | SE_ECL_NONCENTRAL + * SE_ECL_ANNULAR | SE_ECL_CENTRAL + * SE_ECL_ANNULAR | SE_ECL_NONCENTRAL + * SE_ECL_PARTIAL + * + * geopos[0]: geographic longitude of central line + * geopos[1]: geographic latitude of central line + * + * not implemented so far: + * + * geopos[2]: geographic longitude of northern limit of umbra + * geopos[3]: geographic latitude of northern limit of umbra + * geopos[4]: geographic longitude of southern limit of umbra + * geopos[5]: geographic latitude of southern limit of umbra + * geopos[6]: geographic longitude of northern limit of penumbra + * geopos[7]: geographic latitude of northern limit of penumbra + * geopos[8]: geographic longitude of southern limit of penumbra + * geopos[9]: geographic latitude of southern limit of penumbra + * + * Attention: "northern" and "southern" limits of umbra do not + * necessarily correspond to the northernmost or southernmost + * geographic position, where the total, annular, or partial + * phase is visible at a given time. + * Imagine a situation in northern summer, when the sun illuminates + * the northern polar circle. The southernmost point of the core + * shadow may then touch the north pole, and therefore the + * northernmost point will be more in the south. + * Note also that with annular eclipses, the northern edge is + * usually geographically the southern one. With annular-total + * ones, the two lines cross, usually twice. The maximum is always + * total in such cases. + * + * attr[0] fraction of solar diameter covered by moon (magnitude) + * attr[1] ratio of lunar diameter to solar one + * attr[2] fraction of solar disc covered by moon (obscuration) + * attr[3] diameter of core shadow in km + * attr[4] azimuth of sun at tjd + * attr[5] true altitude of sun above horizon at tjd + * attr[6] apparent altitude of sun above horizon at tjd + * attr[7] angular distance of moon from sun in degrees + * declare as attr[20] at least ! + */ +int32 FAR PASCAL_CONV swe_sol_eclipse_where( + double tjd_ut, + int32 ifl, + double *geopos, + double *attr, + char *serr) +{ + int32 retflag, retflag2; + double dcore[10]; + ifl &= SEFLG_EPHMASK; + if ((retflag = eclipse_where(tjd_ut, SE_SUN, NULL, ifl, geopos, dcore, serr)) < 0) + return retflag; + if ((retflag2 = eclipse_how(tjd_ut, SE_SUN, NULL, ifl, geopos[0], geopos[1], 0, attr, serr)) == ERR) + return retflag2; + attr[3] = dcore[0]; + return retflag; +} + +int32 FAR PASCAL_CONV swe_lun_occult_where( + double tjd_ut, + int32 ipl, + char *starname, + int32 ifl, + double *geopos, + double *attr, + char *serr) +{ + int32 retflag, retflag2; + double dcore[10]; + ifl &= SEFLG_EPHMASK; + /* function calls for Pluto with asteroid number 134340 + * are treated as calls for Pluto as main body SE_PLUTO */ + if (ipl == SE_AST_OFFSET + 134340) + ipl = SE_PLUTO; + if ((retflag = eclipse_where(tjd_ut, ipl, starname, ifl, geopos, dcore, serr)) < 0) + return retflag; + if ((retflag2 = eclipse_how(tjd_ut, ipl, starname, ifl, geopos[0], geopos[1], 0, attr, serr)) == ERR) + return retflag2; + attr[3] = dcore[0]; + return retflag; +} + +/* Used by several swe_sol_eclipse_ functions. + * Like swe_sol_eclipse_where(), but instead of attr[0], it returns: + * + * dcore[0]: core shadow width in km + * dcore[2]: distance of shadow axis from geocenter r0 + * dcore[3]: diameter of core shadow on fundamental plane d0 + * dcore[4]: diameter of half-shadow on fundamental plane D0 + */ +static int32 eclipse_where( double tjd_ut, int32 ipl, char *starname, int32 ifl, double *geopos, double *dcore, + char *serr) +{ + int i; + int32 retc = 0, niter = 0; + double e[6], et[6], rm[6], rs[6], rmt[6], rst[6], xs[6], xst[6]; +#if 0 + double erm[6]; +#endif + double x[6]; + double lm[6], ls[6], lx[6]; + double dsm, dsmt, d0, D0, s0, r0, d, s, dm; + double de = 6378140.0 / AUNIT; + double earthobl = 1 - EARTH_OBLATENESS; + double deltat, tjd, sidt; + double drad; + double sinf1, sinf2, cosf1, cosf2; + double rmoon = RMOON; + double dmoon = 2 * rmoon; + int32 iflag, iflag2; + /* double ecce = sqrt(2 * EARTH_OBLATENESS - EARTH_OBLATENESS * EARTH_OBLATENESS); */ + AS_BOOL no_eclipse = FALSE; + struct epsilon *oe = &swed.oec; + for (i = 0; i < 10; i++) + dcore[i] = 0; + /* nutation need not be in lunar and solar positions, + * if mean sidereal time will be used */ + iflag = SEFLG_SPEED | SEFLG_EQUATORIAL | ifl; + iflag2 = iflag | SEFLG_RADIANS; + iflag = iflag | SEFLG_XYZ; + deltat = swe_deltat(tjd_ut); + tjd = tjd_ut + deltat; + /* moon in cartesian coordinates */ + if ((retc = swe_calc(tjd, SE_MOON, iflag, rm, serr)) == ERR) + return retc; + /* moon in polar coordinates */ + if ((retc = swe_calc(tjd, SE_MOON, iflag2, lm, serr)) == ERR) + return retc; + /* sun in cartesian coordinates */ + if ((retc = calc_planet_star(tjd, ipl, starname, iflag, rs, serr)) == ERR) + return retc; + /* sun in polar coordinates */ + if ((retc = calc_planet_star(tjd, ipl, starname, iflag2, ls, serr)) == ERR) + return retc; + /* save sun position */ + for (i = 0; i <= 2; i++) + rst[i] = rs[i]; + /* save moon position */ + for (i = 0; i <= 2; i++) + rmt[i] = rm[i]; + if (iflag & SEFLG_NONUT) + sidt = swe_sidtime0(tjd_ut, oe->eps * RADTODEG, 0) * 15 * DEGTORAD; + else + sidt = swe_sidtime(tjd_ut) * 15 * DEGTORAD; + /* + * radius of planet disk in AU + */ + if (starname != NULL && *starname != '\0') + drad = 0; + else if (ipl < NDIAM) + drad = pla_diam[ipl] / 2 / AUNIT; + else if (ipl > SE_AST_OFFSET) + drad = swed.ast_diam / 2 * 1000 / AUNIT; /* km -> m -> AU */ + else + drad = 0; +iter_where: + for (i = 0; i <= 2; i++) { + rs[i] = rst[i]; + rm[i] = rmt[i]; + } + /* Account for oblateness of earth: + * Instead of flattening the earth, we apply the + * correction to the z coordinate of the moon and + * the sun. This makes the calculation easier. + */ + for (i = 0; i <= 2; i++) + lx[i] = lm[i]; + swi_polcart(lx, rm); + rm[2] /= earthobl; + /* distance of moon from geocenter */ + dm = sqrt(square_sum(rm)); + /* Account for oblateness of earth */ + for (i = 0; i <= 2; i++) + lx[i] = ls[i]; + swi_polcart(lx, rs); + rs[2] /= earthobl; + /* sun - moon vector */ + for (i = 0; i <= 2; i++) { + e[i] = (rm[i] - rs[i]); + et[i] = (rmt[i] - rst[i]); + } + /* distance sun - moon */ + dsm = sqrt(square_sum(e)); + dsmt = sqrt(square_sum(et)); + /* sun - moon unit vector */ + for (i = 0; i <= 2; i++) { + e[i] /= dsm; + et[i] /= dsmt; +#if 0 + erm[i] = rm[i] / dm; +#endif + } + sinf1 = ((drad - rmoon) / dsm); + cosf1 = sqrt(1 - sinf1 * sinf1); + sinf2 = ((drad + rmoon) / dsm); + cosf2 = sqrt(1 - sinf2 * sinf2); + /* distance of moon from fundamental plane */ + s0 = -dot_prod(rm, e); + /* distance of shadow axis from geocenter */ + r0 = sqrt(dm * dm - s0 * s0); + /* diameter of core shadow on fundamental plane */ + d0 = (s0 / dsm * (drad * 2 - dmoon) - dmoon) / cosf1; + /* diameter of half-shadow on fundamental plane */ + D0 = (s0 / dsm * (drad * 2 + dmoon) + dmoon) / cosf2; + dcore[2] = r0; + dcore[3] = d0; + dcore[4] = D0; + dcore[5] = cosf1; + dcore[6] = cosf2; + for (i = 2; i < 5; i++) + dcore[i] *= AUNIT / 1000.0; + /************************** + * central (total or annular) phase + **************************/ + retc = 0; + if (de * cosf1 >= r0) { + retc |= SE_ECL_CENTRAL; + } else if (r0 <= de * cosf1 + fabs(d0) / 2) { + retc |= SE_ECL_NONCENTRAL; + } else if (r0 <= de * cosf2 + D0 / 2) { + retc |= (SE_ECL_PARTIAL | SE_ECL_NONCENTRAL); + } else { + if (serr != NULL) + sprintf(serr, "no solar eclipse at tjd = %f", tjd); + for (i = 0; i < 10; i++) + geopos[i] = 0; + *dcore = 0; + retc = 0; + d = 0; + no_eclipse = TRUE; + /*return retc;*/ + } + /* distance of shadow point from fundamental plane */ + d = s0 * s0 + de * de - dm * dm; + if (d > 0) + d = sqrt(d); + else + d = 0; + /* distance of moon from shadow point on earth */ + s = s0 - d; + /* next: geographic position of eclipse center. + * if shadow axis does not touch the earth, + * place on earth with maximum occultation is computed. + */ +#if 0 /* the following stuff is meaningless for observations */ + /* + * account for refraction at horizon + */ + if (d == 0) { + double ds, a, b; + /* distance of sun from geocenter */ + ds = sqrt(square_sum(rs)); + a = PI - acos(swi_dot_prod_unit(e, erm)); + /* refraction at horizon + sun radius = about 0.83 degrees */ + b = 34.4556 / 60.0 * DEGTORAD + asin(drad / ds); +# if 0 + /* at edge of umbra and penumbra + * light rays are not parallel to shadow axis. + * for a short time close to contact of umbra and + * penumbra, an angle < 0.27 degrees would have + * to be subtracted from b; + */ + if (retc & SE_ECL_PARTIAL) { + d = d0; + sinf = sinf1; + } else { + d = D0; + sinf = sinf2; + } + c = (r0 - de) / d * 2 * sinf; + if (c > sinf1) { + b -= .....; + } + printf("%f %f %f", a * RADTODEG, b * RADTODEG, s); + printf(" %f\n", s); +# else + if (retc & SE_ECL_PARTIAL) + b -= asin(sinf2); /* maximum! */ + else + b -= asin(sinf1); +# endif + s += tan(b) * cos(PI / 2 - a) * dm; + } +#endif + /* geographic position of eclipse center (maximum) */ + for (i = 0; i <= 2; i++) + xs[i] = rm[i] + s * e[i]; + /* we need geographic position with correct z, as well */ + for (i = 0; i <= 2; i++) + xst[i] = xs[i]; + xst[2] *= earthobl; + swi_cartpol(xst, xst); + if (niter <= 0) { + double cosfi = cos(xst[1]); + double sinfi = sin(xst[1]); + double eobl = EARTH_OBLATENESS; + double cc= 1 / sqrt(cosfi * cosfi + (1-eobl) * (1-eobl) * sinfi * sinfi); + double ss= (1-eobl) * (1-eobl) * cc; + earthobl = ss; + niter++; + goto iter_where; + } + swi_polcart(xst, xst); + /* to longitude and latitude */ + swi_cartpol(xs, xs); + /* measure from sidereal time at greenwich */ + xs[0] -= sidt; + xs[0] *= RADTODEG; + xs[1] *= RADTODEG; + xs[0] = swe_degnorm(xs[0]); + /* west is negative */ + if (xs[0] > 180) + xs[0] -= 360; + geopos[0] = xs[0]; + geopos[1] = xs[1]; + /* diameter of core shadow: + * first, distance moon - place of eclipse on earth */ + for (i = 0; i <= 2; i++) + x[i] = rmt[i] - xst[i]; + s = sqrt(square_sum(x)); + /* diameter of core shadow at place of maximum eclipse */ + *dcore = (s / dsmt * ( drad * 2 - dmoon) - dmoon) * cosf1; + *dcore *= AUNIT / 1000.0; + /* diameter of penumbra at place of maximum eclipse */ + dcore[1] = (s / dsmt * ( drad * 2 + dmoon) + dmoon) * cosf2; + dcore[1] *= AUNIT / 1000.0; + if (!(retc & SE_ECL_PARTIAL) && !no_eclipse) { + if (*dcore > 0) { + /*printf("annular\n");*/ + retc |= SE_ECL_ANNULAR; + } else { + /*printf("total\n");*/ + retc |= SE_ECL_TOTAL; + } + } + return retc; +} + +static int32 calc_planet_star(double tjd_et, int32 ipl, char *starname, int32 iflag, double *x, char *serr) +{ + int i; + int retc = OK; + if (starname == NULL || *starname == '\0') { + retc = swe_calc(tjd_et, ipl, iflag, x, serr); + } else { + if ((retc = swe_fixstar(starname, tjd_et, iflag, x, serr)) == OK) { + /* fixstars have the standard distance 1. + * in the occultation routines, this might lead to errors + * if interpreted as AU distance. To avoid this, we make it very high. + */ + if (iflag & SEFLG_XYZ) { + for (i = 0; i < 3; i++) + x[i] *= 100000000; + } else { + x[2] *= 100000000; + } + } + } + return retc; +} + +/* Computes attributes of a solar eclipse for given tjd, geo. longitude, + * geo. latitude, and geo. height. + * + * retflag SE_ECL_TOTAL or SE_ECL_ANNULAR or SE_ECL_PARTIAL + * SE_ECL_NONCENTRAL + * if 0, no eclipse is visible at geogr. position. + * + * attr[0] fraction of solar diameter covered by moon; + * with total/annular eclipses, it results in magnitude acc. to IMCCE. + * attr[1] ratio of lunar diameter to solar one + * attr[2] fraction of solar disc covered by moon (obscuration) + * attr[3] diameter of core shadow in km + * attr[4] azimuth of sun at tjd + * attr[5] true altitude of sun above horizon at tjd + * attr[6] apparent altitude of sun above horizon at tjd + * attr[7] elongation of moon in degrees + * attr[8] magnitude acc. to NASA; + * = attr[0] for partial and attr[1] for annular and total eclipses + * attr[9] saros series number + * attr[10] saros series member number + * declare as attr[20] at least ! + * + */ +int32 FAR PASCAL_CONV swe_sol_eclipse_how( + double tjd_ut, + int32 ifl, + double *geopos, + double *attr, + char *serr) +{ + int32 retflag, retflag2; + double dcore[10], ls[6], xaz[6]; + double geopos2[20]; + ifl &= SEFLG_EPHMASK; + if ((retflag = eclipse_how(tjd_ut, SE_SUN, NULL, ifl, geopos[0], geopos[1], geopos[2], attr, serr)) == ERR) + return retflag; + if ((retflag2 = eclipse_where(tjd_ut, SE_SUN, NULL, ifl, geopos2, dcore, serr)) == ERR) + return retflag2; + if (retflag) + retflag |= (retflag2 & (SE_ECL_CENTRAL | SE_ECL_NONCENTRAL)); + attr[3] = dcore[0]; + swe_set_topo(geopos[0], geopos[1], geopos[2]); + if (swe_calc_ut(tjd_ut, SE_SUN, ifl | SEFLG_TOPOCTR | SEFLG_EQUATORIAL, ls, serr) == ERR) + return ERR; + swe_azalt(tjd_ut, SE_EQU2HOR, geopos, 0, 10, ls, xaz); + attr[4] = xaz[0]; + attr[5] = xaz[1]; + attr[6] = xaz[2]; + if (xaz[2] <= 0) + retflag = 0; + return retflag; +} + +#define USE_AZ_NAV 0 +static int32 eclipse_how( double tjd_ut, int32 ipl, char *starname, int32 ifl, + double geolon, double geolat, double geohgt, + double *attr, char *serr) +{ + int i, j, k; + int32 retc = 0; + double te, d; + double xs[6], xm[6], ls[6], lm[6], x1[6], x2[6]; + double rmoon, rsun, rsplusrm, rsminusrm; + double dctr; + double drad; + int32 iflag = SEFLG_EQUATORIAL | SEFLG_TOPOCTR | ifl; + int32 iflagcart = iflag | SEFLG_XYZ; +#if USE_AZ_NAV + double mdd, eps, sidt, armc; +#endif + double xh[6], hmin_appr; + double lsun, lmoon, lctr, lsunleft, a, b, sc1, sc2; + double geopos[3]; + for (i = 0; i < 10; i++) + attr[i] = 0; + geopos[0] = geolon; + geopos[1] = geolat; + geopos[2] = geohgt; + te = tjd_ut + swe_deltat(tjd_ut); + swe_set_topo(geolon, geolat, geohgt); + if (calc_planet_star(te, ipl, starname, iflag, ls, serr) == ERR) + return ERR; + if (swe_calc(te, SE_MOON, iflag, lm, serr) == ERR) + return ERR; + if (calc_planet_star(te, ipl, starname, iflagcart, xs, serr) == ERR) + return ERR; + if (swe_calc(te, SE_MOON, iflagcart, xm, serr) == ERR) + return ERR; + /* + * radius of planet disk in AU + */ + if (starname != NULL && *starname != '\0') + drad = 0; + else if (ipl < NDIAM) + drad = pla_diam[ipl] / 2 / AUNIT; + else if (ipl > SE_AST_OFFSET) + drad = swed.ast_diam / 2 * 1000 / AUNIT; /* km -> m -> AU */ + else + drad = 0; + /* + * azimuth and altitude of sun or planet + */ +#if USE_AZ_NAV /* old */ + eps = swi_epsiln(te); + if (iflag & SEFLG_NONUT) + sidt = swe_sidtime0(tjd_ut, eps * RADTODEG, 0) * 15; + else + sidt = swe_sidtime(tjd_ut) * 15; + armc = sidt + geolon; + mdd = swe_degnorm(ls[0] - armc); + xh[0] = swe_degnorm(mdd - 90); + xh[1] = ls[1]; + xh[2] = ls[2]; + swe_cotrans(xh, xh, 90 - geolat); /* azimuth from east, counterclock, via north */ +#else + swe_azalt(tjd_ut, SE_EQU2HOR, geopos, 0, 10, ls, xh); /* azimuth from south, clockwise, via west */ +#endif + /* eclipse description */ + rmoon = asin(RMOON / lm[2]) * RADTODEG; + rsun = asin(drad / ls[2]) * RADTODEG; + rsplusrm = rsun + rmoon; + rsminusrm = rsun - rmoon; + for (i = 0; i < 3; i++) { + x1[i] = xs[i] / ls[2]; + x2[i] = xm[i] / lm[2]; + } + dctr = acos(swi_dot_prod_unit(x1, x2)) * RADTODEG; + /* + * phase + */ + if (dctr < rsminusrm) + retc = SE_ECL_ANNULAR; + else if (dctr < fabs(rsminusrm)) + retc = SE_ECL_TOTAL; + else if (dctr < rsplusrm) + retc = SE_ECL_PARTIAL; + else { + retc = 0; + if (serr != NULL) + sprintf(serr, "no solar eclipse at tjd = %f", tjd_ut); + } + /* + * ratio of diameter of moon to that of sun + */ + if (rsun > 0) + attr[1] = rmoon / rsun; + else + attr[1] = 0; + /* + * eclipse magnitude: + * fraction of solar diameter covered by moon + */ + lsun = asin(rsun / 2 * DEGTORAD) * 2; + lsunleft = (-dctr + rsun + rmoon); + if (lsun > 0) { + attr[0] = lsunleft / rsun / 2; + } else { + attr[0] = 100; + } + /*if (retc == SE_ECL_ANNULAR || retc == SE_ECL_TOTAL) + attr[0] = attr[1];*/ + /* + * obscuration: + * fraction of solar disc obscured by moon + */ + lsun = rsun; + lmoon = rmoon; + lctr = dctr; + if (retc == 0 || lsun == 0) { + attr[2] = 100; + } else if (retc == SE_ECL_TOTAL || retc == SE_ECL_ANNULAR) { + attr[2] = lmoon * lmoon / lsun / lsun; + } else { + a = 2 * lctr * lmoon; + b = 2 * lctr * lsun; + if (a < 1e-9) { + attr[2] = lmoon * lmoon / lsun / lsun; + } else { + a = (lctr * lctr + lmoon * lmoon - lsun * lsun) / a; + if (a > 1) a = 1; + if (a < -1) a = -1; + b = (lctr * lctr + lsun * lsun - lmoon * lmoon) / b; + if (b > 1) b = 1; + if (b < -1) b = -1; + a = acos(a); + b = acos(b); + sc1 = a * lmoon * lmoon / 2; + sc2 = b * lsun * lsun / 2; + sc1 -= (cos(a) * sin(a)) * lmoon * lmoon / 2; + sc2 -= (cos(b) * sin(b)) * lsun * lsun / 2; + attr[2] = (sc1 + sc2) * 2 / PI / lsun / lsun; + } + } + attr[7] = dctr; + /* approximate minimum height for visibility, considering + * refraction and dip + * 34.4556': refraction at horizon, from Bennets formulae + * 1.75' / sqrt(geohgt): dip of horizon + * 0.37' / sqrt(geohgt): refraction between horizon and observer */ + hmin_appr = -(34.4556 + (1.75 + 0.37) * sqrt(geohgt)) / 60; + if (xh[1] + rsun + fabs(hmin_appr) >= 0 && retc) + retc |= SE_ECL_VISIBLE; /* eclipse visible */ +#if USE_AZ_NAV /* old */ + attr[4] = swe_degnorm(90 - xh[0]); /* azimuth, from north, clockwise, via east */ +#else + attr[4] = xh[0]; /* azimuth, from south, clockwise, via west */ +#endif + attr[5] = xh[1]; /* height */ + attr[6] = xh[2]; /* height */ + if (ipl == SE_SUN && (starname == NULL || *starname == '\0')) { + /* magnitude of solar eclipse according to NASA */ + attr[8] = attr[0]; /* fraction of diameter occulted */ + if (retc & (SE_ECL_TOTAL | SE_ECL_ANNULAR)) + attr[8] = attr[1]; /* ratio between diameters of sun and moon */ + /* saros series and member */ + for (i = 0; i < NSAROS_SOLAR; i++) { + d = (tjd_ut - saros_data_solar[i].tstart) / SAROS_CYCLE; + if (d < 0) continue; + j = (int) d; + if ((d - j) * SAROS_CYCLE < 2) { + attr[9] = (double) saros_data_solar[i].series_no; + attr[10] = (double) j + 1; + break; + } + k = j + 1; + if ((k - d) * SAROS_CYCLE < 2) { + attr[9] = (double) saros_data_solar[i].series_no; + attr[10] = (double) k + 1; + break; + } + } + if (i == NSAROS_SOLAR) { + attr[9] = attr[10] = -99999999; + } + } + return retc; +} + +/* When is the next solar eclipse anywhere on earth? + * + * input parameters: + * + * tjd_start start time for search (UT) + * ifl ephemeris to be used (SEFLG_SWIEPH, etc.) + * ifltype eclipse type to be searched (SE_ECL_TOTAL, etc.) + * 0, if any type of eclipse is wanted + * + * return values: + * + * retflag SE_ECL_TOTAL or SE_ECL_ANNULAR or SE_ECL_PARTIAL + * or SE_ECL_ANNULAR_TOTAL + * SE_ECL_CENTRAL + * SE_ECL_NONCENTRAL + * + * tret[0] time of maximum eclipse + * tret[1] time, when eclipse takes place at local apparent noon + * tret[2] time of eclipse begin + * tret[3] time of eclipse end + * tret[4] time of totality begin + * tret[5] time of totality end + * tret[6] time of center line begin + * tret[7] time of center line end + * tret[8] time when annular-total eclipse becomes total + * not implemented so far + * tret[9] time when annular-total eclipse becomes annular again + * not implemented so far + * declare as tret[10] at least! + * + */ +int32 FAR PASCAL_CONV swe_sol_eclipse_when_glob(double tjd_start, int32 ifl, int32 ifltype, + double *tret, int32 backward, char *serr) +{ + int i, j, k, m, n, o, i1 = 0, i2 = 0; + int32 retflag = 0, retflag2 = 0; + double de = 6378.140, a; + double t, tt, tjd, tjds, dt, dtint, dta, dtb; + double T, T2, T3, T4, K, M, Mm; + double E, Ff; + double xs[6], xm[6], ls[6], lm[6]; + double rmoon, rsun, dcore[10]; + double dc[3], dctr; + double twohr = 2.0 / 24.0; + double tenmin = 10.0 / 24.0 / 60.0; + double dt1, dt2; + double geopos[20], attr[20]; + double dtstart, dtdiv; + double xa[6], xb[6]; + int direction = 1; + AS_BOOL dont_times = FALSE; + int32 iflag, iflagcart; + ifl &= SEFLG_EPHMASK; + iflag = SEFLG_EQUATORIAL | ifl; + iflagcart = iflag | SEFLG_XYZ; + if (ifltype == (SE_ECL_PARTIAL | SE_ECL_CENTRAL)) { + if (serr != NULL) + strcpy(serr, "central partial eclipses do not exist"); + return ERR; + } + if (ifltype == 0) + ifltype = SE_ECL_TOTAL | SE_ECL_ANNULAR | SE_ECL_PARTIAL + | SE_ECL_ANNULAR_TOTAL | SE_ECL_NONCENTRAL | SE_ECL_CENTRAL; + if (backward) + direction = -1; + K = (int) ((tjd_start - J2000) / 365.2425 * 12.3685); + K -= direction; +next_try: + retflag = 0; + dont_times = FALSE; + for (i = 0; i <= 9; i++) + tret[i] = 0; + T = K / 1236.85; + T2 = T * T; T3 = T2 * T; T4 = T3 * T; + Ff = swe_degnorm(160.7108 + 390.67050274 * K + - 0.0016341 * T2 + - 0.00000227 * T3 + + 0.000000011 * T4); + if (Ff > 180) + Ff -= 180; + if (Ff > 21 && Ff < 159) { /* no eclipse possible */ + K += direction; + goto next_try; + } + /* approximate time of geocentric maximum eclipse + * formula from Meeus, German, p. 381 */ + tjd = 2451550.09765 + 29.530588853 * K + + 0.0001337 * T2 + - 0.000000150 * T3 + + 0.00000000073 * T4; + M = swe_degnorm(2.5534 + 29.10535669 * K + - 0.0000218 * T2 + - 0.00000011 * T3); + Mm = swe_degnorm(201.5643 + 385.81693528 * K + + 0.1017438 * T2 + + 0.00001239 * T3 + + 0.000000058 * T4); + E = 1 - 0.002516 * T - 0.0000074 * T2; + M *= DEGTORAD; + Mm *= DEGTORAD; + tjd = tjd - 0.4075 * sin(Mm) + + 0.1721 * E * sin(M); + /* + * time of maximum eclipse (if eclipse) = + * minimum geocentric angle between sun and moon edges. + * After this time has been determined, check + * whether or not an eclipse is taking place with + * the functions eclipse_where() and _how(). + */ + dtstart = 1; + if (tjd < 2000000) + dtstart = 5; + dtdiv = 4; + for (dt = dtstart; + dt > 0.0001; + dt /= dtdiv) { + for (i = 0, t = tjd - dt; i <= 2; i++, t += dt) { + if (swe_calc(t, SE_SUN, iflag, ls, serr) == ERR) + return ERR; + if (swe_calc(t, SE_MOON, iflag, lm, serr) == ERR) + return ERR; + if (swe_calc(t, SE_SUN, iflagcart, xs, serr) == ERR) + return ERR; + if (swe_calc(t, SE_MOON, iflagcart, xm, serr) == ERR) + return ERR; + for (m = 0; m < 3; m++) { + xa[m] = xs[m] / ls[2]; + xb[m] = xm[m] / lm[2]; + } + dc[i] = acos(swi_dot_prod_unit(xa, xb)) * RADTODEG; + rmoon = asin(RMOON / lm[2]) * RADTODEG; + rsun = asin(RSUN / ls[2]) * RADTODEG; + dc[i] -= (rmoon + rsun); + } + find_maximum(dc[0], dc[1], dc[2], dt, &dtint, &dctr); + tjd += dtint + dt; + } + tjds = tjd = tjd - swe_deltat(tjd); + if ((retflag = eclipse_where(tjd, SE_SUN, NULL, ifl, geopos, dcore, serr)) == ERR) + return retflag; + retflag2 = retflag; + /* in extreme cases _where() returns no eclipse, where there is + * actually a very small one, therefore call _how() with the + * coordinates returned by _where(): */ + if ((retflag2 = eclipse_how(tjd, SE_SUN, NULL, ifl, geopos[0], geopos[1], 0, attr, serr)) == ERR) + return retflag2; + if (retflag2 == 0) { + K += direction; + goto next_try; + } + tret[0] = tjd; + if ((backward && tret[0] >= tjd_start - 0.0001) + || (!backward && tret[0] <= tjd_start + 0.0001)) { + K += direction; + goto next_try; + } + /* + * eclipse type, SE_ECL_TOTAL, _ANNULAR, etc. + * SE_ECL_ANNULAR_TOTAL will be discovered later + */ + if ((retflag = eclipse_where(tjd, SE_SUN, NULL, ifl, geopos, dcore, serr)) == ERR) + return retflag; + if (retflag == 0) { /* can happen with extremely small percentage */ + retflag = SE_ECL_PARTIAL | SE_ECL_NONCENTRAL; + tret[4] = tret[5] = tjd; /* fix this ???? */ + dont_times = TRUE; + } + /* + * check whether or not eclipse type found is wanted + */ + /* non central eclipse is wanted: */ + if (!(ifltype & SE_ECL_NONCENTRAL) && (retflag & SE_ECL_NONCENTRAL)) { + K += direction; + goto next_try; + } + /* central eclipse is wanted: */ + if (!(ifltype & SE_ECL_CENTRAL) && (retflag & SE_ECL_CENTRAL)) { + K += direction; + goto next_try; + } + /* non annular eclipse is wanted: */ + if (!(ifltype & SE_ECL_ANNULAR) && (retflag & SE_ECL_ANNULAR)) { + K += direction; + goto next_try; + } + /* non partial eclipse is wanted: */ + if (!(ifltype & SE_ECL_PARTIAL) && (retflag & SE_ECL_PARTIAL)) { + K += direction; + goto next_try; + } + /* annular-total eclipse will be discovered later */ + if (!(ifltype & (SE_ECL_TOTAL | SE_ECL_ANNULAR_TOTAL)) && (retflag & SE_ECL_TOTAL)) { + K += direction; + goto next_try; + } + if (dont_times) + goto end_search_global; + /* + * n = 0: times of eclipse begin and end + * n = 1: times of totality begin and end + * n = 2: times of center line begin and end + */ + if (retflag & SE_ECL_PARTIAL) + o = 0; + else if (retflag & SE_ECL_NONCENTRAL) + o = 1; + else + o = 2; + dta = twohr; + dtb = tenmin / 3.0; + for (n = 0; n <= o; n++) { + if (n == 0) { + /*dc[1] = dcore[3] / 2 + de - dcore[1];*/ + i1 = 2; i2 = 3; + } else if (n == 1) { + if (retflag & SE_ECL_PARTIAL) + continue; + i1 = 4; i2 = 5; + } else if (n == 2) { + if (retflag & SE_ECL_NONCENTRAL) + continue; + i1 = 6; i2 = 7; + } + for (i = 0, t = tjd - dta; i <= 2; i += 1, t += dta) { + if ((retflag2 = eclipse_where(t, SE_SUN, NULL, ifl, geopos, dcore, serr)) == ERR) + return retflag2; + if (n == 0) + dc[i] = dcore[4] / 2 + de / dcore[5] - dcore[2]; + else if (n == 1) + dc[i] = fabs(dcore[3]) / 2 + de / dcore[6] - dcore[2]; + else if (n == 2) + dc[i] = de / dcore[6] - dcore[2]; + } + find_zero(dc[0], dc[1], dc[2], dta, &dt1, &dt2); + tret[i1] = tjd + dt1 + dta; + tret[i2] = tjd + dt2 + dta; + for (m = 0, dt = dtb; m < 3; m++, dt /= 3) { + for (j = i1; j <= i2; j += (i2 - i1)) { + for (i = 0, t = tret[j] - dt; i < 2; i++, t += dt) { + if ((retflag2 = eclipse_where(t, SE_SUN, NULL, ifl, geopos, dcore, serr)) == ERR) + return retflag2; + if (n == 0) + dc[i] = dcore[4] / 2 + de / dcore[5] - dcore[2]; + else if (n == 1) + dc[i] = fabs(dcore[3]) / 2 + de / dcore[6] - dcore[2]; + else if (n == 2) + dc[i] = de / dcore[6] - dcore[2]; + } + dt1 = dc[1] / ((dc[1] - dc[0]) / dt); + tret[j] -= dt1; + } + } + } + /* + * annular-total eclipses + */ + if (retflag & SE_ECL_TOTAL) { + if ((retflag2 = eclipse_where(tret[0], SE_SUN, NULL, ifl, geopos, dcore, serr)) == ERR) + return retflag2; + dc[0] = *dcore; + if ((retflag2 = eclipse_where(tret[4], SE_SUN, NULL, ifl, geopos, dcore, serr)) == ERR) + return retflag2; + dc[1] = *dcore; + if ((retflag2 = eclipse_where(tret[5], SE_SUN, NULL, ifl, geopos, dcore, serr)) == ERR) + return retflag2; + dc[2] = *dcore; + /* the maximum is always total, and there is either one or + * to times before and after, when the core shadow becomes + * zero and totality changes into annularity or vice versa. + */ + if (dc[0] * dc[1] < 0 || dc[0] * dc[2] < 0) { + retflag |= SE_ECL_ANNULAR_TOTAL; + retflag &= ~SE_ECL_TOTAL; + } + } + /* if eclipse is given but not wanted: */ + if (!(ifltype & SE_ECL_TOTAL) && (retflag & SE_ECL_TOTAL)) { + K += direction; + goto next_try; + } + /* if annular_total eclipse is given but not wanted: */ + if (!(ifltype & SE_ECL_ANNULAR_TOTAL) && (retflag & SE_ECL_ANNULAR_TOTAL)) { + K += direction; + goto next_try; + } + /* + * time of maximum eclipse at local apparent noon + */ + /* first, find out, if there is a solar transit + * between begin and end of eclipse */ + k = 2; + for (i = 0; i < 2; i++) { + j = i + k; + tt = tret[j] + swe_deltat(tret[j]); + if (swe_calc(tt, SE_SUN, iflag, ls, serr) == ERR) + return ERR; + if (swe_calc(tt, SE_MOON, iflag, lm, serr) == ERR) + return ERR; + dc[i] = swe_degnorm(ls[0] - lm[0]); + if (dc[i] > 180) + dc[i] -= 360; + } + if (dc[0] * dc[1] >= 0) /* no transit */ + tret[1] = 0; + else { + tjd = tjds; + dt = 0.1; + dt1 = (tret[3] - tret[2]) / 2.0; + if (dt1 < dt) + dt = dt1 / 2.0; + for (j = 0; + dt > 0.01; + j++, dt /= 3) { + for (i = 0, t = tjd; i <= 1; i++, t -= dt) { + tt = t + swe_deltat(t); + if (swe_calc(tt, SE_SUN, iflag, ls, serr) == ERR) + return ERR; + if (swe_calc(tt, SE_MOON, iflag, lm, serr) == ERR) + return ERR; + dc[i] = swe_degnorm(ls[0] - lm[0]); + if (dc[i] > 180) + dc[i] -= 360; + if (dc[i] > 180) + dc[i] -= 360; + } + a = (dc[1] - dc[0]) / dt; + if (a < 1e-10) + break; + dt1 = dc[0] / a; + tjd += dt1; + } + tret[1] = tjd; + } +end_search_global: + return retflag; + /* + * the time of maximum occultation is practically identical + * with the time of maximum core shadow diameter. + * + * the time, when duration of totality is maximal, + * is not an interesting computation either. Near the maximum + * occulation, the time of totality can be the same by + * a second for hundreds of kilometers (for 10 minutes + * or more). + * + * for annular eclipses the maximum duration is close to the + * beginning and the end of the center lines, where is also + * the minimum of core shadow diameter. + */ +} + +/* When is the next lunar occultation anywhere on earth? + * This function also finds solar eclipses, but is less efficient + * than swe_sol_eclipse_when_glob(). + * + * input parameters: + * + * tjd_start start time for search (UT) + * ipl planet number of occulted body + * starname name of occulted star. Must be NULL or "", if a planetary + * occultation is to be calculated. For the use of this + * field, also see swe_fixstar(). + * ifl ephemeris to be used (SEFLG_SWIEPH, etc.) + * ephemeris flag. + * + * ifltype eclipse type to be searched (SE_ECL_TOTAL, etc.) + * 0, if any type of eclipse is wanted + * this functionality also works with occultations + * + * backward if 1, causes search backward in time + * + * If you want to have only one conjunction + * of the moon with the body tested, add the following flag: + * backward |= SE_ECL_ONE_TRY. If this flag is not set, + * the function will search for an occultation until it + * finds one. For bodies with ecliptical latitudes > 5, + * the function may search successlessly until it reaches + * the end of the ephemeris. + * (Note: we do not add SE_ECL_ONE_TRY to ifl, because + * ifl may contain SEFLG_TOPOCTR (=SE_ECL_ONE_TRY) from + * the parameter iflag of swe_calc() etc. Although the + * topocentric flag is irrelevant here, it might cause + * confusion.) + * + * return values: + * + * retflag SE_ECL_TOTAL or SE_ECL_ANNULAR or SE_ECL_PARTIAL + * or SE_ECL_ANNULAR_TOTAL + * SE_ECL_CENTRAL + * SE_ECL_NONCENTRAL + * + * tret[0] time of maximum eclipse + * tret[1] time, when eclipse takes place at local apparent noon + * tret[2] time of eclipse begin + * tret[3] time of eclipse end + * tret[4] time of totality begin + * tret[5] time of totality end + * tret[6] time of center line begin + * tret[7] time of center line end + * tret[8] time when annular-total eclipse becomes total + * not implemented so far + * tret[9] time when annular-total eclipse becomes annular again + * not implemented so far + * declare as tret[10] at least! + * + */ +int32 FAR PASCAL_CONV swe_lun_occult_when_glob( + double tjd_start, int32 ipl, char *starname, int32 ifl, int32 ifltype, + double *tret, int32 backward, char *serr) +{ + int i, j, k, m, n, o, i1, i2; + int32 retflag = 0, retflag2 = 0; + double de = 6378.140, a; + double t, tt, tjd = 0, tjds, dt, dtint, dta, dtb; + double drad; + double xs[6], xm[6], ls[6], lm[6]; + double rmoon, rsun, dcore[10]; + double dc[20], dctr; + double twohr = 2.0 / 24.0; + double tenmin = 10.0 / 24.0 / 60.0; + double dt1, dt2, dadd = 10, dadd2 = 6; + int nstartpos = 10; + double geopos[20]; + double dtstart, dtdiv; + int direction = 1; + char s[AS_MAXCH]; + int32 iflag, iflagcart; + AS_BOOL dont_times = FALSE; + int32 one_try = backward & SE_ECL_ONE_TRY; +/*if (backward & SEI_OCC_FAST) + dont_times = TRUE; */ + /* function calls for Pluto with asteroid number 134340 + * are treated as calls for Pluto as main body SE_PLUTO */ + if (ipl == SE_AST_OFFSET + 134340) + ipl = SE_PLUTO; + ifl &= SEFLG_EPHMASK; + iflag = SEFLG_EQUATORIAL | ifl; + iflagcart = iflag | SEFLG_XYZ; + backward &= 1L; + /* + * initializations + */ + if (ifltype == (SE_ECL_PARTIAL | SE_ECL_CENTRAL)) { + if (serr != NULL) + strcpy(serr, "central partial eclipses do not exist"); + return ERR; + } + if (ifltype == 0) + ifltype = SE_ECL_TOTAL | SE_ECL_ANNULAR | SE_ECL_PARTIAL + | SE_ECL_ANNULAR_TOTAL | SE_ECL_NONCENTRAL | SE_ECL_CENTRAL; + retflag = 0; + for (i = 0; i <= 9; i++) + tret[i] = 0; + if (backward) + direction = -1; + t = tjd_start - direction * 0.001; +next_try: + for (i = 0; i < nstartpos; i++, t += direction * dadd2) { + if (calc_planet_star(t, ipl, starname, iflagcart, xs, serr) == ERR) + return ERR; + if (swe_calc(t, SE_MOON, iflagcart, xm, serr) == ERR) + return ERR; + dc[i] = acos(swi_dot_prod_unit(xs, xm)) * RADTODEG; + if (i > 1 && dc[i] > dc[i-1] && dc[i-2] > dc[i-1]) { + tjd = t - direction * dadd2; + break; + } else if (i == nstartpos-1) { + /*for (j = 0; j < nstartpos; j++) + printf("%f ", dc[j]);*/ + if (serr != NULL) { + if (starname != NULL && *starname != '\0') + strcpy(s, starname); + else + swe_get_planet_name(ipl , s); + sprintf(serr, "error in swe_lun_occult_when_glob(): conjunction of moon with planet %s not found\n", s); + } + return ERR; + } + } + /* + * radius of planet disk in AU + */ + if (starname != NULL && *starname != '\0') + drad = 0; + else if (ipl < NDIAM) + drad = pla_diam[ipl] / 2 / AUNIT; + else if (ipl > SE_AST_OFFSET) + drad = swed.ast_diam / 2 * 1000 / AUNIT; /* km -> m -> AU */ + else + drad = 0; + /* + * time of maximum eclipse (if eclipse) = + * minimum geocentric angle between sun and moon edges. + * After this time has been determined, check + * whether or not an eclipse is taking place with + * the functions eclipse_where() and _how(). + */ + dtstart = dadd2; /* originally 1 */ + dtdiv = 3; + for (dt = dtstart; + dt > 0.0001; + dt /= dtdiv) { + for (i = 0, t = tjd - dt; i <= 2; i++, t += dt) { + if (calc_planet_star(t, ipl, starname, iflag, ls, serr) == ERR) + return ERR; + if (swe_calc(t, SE_MOON, iflag, lm, serr) == ERR) + return ERR; + if (calc_planet_star(t, ipl, starname, iflagcart, xs, serr) == ERR) + return ERR; + if (swe_calc(t, SE_MOON, iflagcart, xm, serr) == ERR) + return ERR; + dc[i] = acos(swi_dot_prod_unit(xs, xm)) * RADTODEG; + rmoon = asin(RMOON / lm[2]) * RADTODEG; + rsun = asin(drad / ls[2]) * RADTODEG; + dc[i] -= (rmoon + rsun); + } + find_maximum(dc[0], dc[1], dc[2], dt, &dtint, &dctr); + tjd += dtint + dt; + } + tjd -= swe_deltat(tjd); + tjds = tjd; + if ((retflag = eclipse_where(tjd, ipl, starname, ifl, geopos, dcore, serr)) == ERR) + return retflag; + retflag2 = retflag; + /* in extreme cases _where() returns no eclipse, where there is + * actually a very small one, therefore call _how() with the + * coordinates returned by _where(): */ + /* if ((retflag2 = eclipse_how(tjd, ipl, starname, ifl, geopos[0], geopos[1], 0, attr, serr)) == ERR) + return retflag2; */ + if (retflag2 == 0) { + /* only one try! */ + if (one_try) { + tret[0] = tjd; + return 0; + } + t= tjd + direction * dadd; + goto next_try; + } + tret[0] = tjd; + if ((backward && tret[0] >= tjd_start - 0.0001) + || (!backward && tret[0] <= tjd_start + 0.0001)) { + t= tjd + direction * dadd; + goto next_try; + } + /* + * eclipse type, SE_ECL_TOTAL, _ANNULAR, etc. + * SE_ECL_ANNULAR_TOTAL will be discovered later + */ + if ((retflag = eclipse_where(tjd, ipl, starname, ifl, geopos, dcore, serr)) == ERR) + return retflag; + if (retflag == 0) { /* can happen with extremely small percentage */ + retflag = SE_ECL_PARTIAL | SE_ECL_NONCENTRAL; + tret[4] = tret[5] = tjd; /* fix this ???? */ + dont_times = TRUE; + } + /* + * check whether or not eclipse type found is wanted + */ + /* non central eclipse is wanted: */ + if (!(ifltype & SE_ECL_NONCENTRAL) && (retflag & SE_ECL_NONCENTRAL)) { + t= tjd + direction * dadd; + goto next_try; + } + /* central eclipse is wanted: */ + if (!(ifltype & SE_ECL_CENTRAL) && (retflag & SE_ECL_CENTRAL)) { + t= tjd + direction * dadd; + goto next_try; + } + /* non annular eclipse is wanted: */ + if (!(ifltype & SE_ECL_ANNULAR) && (retflag & SE_ECL_ANNULAR)) { + t= tjd + direction * dadd; + goto next_try; + } + /* non partial eclipse is wanted: */ + if (!(ifltype & SE_ECL_PARTIAL) && (retflag & SE_ECL_PARTIAL)) { + t= tjd + direction * dadd; + goto next_try; + } + /* annular-total eclipse will be discovered later */ + if (!(ifltype & (SE_ECL_TOTAL | SE_ECL_ANNULAR_TOTAL)) && (retflag & SE_ECL_TOTAL)) { + t= tjd + direction * dadd; + goto next_try; + } + if (dont_times) + goto end_search_global; + /* + * n = 0: times of eclipse begin and end + * n = 1: times of totality begin and end + * n = 2: times of center line begin and end + */ + if (retflag & SE_ECL_PARTIAL) + o = 0; + else if (retflag & SE_ECL_NONCENTRAL) + o = 1; + else + o = 2; + dta = twohr; + dtb = tenmin; + for (n = 0; n <= o; n++) { + if (n == 0) { + /*dc[1] = dcore[3] / 2 + de - dcore[1];*/ + i1 = 2; i2 = 3; + } else if (n == 1) { + if (retflag & SE_ECL_PARTIAL) + continue; + i1 = 4; i2 = 5; + } else if (n == 2) { + if (retflag & SE_ECL_NONCENTRAL) + continue; + i1 = 6; i2 = 7; + } + for (i = 0, t = tjd - dta; i <= 2; i += 1, t += dta) { + if ((retflag2 = eclipse_where(t, ipl, starname, ifl, geopos, dcore, serr)) == ERR) + return retflag2; + if (n == 0) + dc[i] = dcore[4] / 2 + de / dcore[5] - dcore[2]; + else if (n == 1) + dc[i] = fabs(dcore[3]) / 2 + de / dcore[6] - dcore[2]; + else if (n == 2) + dc[i] = de / dcore[6] - dcore[2]; + } + find_zero(dc[0], dc[1], dc[2], dta, &dt1, &dt2); + tret[i1] = tjd + dt1 + dta; + tret[i2] = tjd + dt2 + dta; + for (m = 0, dt = dtb; m < 3; m++, dt /= 3) { + for (j = i1; j <= i2; j += (i2 - i1)) { + for (i = 0, t = tret[j] - dt; i < 2; i++, t += dt) { + if ((retflag2 = eclipse_where(t, ipl, starname, ifl, geopos, dcore, serr)) == ERR) + return retflag2; + if (n == 0) + dc[i] = dcore[4] / 2 + de / dcore[5] - dcore[2]; + else if (n == 1) + dc[i] = fabs(dcore[3]) / 2 + de / dcore[6] - dcore[2]; + else if (n == 2) + dc[i] = de / dcore[6] - dcore[2]; + } + dt1 = dc[1] / ((dc[1] - dc[0]) / dt); + tret[j] -= dt1; + } + } + } + /* + * annular-total eclipses + */ + if (retflag & SE_ECL_TOTAL) { + if ((retflag2 = eclipse_where(tret[0], ipl, starname, ifl, geopos, dcore, serr)) == ERR) + return retflag2; + dc[0] = *dcore; + if ((retflag2 = eclipse_where(tret[4], ipl, starname, ifl, geopos, dcore, serr)) == ERR) + return retflag2; + dc[1] = *dcore; + if ((retflag2 = eclipse_where(tret[5], ipl, starname, ifl, geopos, dcore, serr)) == ERR) + return retflag2; + dc[2] = *dcore; + /* the maximum is always total, and there is either one or + * to times before and after, when the core shadow becomes + * zero and totality changes into annularity or vice versa. + */ + if (dc[0] * dc[1] < 0 || dc[0] * dc[2] < 0) { + retflag |= SE_ECL_ANNULAR_TOTAL; + retflag &= ~SE_ECL_TOTAL; + } + } + /* if eclipse is given but not wanted: */ + if (!(ifltype & SE_ECL_TOTAL) && (retflag & SE_ECL_TOTAL)) { + t= tjd + direction * dadd; + goto next_try; + } + /* if annular_total eclipse is given but not wanted: */ + if (!(ifltype & SE_ECL_ANNULAR_TOTAL) && (retflag & SE_ECL_ANNULAR_TOTAL)) { + t= tjd + direction * dadd; + goto next_try; + } + /* + * time of maximum eclipse at local apparent noon + */ + /* first, find out, if there is a solar transit + * between begin and end of eclipse */ + k = 2; + for (i = 0; i < 2; i++) { + j = i + k; + tt = tret[j] + swe_deltat(tret[j]); + if (calc_planet_star(tt, ipl, starname, iflag, ls, serr) == ERR) + return ERR; + if (swe_calc(tt, SE_MOON, iflag, lm, serr) == ERR) + return ERR; + dc[i] = swe_degnorm(ls[0] - lm[0]); + if (dc[i] > 180) + dc[i] -= 360; + } + if (dc[0] * dc[1] >= 0) /* no transit */ + tret[1] = 0; + else { + tjd = tjds; + dt = 0.1; + dt1 = (tret[3] - tret[2]) / 2.0; + if (dt1 < dt) + dt = dt1 / 2.0; + for (j = 0; + dt > 0.01; + j++, dt /= 3) { + for (i = 0, t = tjd; i <= 1; i++, t -= dt) { + tt = t + swe_deltat(t); + if (calc_planet_star(tt, ipl, starname, iflag, ls, serr) == ERR) + return ERR; + if (swe_calc(tt, SE_MOON, iflag, lm, serr) == ERR) + return ERR; + dc[i] = swe_degnorm(ls[0] - lm[0]); + if (dc[i] > 180) + dc[i] -= 360; + if (dc[i] > 180) + dc[i] -= 360; + } + a = (dc[1] - dc[0]) / dt; + if (a < 1e-10) + break; + dt1 = dc[0] / a; + tjd += dt1; + } + tret[1] = tjd; + } +end_search_global: + return retflag; + /* + * the time of maximum occultation is practically identical + * with the time of maximum core shadow diameter. + * + * the time, when duration of totality is maximal, + * is not an interesting computation either. Near the maximum + * occulation, the time of totality can be the same by + * a second for hundreds of kilometers (for 10 minutes + * or more). + * + * for annular eclipses the maximum duration is close to the + * beginning and the end of the center lines, where is also + * the minimum of core shadow diameter. + */ +} + +/* When is the next solar eclipse at a given geographical position? + * Note the uncertainty of Delta T for the remote past and for + * the future. + * + * retflag SE_ECL_TOTAL or SE_ECL_ANNULAR or SE_ECL_PARTIAL + * SE_ECL_VISIBLE, + * SE_ECL_MAX_VISIBLE, + * SE_ECL_1ST_VISIBLE, SE_ECL_2ND_VISIBLE + * SE_ECL_3ST_VISIBLE, SE_ECL_4ND_VISIBLE + * + * tret[0] time of maximum eclipse + * tret[1] time of first contact + * tret[2] time of second contact + * tret[3] time of third contact + * tret[4] time of forth contact + * tret[5] time of sun rise between first and forth contact + * tret[6] time of sun set beween first and forth contact + * + * attr[0] fraction of solar diameter covered by moon; + * with total/annular eclipses, it results in magnitude acc. to IMCCE. + * attr[1] ratio of lunar diameter to solar one + * attr[2] fraction of solar disc covered by moon (obscuration) + * attr[3] diameter of core shadow in km + * attr[4] azimuth of sun at tjd + * attr[5] true altitude of sun above horizon at tjd + * attr[6] apparent altitude of sun above horizon at tjd + * attr[7] elongation of moon in degrees + * attr[8] magnitude acc. to NASA; + * = attr[0] for partial and attr[1] for annular and total eclipses + * attr[9] saros series number + * attr[10] saros series member number + * declare as attr[20] at least ! + */ +int32 FAR PASCAL_CONV swe_sol_eclipse_when_loc(double tjd_start, int32 ifl, + double *geopos, double *tret, double *attr, int32 backward, char *serr) +{ + int32 retflag = 0, retflag2 = 0; + double geopos2[20], dcore[10]; + ifl &= SEFLG_EPHMASK; + if ((retflag = eclipse_when_loc(tjd_start, ifl, geopos, tret, attr, backward, serr)) <= 0) + return retflag; + /* + * diameter of core shadow + */ + if ((retflag2 = eclipse_where(tret[0], SE_SUN, NULL, ifl, geopos2, dcore, serr)) == ERR) + return retflag2; + retflag |= (retflag2 & SE_ECL_NONCENTRAL); + attr[3] = dcore[0]; + return retflag; +} + +/* Same declaration as swe_sol_eclipse_when_loc(). + * In addition: + * int32 ipl planet number of occulted body + * char* starname name of occulted star. Must be NULL or "", if a planetary + * occultation is to be calculated. For the use of this + * field, also see swe_fixstar(). + * int32 ifl ephemeris flag. If you want to have only one conjunction + * of the moon with the body tested, add the following flag: + * backward |= SE_ECL_ONE_TRY. If this flag is not set, + * the function will search for an occultation until it + * finds one. For bodies with ecliptical latitudes > 5, + * the function may search unsuccessfully until it reaches + * the end of the ephemeris. + */ +int32 FAR PASCAL_CONV swe_lun_occult_when_loc(double tjd_start, int32 ipl, char *starname, int32 ifl, + double *geopos, double *tret, double *attr, int32 backward, char *serr) +{ + int32 retflag = 0, retflag2 = 0; + double geopos2[20], dcore[10]; + /* function calls for Pluto with asteroid number 134340 + * are treated as calls for Pluto as main body SE_PLUTO */ + if (ipl == SE_AST_OFFSET + 134340) + ipl = SE_PLUTO; + ifl &= SEFLG_EPHMASK; + if ((retflag = occult_when_loc(tjd_start, ipl, starname, ifl, geopos, tret, attr, backward, serr)) <= 0) + return retflag; + /* + * diameter of core shadow + */ + if ((retflag2 = eclipse_where(tret[0], ipl, starname, ifl, geopos2, dcore, serr)) == ERR) + return retflag2; + retflag |= (retflag2 & SE_ECL_NONCENTRAL); + attr[3] = dcore[0]; + return retflag; +} + +static int32 eclipse_when_loc(double tjd_start, int32 ifl, double *geopos, double *tret, double *attr, int32 backward, char *serr) +{ + int i, j, k, m; + int32 retflag = 0, retc; + double t, tjd, dt, dtint, K, T, T2, T3, T4, F, M, Mm; + double tjdr, tjds; + double E, Ff, A1, Om; + double xs[6], xm[6], ls[6], lm[6], x1[6], x2[6], dm, ds; + double rmoon, rsun, rsplusrm, rsminusrm; + double dc[3], dctr, dctrmin; + double twomin = 2.0 / 24.0 / 60.0; + double tensec = 10.0 / 24.0 / 60.0 / 60.0; + double twohr = 2.0 / 24.0; + double tenmin = 10.0 / 24.0 / 60.0; + double dt1, dt2, dtdiv, dtstart; + int32 iflag = SEFLG_EQUATORIAL | SEFLG_TOPOCTR | ifl; + int32 iflagcart = iflag | SEFLG_XYZ; + swe_set_topo(geopos[0], geopos[1], geopos[2]); + K = (int) ((tjd_start - J2000) / 365.2425 * 12.3685); + if (backward) + K++; + else + K--; +next_try: + T = K / 1236.85; + T2 = T * T; T3 = T2 * T; T4 = T3 * T; + Ff = F = swe_degnorm(160.7108 + 390.67050274 * K + - 0.0016341 * T2 + - 0.00000227 * T3 + + 0.000000011 * T4); + if (Ff > 180) + Ff -= 180; + if (Ff > 21 && Ff < 159) { /* no eclipse possible */ + if (backward) + K--; + else + K++; + goto next_try; + } + /* approximate time of geocentric maximum eclipse. + * formula from Meeus, German, p. 381 */ + tjd = 2451550.09765 + 29.530588853 * K + + 0.0001337 * T2 + - 0.000000150 * T3 + + 0.00000000073 * T4; + M = swe_degnorm(2.5534 + 29.10535669 * K + - 0.0000218 * T2 + - 0.00000011 * T3); + Mm = swe_degnorm(201.5643 + 385.81693528 * K + + 0.1017438 * T2 + + 0.00001239 * T3 + + 0.000000058 * T4); + Om = swe_degnorm(124.7746 - 1.56375580 * K + + 0.0020691 * T2 + + 0.00000215 * T3); + E = 1 - 0.002516 * T - 0.0000074 * T2; + A1 = swe_degnorm(299.77 + 0.107408 * K - 0.009173 * T2); + M *= DEGTORAD; + Mm *= DEGTORAD; + F *= DEGTORAD; + Om *= DEGTORAD; + A1 *= DEGTORAD; + tjd = tjd - 0.4075 * sin(Mm) + + 0.1721 * E * sin(M); + swe_set_topo(geopos[0], geopos[1], geopos[2]); + dtdiv = 2; + dtstart = 0.5; + if (tjd < 1900000) /* because above formula is not good (delta t?) */ + dtstart = 2; + for (dt = dtstart; + dt > 0.00001; + dt /= dtdiv) { + if (dt < 0.1) + dtdiv = 3; + for (i = 0, t = tjd - dt; i <= 2; i++, t += dt) { + /* this takes some time, but is necessary to avoid + * missing an eclipse */ + if (swe_calc(t, SE_SUN, iflagcart, xs, serr) == ERR) + return ERR; + if (swe_calc(t, SE_SUN, iflag, ls, serr) == ERR) + return ERR; + if (swe_calc(t, SE_MOON, iflagcart, xm, serr) == ERR) + return ERR; + if (swe_calc(t, SE_MOON, iflag, lm, serr) == ERR) + return ERR; + dm = sqrt(square_sum(xm)); + ds = sqrt(square_sum(xs)); + for (k = 0; k < 3; k++) { + x1[k] = xs[k] / ds /*ls[2]*/; + x2[k] = xm[k] / dm /*lm[2]*/; + } + dc[i] = acos(swi_dot_prod_unit(x1, x2)) * RADTODEG; + } + find_maximum(dc[0], dc[1], dc[2], dt, &dtint, &dctr); + tjd += dtint + dt; + } + if (swe_calc(tjd, SE_SUN, iflagcart, xs, serr) == ERR) + return ERR; + if (swe_calc(tjd, SE_SUN, iflag, ls, serr) == ERR) + return ERR; + if (swe_calc(tjd, SE_MOON, iflagcart, xm, serr) == ERR) + return ERR; + if (swe_calc(tjd, SE_MOON, iflag, lm, serr) == ERR) + return ERR; + dctr = acos(swi_dot_prod_unit(xs, xm)) * RADTODEG; + rmoon = asin(RMOON / lm[2]) * RADTODEG; + rsun = asin(RSUN / ls[2]) * RADTODEG; + rsplusrm = rsun + rmoon; + rsminusrm = rsun - rmoon; + if (dctr > rsplusrm) { + if (backward) + K--; + else + K++; + goto next_try; + } + tret[0] = tjd - swe_deltat(tjd); + if ((backward && tret[0] >= tjd_start - 0.0001) + || (!backward && tret[0] <= tjd_start + 0.0001)) { + if (backward) + K--; + else + K++; + goto next_try; + } + if (dctr < rsminusrm) + retflag = SE_ECL_ANNULAR; + else if (dctr < fabs(rsminusrm)) + retflag = SE_ECL_TOTAL; + else if (dctr <= rsplusrm) + retflag = SE_ECL_PARTIAL; + dctrmin = dctr; + /* contacts 2 and 3 */ + if (dctr > fabs(rsminusrm)) /* partial, no 2nd and 3rd contact */ + tret[2] = tret[3] = 0; + else { + dc[1] = fabs(rsminusrm) - dctrmin; + for (i = 0, t = tjd - twomin; i <= 2; i += 2, t = tjd + twomin) { + if (swe_calc(t, SE_SUN, iflagcart, xs, serr) == ERR) + return ERR; + if (swe_calc(t, SE_MOON, iflagcart, xm, serr) == ERR) + return ERR; + dm = sqrt(square_sum(xm)); + ds = sqrt(square_sum(xs)); + rmoon = asin(RMOON / dm) * RADTODEG; + rmoon *= 0.99916; /* gives better accuracy for 2nd/3rd contacts */ + rsun = asin(RSUN / ds) * RADTODEG; + rsminusrm = rsun - rmoon; + for (k = 0; k < 3; k++) { + x1[k] = xs[k] / ds /*ls[2]*/; + x2[k] = xm[k] / dm /*lm[2]*/; + } + dctr = acos(swi_dot_prod_unit(x1, x2)) * RADTODEG; + dc[i] = fabs(rsminusrm) - dctr; + } + find_zero(dc[0], dc[1], dc[2], twomin, &dt1, &dt2); + tret[2] = tjd + dt1 + twomin; + tret[3] = tjd + dt2 + twomin; + for (m = 0, dt = tensec; m < 2; m++, dt /= 10) { + for (j = 2; j <= 3; j++) { + if (swe_calc(tret[j], SE_SUN, iflagcart | SEFLG_SPEED, xs, serr) == ERR) + return ERR; + if (swe_calc(tret[j], SE_MOON, iflagcart | SEFLG_SPEED, xm, serr) == ERR) + return ERR; + for (i = 0; i < 2; i++) { + if (i == 1) { + for(k = 0; k < 3; k++) { + xs[k] -= xs[k+3] * dt; + xm[k] -= xm[k+3] * dt; + } + } + dm = sqrt(square_sum(xm)); + ds = sqrt(square_sum(xs)); + rmoon = asin(RMOON / dm) * RADTODEG; + rmoon *= 0.99916; /* gives better accuracy for 2nd/3rd contacts */ + rsun = asin(RSUN / ds) * RADTODEG; + rsminusrm = rsun - rmoon; + for (k = 0; k < 3; k++) { + x1[k] = xs[k] / ds /*ls[2]*/; + x2[k] = xm[k] / dm /*lm[2]*/; + } + dctr = acos(swi_dot_prod_unit(x1, x2)) * RADTODEG; + dc[i] = fabs(rsminusrm) - dctr; + } + dt1 = -dc[0] / ((dc[0] - dc[1]) / dt); + tret[j] += dt1; + } + } + tret[2] -= swe_deltat(tret[2]); + tret[3] -= swe_deltat(tret[3]); + } + /* contacts 1 and 4 */ + dc[1] = rsplusrm - dctrmin; + for (i = 0, t = tjd - twohr; i <= 2; i += 2, t = tjd + twohr) { + if (swe_calc(t, SE_SUN, iflagcart, xs, serr) == ERR) + return ERR; + if (swe_calc(t, SE_MOON, iflagcart, xm, serr) == ERR) + return ERR; + dm = sqrt(square_sum(xm)); + ds = sqrt(square_sum(xs)); + rmoon = asin(RMOON / dm) * RADTODEG; + rsun = asin(RSUN / ds) * RADTODEG; + rsplusrm = rsun + rmoon; + for (k = 0; k < 3; k++) { + x1[k] = xs[k] / ds /*ls[2]*/; + x2[k] = xm[k] / dm /*lm[2]*/; + } + dctr = acos(swi_dot_prod_unit(x1, x2)) * RADTODEG; + dc[i] = rsplusrm - dctr; + } + find_zero(dc[0], dc[1], dc[2], twohr, &dt1, &dt2); + tret[1] = tjd + dt1 + twohr; + tret[4] = tjd + dt2 + twohr; + for (m = 0, dt = tenmin; m < 3; m++, dt /= 10) { + for (j = 1; j <= 4; j += 3) { + if (swe_calc(tret[j], SE_SUN, iflagcart | SEFLG_SPEED, xs, serr) == ERR) + return ERR; + if (swe_calc(tret[j], SE_MOON, iflagcart | SEFLG_SPEED, xm, serr) == ERR) + return ERR; + for (i = 0; i < 2; i++) { + if (i == 1) { + for(k = 0; k < 3; k++) { + xs[k] -= xs[k+3] * dt; + xm[k] -= xm[k+3] * dt; + } + } + dm = sqrt(square_sum(xm)); + ds = sqrt(square_sum(xs)); + rmoon = asin(RMOON / dm) * RADTODEG; + rsun = asin(RSUN / ds) * RADTODEG; + rsplusrm = rsun + rmoon; + for (k = 0; k < 3; k++) { + x1[k] = xs[k] / ds /*ls[2]*/; + x2[k] = xm[k] / dm /*lm[2]*/; + } + dctr = acos(swi_dot_prod_unit(x1, x2)) * RADTODEG; + dc[i] = fabs(rsplusrm) - dctr; + } + dt1 = -dc[0] / ((dc[0] - dc[1]) / dt); + tret[j] += dt1; + } + } + tret[1] -= swe_deltat(tret[1]); + tret[4] -= swe_deltat(tret[4]); + /* + * visibility of eclipse phases + */ + for (i = 4; i >= 0; i--) { /* attr for i = 0 must be kept !!! */ + if (tret[i] == 0) + continue; + if (eclipse_how(tret[i], SE_SUN, NULL, ifl, geopos[0], geopos[1], geopos[2], + attr, serr) == ERR) + return ERR; + /*if (retflag2 & SE_ECL_VISIBLE) { could be wrong for 1st/4th contact */ + if (attr[6] > 0) { /* this is save, sun above horizon, using app. alt. */ + retflag |= SE_ECL_VISIBLE; + switch(i) { + case 0: retflag |= SE_ECL_MAX_VISIBLE; break; + case 1: retflag |= SE_ECL_1ST_VISIBLE; break; + case 2: retflag |= SE_ECL_2ND_VISIBLE; break; + case 3: retflag |= SE_ECL_3RD_VISIBLE; break; + case 4: retflag |= SE_ECL_4TH_VISIBLE; break; + default: break; + } + } + } +#if 1 + if (!(retflag & SE_ECL_VISIBLE)) { + if (backward) + K--; + else + K++; + goto next_try; + } +#endif + if (swe_rise_trans(tret[1] - 0.1, SE_SUN, NULL, iflag, SE_CALC_RISE|SE_BIT_DISC_BOTTOM, geopos, 0, 0, &tjdr, serr) == ERR) + return ERR; + if (swe_rise_trans(tret[1] - 0.1, SE_SUN, NULL, iflag, SE_CALC_SET|SE_BIT_DISC_BOTTOM, geopos, 0, 0, &tjds, serr) == ERR) + return ERR; + if (tjdr > tret[1] && tjdr < tret[4]) { + tret[5] = tjdr; + if (!(retflag & SE_ECL_MAX_VISIBLE)) { + tret[0] = tjdr; + if ((retc = eclipse_how(tret[5], SE_SUN, NULL, ifl, geopos[0], geopos[1], geopos[2], attr, serr)) == ERR) + return ERR; + retflag &= ~(SE_ECL_TOTAL|SE_ECL_ANNULAR|SE_ECL_PARTIAL); + retflag |= (retc & (SE_ECL_TOTAL|SE_ECL_ANNULAR|SE_ECL_PARTIAL)); + } + } + if (tjds > tret[1] && tjds < tret[4]) { + tret[6] = tjds; + if (!(retflag & SE_ECL_MAX_VISIBLE)) { + tret[0] = tjds; + if ((retc = eclipse_how(tret[6], SE_SUN, NULL, ifl, geopos[0], geopos[1], geopos[2], attr, serr)) == ERR) + return ERR; + retflag &= ~(SE_ECL_TOTAL|SE_ECL_ANNULAR|SE_ECL_PARTIAL); + retflag |= (retc & (SE_ECL_TOTAL|SE_ECL_ANNULAR|SE_ECL_PARTIAL)); + } + } + return retflag; +} + +static int32 occult_when_loc( + double tjd_start, int32 ipl, char *starname, + int32 ifl, double *geopos, double *tret, double *attr, + int32 backward, char *serr) +{ + int i, j, k, m; + int32 retflag = 0; + double t, tjd, dt, dtint; + double tjdr, tjds; + double xs[6], xm[6], ls[6], lm[6], x1[6], x2[6], dm, ds; + double rmoon, rsun, rsplusrm, rsminusrm; + double dc[20], dctr, dctrmin; + double twomin = 2.0 / 24.0 / 60.0; + double tensec = 10.0 / 24.0 / 60.0 / 60.0; + double twohr = 2.0 / 24.0; + double tenmin = 10.0 / 24.0 / 60.0; + double dt1, dt2, dtdiv, dtstart; + double dadd2 = 6; + int nstartpos = 10; + double drad; + int32 iflag = SEFLG_TOPOCTR | ifl; + int32 iflaggeo = iflag & ~SEFLG_TOPOCTR; + int32 iflagcart = iflag | SEFLG_XYZ; + int32 iflagcartgeo = iflaggeo | SEFLG_XYZ; + int direction = 1; + int32 one_try = backward & SE_ECL_ONE_TRY; + AS_BOOL stop_after_this = FALSE; + backward &= 1L; + retflag = 0; + swe_set_topo(geopos[0], geopos[1], geopos[2]); + for (i = 0; i <= 9; i++) + tret[i] = 0; + if (backward) + direction = -1; + t = tjd_start - direction * 0.1; + tjd = tjd_start; +next_try: + for (i = 0; i < nstartpos; i++, t += direction * dadd2) { + if (calc_planet_star(t, ipl, starname, iflagcartgeo, xs, serr) == ERR) + return ERR; + if (swe_calc(t, SE_MOON, iflagcartgeo, xm, serr) == ERR) + return ERR; + dc[i] = acos(swi_dot_prod_unit(xs, xm)) * RADTODEG; + if (i > 1 && dc[i] > dc[i-1] && dc[i-2] > dc[i-1]) { + tjd = t - direction*dadd2; + break; + } else if (i == nstartpos-1) { + for (j = 0; j < nstartpos; j++) + printf("%f ", dc[j]); + printf("swe_lun_occult_when_loc(): problem planet\n"); + return ERR; + } + } + /* + * radius of planet disk in AU + */ + if (starname != NULL && *starname != '\0') + drad = 0; + else if (ipl < NDIAM) + drad = pla_diam[ipl] / 2 / AUNIT; + else if (ipl > SE_AST_OFFSET) + drad = swed.ast_diam / 2 * 1000 / AUNIT; /* km -> m -> AU */ + else + drad = 0; + /* now find out, if there is an occultation at our geogr. location */ + dtdiv = 3; + dtstart = dadd2; /* formerly 0.2 */ + for (dt = dtstart; + dt > 0.00001; + dt /= dtdiv) { + if (dt < 0.01) + dtdiv = 3; + for (i = 0, t = tjd - dt; i <= 2; i++, t += dt) { + /* this takes some time, but is necessary to avoid + * missing an eclipse */ + if (calc_planet_star(t, ipl, starname, iflagcart, xs, serr) == ERR) + return ERR; + if (calc_planet_star(t, ipl, starname, iflag, ls, serr) == ERR) + return ERR; + if (swe_calc(t, SE_MOON, iflagcart, xm, serr) == ERR) + return ERR; + if (swe_calc(t, SE_MOON, iflag, lm, serr) == ERR) + return ERR; + if (dt < 1 && fabs(ls[1] - lm[1]) > 2) { + if (one_try) { + stop_after_this = TRUE; + } else { + t = tjd + direction * 2; + goto next_try; + } + } + dc[i] = acos(swi_dot_prod_unit(xs, xm)) * RADTODEG; + rmoon = asin(RMOON / lm[2]) * RADTODEG; + rsun = asin(drad / ls[2]) * RADTODEG; + dc[i] -= (rmoon + rsun); + } + find_maximum(dc[0], dc[1], dc[2], dt, &dtint, &dctr); + tjd += dtint + dt; + } + if (stop_after_this) { /* has one_try = TRUE */ + tret[0] = tjd; + return 0; + } + if (calc_planet_star(tjd, ipl, starname, iflagcart, xs, serr) == ERR) + return ERR; + if (calc_planet_star(tjd, ipl, starname, iflag, ls, serr) == ERR) + return ERR; + if (swe_calc(tjd, SE_MOON, iflagcart, xm, serr) == ERR) + return ERR; + if (swe_calc(tjd, SE_MOON, iflag, lm, serr) == ERR) + return ERR; + dctr = acos(swi_dot_prod_unit(xs, xm)) * RADTODEG; + rmoon = asin(RMOON / lm[2]) * RADTODEG; + rsun = asin(drad / ls[2]) * RADTODEG; + rsplusrm = rsun + rmoon; + rsminusrm = rsun - rmoon; + if (dctr > rsplusrm) { + if (one_try) { + tret[0] = tjd; + return 0; + } + t = tjd + direction; + goto next_try; + } + tret[0] = tjd - swe_deltat(tjd); + if ((backward && tret[0] >= tjd_start - 0.0001) + || (!backward && tret[0] <= tjd_start + 0.0001)) { + t = tjd + direction; + goto next_try; + } + if (dctr < rsminusrm) + retflag = SE_ECL_ANNULAR; + else if (dctr < fabs(rsminusrm)) + retflag = SE_ECL_TOTAL; + else if (dctr <= rsplusrm) + retflag = SE_ECL_PARTIAL; + dctrmin = dctr; + /* contacts 2 and 3 */ + if (dctr > fabs(rsminusrm)) /* partial, no 2nd and 3rd contact */ + tret[2] = tret[3] = 0; + else { + dc[1] = fabs(rsminusrm) - dctrmin; + for (i = 0, t = tjd - twomin; i <= 2; i += 2, t = tjd + twomin) { + if (calc_planet_star(t, ipl, starname, iflagcart, xs, serr) == ERR) + return ERR; + if (swe_calc(t, SE_MOON, iflagcart, xm, serr) == ERR) + return ERR; + dm = sqrt(square_sum(xm)); + ds = sqrt(square_sum(xs)); + rmoon = asin(RMOON / dm) * RADTODEG; + rmoon *= 0.99916; /* gives better accuracy for 2nd/3rd contacts */ + rsun = asin(drad / ds) * RADTODEG; + rsminusrm = rsun - rmoon; + for (k = 0; k < 3; k++) { + x1[k] = xs[k] / ds /*ls[2]*/; + x2[k] = xm[k] / dm /*lm[2]*/; + } + dctr = acos(swi_dot_prod_unit(x1, x2)) * RADTODEG; + dc[i] = fabs(rsminusrm) - dctr; + } + find_zero(dc[0], dc[1], dc[2], twomin, &dt1, &dt2); + tret[2] = tjd + dt1 + twomin; + tret[3] = tjd + dt2 + twomin; + for (m = 0, dt = tensec; m < 2; m++, dt /= 10) { + for (j = 2; j <= 3; j++) { + if (calc_planet_star(tret[j], ipl, starname, iflagcart | SEFLG_SPEED, xs, serr) == ERR) + return ERR; + if (swe_calc(tret[j], SE_MOON, iflagcart | SEFLG_SPEED, xm, serr) == ERR) + return ERR; + for (i = 0; i < 2; i++) { + if (i == 1) { + for(k = 0; k < 3; k++) { + xs[k] -= xs[k+3] * dt; + xm[k] -= xm[k+3] * dt; + } + } + dm = sqrt(square_sum(xm)); + ds = sqrt(square_sum(xs)); + rmoon = asin(RMOON / dm) * RADTODEG; + rmoon *= 0.99916; /* gives better accuracy for 2nd/3rd contacts */ + rsun = asin(drad / ds) * RADTODEG; + rsminusrm = rsun - rmoon; + for (k = 0; k < 3; k++) { + x1[k] = xs[k] / ds /*ls[2]*/; + x2[k] = xm[k] / dm /*lm[2]*/; + } + dctr = acos(swi_dot_prod_unit(x1, x2)) * RADTODEG; + dc[i] = fabs(rsminusrm) - dctr; + } + dt1 = -dc[0] / ((dc[0] - dc[1]) / dt); + tret[j] += dt1; + } + } + tret[2] -= swe_deltat(tret[2]); + tret[3] -= swe_deltat(tret[3]); + } + /* contacts 1 and 4 */ + dc[1] = rsplusrm - dctrmin; + for (i = 0, t = tjd - twohr; i <= 2; i += 2, t = tjd + twohr) { + if (calc_planet_star(t, ipl, starname, iflagcart, xs, serr) == ERR) + return ERR; + if (swe_calc(t, SE_MOON, iflagcart, xm, serr) == ERR) + return ERR; + dm = sqrt(square_sum(xm)); + ds = sqrt(square_sum(xs)); + rmoon = asin(RMOON / dm) * RADTODEG; + rsun = asin(drad / ds) * RADTODEG; + rsplusrm = rsun + rmoon; + for (k = 0; k < 3; k++) { + x1[k] = xs[k] / ds /*ls[2]*/; + x2[k] = xm[k] / dm /*lm[2]*/; + } + dctr = acos(swi_dot_prod_unit(x1, x2)) * RADTODEG; + dc[i] = rsplusrm - dctr; + } + find_zero(dc[0], dc[1], dc[2], twohr, &dt1, &dt2); + tret[1] = tjd + dt1 + twohr; + tret[4] = tjd + dt2 + twohr; + for (m = 0, dt = tenmin; m < 3; m++, dt /= 10) { + for (j = 1; j <= 4; j += 3) { + if (calc_planet_star(tret[j], ipl, starname, iflagcart | SEFLG_SPEED, xs, serr) == ERR) + return ERR; + if (swe_calc(tret[j], SE_MOON, iflagcart | SEFLG_SPEED, xm, serr) == ERR) + return ERR; + for (i = 0; i < 2; i++) { + if (i == 1) { + for(k = 0; k < 3; k++) { + xs[k] -= xs[k+3] * dt; + xm[k] -= xm[k+3] * dt; + } + } + dm = sqrt(square_sum(xm)); + ds = sqrt(square_sum(xs)); + rmoon = asin(RMOON / dm) * RADTODEG; + rsun = asin(drad / ds) * RADTODEG; + rsplusrm = rsun + rmoon; + for (k = 0; k < 3; k++) { + x1[k] = xs[k] / ds /*ls[2]*/; + x2[k] = xm[k] / dm /*lm[2]*/; + } + dctr = acos(swi_dot_prod_unit(x1, x2)) * RADTODEG; + dc[i] = fabs(rsplusrm) - dctr; + } + dt1 = -dc[0] / ((dc[0] - dc[1]) / dt); + tret[j] += dt1; + } + } + tret[1] -= swe_deltat(tret[1]); + tret[4] -= swe_deltat(tret[4]); + /* + * visibility of eclipse phases + */ + for (i = 4; i >= 0; i--) { /* attr for i = 0 must be kept !!! */ + if (tret[i] == 0) + continue; + if (eclipse_how(tret[i], ipl, starname, ifl, geopos[0], geopos[1], geopos[2], + attr, serr) == ERR) + return ERR; + /*if (retflag2 & SE_ECL_VISIBLE) { could be wrong for 1st/4th contact */ + if (attr[6] > 0) { /* this is save, sun above horizon (using app. alt.) */ + retflag |= SE_ECL_VISIBLE; + switch(i) { + case 0: retflag |= SE_ECL_MAX_VISIBLE; break; + case 1: retflag |= SE_ECL_1ST_VISIBLE; break; + case 2: retflag |= SE_ECL_2ND_VISIBLE; break; + case 3: retflag |= SE_ECL_3RD_VISIBLE; break; + case 4: retflag |= SE_ECL_4TH_VISIBLE; break; + default: break; + } + } + } +#if 1 + if (!(retflag & SE_ECL_VISIBLE)) { + t = tjd + direction; + goto next_try; + } +#endif + if (swe_rise_trans(tret[1] - 0.1, ipl, starname, iflag, SE_CALC_RISE|SE_BIT_DISC_BOTTOM, geopos, 0, 0, &tjdr, serr) == ERR) + return ERR; + if (swe_rise_trans(tret[1] - 0.1, ipl, starname, iflag, SE_CALC_SET|SE_BIT_DISC_BOTTOM, geopos, 0, 0, &tjds, serr) == ERR) + return ERR; + if (tjdr > tret[1] && tjdr < tret[4]) + tret[5] = tjdr; + if (tjds > tret[1] && tjds < tret[4]) + tret[6] = tjds; + return retflag; +} + +/* + * swe_azalt() + * Computes azimut and height, from either ecliptic or + * equatorial coordinates + * + * input: + * tjd_ut + * iflag either SE_ECL2HOR or SE_EQU2HOR + * geopos[3] geograph. longitude, latitude, height above sea + * atpress atmospheric pressure at geopos in millibars (hPa) + * attemp atmospheric temperature in degrees C + * xin[2] input coordinates polar, in degrees + * + * Horizontal coordinates are returned in + * xaz[3] xaz[0] = azimuth + * xaz[1] = true altitude + * xaz[2] = apparent altitude + * + * If atpress is not given (= 0), the programm assumes 1013.25 mbar; + * if a non-zero height above sea is given, atpress is estimated. + * geohgt height of observer above sea (optional) + */ +void FAR PASCAL_CONV swe_azalt( + double tjd_ut, + int32 calc_flag, + double *geopos, + double atpress, + double attemp, + double *xin, + double *xaz) +{ + int i; + double x[6], xra[3]; + double armc = swe_degnorm(swe_sidtime(tjd_ut) * 15 + geopos[0]); + double mdd, eps_true, tjd_et; + for (i = 0; i < 2; i++) + xra[i] = xin[i]; + xra[2] = 1; + if (calc_flag == SE_ECL2HOR) { + tjd_et = tjd_ut + swe_deltat(tjd_ut); + swe_calc(tjd_et, SE_ECL_NUT, 0, x, NULL); + eps_true = x[0]; + swe_cotrans(xra, xra, -eps_true); + } + mdd = swe_degnorm(xra[0] - armc); + x[0] = swe_degnorm(mdd - 90); + x[1] = xra[1]; + x[2] = 1; + /* azimuth from east, counterclock */ + swe_cotrans(x, x, 90 - geopos[1]); + /* azimuth from south to west */ + x[0] = swe_degnorm(x[0] + 90); + xaz[0] = 360 - x[0]; + xaz[1] = x[1]; /* true height */ + if (atpress == 0) { + /* estimate atmospheric pressure */ + atpress = 1013.25 * pow(1 - 0.0065 * geopos[2] / 288, 5.255); + } + xaz[2] = swe_refrac_extended(x[1], geopos[2], atpress, attemp, const_lapse_rate, SE_TRUE_TO_APP, NULL); + /* xaz[2] = swe_refrac_extended(xaz[2], geopos[2], atpress, attemp, const_lapse_rate, SE_APP_TO_TRUE, NULL);*/ +} + +/* + * swe_azalt_rev() + * computes either ecliptical or equatorial coordinates from + * azimuth and true altitude in degrees. + * For conversion between true and apparent altitude, there is + * the function swe_refrac(). + * + * input: + * tjd_ut + * iflag either SE_HOR2ECL or SE_HOR2EQU + * xin[2] azimut and true altitude, in degrees + */ +void FAR PASCAL_CONV swe_azalt_rev( + double tjd_ut, + int32 calc_flag, + double *geopos, + double *xin, + double *xout) +{ + int i; + double x[6], xaz[3]; + double geolon = geopos[0]; + double geolat = geopos[1]; + double armc = swe_degnorm(swe_sidtime(tjd_ut) * 15 + geolon); + double eps_true, tjd_et, dang; + for (i = 0; i < 2; i++) + xaz[i] = xin[i]; + xaz[2] = 1; + /* azimuth is from south, clockwise. + * we need it from east, counterclock */ + xaz[0] = 360 - xaz[0]; + xaz[0] = swe_degnorm(xaz[0] - 90); + /* equatorial positions */ + dang = geolat - 90; + swe_cotrans(xaz, xaz, dang); + xaz[0] = swe_degnorm(xaz[0] + armc + 90); + xout[0] = xaz[0]; + xout[1] = xaz[1]; + /* ecliptic positions */ + if (calc_flag == SE_HOR2ECL) { + tjd_et = tjd_ut + swe_deltat(tjd_ut); + swe_calc(tjd_et, SE_ECL_NUT, 0, x, NULL); + eps_true = x[0]; + swe_cotrans(xaz, x, eps_true); + xout[0] = x[0]; + xout[1] = x[1]; + } +} + +/* swe_refrac() + * Transforms apparent to true altitude and vice-versa. + * These formulae do not handle the case when the + * sun is visible below the geometrical horizon + * (from a mountain top or an air plane) + * input: + * double inalt; * altitude of object in degrees * + * double atpress; * millibars (hectopascal) * + * double attemp; * degrees C * + * int32 calc_flag; * either SE_CALC_APP_TO_TRUE or + * * SE_CALC_TRUE_TO_APP + */ +double FAR PASCAL_CONV swe_refrac(double inalt, double atpress, double attemp, int32 calc_flag) +{ + double a, refr; + double pt_factor = atpress / 1010.0 * 283.0 / (273.0 + attemp); + double trualt, appalt; +#if 0 + /* + * -- S. L. Moshier */ + double y, yy0, D0, N, D, P, Q; + int i; + if (calc_flag == SE_TRUE_TO_APP) { + trualt = inalt; + if( (trualt < -2.0) || (trualt >= 90.0) ) + return(trualt); + /* For high altitude angle, AA page B61 + * Accuracy "usually about 0.1' ". + */ + if( trualt > 15.0 ) { + D = 0.00452*atpress/((273.0+attemp)*tan( DEGTORAD*trualt )); + return(trualt + D); + } + /* Formula for low altitude is from the Almanac for Computers. + * It gives the correction for observed altitude, so has + * to be inverted numerically to get the observed from the true. + * Accuracy about 0.2' for -20C < T < +40C and 970mb < P < 1050mb. + */ + /* Start iteration assuming correction = 0 + */ + y = trualt; + D = 0.0; + /* Invert Almanac for Computers formula numerically + */ + P = (atpress - 80.0)/930.0; + Q = 4.8e-3 * (attemp - 10.0); + yy0 = y; + D0 = D; + for( i=0; i<4; i++ ) { + N = y + (7.31/(y+4.4)); + N = 1.0/tan(DEGTORAD*N); + D = N*P/(60.0 + Q * (N + 39.0)); + N = y - yy0; + yy0 = D - D0 - N; /* denominator of derivative */ + if( (N != 0.0) && (yy0 != 0.0) ) + /* Newton iteration with numerically estimated derivative */ + N = y - N*(trualt + D - y)/yy0; + else + /* Can't do it on first pass */ + N = trualt + D; + yy0 = y; + D0 = D; + y = N; + } + return( trualt + D ); + } else { +#else + /* another algorithm, from Meeus, German, p. 114ff. + */ + if (calc_flag == SE_TRUE_TO_APP) { + trualt = inalt; + if (trualt > 15) { + a = tan((90 - trualt) * DEGTORAD); + refr = (58.276 * a - 0.0824 * a * a * a); + refr *= pt_factor / 3600.0; + } else if (trualt > -5) { + /* the following tan is not defined for a value + * of trualt near -5.00158 and 89.89158 */ + a = trualt + 10.3 / (trualt + 5.11); + if (a + 1e-10 >= 90) + refr = 0; + else + refr = 1.02 / tan(a * DEGTORAD); + refr *= pt_factor / 60.0; + } else + refr = 0; + appalt = trualt; + if (appalt + refr > 0) + appalt += refr; + return appalt; + } else { +#endif + /* apparent to true */ + appalt = inalt; + /* the following tan is not defined for a value + * of inalt near -4.3285 and 89.9225 */ + a = appalt + 7.31 / (appalt + 4.4); + if (a + 1e-10 >= 90) + refr = 0; + else { + refr = 1.00 / tan(a * DEGTORAD); + refr -= 0.06 * sin(14.7 * refr + 13); + } + refr *= pt_factor / 60.0; + trualt = appalt; + if (appalt - refr > 0) + trualt = appalt - refr; + return trualt; + } +} + +void FAR PASCAL_CONV swe_set_lapse_rate(double lapse_rate) +{ + const_lapse_rate = lapse_rate; +} + +/* swe_refrac_extended() + * + * This function was created thanks to and with the help of the + * archaeoastronomer Victor Reijs. + * It is more correct and more skilled than the old function swe_refrac(): + * - it allows correct calculation of refraction for altitudes above sea > 0, + * where the ideal horizon and planets that are visible may have a + * negative height. (for swe_refrac(), negative apparent heights do not + * exist!) + * - it allows to manipulate the refraction constant + * + * Transforms apparent to true altitude and vice-versa. + * input: + * double inalt; * altitude of object above geometric horizon in degrees* + * * geometric horizon = plane perpendicular to gravity * + * double geoalt; * altitude of observer above sea level in meters * + * double atpress; * millibars (hectopascal) * + * double lapse_rate; * (dT/dh) [deg K/m] + * double attemp; * degrees C * + * int32 calc_flag; * either SE_CALC_APP_TO_TRUE or + * * SE_CALC_TRUE_TO_APP + * + * function returns: + * case 1, conversion from true altitude to apparent altitude + * - apparent altitude, if body appears above is observable above ideal horizon + * - true altitude (the input value), otherwise + * "ideal horizon" is the horizon as seen above an ideal sphere (as seen + * from a plane over the ocean with a clear sky) + * case 2, conversion from apparent altitude to true altitude + * - the true altitude resulting from the input apparent altitude, if this value + * is a plausible apparent altitude, i.e. if it is a position above the ideal + * horizon + * - the input altitude otherwise + * + * in addition the array dret[] is given the following values + * - dret[0] true altitude, if possible; otherwise input value + * - dret[1] apparent altitude, if possible; otherwise input value + * - dret[2] refraction + * - dret[3] dip of the horizon + * + * The body is above the horizon if the dret[0] != dret[1] + */ +double FAR PASCAL_CONV swe_refrac_extended(double inalt, double geoalt, double atpress, double attemp, double lapse_rate, int32 calc_flag, double *dret) +{ + double refr; + double trualt; + double dip = calc_dip(geoalt, atpress, attemp, lapse_rate); + double D, D0, N, y, yy0; + int i; + /* make sure that inalt <=90 */ + if( (inalt>90) ) + inalt=180-inalt; + if (calc_flag == SE_TRUE_TO_APP) { + if (inalt < -10) { + if (dret != NULL) { + dret[0]=inalt; + dret[1]=inalt; + dret[2]=0; + dret[3]=dip; + } + return inalt; + } + /* by iteration */ + y = inalt; + D = 0.0; + yy0 = 0; + D0 = D; + for(i=0; i<5; i++) { + D = calc_astronomical_refr(y,atpress,attemp); + N = y - yy0; + yy0 = D - D0 - N; /* denominator of derivative */ + if (N != 0.0 && yy0 != 0.0) /* sic !!! code by Moshier */ + N = y - N*(inalt + D - y)/yy0; /* Newton iteration with numerically estimated derivative */ + else /* Can't do it on first pass */ + N = inalt + D; + yy0 = y; + D0 = D; + y = N; + } + refr = D; + if( (inalt + refr < dip) ) { + if (dret != NULL) { + dret[0]=inalt; + dret[1]=inalt; + dret[2]=0; + dret[3]=dip; + } + return inalt; + } + if (dret != NULL) { + dret[0]=inalt; + dret[1]=inalt+refr; + dret[2]=refr; + dret[3]=dip; + } + return inalt+refr; + } else { + refr = calc_astronomical_refr(inalt,atpress,attemp); + trualt=inalt-refr; + if (dret != NULL) { + if (inalt > dip) { + dret[0]=trualt; + dret[1]=inalt; + dret[2]=refr; + dret[3]=dip; + } else { + dret[0]=inalt; + dret[1]=inalt; + dret[2]=0; + dret[3]=dip; + } + } + if (trualt > dip) + return trualt; + else + return inalt; + } +} + +/* calculate the astronomical refraction + * input parameters: + * double inalt * apparent altitude of object + * double atpress * atmospheric pressure millibars (hectopascal) * + * double attemp * atmospheric temperature degrees C * + * returns double r in degrees +*/ +static double calc_astronomical_refr(double inalt,double atpress, double attemp) +{ +#if 0 + /* formula based on G.G. Bennett, The calculation of astronomical refraction in marine navigation, + * Journal of Inst. Navigation, No. 35, page 255-259, 1982, + * page 257 for refraction formula: formula H + * and page 259 for atmospheric compensation + */ + double refractaccent = 1/tan(DEGTORAD*(inalt + 7.31/(inalt+4.4))); + double r = (refractaccent - 0.06 * sin(DEGTORAD*(14.7*refractaccent +13))); + r = ((atpress - 80) / 930 / (1 + 0.00008 * (r + 39) * (attemp - 10)) * r)/60; + return r; +#else + /* Formula by Sinclair, see article mentioned above, p. 256. Better for + * apparent altitudes < 0; */ + double r; + if (inalt > 17.904104638432) { /* for continuous function, instead of '>15' */ + r = 0.97 / tan(inalt * DEGTORAD); + } else { + r = (34.46 + 4.23 * inalt + 0.004 * inalt * inalt) / (1 + 0.505 * inalt + 0.0845 * inalt * inalt); + } + r = ((atpress - 80) / 930 / (1 + 0.00008 * (r + 39) * (attemp - 10)) * r) / 60.0; + return r; +#endif +} + +/* calculate dip of the horizon + * input parameters: + * double geoalt * altitude of observer above sea level in meters * + * double atpress * atmospheric pressure millibars (hectopascal) * + * double attemp * atmospheric temperature degrees C * + * double lapse_rate * (dT/dh) [deg K/m] + * returns dip in degrees + */ +static double calc_dip(double geoalt, double atpress, double attemp, double lapse_rate) +{ + /* below formula is based on A. Thom, Megalithic lunar observations, 1973 (page 32). + * conversion to metric has been done by + * V. Reijs, 2000, http://www.iol.ie/~geniet/eng/refract.htm + */ + double krefr = (0.0342 + lapse_rate) / (0.154 * 0.0238); + double d = 1-1.8480*krefr*atpress/(273.16+attemp)/(273.16+attemp); + /* return -0.03203*sqrt(geoalt)*sqrt(d); */ + /* double a = acos(1/(1+geoalt/EARTH_RADIUS));*/ + return -180.0/PI * acos(1 / (1 + geoalt / EARTH_RADIUS)) * sqrt(d); +} + + +/* Computes attributes of a lunar eclipse for given tjd and geopos + * + * retflag SE_ECL_TOTAL or SE_ECL_PARTIAL + * SE_ECL_PENUMBRAL + * if 0, there is no eclipse + * + * attr[0] umbral magnitude at tjd + * attr[1] penumbral magnitude + * attr[4] azimuth of moon at tjd + * attr[5] true altitude of moon above horizon at tjd + * attr[6] apparent altitude of moon above horizon at tjd + * attr[7] distance of moon from opposition in degrees + * attr[8] umbral magnitude at tjd (= attr[0]) + * attr[9] saros series number + * attr[10] saros series member number + * declare as attr[20] at least ! + * + */ +int32 FAR PASCAL_CONV swe_lun_eclipse_how( + double tjd_ut, + int32 ifl, + double *geopos, + double *attr, + char *serr) +{ + double dcore[10]; + double lm[6], xaz[6]; + int32 retc; + /* attention: geopos[] is not used so far; may be NULL */ + if (geopos != NULL) + geopos[0] = geopos[0]; /* to shut up mint */ + ifl = ifl & ~SEFLG_TOPOCTR; + retc = lun_eclipse_how(tjd_ut, ifl, attr, dcore, serr); + if (geopos == NULL) + return retc; + /* + * azimuth and altitude of moon + */ + swe_set_topo(geopos[0], geopos[1], geopos[2]); + if (swe_calc_ut(tjd_ut, SE_MOON, ifl | SEFLG_TOPOCTR | SEFLG_EQUATORIAL, lm, serr) == ERR) + return ERR; + swe_azalt(tjd_ut, SE_EQU2HOR, geopos, 0, 10, lm, xaz); + attr[4] = xaz[0]; + attr[5] = xaz[1]; + attr[6] = xaz[2]; + if (xaz[2] <= 0) + retc = 0; + return retc; +} + +/* + * attr[]: see swe_lun_eclipse_how() + * + * dcore[0]: distance of shadow axis from geocenter r0 + * dcore[1]: diameter of core shadow on fundamental plane d0 + * dcore[2]: diameter of half-shadow on fundamental plane D0 + */ +static int32 lun_eclipse_how( + double tjd_ut, + int32 ifl, + double *attr, + double *dcore, + char *serr) +{ + int i, j, k; + int32 retc = 0; + double e[6], rm[6], rs[6]; + double dsm, d0, D0, s0, r0, ds, dm; + double dctr, x1[6], x2[6]; + double f1, f2; + double deltat, tjd, d; + double cosf1, cosf2; + double rmoon = RMOON; + double dmoon = 2 * rmoon; + int32 iflag; + for (i = 0; i < 10; i++) + dcore[i] = 0; + for (i = 0; i < 20; i++) + attr[i] = 0; + /* nutation need not be in lunar and solar positions, + * if mean sidereal time will be used */ + iflag = SEFLG_SPEED | SEFLG_EQUATORIAL | ifl; + iflag = iflag | SEFLG_XYZ; + deltat = swe_deltat(tjd_ut); + tjd = tjd_ut + deltat; + /* moon in cartesian coordinates */ + if (swe_calc(tjd, SE_MOON, iflag, rm, serr) == ERR) + return ERR; + /* distance of moon from geocenter */ + dm = sqrt(square_sum(rm)); + /* sun in cartesian coordinates */ + if (swe_calc(tjd, SE_SUN, iflag, rs, serr) == ERR) + return ERR; + /* distance of sun from geocenter */ + ds = sqrt(square_sum(rs)); + for (i = 0; i < 3; i++) { + x1[i] = rs[i] / ds; + x2[i] = rm[i] / dm; + } + dctr = acos(swi_dot_prod_unit(x1, x2)) * RADTODEG; + /* selenocentric sun */ + for (i = 0; i <= 2; i++) + rs[i] -= rm[i]; + /* selenocentric earth */ + for (i = 0; i <= 2; i++) + rm[i] = -rm[i]; + /* sun - earth vector */ + for (i = 0; i <= 2; i++) + e[i] = (rm[i] - rs[i]); + /* distance sun - earth */ + dsm = sqrt(square_sum(e)); + /* sun - earth unit vector */ + for (i = 0; i <= 2; i++) + e[i] /= dsm; + f1 = ((RSUN - REARTH) / dsm); + cosf1 = sqrt(1 - f1 * f1); + f2 = ((RSUN + REARTH) / dsm); + cosf2 = sqrt(1 - f2 * f2); + /* distance of earth from fundamental plane */ + s0 = -dot_prod(rm, e); + /* distance of shadow axis from selenocenter */ + r0 = sqrt(dm * dm - s0 * s0); + /* diameter of core shadow on fundamental plane */ + /* one 50th is added for effect of atmosphere, AA98, L4 */ + d0 = fabs(s0 / dsm * (DSUN - DEARTH) - DEARTH) * (1 + 1.0 / 50.0) / cosf1; + /* diameter of half-shadow on fundamental plane */ + D0 = (s0 / dsm * (DSUN + DEARTH) + DEARTH) * (1 + 1.0 / 50.0) / cosf2; + d0 /= cosf1; + D0 /= cosf2; + /* for better agreement with NASA: */ + d0 *= 0.99405; + D0 *= 0.98813; + dcore[0] = r0; + dcore[1] = d0; + dcore[2] = D0; + dcore[3] = cosf1; + dcore[4] = cosf2; + /************************** + * phase and umbral magnitude + **************************/ + retc = 0; + if (d0 / 2 >= r0 + rmoon / cosf1) { + retc = SE_ECL_TOTAL; + attr[0] = (d0 / 2 - r0 + rmoon) / dmoon; + } else if (d0 / 2 >= r0 - rmoon / cosf1) { + retc = SE_ECL_PARTIAL; + attr[0] = (d0 / 2 - r0 + rmoon) / dmoon; + } else if (D0 / 2 >= r0 - rmoon / cosf2) { + retc = SE_ECL_PENUMBRAL; + attr[0] = 0; + } else { + if (serr != NULL) + sprintf(serr, "no lunar eclipse at tjd = %f", tjd); + } + attr[8] = attr[0]; + /************************** + * penumbral magnitude + **************************/ + attr[1] = (D0 / 2 - r0 + rmoon) / dmoon; + if (retc != 0) + attr[7] = 180 - fabs(dctr); + /* saros series and member */ + for (i = 0; i < NSAROS_LUNAR; i++) { + d = (tjd_ut - saros_data_lunar[i].tstart) / SAROS_CYCLE; + if (d < 0) continue; + j = (int) d; + if ((d - j) * SAROS_CYCLE < 2) { + attr[9] = (double) saros_data_lunar[i].series_no; + attr[10] = (double) j + 1; + break; + } + k = j + 1; + if ((k - d) * SAROS_CYCLE < 2) { + attr[9] = (double) saros_data_lunar[i].series_no; + attr[10] = (double) k + 1; + break; + } + } + if (i == NSAROS_LUNAR) { + attr[9] = attr[10] = -99999999; + } + return retc; +} + +/* When is the next lunar eclipse? + * + * retflag SE_ECL_TOTAL or SE_ECL_PENUMBRAL or SE_ECL_PARTIAL + * + * tret[0] time of maximum eclipse + * tret[1] + * tret[2] time of partial phase begin (indices consistent with solar eclipses) + * tret[3] time of partial phase end + * tret[4] time of totality begin + * tret[5] time of totality end + * tret[6] time of penumbral phase begin + * tret[7] time of penumbral phase end + */ +int32 FAR PASCAL_CONV swe_lun_eclipse_when(double tjd_start, int32 ifl, int32 ifltype, + double *tret, int32 backward, char *serr) +{ + int i, j, m, n, o, i1 = 0, i2 = 0; + int32 retflag = 0, retflag2 = 0; + double t, tjd, dt, dtint, dta, dtb; + double T, T2, T3, T4, K, F, M, Mm; + double E, Ff, F1, A1, Om; + double xs[6], xm[6], dm, ds; + double rsun, rearth, dcore[10]; + double dc[3], dctr; + double twohr = 2.0 / 24.0; + double tenmin = 10.0 / 24.0 / 60.0; + double dt1, dt2; + double kk; + double attr[20]; + double dtstart, dtdiv; + double xa[6], xb[6]; + int direction = 1; + int32 iflag; + int32 iflagcart; + ifl &= SEFLG_EPHMASK; + iflag = SEFLG_EQUATORIAL | ifl; + iflagcart = iflag | SEFLG_XYZ; + if (ifltype == 0) + ifltype = SE_ECL_TOTAL | SE_ECL_PENUMBRAL | SE_ECL_PARTIAL; + if (backward) + direction = -1; + K = (int) ((tjd_start - J2000) / 365.2425 * 12.3685); + K -= direction; +next_try: + retflag = 0; + for (i = 0; i <= 9; i++) + tret[i] = 0; + kk = K + 0.5; + T = kk / 1236.85; + T2 = T * T; T3 = T2 * T; T4 = T3 * T; + Ff = F = swe_degnorm(160.7108 + 390.67050274 * kk + - 0.0016341 * T2 + - 0.00000227 * T3 + + 0.000000011 * T4); + if (Ff > 180) + Ff -= 180; + if (Ff > 21 && Ff < 159) { /* no eclipse possible */ + K += direction; + goto next_try; + } + /* approximate time of geocentric maximum eclipse + * formula from Meeus, German, p. 381 */ + tjd = 2451550.09765 + 29.530588853 * kk + + 0.0001337 * T2 + - 0.000000150 * T3 + + 0.00000000073 * T4; + M = swe_degnorm(2.5534 + 29.10535669 * kk + - 0.0000218 * T2 + - 0.00000011 * T3); + Mm = swe_degnorm(201.5643 + 385.81693528 * kk + + 0.1017438 * T2 + + 0.00001239 * T3 + + 0.000000058 * T4); + Om = swe_degnorm(124.7746 - 1.56375580 * kk + + 0.0020691 * T2 + + 0.00000215 * T3); + E = 1 - 0.002516 * T - 0.0000074 * T2; + A1 = swe_degnorm(299.77 + 0.107408 * kk - 0.009173 * T2); + M *= DEGTORAD; + Mm *= DEGTORAD; + F *= DEGTORAD; + Om *= DEGTORAD; + F1 = F - 0.02665 * sin(Om) * DEGTORAD; + A1 *= DEGTORAD; + tjd = tjd - 0.4075 * sin(Mm) + + 0.1721 * E * sin(M) + + 0.0161 * sin(2 * Mm) + - 0.0097 * sin(2 * F1) + + 0.0073 * E * sin(Mm - M) + - 0.0050 * E * sin(Mm + M) + - 0.0023 * sin(Mm - 2 * F1) + + 0.0021 * E * sin(2 * M) + + 0.0012 * sin(Mm + 2 * F1) + + 0.0006 * E * sin(2 * Mm + M) + - 0.0004 * sin(3 * Mm) + - 0.0003 * E * sin(M + 2 * F1) + + 0.0003 * sin(A1) + - 0.0002 * E * sin(M - 2 * F1) + - 0.0002 * E * sin(2 * Mm - M) + - 0.0002 * sin(Om); + /* + * precise computation: + * time of maximum eclipse (if eclipse) = + * minimum selenocentric angle between sun and earth edges. + * After this time has been determined, check + * whether or not an eclipse is taking place with + * the function lun_eclipse_how(). + */ + dtstart = 0.1; + if (tjd < 2000000) + dtstart = 5; + dtdiv = 4; + for (j = 0, dt = dtstart; + dt > 0.001; + j++, dt /= dtdiv) { + for (i = 0, t = tjd - dt; i <= 2; i++, t += dt) { + if (swe_calc(t, SE_SUN, iflagcart, xs, serr) == ERR) + return ERR; + if (swe_calc(t, SE_MOON, iflagcart, xm, serr) == ERR) + return ERR; + for (m = 0; m < 3; m++) { + xs[m] -= xm[m]; /* selenocentric sun */ + xm[m] = -xm[m]; /* selenocentric earth */ + } + ds = sqrt(square_sum(xs)); + dm = sqrt(square_sum(xm)); + for (m = 0; m < 3; m++) { + xa[m] = xs[m] / ds; + xb[m] = xm[m] / dm; + } + dc[i] = acos(swi_dot_prod_unit(xa, xb)) * RADTODEG; + rearth = asin(REARTH / dm) * RADTODEG; + rsun = asin(RSUN / ds) * RADTODEG; + dc[i] -= (rearth + rsun); + } + find_maximum(dc[0], dc[1], dc[2], dt, &dtint, &dctr); + tjd += dtint + dt; + } + tjd = tjd - swe_deltat(tjd); + if ((retflag = swe_lun_eclipse_how(tjd, ifl, NULL, attr, serr)) == ERR) + return retflag; + if (retflag == 0) { + K += direction; + goto next_try; + } + tret[0] = tjd; + if ((backward && tret[0] >= tjd_start - 0.0001) + || (!backward && tret[0] <= tjd_start + 0.0001)) { + K += direction; + goto next_try; + } + /* + * check whether or not eclipse type found is wanted + */ + /* non penumbral eclipse is wanted: */ + if (!(ifltype & SE_ECL_PENUMBRAL) && (retflag & SE_ECL_PENUMBRAL)) { + K += direction; + goto next_try; + } + /* non partial eclipse is wanted: */ + if (!(ifltype & SE_ECL_PARTIAL) && (retflag & SE_ECL_PARTIAL)) { + K += direction; + goto next_try; + } + /* annular-total eclipse will be discovered later */ + if (!(ifltype & (SE_ECL_TOTAL)) && (retflag & SE_ECL_TOTAL)) { + K += direction; + goto next_try; + } + /* + * n = 0: times of eclipse begin and end + * n = 1: times of totality begin and end + * n = 2: times of center line begin and end + */ + if (retflag & SE_ECL_PENUMBRAL) + o = 0; + else if (retflag & SE_ECL_PARTIAL) + o = 1; + else + o = 2; + dta = twohr; + dtb = tenmin; + for (n = 0; n <= o; n++) { + if (n == 0) { + i1 = 6; i2 = 7; + } else if (n == 1) { + i1 = 2; i2 = 3; + } else if (n == 2) { + i1 = 4; i2 = 5; + } +#if 1 + for (i = 0, t = tjd - dta; i <= 2; i += 1, t += dta) { + if ((retflag2 = lun_eclipse_how(t, ifl, attr, dcore, serr)) == ERR) + return retflag2; + if (n == 0) + dc[i] = dcore[2] / 2 + RMOON / dcore[4] - dcore[0]; + else if (n == 1) + dc[i] = dcore[1] / 2 + RMOON / dcore[3] - dcore[0]; + else if (n == 2) + dc[i] = dcore[1] / 2 - RMOON / dcore[3] - dcore[0]; + } + find_zero(dc[0], dc[1], dc[2], dta, &dt1, &dt2); + dtb = (dt1 + dta) / 2; + tret[i1] = tjd + dt1 + dta; + tret[i2] = tjd + dt2 + dta; +#else + tret[i1] = tjd - dtb; + tret[i2] = tjd + dtb; +#endif + for (m = 0, dt = dtb / 2; m < 3; m++, dt /= 2) { + for (j = i1; j <= i2; j += (i2 - i1)) { + for (i = 0, t = tret[j] - dt; i < 2; i++, t += dt) { + if ((retflag2 = lun_eclipse_how(t, ifl, attr, dcore, serr)) == ERR) + return retflag2; + if (n == 0) + dc[i] = dcore[2] / 2 + RMOON / dcore[4] - dcore[0]; + else if (n == 1) + dc[i] = dcore[1] / 2 + RMOON / dcore[3] - dcore[0]; + else if (n == 2) + dc[i] = dcore[1] / 2 - RMOON / dcore[3] - dcore[0]; + } + dt1 = dc[1] / ((dc[1] - dc[0]) / dt); + tret[j] -= dt1; + } + } + } + return retflag; +} + +/* + * function calculates planetary phenomena + * + * attr[0] = phase angle (earth-planet-sun) + * attr[1] = phase (illumined fraction of disc) + * attr[2] = elongation of planet + * attr[3] = apparent diameter of disc + * attr[4] = apparent magnitude + * attr[5] = geocentric horizontal parallax (Moon) + * declare as attr[20] at least ! + * + * Note: the lunar magnitude is quite a complicated thing, + * but our algorithm is very simple. + * The phase of the moon, its distance from the earth and + * the sun is considered, but no other factors. + * + */ +#define EULER 2.718281828459 +#define NMAG_ELEM (SE_VESTA + 1) +static double mag_elem[NMAG_ELEM][4] = { + /* DTV-Atlas Astronomie, p. 32 */ + {-26.86, 0, 0, 0}, + {-12.55, 0, 0, 0}, + /* IAU 1986 */ + {-0.42, 3.80, -2.73, 2.00}, + {-4.40, 0.09, 2.39, -0.65}, + {- 1.52, 1.60, 0, 0}, /* Mars */ + {- 9.40, 0.5, 0, 0}, /* Jupiter */ + {- 8.88, -2.60, 1.25, 0.044}, /* Saturn */ + {- 7.19, 0.0, 0, 0}, /* Uranus */ + {- 6.87, 0.0, 0, 0}, /* Neptune */ + {- 1.00, 0.0, 0, 0}, /* Pluto */ + {99, 0, 0, 0}, /* nodes and apogees */ + {99, 0, 0, 0}, + {99, 0, 0, 0}, + {99, 0, 0, 0}, + {99, 0, 0, 0}, /* Earth */ + /* from Bowell data base */ + {6.5, 0.15, 0, 0}, /* Chiron */ + {7.0, 0.15, 0, 0}, /* Pholus */ + {3.34, 0.12, 0, 0}, /* Ceres */ + {4.13, 0.11, 0, 0}, /* Pallas */ + {5.33, 0.32, 0, 0}, /* Juno */ + {3.20, 0.32, 0, 0}, /* Vesta */ + }; +int32 FAR PASCAL_CONV swe_pheno(double tjd, int32 ipl, int32 iflag, double *attr, char *serr) +{ + int i; + double xx[6], xx2[6], xxs[6], lbr[6], lbr2[6], dt = 0, dd; + double fac; + double T, in, om, sinB, u1, u2, du; + double ph1, ph2, me[2]; + int32 iflagp, epheflag; + /* function calls for Pluto with asteroid number 134340 + * are treated as calls for Pluto as main body SE_PLUTO */ + if (ipl == SE_AST_OFFSET + 134340) + ipl = SE_PLUTO; + for (i = 0; i < 20; i++) + attr[i] = 0; + /* Ceres - Vesta must be SE_CERES etc., not 10001 etc. */ + if (ipl > SE_AST_OFFSET && ipl <= SE_AST_OFFSET + 4) + ipl = ipl - SE_AST_OFFSET - 1 + SE_CERES; + iflag = iflag & (SEFLG_EPHMASK | + SEFLG_TRUEPOS | + SEFLG_J2000 | + SEFLG_NONUT | + SEFLG_NOGDEFL | + SEFLG_NOABERR | + SEFLG_TOPOCTR); + iflagp = iflag & (SEFLG_EPHMASK | + SEFLG_TRUEPOS | + SEFLG_J2000 | + SEFLG_NONUT | + SEFLG_NOABERR); + iflagp |= SEFLG_HELCTR; + epheflag = iflag & SEFLG_EPHMASK; + /* + * geocentric planet + */ + if (swe_calc(tjd, (int) ipl, iflag | SEFLG_XYZ, xx, serr) == ERR) + /* int cast can be removed when swe_calc() gets int32 ipl definition */ + return ERR; + if (swe_calc(tjd, (int) ipl, iflag, lbr, serr) == ERR) + /* int cast can be removed when swe_calc() gets int32 ipl definition */ + return ERR; + /* if moon, we need sun as well, for magnitude */ + if (ipl == SE_MOON) + if (swe_calc(tjd, SE_SUN, iflag | SEFLG_XYZ, xxs, serr) == ERR) + return ERR; + if (ipl != SE_SUN && ipl != SE_EARTH && + ipl != SE_MEAN_NODE && ipl != SE_TRUE_NODE && + ipl != SE_MEAN_APOG && ipl != SE_OSCU_APOG) { + /* + * light time planet - earth + */ + dt = lbr[2] * AUNIT / CLIGHT / 86400.0; + if (iflag & SEFLG_TRUEPOS) + dt = 0; + /* + * heliocentric planet at tjd - dt + */ + if (swe_calc(tjd - dt, (int) ipl, iflagp | SEFLG_XYZ, xx2, serr) == ERR) + /* int cast can be removed when swe_calc() gets int32 ipl definition */ + return ERR; + if (swe_calc(tjd - dt, (int) ipl, iflagp, lbr2, serr) == ERR) + /* int cast can be removed when swe_calc() gets int32 ipl definition */ + return ERR; + /* + * phase angle + */ + attr[0] = acos(swi_dot_prod_unit(xx, xx2)) * RADTODEG; + /* + * phase + */ + attr[1] = (1 + cos(attr[0] * DEGTORAD)) / 2; + } + /* + * apparent diameter of disk + */ + if (ipl < NDIAM) + dd = pla_diam[ipl]; + else if (ipl > SE_AST_OFFSET) + dd = swed.ast_diam * 1000; /* km -> m */ + else + dd = 0; + if (lbr[2] < dd / 2 / AUNIT) + attr[3] = 180; /* assume position on surface of earth */ + else + attr[3] = asin(dd / 2 / AUNIT / lbr[2]) * 2 * RADTODEG; + /* + * apparent magnitude + */ + if (ipl > SE_AST_OFFSET || (ipl < NMAG_ELEM && mag_elem[ipl][0] < 99)) { + if (ipl == SE_SUN) { + /* ratio apparent diameter : average diameter */ + fac = attr[3] / (asin(pla_diam[SE_SUN] / 2.0 / AUNIT) * 2 * RADTODEG); + fac *= fac; + attr[4] = mag_elem[ipl][0] - 2.5 * log10(fac); + } else if (ipl == SE_MOON) { + /* formula according to Allen, C.W., 1976, Astrophysical Quantities */ + /*attr[4] = -21.62 + 5 * log10(384410497.8 / EARTH_RADIUS) / log10(10) + 0.026 * fabs(attr[0]) + 0.000000004 * pow(attr[0], 4);*/ + attr[4] = -21.62 + 5 * log10(lbr[2] * AUNIT / EARTH_RADIUS) / log10(10) + 0.026 * fabs(attr[0]) + 0.000000004 * pow(attr[0], 4); +#if 0 + /* ratio apparent diameter : average diameter */ + fac = attr[3] / (asin(pla_diam[SE_MOON] / 2.0 / 384400000.0) * 2 * RADTODEG); + /* distance sun - moon */ + for (i = 0; i < 3; i++) + xxs[i] -= xx[i]; + dsm = sqrt(square_sum(xxs)); + /* account for phase and distance of moon: */ + fac *= fac * attr[1]; + /* account for distance of sun from moon: */ + fac *= dsm * dsm; + attr[4] = mag_elem[ipl][0] - 2.5 * log10(fac); +#endif + /*printf("1 = %f, 2 = %f\n", mag, mag2);*/ + } else if (ipl == SE_SATURN) { + /* rings are considered according to Meeus, German, p. 329ff. */ + T = (tjd - dt - J2000) / 36525.0; + in = (28.075216 - 0.012998 * T + 0.000004 * T * T) * DEGTORAD; + om = (169.508470 + 1.394681 * T + 0.000412 * T * T) * DEGTORAD; + sinB = fabs(sin(in) * cos(lbr[1] * DEGTORAD) + * sin(lbr[0] * DEGTORAD - om) + - cos(in) * sin(lbr[1] * DEGTORAD)); + u1 = atan2(sin(in) * tan(lbr2[1] * DEGTORAD) + + cos(in) * sin(lbr2[0] * DEGTORAD - om), + cos(lbr2[0] * DEGTORAD - om)) * RADTODEG; + u2 = atan2(sin(in) * tan(lbr[1] * DEGTORAD) + + cos(in) * sin(lbr[0] * DEGTORAD - om), + cos(lbr[0] * DEGTORAD - om)) * RADTODEG; + du = swe_degnorm(u1 - u2); + if (du > 10) + du = 360 - du; + attr[4] = 5 * log10(lbr2[2] * lbr[2]) + + mag_elem[ipl][1] * sinB + + mag_elem[ipl][2] * sinB * sinB + + mag_elem[ipl][3] * du + + mag_elem[ipl][0]; + } else if (ipl < SE_CHIRON) { + attr[4] = 5 * log10(lbr2[2] * lbr[2]) + + mag_elem[ipl][1] * attr[0] /100.0 + + mag_elem[ipl][2] * attr[0] * attr[0] / 10000.0 + + mag_elem[ipl][3] * attr[0] * attr[0] * attr[0] / 1000000.0 + + mag_elem[ipl][0]; + } else if (ipl < NMAG_ELEM || ipl > SE_AST_OFFSET) { /* asteroids */ + ph1 = pow(EULER, -3.33 * pow(tan(attr[0] * DEGTORAD / 2), 0.63)); + ph2 = pow(EULER, -1.87 * pow(tan(attr[0] * DEGTORAD / 2), 1.22)); + if (ipl < NMAG_ELEM) { /* main asteroids */ + me[0] = mag_elem[ipl][0]; + me[1] = mag_elem[ipl][1]; + } else if (ipl == SE_AST_OFFSET + 1566) { + /* Icarus has elements from JPL database */ + me[0] = 16.9; + me[1] = 0.15; + } else { /* other asteroids */ + me[0] = swed.ast_H; + me[1] = swed.ast_G; + } + attr[4] = 5 * log10(lbr2[2] * lbr[2]) + + me[0] + - 2.5 * log10((1 - me[1]) * ph1 + me[1] * ph2); + } else { /* ficticious bodies */ + attr[4] = 0; + } + } + if (ipl != SE_SUN && ipl != SE_EARTH) { + /* + * elongation of planet + */ + if (swe_calc(tjd, SE_SUN, iflag | SEFLG_XYZ, xx2, serr) == ERR) + return ERR; + if (swe_calc(tjd, SE_SUN, iflag, lbr2, serr) == ERR) + return ERR; + attr[2] = acos(swi_dot_prod_unit(xx, xx2)) * RADTODEG; + } + /* horizontal parallax */ + if (ipl == SE_MOON) { + double sinhp, xm[6]; + /* geocentric horizontal parallax */ + /* Expl.Suppl. to the AA 1984, p.400 */ + if (swe_calc(tjd, (int) ipl, epheflag|SEFLG_TRUEPOS|SEFLG_EQUATORIAL|SEFLG_RADIANS, xm, serr) == ERR) + /* int cast can be removed when swe_calc() gets int32 ipl definition */ + return ERR; + sinhp = EARTH_RADIUS / xm[2] / AUNIT; + attr[5] = asin(sinhp) / DEGTORAD; + /* topocentric horizontal parallax */ + if (iflag & SEFLG_TOPOCTR) { + if (swe_calc(tjd, (int) ipl, epheflag|SEFLG_XYZ|SEFLG_TOPOCTR, xm, serr) == ERR) + return ERR; + if (swe_calc(tjd, (int) ipl, epheflag|SEFLG_XYZ, xx, serr) == ERR) + return ERR; + attr[5] = acos(swi_dot_prod_unit(xm, xx)) / DEGTORAD; +#if 0 + { + /* Expl. Suppl. to the Astronomical Almanac 1984, p. 400; + * Does not take into account + * - the topocentric distance of the moon + * - the distance of the observer from the geocenter + */ + double tsid, h, e, f = EARTH_OBLATENESS; + double cosz, sinz, phi; + /* local apparent sidereal time */ + tsid = swe_sidtime(tjd - swe_deltat(tjd)) * 15 + swed.topd.geolon; + /* local hour angle of the moon */ + h = swe_degnorm(tsid - xm[0] / DEGTORAD); + /* geocentric latitude of the observer */ + e = sqrt(f * (2 - f)); + phi = atan((1 - e * e) * tan(swed.topd.geolat * DEGTORAD)); + /* sine of geocentric zenith angle of moon */ + cosz = sin(xm[1]) * sin(phi) + cos(xm[1]) * cos(phi) * cos(h * DEGTORAD); + sinz = sqrt(1 - cosz * cosz); + attr[5] = asin(sinz * sinhp / (1 - sinz * sinhp)) / DEGTORAD; + } +#endif + } + } + return OK; +} + +int32 FAR PASCAL_CONV swe_pheno_ut(double tjd_ut, int32 ipl, int32 iflag, double *attr, char *serr) +{ + return swe_pheno(tjd_ut + swe_deltat(tjd_ut), ipl, iflag, attr, serr); +} + +static int find_maximum(double y00, double y11, double y2, double dx, + double *dxret, double *yret) +{ + double a, b, c, x, y; + c = y11; + b = (y2 - y00) / 2.0; + a = (y2 + y00) / 2.0 - c; + x = -b / 2 / a; + y = (4 * a * c - b * b) / 4 / a; + *dxret = (x - 1) * dx; + if (yret != NULL) + *yret = y; + return OK; +} + +static int find_zero(double y00, double y11, double y2, double dx, + double *dxret, double *dxret2) +{ + double a, b, c, x1, x2; + c = y11; + b = (y2 - y00) / 2.0; + a = (y2 + y00) / 2.0 - c; + if (b * b - 4 * a * c < 0) + return ERR; + x1 = (-b + sqrt(b * b - 4 * a * c)) / 2 / a; + x2 = (-b - sqrt(b * b - 4 * a * c)) / 2 / a; + *dxret = (x1 - 1) * dx; + *dxret2 = (x2 - 1) * dx; + return OK; +} + +double rdi_twilight(int32 rsmi) +{ + double rdi = 0; + if (rsmi & SE_BIT_CIVIL_TWILIGHT) + rdi = 6; + if (rsmi & SE_BIT_NAUTIC_TWILIGHT) + rdi = 12; + if (rsmi & SE_BIT_ASTRO_TWILIGHT) + rdi = 18; + return rdi; +} + +/* rise, set, and meridian transits of sun, moon, planets, and stars + * + * tjd_ut universal time from when on search ought to start + * ipl planet number, neglected, if starname is given + * starname pointer to string. if a planet, not a star, is + * wanted, starname must be NULL or "" + * epheflag used for ephemeris only + * rsmi SE_CALC_RISE, SE_CALC_SET, SE_CALC_MTRANSIT, SE_CALC_ITRANSIT + * | SE_BIT_DISC_CENTER for rises of disc center of body + * | SE_BIT_DISC_BOTTOM for rises of disc bottom of body + * | SE_BIT_NO_REFRACTION to neglect refraction + * | SE_BIT_FIXED_DISC_SIZE neglect the effect of distance on disc size + * geopos array of doubles for geogr. long., lat. and height above sea + * atpress atmospheric pressure + * attemp atmospheric temperature + * + * return variables: + * tret time of rise, set, meridian transits + * serr[256] error string + * function return value -2 means that the body does not rise or set */ +#define SEFLG_EPHMASK (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH) +int32 FAR PASCAL_CONV swe_rise_trans( + double tjd_ut, int32 ipl, char *starname, + int32 epheflag, int32 rsmi, + double *geopos, + double atpress, double attemp, + double *tret, + char *serr) +{ + return swe_rise_trans_true_hor(tjd_ut, ipl, starname, epheflag, rsmi, geopos, atpress, attemp, 0, tret, serr); +} + +/* same as swe_rise_trans(), but allows to define the height of the horizon + * at the point of the rising or setting (horhgt) */ +int32 FAR PASCAL_CONV swe_rise_trans_true_hor( + double tjd_ut, int32 ipl, char *starname, + int32 epheflag, int32 rsmi, + double *geopos, + double atpress, double attemp, + double horhgt, + double *tret, + char *serr) +{ + int i, j, k, ii, calc_culm, nculm = -1; + double tjd_et = tjd_ut + swe_deltat(tjd_ut); + double xc[6], xh[20][6], ah[6], aha; + double tculm[4], tcu, tc[20], h[20], t2[6], dc[6], dtint, dx, rdi, dd = 0; + int32 iflag = epheflag; + int jmax = 14; + double t, te, tt, dt, twohrs = 1.0 / 12.0; + double curdist; + AS_BOOL do_fixstar = (starname != NULL && *starname != '\0'); + /* function calls for Pluto with asteroid number 134340 + * are treated as calls for Pluto as main body SE_PLUTO */ + if (ipl == SE_AST_OFFSET + 134340) + ipl = SE_PLUTO; + xh[0][0] = 0; /* to shut up mint */ + /* allowing SEFLG_NONUT and SEFLG_TRUEPOS speeds it up */ + iflag &= (SEFLG_EPHMASK | SEFLG_NONUT | SEFLG_TRUEPOS); + *tret = 0; + iflag |= (SEFLG_EQUATORIAL | SEFLG_TOPOCTR); + swe_set_topo(geopos[0], geopos[1], geopos[2]); + if (rsmi & (SE_CALC_MTRANSIT | SE_CALC_ITRANSIT)) + return calc_mer_trans(tjd_ut, ipl, epheflag, rsmi, + geopos, starname, tret, serr); + if (!(rsmi & (SE_CALC_RISE | SE_CALC_SET))) + rsmi |= SE_CALC_RISE; + /* twilight calculation */ + if (ipl == SE_SUN && (rsmi & (SE_BIT_CIVIL_TWILIGHT|SE_BIT_NAUTIC_TWILIGHT|SE_BIT_ASTRO_TWILIGHT))) { + rsmi |= (SE_BIT_NO_REFRACTION | SE_BIT_DISC_CENTER); + horhgt = -rdi_twilight(rsmi); + /* note: twilight is not dependent on height of horizon, so we can + * use this parameter and define a fictitious height of horizon */ + } + /* find culmination points within 28 hours from t0 - twohrs. + * culminations are required in case there are maxima or minima + * in height slightly above or below the horizon. + * we do not use meridian transits, because in polar regions + * the culmination points may considerably deviate from + * transits. also, there are cases where the moon rises in the + * western half of the sky for a short time. + */ + if (do_fixstar) { + if (swe_fixstar(starname, tjd_et, iflag, xc, serr) == ERR) + return ERR; + } + for (ii = 0, t = tjd_ut - twohrs; ii <= jmax; ii++, t += twohrs) { + tc[ii] = t; + if (!do_fixstar) { + te = t + swe_deltat(t); + if (swe_calc(te, ipl, iflag, xc, serr) == ERR) + return ERR; + } + /* diameter of object in km */ + if (ii == 0) { + if (do_fixstar) + dd = 0; + else if (rsmi & SE_BIT_DISC_CENTER) + dd = 0; + else if (ipl < NDIAM) + dd = pla_diam[ipl]; + else if (ipl > SE_AST_OFFSET) + dd = swed.ast_diam * 1000; /* km -> m */ + else + dd = 0; + } + curdist = xc[2]; + if (rsmi & SE_BIT_FIXED_DISC_SIZE) { + if (ipl == SE_SUN) { + curdist = 1.0; + } else if (ipl == SE_MOON) { + curdist = 0.00257; + } + } + /* apparent radius of disc */ + rdi = asin( dd / 2 / AUNIT / curdist ) * RADTODEG; + /* true height of center of body */ + swe_azalt(t, SE_EQU2HOR, geopos, atpress, attemp, xc, xh[ii]); + if (rsmi & SE_BIT_DISC_BOTTOM) { + /* true height of bottom point of body */ + xh[ii][1] -= rdi; + } else { + /* true height of uppermost point of body */ + xh[ii][1] += rdi; + } + /* apparent height of uppermost point of body */ + if (rsmi & SE_BIT_NO_REFRACTION) { + xh[ii][1] -= horhgt; + h[ii] = xh[ii][1]; + } else { + swe_azalt_rev(t, SE_HOR2EQU, geopos, xh[ii], xc); + swe_azalt(t, SE_EQU2HOR, geopos, atpress, attemp, xc, xh[ii]); + xh[ii][1] -= horhgt; + xh[ii][2] -= horhgt; + h[ii] = xh[ii][2]; + } + calc_culm = 0; + if (ii > 1) { + dc[0] = xh[ii-2][1]; + dc[1] = xh[ii-1][1]; + dc[2] = xh[ii][1]; + if (dc[1] > dc[0] && dc[1] > dc[2]) + calc_culm = 1; + if (dc[1] < dc[0] && dc[1] < dc[2]) + calc_culm = 2; + } + if (calc_culm) { + dt = twohrs; + tcu = t - dt; + find_maximum(dc[0], dc[1], dc[2], dt, &dtint, &dx); + tcu += dtint + dt; + dt /= 3; + for (; dt > 0.0001; dt /= 3) { + for (i = 0, tt = tcu - dt; i < 3; tt += dt, i++) { + te = tt + swe_deltat(tt); + if (!do_fixstar) + if (swe_calc(te, ipl, iflag, xc, serr) == ERR) + return ERR; + swe_azalt(tt, SE_EQU2HOR, geopos, atpress, attemp, xc, ah); + ah[1] -= horhgt; + dc[i] = ah[1]; + } + find_maximum(dc[0], dc[1], dc[2], dt, &dtint, &dx); + tcu += dtint + dt; + } + nculm++; + tculm[nculm] = tcu; + } + } + /* note: there can be a rise or set on the poles, even if + * there is no culmination. So, we must not leave here + * in any case. */ + /* insert culminations into array of heights */ + for (i = 0; i <= nculm; i++) { + for (j = 1; j <= jmax; j++) { + if (tculm[i] < tc[j]) { + for (k = jmax; k >= j; k--) { + tc[k+1] = tc[k]; + h[k+1] = h[k]; + } + tc[j] = tculm[i]; + if (!do_fixstar) { + te = tc[j] + swe_deltat(tc[j]); + if (swe_calc(te, ipl, iflag, xc, serr) == ERR) + return ERR; + } + curdist = xc[2]; + if (rsmi & SE_BIT_FIXED_DISC_SIZE) { + if ( ipl == SE_SUN ) { + curdist = 1.0; + } else if (ipl == SE_MOON) { + curdist = 0.00257; + } + } + /* apparent radius of disc */ + rdi = asin( dd / 2 / AUNIT / curdist ) * RADTODEG; + /* true height of center of body */ + swe_azalt(tc[j], SE_EQU2HOR, geopos, atpress, attemp, xc, ah); + if (rsmi & SE_BIT_DISC_BOTTOM) { + /* true height of bottom point of body */ + ah[1] -= rdi; + } else { + /* true height of uppermost point of body */ + ah[1] += rdi; + } + /* apparent height of uppermost point of body */ + if (rsmi & SE_BIT_NO_REFRACTION) { + ah[1] -= horhgt; + h[j] = ah[1]; + } else { + swe_azalt_rev(tc[j], SE_HOR2EQU, geopos, ah, xc); + swe_azalt(tc[j], SE_EQU2HOR, geopos, atpress, attemp, xc, ah); + ah[1] -= horhgt; + ah[2] -= horhgt; + h[j] = ah[2]; + } + jmax++; + break; + } + } + } + *tret = 0; + /* find points with zero height. + * binary search */ + for (ii = 1; ii <= jmax; ii++) { + if (h[ii-1] * h[ii] >= 0) + continue; + if (h[ii-1] < h[ii] && !(rsmi & SE_CALC_RISE)) + continue; + if (h[ii-1] > h[ii] && !(rsmi & SE_CALC_SET)) + continue; + dc[0] = h[ii-1]; + dc[1] = h[ii]; + t2[0] = tc[ii-1]; + t2[1] = tc[ii]; + for (i = 0; i < 20; i++) { + t = (t2[0] + t2[1]) / 2; + if (!do_fixstar) { + te = t + swe_deltat(t); + if (swe_calc(te, ipl, iflag, xc, serr) == ERR) + return ERR; + } + curdist = xc[2]; + if (rsmi & SE_BIT_FIXED_DISC_SIZE) { + if (ipl == SE_SUN) { + curdist = 1.0; + } else if (ipl == SE_MOON) { + curdist = 0.00257; + } + } + /* apparent radius of disc */ + rdi = asin( dd / 2 / AUNIT / curdist ) * RADTODEG; + /* true height of center of body */ + swe_azalt(t, SE_EQU2HOR, geopos, atpress, attemp, xc, ah); + if (rsmi & SE_BIT_DISC_BOTTOM) { + /* true height of bottom point of body */ + ah[1] -= rdi; + } else { + /* true height of uppermost point of body */ + ah[1] += rdi; + } + /* apparent height of uppermost point of body */ + if (rsmi & SE_BIT_NO_REFRACTION) { + ah[1] -= horhgt; + aha = ah[1]; + } else { + swe_azalt_rev(t, SE_HOR2EQU, geopos, ah, xc); + swe_azalt(t, SE_EQU2HOR, geopos, atpress, attemp, xc, ah); + ah[1] -= horhgt; + ah[2] -= horhgt; + aha = ah[2]; + } + if (aha * dc[0] <= 0) { + dc[1] = aha; + t2[1] = t; + } else { + dc[0] = aha; + t2[0] = t; + } + } + if (t > tjd_ut) { + *tret = t; + return OK; + } + } + if (serr) + sprintf(serr, "rise or set not found for planet %d", ipl); + return -2; /* no t of rise or set found */ +} + +static int32 calc_mer_trans( + double tjd_ut, int32 ipl, int32 epheflag, int32 rsmi, + double *geopos, + char *starname, + double *tret, + char *serr) +{ + int i; + double tjd_et = tjd_ut + swe_deltat(tjd_ut); + double armc, armc0, arxc, x0[6], x[6], t, te; + double mdd; + int32 iflag = epheflag; + AS_BOOL do_fixstar = (starname != NULL && *starname != '\0'); + iflag &= SEFLG_EPHMASK; + *tret = 0; + iflag |= (SEFLG_EQUATORIAL | SEFLG_TOPOCTR); + armc0 = swe_sidtime(tjd_ut) + geopos[0] / 15; + if (armc0 >= 24) + armc0 -= 24; + if (armc0 < 0) + armc0 += 24; + armc0 *= 15; + if (do_fixstar) { + if (swe_fixstar(starname, tjd_et, iflag, x0, serr) == ERR) + return ERR; + } else { + if (swe_calc(tjd_et, ipl, iflag, x0, serr) == ERR) + return ERR; + } + /* + * meridian transits + */ + x[0] = x0[0]; + x[1] = x0[1]; + t = tjd_ut; + arxc = armc0; + if (rsmi & SE_CALC_ITRANSIT) + arxc = swe_degnorm(arxc + 180); + for (i = 0; i < 4; i++) { + mdd = swe_degnorm(x[0] - arxc); + if (i > 0 && mdd > 180) + mdd -= 360; + t += mdd / 361; + armc = swe_sidtime(t) + geopos[0] / 15; + if (armc >= 24) + armc -= 24; + if (armc < 0) + armc += 24; + armc *= 15; + arxc = armc; + if (rsmi & SE_CALC_ITRANSIT) + arxc = swe_degnorm(arxc + 180); + if (!do_fixstar) { + te = t + swe_deltat(t); + if (swe_calc(te, ipl, iflag, x, serr) == ERR) + return ERR; + } + } + *tret = t; + return OK; +} + +/* +Nodes and apsides of planets and moon + +Planetary nodes can be defined in three different ways: +a) They can be understood as a direction or as an axis + defined by the intersection line of two orbital planes. + E.g., the nodes of Mars are defined by the intersection + line of Mars' orbital plane with the ecliptic (= the + Earths orbit heliocentrically or the solar orbit + geocentrically). However, as Michael Erlewine points + out in his elaborate web page on this topic + (http://thenewage.com/resources/articles/interface.html), + planetary nodes can be defined for any couple of + planets. E.g. there is also an intersection line for the + two orbital planes of Mars and Saturn. + Because such lines are, in principle, infinite, the + heliocentric and the geocentric positions of the + planetary nodes will be the same. There are astrologers + that use such heliocentric planetary nodes in geocentric + charts. + The ascending and the descending node will, in this + case, be in precise opposition. + +b) The planetary nodes can also be understood in a + different way, not as an axis, but as the two points on a + planetary orbit that are located precisely on the + intersection line of the two planes. + This second definition makes no difference for the moon or + for heliocentric positions of planets, but it does so for + geocentric positions. There are two possibilities for + geocentric planetary nodes based on this definition. + 1) The common solution is that the points on the + planets orbit are transformed to the geocenter. The + two points will not be in opposition anymore, or + they will only roughly be so with the outer planets. The + advantage of these nodes is that when a planet is in + conjunction with its node, then its ecliptic latitude + will be zero. This is not true when a planet is in + geocentric conjunction with its heliocentric node. + (And neither is it always true for the inner planets, + i.e. Mercury and Venus.) + 2) The second possibility that nobody seems to have + thought of so far: One may compute the points of + the earth's orbit that lie exactly on another planet's + orbital plane and transform it to the geocenter. The two + points will always be in an approximate square. + +c) Third, the planetary nodes could be defined as the + intersection points of the plane defined by their + momentary geocentric position and motion with the + plane of the ecliptic. Such points would move very fast + around the planetary stations. Here again, as in b)1), + the planet would cross the ecliptic and its ecliptic + latitude would be 0 exactly when it were in + conjunction with one of its nodes. + +The Swiss Ephemeris supports the solutions a) and b) 1). + +Possible definitions for apsides + +a) The planetary apsides can be defined as the perihelion and + aphelion points on a planetary orbit. For a + geocentric chart, these points could be transformed + from the heliocenter to the geocenter. +b) However, one might consider these points as + astrologically relevant axes rather than as points on a + planetary orbit. Again, this would allow heliocentric + positions in a geocentric chart. + +Note: For the "Dark Moon" or "Lilith", which I usually +define as the lunar apogee, some astrologers give a +different definition. They understand it as the second focal +point of the moon's orbital ellipse. This definition does not +make a difference for geocentric positions, because the +apogee and the second focus are in exactly the same geocentric +direction. However, it makes a difference with topocentric +positions, because the two points do not have same distance. +Analogous "black planets" have been proposed: they would be the +second focal points of the planets' orbital ellipses. The +heliocentric positions of these "black planets" are identical +with the heliocentric positions of the aphelia, but geocentric +positions are not identical, because the focal points are +much closer to the sun than the aphelia. + +The Swiss Ephemeris allows to compute the "black planets" as well. + +Mean positions + +Mean nodes and apsides can be computed for the Moon, the +Earth and the planets Mercury - Neptune. They are taken +from the planetary theory VSOP87. Mean points can not be +calculated for Pluto and the asteroids, because there is no +planetary theory for them. + +Osculating nodes and apsides + +Nodes and apsides can also be derived from the osculating +orbital elements of a body, the paramaters that define an +ideal unperturbed elliptic (two-body) orbit. +For astrology, note that this is a simplification and +idealization. +Problem with Neptune: Neptune's orbit around the sun does not +have much in common with an ellipse. There are often two +perihelia and two aphelia within one revolution. As a result, +there is a wild oscillation of the osculating perihelion (and +aphelion). +In actuality, Neptune's orbit is not heliocentric orbit at all. +The twofold perihelia and aphelia are an effect of the motion of +the sun about the solar system barycenter. This motion is +much faster than the motion of Neptune, and Neptune +cannot react on such fast displacements of the Sun. As a +result, Neptune seems to move around the barycenter (or a +mean sun) rather than around the true sun. In fact, +Neptune's orbit around the barycenter is therefore closer to +an ellipse than the his orbit around the sun. The same +statement is also true for Saturn, Uranus and Pluto, but not +for Jupiter and the inner planets. + +This fundamental problem about osculating ellipses of +planetary orbits does of course not only affect the apsides +but also the nodes. + +Two solutions can be thought of for this problem: +1) The one would be to interpolate between actual + passages of the planets through their nodes and + apsides. However, this works only well with Mercury. + With all other planets, the supporting points are too far + apart as to make an accurate interpolation possible. + This solution is not implemented, here. +2) The other solution is to compute the apsides of the + orbit around the barycenter rather than around the sun. + This procedure makes sense for planets beyond Jupiter, + it comes closer to the mean apsides and nodes for + planets that have such points defined. For all other + transsaturnian planets and asteroids, this solution yields + a kind of "mean" nodes and apsides. On the other hand, + the barycentric ellipse does not make any sense for + inner planets and Jupiter. + +The Swiss Ephemeris supports solution 2) for planets and +asteroids beyond Jupiter. + +Anyway, neither the heliocentric nor the barycentric ellipse +is a perfect representation of the nature of a planetary orbit, +and it will not yield the degree of precision that today's +astrology is used to. +The best choice of method will probably be: +- For Mercury - Neptune: mean nodes and apsides +- For asteroids that belong to the inner asteroid belt: +osculating nodes/apsides from a heliocentric ellipse +- For Pluto and outer asteroids: osculating nodes/apsides +from a barycentric ellipse + +The Moon is a special case: A "lunar true node" makes +more sense, because it can be defined without the idea of an +ellipse, e.g. as the intersection axis of the momentary lunar +orbital plane with the ecliptic. Or it can be said that the +momentary motion of the moon points to one of the two +ecliptic points that are called the "true nodes". So, these +points make sense. With planetary nodes, the situation is +somewhat different, at least if we make a difference +between heliocentric and geocentric positions. If so, the +planetary nodes are points on a heliocentric orbital ellipse, +which are transformed to the geocenter. An ellipse is +required here, because a solar distance is required. In +contrast to the planetary nodes, the lunar node does not +require a distance, therefore manages without the idea of an +ellipse and does not share its weaknesses. +On the other hand, the lunar apsides DO require the idea of +an ellipse. And because the lunar ellipse is actually +extremely distorted, even more than any other celestial +ellipse, the "true Lilith" (apogee), for which printed +ephemerides are available, does not make any sense at all. +(See the chapter on the lunar node and apogee.) + +Special case: the Earth + +The Earth is another special case. Instead of the motion of +the Earth herself, the heliocentric motion of the Earth- +Moon-Barycenter (EMB) is used to determine the +osculating perihelion. +There is no node of the earth orbit itself. However, there is +an axis around which the earth's orbital plane slowly rotates +due to planetary precession. The position points of this axis +are not calculated by the Swiss Ephemeris. + +Special case: the Sun + +In addition to the Earth (EMB) apsides, the function +computes so-to-say "apsides" of the sun, i.e. points on the +orbit of the Sun where it is closest to and where it is farthest +from the Earth. These points form an opposition and are +used by some astrologers, e.g. by the Dutch astrologer +George Bode or the Swiss astrologer Liduina Schmed. The +perigee, located at about 13 Capricorn, is called the +"Black Sun", the other one, in Cancer, the "Diamond". +So, for a complete set of apsides, one ought to calculate +them for the Sun and the Earth and all other planets. + +The modes of the Swiss Ephemeris function +swe_nod_aps() + +The function swe_nod_aps() can be run in the following +modes: +1) Mean positions are given for nodes and apsides of Sun, + Moon, Earth, and the up to Neptune. Osculating + positions are given with Pluto and all asteroids. This is + the default mode. +2) Osculating positions are returned for nodes and apsides + of all planets. +3) Same as 2), but for planets and asteroids beyond + Jupiter, a barycentric ellipse is used. +4) Same as 1), but for Pluto and asteroids beyond Jupiter, + a barycentric ellipse is used. + +In all of these modes, the second focal point of the ellipse +can be computed instead of the aphelion. +Like the planetary function swe_calc(), swe_nod_aps() is +able to return geocentric, topocentric, heliocentric, or +barycentric position. + * + * tjd_ut julian day, ephemeris time + * ipl planet number + * iflag as usual, SEFLG_HELCTR, etc. + * xnasc an array of 6 doubles: ascending node + * xndsc an array of 6 doubles: ascending node + * xperi an array of 6 doubles: perihelion + * xaphe an array of 6 doubles: aphelion + * method see below + * serr error message + * + * method can have the following values: + * - 0 or SE_NODBIT_MEAN. MEAN positions are given for + * nodes and apsides of Sun, Moon, Earth, and the + * planets up to Neptune. Osculating positions are + * given with Pluto and all asteroids. + * - SE_NODBIT_OSCU. Osculating positions are given + * for all nodes and apsides. + * - SE_NODBIT_OSCU_BAR. Osculating nodes and apsides + * are computed from barycentric ellipses, for planets + * beyond Jupiter, but from heliocentric ones for + * ones for Jupiter and inner planets. + * - SE_NODBIT_MEAN and SE_NODBIT_OSCU_BAR can be combined. + * The program behaves the same way as with simple + * SE_NODBIT_MEAN, but uses barycentric ellipses for + * planets beyond Neptune and asteroids beyond Jupiter. + * - SE_NODBIT_FOCAL can be combined with any of the other + * bits. The second focal points of the ellipses will + * be returned instead of the aphelia. + */ +/* mean elements for Mercury - Neptune from VSOP87 (mean equinox of date) */ +static double el_node[8][4] = + {{ 48.330893, 1.1861890, 0.00017587, 0.000000211,}, /* Mercury */ + { 76.679920, 0.9011190, 0.00040665, -0.000000080,}, /* Venus */ + { 0 , 0 , 0 , 0 ,}, /* Earth */ + { 49.558093, 0.7720923, 0.00001605, 0.000002325,}, /* Mars */ + {100.464441, 1.0209550, 0.00040117, 0.000000569,}, /* Jupiter */ + {113.665524, 0.8770970, -0.00012067, -0.000002380,}, /* Saturn */ + { 74.005947, 0.5211258, 0.00133982, 0.000018516,}, /* Uranus */ + {131.784057, 1.1022057, 0.00026006, -0.000000636,}, /* Neptune */ + }; +static double el_peri[8][4] = + {{ 77.456119, 1.5564775, 0.00029589, 0.000000056,}, /* Mercury */ + {131.563707, 1.4022188, -0.00107337, -0.000005315,}, /* Venus */ + {102.937348, 1.7195269, 0.00045962, 0.000000499,}, /* Earth */ + {336.060234, 1.8410331, 0.00013515, 0.000000318,}, /* Mars */ + { 14.331309, 1.6126668, 0.00103127, -0.000004569,}, /* Jupiter */ + { 93.056787, 1.9637694, 0.00083757, 0.000004899,}, /* Saturn */ + {173.005159, 1.4863784, 0.00021450, 0.000000433,}, /* Uranus */ + { 48.123691, 1.4262677, 0.00037918, -0.000000003,}, /* Neptune */ + }; +static double el_incl[8][4] = + {{ 7.004986, 0.0018215, -0.00001809, 0.000000053,}, /* Mercury */ + { 3.394662, 0.0010037, -0.00000088, -0.000000007,}, /* Venus */ + { 0, 0, 0, 0 ,}, /* Earth */ + { 1.849726, -0.0006010, 0.00001276, -0.000000006,}, /* Mars */ + { 1.303270, -0.0054966, 0.00000465, -0.000000004,}, /* Jupiter */ + { 2.488878, -0.0037363, -0.00001516, 0.000000089,}, /* Saturn */ + { 0.773196, 0.0007744, 0.00003749, -0.000000092,}, /* Uranus */ + { 1.769952, -0.0093082, -0.00000708, 0.000000028,}, /* Neptune */ + }; +static double el_ecce[8][4] = + {{ 0.20563175, 0.000020406, -0.0000000284, -0.00000000017,}, /* Mercury */ + { 0.00677188, -0.000047766, 0.0000000975, 0.00000000044,}, /* Venus */ + { 0.01670862, -0.000042037, -0.0000001236, 0.00000000004,}, /* Earth */ + { 0.09340062, 0.000090483, -0.0000000806, -0.00000000035,}, /* Mars */ + { 0.04849485, 0.000163244, -0.0000004719, -0.00000000197,}, /* Jupiter */ + { 0.05550862, -0.000346818, -0.0000006456, 0.00000000338,}, /* Saturn */ + { 0.04629590, -0.000027337, 0.0000000790, 0.00000000025,}, /* Uranus */ + { 0.00898809, 0.000006408, -0.0000000008, -0.00000000005,}, /* Neptune */ + }; +static double el_sema[8][4] = + {{ 0.387098310, 0.0, 0.0, 0.0,}, /* Mercury */ + { 0.723329820, 0.0, 0.0, 0.0,}, /* Venus */ + { 1.000001018, 0.0, 0.0, 0.0,}, /* Earth */ + { 1.523679342, 0.0, 0.0, 0.0,}, /* Mars */ + { 5.202603191, 0.0000001913, 0.0, 0.0,}, /* Jupiter */ + { 9.554909596, 0.0000021389, 0.0, 0.0,}, /* Saturn */ + { 19.218446062, -0.0000000372, 0.00000000098, 0.0,}, /* Uranus */ + { 30.110386869, -0.0000001663, 0.00000000069, 0.0,}, /* Neptune */ + }; +/* Ratios of mass of Sun to masses of the planets */ +static double plmass[9] = { + 6023600, /* Mercury */ + 408523.5, /* Venus */ + 328900.5, /* Earth and Moon */ + 3098710, /* Mars */ + 1047.350, /* Jupiter */ + 3498.0, /* Saturn */ + 22960, /* Uranus */ + 19314, /* Neptune */ + 130000000, /* Pluto */ +}; +static int ipl_to_elem[15] = {2, 0, 0, 1, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 2,}; +int32 FAR PASCAL_CONV swe_nod_aps(double tjd_et, int32 ipl, int32 iflag, + int32 method, + double *xnasc, double *xndsc, + double *xperi, double *xaphe, + char *serr) +{ + int ij, i, j; + int32 iplx; + int32 ipli; + int istart, iend; + int32 iflJ2000; + double plm; + double t = (tjd_et - J2000) / 36525, dt; + double x[6], xx[24], *xp, xobs[6], x2000[6]; + double xpos[3][6], xnorm[6]; + double xposm[6]; + double xn[3][6], xs[3][6]; + double xq[3][6], xa[3][6]; + double xobs2[6], x2[6]; + double *xna, *xnd, *xpe, *xap; + double incl, sema, ecce, parg, ea, vincl, vsema, vecce, pargx, eax; + struct plan_data *pedp = &swed.pldat[SEI_EARTH]; + struct plan_data *psbdp = &swed.pldat[SEI_SUNBARY]; + struct plan_data pldat; + double *xsun = psbdp->x; + double *xear = pedp->x; + double *ep; + double Gmsm, dzmin; + double rxy, rxyz, fac, sgn; + double sinnode, cosnode, sinincl, cosincl, sinu, cosu, sinE, cosE, cosE2; + double uu, ny, ny2, c2, v2, pp, ro, ro2, rn, rn2; + struct epsilon *oe; + AS_BOOL is_true_nodaps = FALSE; + AS_BOOL do_aberr = !(iflag & (SEFLG_TRUEPOS | SEFLG_NOABERR)); + AS_BOOL do_defl = !(iflag & SEFLG_TRUEPOS) && !(iflag & SEFLG_NOGDEFL); + AS_BOOL do_focal_point = method & SE_NODBIT_FOPOINT; + AS_BOOL ellipse_is_bary = FALSE; + int32 iflg0; + /* function calls for Pluto with asteroid number 134340 + * are treated as calls for Pluto as main body SE_PLUTO */ + if (ipl == SE_AST_OFFSET + 134340) + ipl = SE_PLUTO; + xna = xx; + xnd = xx+6; + xpe = xx+12; + xap = xx+18; + xpos[0][0] = 0; /* to shut up mint */ + /* to get control over the save area: */ + swi_force_app_pos_etc(); + method %= SE_NODBIT_FOPOINT; + ipli = ipl; + if (ipl == SE_SUN) + ipli = SE_EARTH; + if (ipl == SE_MOON) { + do_defl = FALSE; + if (!(iflag & SEFLG_HELCTR)) + do_aberr = FALSE; + } + iflg0 = (iflag & (SEFLG_EPHMASK|SEFLG_NONUT)) | SEFLG_SPEED | SEFLG_TRUEPOS; + if (ipli != SE_MOON) + iflg0 |= SEFLG_HELCTR; + if (ipl == SE_MEAN_NODE || ipl == SE_TRUE_NODE || + ipl == SE_MEAN_APOG || ipl == SE_OSCU_APOG || + ipl < 0 || + (ipl >= SE_NPLANETS && ipl <= SE_AST_OFFSET)) { + /*(ipl >= SE_FICT_OFFSET && ipl - SE_FICT_OFFSET < SE_NFICT_ELEM)) */ + if (serr != NULL) + sprintf(serr, "nodes/apsides for planet %5.0f are not implemented", (double) ipl); + if (xnasc != NULL) + for (i = 0; i <= 5; i++) + xnasc[i] = 0; + if (xndsc != NULL) + for (i = 0; i <= 5; i++) + xndsc[i] = 0; + if (xaphe != NULL) + for (i = 0; i <= 5; i++) + xaphe[i] = 0; + if (xperi != NULL) + for (i = 0; i <= 5; i++) + xperi[i] = 0; + return ERR; + } + for (i = 0; i < 24; i++) + xx[i] = 0; + /*************************************** + * mean nodes and apsides + ***************************************/ + /* mean points only for Sun - Neptune */ + if ((method == 0 || (method & SE_NODBIT_MEAN)) && + ((ipl >= SE_SUN && ipl <= SE_NEPTUNE) || ipl == SE_EARTH)) { + if (ipl == SE_MOON) { + swi_mean_lunar_elements(tjd_et, &xna[0], &xna[3], &xpe[0], &xpe[3]); + incl = MOON_MEAN_INCL; + vincl = 0; + ecce = MOON_MEAN_ECC; + vecce = 0; + sema = MOON_MEAN_DIST / AUNIT; + vsema = 0; + } else { + iplx = ipl_to_elem[ipl]; + ep = el_incl[iplx]; + incl = ep[0] + ep[1] * t + ep[2] * t * t + ep[3] * t * t * t; + vincl = ep[1] / 36525; + ep = el_sema[iplx]; + sema = ep[0] + ep[1] * t + ep[2] * t * t + ep[3] * t * t * t; + vsema = ep[1] / 36525; + ep = el_ecce[iplx]; + ecce = ep[0] + ep[1] * t + ep[2] * t * t + ep[3] * t * t * t; + vecce = ep[1] / 36525; + ep = el_node[iplx]; + /* ascending node */ + xna[0] = ep[0] + ep[1] * t + ep[2] * t * t + ep[3] * t * t * t; + xna[3] = ep[1] / 36525; + /* perihelion */ + ep = el_peri[iplx]; + xpe[0] = ep[0] + ep[1] * t + ep[2] * t * t + ep[3] * t * t * t; + xpe[3] = ep[1] / 36525; + } + /* descending node */ + xnd[0] = swe_degnorm(xna[0] + 180); + xnd[3] = xna[3]; + /* angular distance of perihelion from node */ + parg = xpe[0] = swe_degnorm(xpe[0] - xna[0]); + pargx = xpe[3] = swe_degnorm(xpe[0] + xpe[3] - xna[3]); + /* transform from orbital plane to mean ecliptic of date */ + swe_cotrans(xpe, xpe, -incl); + /* xpe+3 is aux. position, not speed!!! */ + swe_cotrans(xpe+3, xpe+3, -incl-vincl); + /* add node again */ + xpe[0] = swe_degnorm(xpe[0] + xna[0]); + /* xpe+3 is aux. position, not speed!!! */ + xpe[3] = swe_degnorm(xpe[3] + xna[0] + xna[3]); + /* speed */ + xpe[3] = swe_degnorm(xpe[3] - xpe[0]); + /* heliocentric distance of perihelion and aphelion */ + xpe[2] = sema * (1 - ecce); + xpe[5] = (sema + vsema) * (1 - ecce - vecce) - xpe[2]; + /* aphelion */ + xap[0] = swe_degnorm(xpe[0] + 180); + xap[1] = -xpe[1]; + xap[3] = xpe[3]; + xap[4] = -xpe[4]; + if (do_focal_point) { + xap[2] = sema * ecce * 2; + xap[5] = (sema + vsema) * (ecce + vecce) * 2 - xap[2]; + } else { + xap[2] = sema * (1 + ecce); + xap[5] = (sema + vsema) * (1 + ecce + vecce) - xap[2]; + } + /* heliocentric distance of nodes */ + ea = atan(tan(-parg * DEGTORAD / 2) * sqrt((1-ecce)/(1+ecce))) * 2; + eax = atan(tan(-pargx * DEGTORAD / 2) * sqrt((1-ecce-vecce)/(1+ecce+vecce))) * 2; + xna[2] = sema * (cos(ea) - ecce) / cos(parg * DEGTORAD); + xna[5] = (sema+vsema) * (cos(eax) - ecce - vecce) / cos(pargx * DEGTORAD); + xna[5] -= xna[2]; + ea = atan(tan((180 - parg) * DEGTORAD / 2) * sqrt((1-ecce)/(1+ecce))) * 2; + eax = atan(tan((180 - pargx) * DEGTORAD / 2) * sqrt((1-ecce-vecce)/(1+ecce+vecce))) * 2; + xnd[2] = sema * (cos(ea) - ecce) / cos((180 - parg) * DEGTORAD); + xnd[5] = (sema+vsema) * (cos(eax) - ecce - vecce) / cos((180 - pargx) * DEGTORAD); + xnd[5] -= xnd[2]; + /* no light-time correction because speed is extremely small */ + for (i = 0, xp = xx; i < 4; i++, xp += 6) { + /* to cartesian coordinates */ + xp[0] *= DEGTORAD; + xp[1] *= DEGTORAD; + xp[3] *= DEGTORAD; + xp[4] *= DEGTORAD; + swi_polcart_sp(xp, xp); + } + /*************************************** + * "true" or osculating nodes and apsides + ***************************************/ + } else { + /* first, we need a heliocentric distance of the planet */ + if (swe_calc(tjd_et, ipli, iflg0, x, serr) == ERR) + return ERR; + iflJ2000 = (iflag & SEFLG_EPHMASK)|SEFLG_J2000|SEFLG_EQUATORIAL|SEFLG_XYZ|SEFLG_TRUEPOS|SEFLG_NONUT|SEFLG_SPEED; + ellipse_is_bary = FALSE; + if (ipli != SE_MOON) { + if ((method & SE_NODBIT_OSCU_BAR) && x[2] > 6) { + iflJ2000 |= SEFLG_BARYCTR; /* only planets beyond Jupiter */ + ellipse_is_bary = TRUE; + } else { + iflJ2000 |= SEFLG_HELCTR; + } + } + /* we need three positions and three speeds + * for three nodes/apsides. from the three node positions, + * the speed of the node will be computed. */ + if (ipli == SE_MOON) { + dt = NODE_CALC_INTV; + dzmin = 1e-15; + Gmsm = GEOGCONST * (1 + 1 / EARTH_MOON_MRAT) /AUNIT/AUNIT/AUNIT*86400.0*86400.0; + } else { + if ((ipli >= SE_MERCURY && ipli <= SE_PLUTO) || ipli == SE_EARTH) + plm = 1 / plmass[ipl_to_elem[ipl]]; + else + plm = 0; + dt = NODE_CALC_INTV * 10 * x[2]; + dzmin = 1e-15 * dt / NODE_CALC_INTV; + Gmsm = HELGRAVCONST * (1 + plm) /AUNIT/AUNIT/AUNIT*86400.0*86400.0; + } + if (iflag & SEFLG_SPEED) { + istart = 0; + iend = 2; + } else { + istart = iend = 0; + dt = 0; + } + for (i = istart, t = tjd_et - dt; i <= iend; i++, t += dt) { + if (istart == iend) + t = tjd_et; + if (swe_calc(t, ipli, iflJ2000, xpos[i], serr) == ERR) + return ERR; + /* the EMB is used instead of the earth */ + if (ipli == SE_EARTH) { + if (swe_calc(t, SE_MOON, iflJ2000 & ~(SEFLG_BARYCTR|SEFLG_HELCTR), xposm, serr) == ERR) + return ERR; + for (j = 0; j <= 2; j++) + xpos[i][j] += xposm[j] / (EARTH_MOON_MRAT + 1.0); + } + swi_plan_for_osc_elem(iflg0, t, xpos[i]); + } + for (i = istart; i <= iend; i++) { + if (fabs(xpos[i][5]) < dzmin) + xpos[i][5] = dzmin; + fac = xpos[i][2] / xpos[i][5]; + sgn = xpos[i][5] / fabs(xpos[i][5]); + for (j = 0; j <= 2; j++) { + xn[i][j] = (xpos[i][j] - fac * xpos[i][j+3]) * sgn; + xs[i][j] = -xn[i][j]; + } + } + for (i = istart; i <= iend; i++) { + /* node */ + rxy = sqrt(xn[i][0] * xn[i][0] + xn[i][1] * xn[i][1]); + cosnode = xn[i][0] / rxy; + sinnode = xn[i][1] / rxy; + /* inclination */ + swi_cross_prod(xpos[i], xpos[i]+3, xnorm); + rxy = xnorm[0] * xnorm[0] + xnorm[1] * xnorm[1]; + c2 = (rxy + xnorm[2] * xnorm[2]); + rxyz = sqrt(c2); + rxy = sqrt(rxy); + sinincl = rxy / rxyz; + cosincl = sqrt(1 - sinincl * sinincl); + if (xnorm[2] < 0) cosincl = -cosincl; /* retrograde asteroid, e.g. 20461 Dioretsa */ + /* argument of latitude */ + cosu = xpos[i][0] * cosnode + xpos[i][1] * sinnode; + sinu = xpos[i][2] / sinincl; + uu = atan2(sinu, cosu); + /* semi-axis */ + rxyz = sqrt(square_sum(xpos[i])); + v2 = square_sum((xpos[i]+3)); + sema = 1 / (2 / rxyz - v2 / Gmsm); + /* eccentricity */ + pp = c2 / Gmsm; + ecce = sqrt(1 - pp / sema); + /* eccentric anomaly */ + cosE = 1 / ecce * (1 - rxyz / sema); + sinE = 1 / ecce / sqrt(sema * Gmsm) * dot_prod(xpos[i], (xpos[i]+3)); + /* true anomaly */ + ny = 2 * atan(sqrt((1+ecce)/(1-ecce)) * sinE / (1 + cosE)); + /* distance of perihelion from ascending node */ + xq[i][0] = swi_mod2PI(uu - ny); + xq[i][1] = 0; /* latitude */ + xq[i][2] = sema * (1 - ecce); /* distance of perihelion */ + /* transformation to ecliptic coordinates */ + swi_polcart(xq[i], xq[i]); + swi_coortrf2(xq[i], xq[i], -sinincl, cosincl); + swi_cartpol(xq[i], xq[i]); + /* adding node, we get perihelion in ecl. coord. */ + xq[i][0] += atan2(sinnode, cosnode); + xa[i][0] = swi_mod2PI(xq[i][0] + PI); + xa[i][1] = -xq[i][1]; + if (do_focal_point) { + xa[i][2] = sema * ecce * 2; /* distance of aphelion */ + } else { + xa[i][2] = sema * (1 + ecce); /* distance of aphelion */ + } + swi_polcart(xq[i], xq[i]); + swi_polcart(xa[i], xa[i]); + /* new distance of node from orbital ellipse: + * true anomaly of node: */ + ny = swi_mod2PI(ny - uu); + ny2 = swi_mod2PI(ny + PI); + /* eccentric anomaly */ + cosE = cos(2 * atan(tan(ny / 2) / sqrt((1+ecce) / (1-ecce)))); + cosE2 = cos(2 * atan(tan(ny2 / 2) / sqrt((1+ecce) / (1-ecce)))); + /* new distance */ + rn = sema * (1 - ecce * cosE); + rn2 = sema * (1 - ecce * cosE2); + /* old node distance */ + ro = sqrt(square_sum(xn[i])); + ro2 = sqrt(square_sum(xs[i])); + /* correct length of position vector */ + for (j = 0; j <= 2; j++) { + xn[i][j] *= rn / ro; + xs[i][j] *= rn2 / ro2; + } + } + for (i = 0; i <= 2; i++) { + if (iflag & SEFLG_SPEED) { + xpe[i] = xq[1][i]; + xpe[i+3] = (xq[2][i] - xq[0][i]) / dt / 2; + xap[i] = xa[1][i]; + xap[i+3] = (xa[2][i] - xa[0][i]) / dt / 2; + xna[i] = xn[1][i]; + xna[i+3] = (xn[2][i] - xn[0][i]) / dt / 2; + xnd[i] = xs[1][i]; + xnd[i+3] = (xs[2][i] - xs[0][i]) / dt / 2; + } else { + xpe[i] = xq[0][i]; + xpe[i+3] = 0; + xap[i] = xa[0][i]; + xap[i+3] = 0; + xna[i] = xn[0][i]; + xna[i+3] = 0; + xnd[i] = xs[0][i]; + xnd[i+3] = 0; + } + } + is_true_nodaps = TRUE; + } + /* to set the variables required in the save area, + * i.e. ecliptic, nutation, barycentric sun, earth + * we compute the planet */ + if (ipli == SE_MOON && (iflag & (SEFLG_HELCTR | SEFLG_BARYCTR))) { + swi_force_app_pos_etc(); + if (swe_calc(tjd_et, SE_SUN, iflg0, x, serr) == ERR) + return ERR; + } else { + if (swe_calc(tjd_et, ipli, iflg0 | (iflag & SEFLG_TOPOCTR), x, serr) == ERR) + return ERR; + } + /*********************** + * position of observer + ***********************/ + if (iflag & SEFLG_TOPOCTR) { + /* geocentric position of observer */ + if (swi_get_observer(tjd_et, iflag, FALSE, xobs, serr) != OK) + return ERR; + /*for (i = 0; i <= 5; i++) + xobs[i] = swed.topd.xobs[i];*/ + } else { + for (i = 0; i <= 5; i++) + xobs[i] = 0; + } + if (iflag & (SEFLG_HELCTR | SEFLG_BARYCTR)) { + if ((iflag & SEFLG_HELCTR) && !(iflag & SEFLG_MOSEPH)) + for (i = 0; i <= 5; i++) + xobs[i] = xsun[i]; + } else if (ipl == SE_SUN && !(iflag & SEFLG_MOSEPH)) { + for (i = 0; i <= 5; i++) + xobs[i] = xsun[i]; + } else { + /* barycentric position of observer */ + for (i = 0; i <= 5; i++) + xobs[i] += xear[i]; + } + /* ecliptic obliqity */ + if (iflag & SEFLG_J2000) + oe = &swed.oec2000; + else + oe = &swed.oec; + /************************************************* + * conversions shared by mean and osculating points + *************************************************/ + for (ij = 0, xp = xx; ij < 4; ij++, xp += 6) { + /* no nodes for earth */ + if (ipli == SE_EARTH && ij <= 1) { + for (i = 0; i <= 5; i++) + xp[i] = 0; + continue; + } + /********************* + * to equator + *********************/ + if (is_true_nodaps && !(iflag & SEFLG_NONUT)) { + swi_coortrf2(xp, xp, -swed.nut.snut, swed.nut.cnut); + if (iflag & SEFLG_SPEED) + swi_coortrf2(xp+3, xp+3, -swed.nut.snut, swed.nut.cnut); + } + swi_coortrf2(xp, xp, -oe->seps, oe->ceps); + swi_coortrf2(xp+3, xp+3, -oe->seps, oe->ceps); + if (is_true_nodaps) { + /**************************** + * to mean ecliptic of date + ****************************/ + if (!(iflag & SEFLG_NONUT)) + swi_nutate(xp, iflag, TRUE); + } + /********************* + * to J2000 + *********************/ + swi_precess(xp, tjd_et, J_TO_J2000); + if (iflag & SEFLG_SPEED) + swi_precess_speed(xp, tjd_et, J_TO_J2000); + /********************* + * to barycenter + *********************/ + if (ipli == SE_MOON) { + for (i = 0; i <= 5; i++) + xp[i] += xear[i]; + } else { + if (!(iflag & SEFLG_MOSEPH) && !ellipse_is_bary) + for (j = 0; j <= 5; j++) + xp[j] += xsun[j]; + } + /********************* + * to correct center + *********************/ + for (j = 0; j <= 5; j++) + xp[j] -= xobs[j]; + /* geocentric perigee/apogee of sun */ + if (ipl == SE_SUN && !(iflag & (SEFLG_HELCTR | SEFLG_BARYCTR))) + for (j = 0; j <= 5; j++) + xp[j] = -xp[j]; + /********************* + * light deflection + *********************/ + dt = sqrt(square_sum(xp)) * AUNIT / CLIGHT / 86400.0; + if (do_defl) + swi_deflect_light(xp, dt, iflag); + /********************* + * aberration + *********************/ + if (do_aberr) { + swi_aberr_light(xp, xobs, iflag); + /* + * Apparent speed is also influenced by + * the difference of speed of the earth between t and t-dt. + * Neglecting this would result in an error of several 0.1" + */ + if (iflag & SEFLG_SPEED) { + /* get barycentric sun and earth for t-dt into save area */ + if (swe_calc(tjd_et - dt, ipli, iflg0 | (iflag & SEFLG_TOPOCTR), x2, serr) == ERR) + return ERR; + if (iflag & SEFLG_TOPOCTR) { + /* geocentric position of observer */ + /* if (swi_get_observer(tjd_et - dt, iflag, FALSE, xobs, serr) != OK) + return ERR;*/ + for (i = 0; i <= 5; i++) + xobs2[i] = swed.topd.xobs[i]; + } else { + for (i = 0; i <= 5; i++) + xobs2[i] = 0; + } + if (iflag & (SEFLG_HELCTR | SEFLG_BARYCTR)) { + if ((iflag & SEFLG_HELCTR) && !(iflag & SEFLG_MOSEPH)) + for (i = 0; i <= 5; i++) + xobs2[i] = xsun[i]; + } else if (ipl == SE_SUN && !(iflag & SEFLG_MOSEPH)) { + for (i = 0; i <= 5; i++) + xobs2[i] = xsun[i]; + } else { + /* barycentric position of observer */ + for (i = 0; i <= 5; i++) + xobs2[i] += xear[i]; + } + for (i = 3; i <= 5; i++) + xp[i] += xobs[i] - xobs2[i]; + /* The above call of swe_calc() has destroyed the + * parts of the save area + * (i.e. bary sun, earth nutation matrix!). + * to restore it: + */ + if (swe_calc(tjd_et, SE_SUN, iflg0 | (iflag & SEFLG_TOPOCTR), x2, serr) == ERR) + return ERR; + } + } + /********************* + * precession + *********************/ + /* save J2000 coordinates; required for sidereal positions */ + for (j = 0; j <= 5; j++) + x2000[j] = xp[j]; + if (!(iflag & SEFLG_J2000)) { + swi_precess(xp, tjd_et, J2000_TO_J); + if (iflag & SEFLG_SPEED) + swi_precess_speed(xp, tjd_et, J2000_TO_J); + } + /********************* + * nutation + *********************/ + if (!(iflag & SEFLG_NONUT)) + swi_nutate(xp, iflag, FALSE); + /* now we have equatorial cartesian coordinates; keep them */ + for (j = 0; j <= 5; j++) + pldat.xreturn[18+j] = xp[j]; + /************************************************ + * transformation to ecliptic. * + * with sidereal calc. this will be overwritten * + * afterwards. * + ************************************************/ + swi_coortrf2(xp, xp, oe->seps, oe->ceps); + if (iflag & SEFLG_SPEED) + swi_coortrf2(xp+3, xp+3, oe->seps, oe->ceps); + if (!(iflag & SEFLG_NONUT)) { + swi_coortrf2(xp, xp, swed.nut.snut, swed.nut.cnut); + if (iflag & SEFLG_SPEED) + swi_coortrf2(xp+3, xp+3, swed.nut.snut, swed.nut.cnut); + } + /* now we have ecliptic cartesian coordinates */ + for (j = 0; j <= 5; j++) + pldat.xreturn[6+j] = xp[j]; + /************************************ + * sidereal positions * + ************************************/ + if (iflag & SEFLG_SIDEREAL) { + /* project onto ecliptic t0 */ + if (swed.sidd.sid_mode & SE_SIDBIT_ECL_T0) { + if (swi_trop_ra2sid_lon(x2000, pldat.xreturn+6, pldat.xreturn+18, iflag, serr) != OK) + return ERR; + /* project onto solar system equator */ + } else if (swed.sidd.sid_mode & SE_SIDBIT_SSY_PLANE) { + if (swi_trop_ra2sid_lon_sosy(x2000, pldat.xreturn+6, pldat.xreturn+18, iflag, serr) != OK) + return ERR; + } else { + /* traditional algorithm */ + swi_cartpol_sp(pldat.xreturn+6, pldat.xreturn); + pldat.xreturn[0] -= swe_get_ayanamsa(tjd_et) * DEGTORAD; + swi_polcart_sp(pldat.xreturn, pldat.xreturn+6); + } + } + if ((iflag & SEFLG_XYZ) && (iflag & SEFLG_EQUATORIAL)) { + for (j = 0; j <= 5; j++) + xp[j] = pldat.xreturn[18+j]; + continue; + } + if (iflag & SEFLG_XYZ) { + for (j = 0; j <= 5; j++) + xp[j] = pldat.xreturn[6+j]; + continue; + } + /************************************************ + * transformation to polar coordinates * + ************************************************/ + swi_cartpol_sp(pldat.xreturn+18, pldat.xreturn+12); + swi_cartpol_sp(pldat.xreturn+6, pldat.xreturn); + /********************** + * radians to degrees * + **********************/ + for (j = 0; j < 2; j++) { + pldat.xreturn[j] *= RADTODEG; /* ecliptic */ + pldat.xreturn[j+3] *= RADTODEG; + pldat.xreturn[j+12] *= RADTODEG; /* equator */ + pldat.xreturn[j+15] *= RADTODEG; + } + if (iflag & SEFLG_EQUATORIAL) { + for (j = 0; j <= 5; j++) + xp[j] = pldat.xreturn[12+j]; + continue; + } else { + for (j = 0; j <= 5; j++) + xp[j] = pldat.xreturn[j]; + continue; + } + } + for (i = 0; i <= 5; i++) { + if (i > 2 && !(iflag & SEFLG_SPEED)) + xna[i] = xnd[i] = xpe[i] = xap[i] = 0; + if (xnasc != NULL) + xnasc[i] = xna[i]; + if (xndsc != NULL) + xndsc[i] = xnd[i]; + if (xperi != NULL) + xperi[i] = xpe[i]; + if (xaphe != NULL) + xaphe[i] = xap[i]; + } + return OK; +} + +int32 FAR PASCAL_CONV swe_nod_aps_ut(double tjd_ut, int32 ipl, int32 iflag, + int32 method, + double *xnasc, double *xndsc, + double *xperi, double *xaphe, + char *serr) { + return swe_nod_aps(tjd_ut + swe_deltat(tjd_ut), + ipl, iflag, method, xnasc, xndsc, xperi, xaphe, + serr); +} + +/* function finds the gauquelin sector position of a planet or fixed star + * + * if starname != NULL then a star is computed. + * iflag: use the flags SE_SWIEPH, SE_JPLEPH, SE_MOSEPH, SEFLG_TOPOCTR. + * + * imeth defines method: + * imeth = 0 use Placidus house position + * imeth = 1 use Placidus house posiition (with planetary lat = 0) + * imeth = 2 use rise and set of body's disc center + * imeth = 3 use rise and set of body's disc center with refraction + * rise and set are defined as appearance and disappearance of disc center + * + * geopos is an array of 3 doubles for geo. longitude, geo. latitude, elevation. + * atpress and attemp are only needed for imeth = 3. If imeth = 3, + * If imeth=3 and atpress not given (= 0), the programm assumes 1013.25 mbar; + * if a non-zero height above sea is given in geopos, atpress is estimated. + * dgsect is return area (pointer to a double) + * serr is pointer to error string, may be NULL + */ +int32 FAR PASCAL_CONV swe_gauquelin_sector(double t_ut, int32 ipl, char *starname, int32 iflag, int32 imeth, double *geopos, double atpress, double attemp, double *dgsect, char *serr) +{ + AS_BOOL rise_found = TRUE; + AS_BOOL set_found = TRUE; + int32 retval; + double tret[3]; + double t_et, t; + double x0[6]; + double eps, nutlo[2], armc; + int32 epheflag = iflag & SEFLG_EPHMASK; + AS_BOOL do_fixstar = (starname != NULL && *starname != '\0'); + int32 risemeth = 0; + AS_BOOL above_horizon = FALSE; + if (imeth < 0 || imeth > 5) { + if (serr) + sprintf(serr, "invalid method: %d", imeth); + return ERR; + } + /* function calls for Pluto with asteroid number 134340 + * are treated as calls for Pluto as main body SE_PLUTO */ + if (ipl == SE_AST_OFFSET + 134340) + ipl = SE_PLUTO; + /* + * geometrically from ecl. longitude and latitude + */ + if (imeth == 0 || imeth == 1) { + t_et = t_ut + swe_deltat(t_ut); + eps = swi_epsiln(t_et) * RADTODEG; + swi_nutation(t_et, nutlo); + nutlo[0] *= RADTODEG; + nutlo[1] *= RADTODEG; + armc = swe_degnorm(swe_sidtime0(t_ut, eps + nutlo[1], nutlo[0]) * 15 + geopos[0]); + if (do_fixstar) { + if (swe_fixstar(starname, t_et, iflag, x0, serr) == ERR) + return ERR; + } else { + if (swe_calc(t_et, ipl, iflag, x0, serr) == ERR) + return ERR; + } + if (imeth == 1) + x0[1] = 0; + *dgsect = swe_house_pos(armc, geopos[1], eps + nutlo[1], 'G', x0, NULL); + return OK; + } + /* + * from rise and set times + */ + if (imeth == 2 || imeth == 4) + risemeth |= SE_BIT_NO_REFRACTION; + if (imeth == 2 || imeth == 3) + risemeth |= SE_BIT_DISC_CENTER; + /* find the next rising time of the planet or star */ + retval = swe_rise_trans(t_ut, ipl, starname, epheflag, SE_CALC_RISE|risemeth, geopos, atpress, attemp, &(tret[0]), serr); + if (retval == ERR) { + return ERR; + } else if (retval == -2) { + /* actually, we could return ERR here. However, we + * keep this variable, in case we implement an algorithm + * for Gauquelin sector positions of circumpolar bodies. + * As with the Ludwig Otto procedure with Placidus, one + * could replace missing rises or sets by meridian transits, + * although there are cases where even this is not possible. + * Sometimes a body both appears and disappears on the western + * part of the horizon. Using true culminations rather than meridan + * transits would not help in any case either, because there are + * cases where a body does not have a culmination within days, + * e.g. the sun near the poles. + */ + rise_found = FALSE; + } + /* find the next setting time of the planet or star */ + retval = swe_rise_trans(t_ut, ipl, starname, epheflag, SE_CALC_SET|risemeth, geopos, atpress, attemp, &(tret[1]), serr); + if (retval == ERR) { + return ERR; + } else if (retval == -2) { + set_found = FALSE; + } + if (tret[0] < tret[1] && rise_found == TRUE) { + above_horizon = FALSE; + /* find last set */ + t = t_ut - 1.2; + if (set_found) t = tret[1] - 1.2; + set_found = TRUE; + retval = swe_rise_trans(t, ipl, starname, epheflag, SE_CALC_SET|risemeth, geopos, atpress, attemp, &(tret[1]), serr); + if (retval == ERR) { + return ERR; + } else if (retval == -2) { + set_found = FALSE; + } + } else if (tret[0] >= tret[1] && set_found == TRUE) { + above_horizon = TRUE; + /* find last rise */ + t = t_ut - 1.2; + if (rise_found) t = tret[0] - 1.2; + rise_found = TRUE; + retval = swe_rise_trans(t, ipl, starname, epheflag, SE_CALC_RISE|risemeth, geopos, atpress, attemp, &(tret[0]), serr); + if (retval == ERR) { + return ERR; + } else if (retval == -2) { + rise_found = FALSE; + } + } + if (rise_found && set_found) { + if (above_horizon) { + *dgsect = (t_ut - tret[0]) / (tret[1] - tret[0]) * 18 + 1; + } else { + *dgsect = (t_ut - tret[1]) / (tret[0] - tret[1]) * 18 + 19; + } + return OK; + } else { + *dgsect = 0; + if (serr) + sprintf(serr, "rise or set not found for planet %d", ipl); + return ERR; + } +} diff --git a/swe/src/swedate.c b/swe/src/swedate.c new file mode 100644 index 0000000..cf2c83a --- /dev/null +++ b/swe/src/swedate.c @@ -0,0 +1,587 @@ +/********************************************************* + $Header: /home/dieter/sweph/RCS/swedate.c,v 1.75 2009/04/08 07:17:29 dieter Exp $ + version 15-feb-89 16:30 + + swe_date_conversion() + swe_revjul() + swe_julday() + +************************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + +/* + swe_date_conversion(): + This function converts some date+time input {d,m,y,uttime} + into the Julian day number tjd. + The function checks that the input is a legal combination + of dates; for illegal dates like 32 January 1993 it returns ERR + but still converts the date correctly, i.e. like 1 Feb 1993. + The function is usually used to convert user input of birth data + into the Julian day number. Illegal dates should be notified to the user. + + Be aware that we always use astronomical year numbering for the years + before Christ, not the historical year numbering. + Astronomical years are done with negative numbers, historical + years with indicators BC or BCE (before common era). + Year 0 (astronomical) = 1 BC historical. + year -1 (astronomical) = 2 BC + etc. + Many users of Astro programs do not know about this difference. + + Return: OK or ERR (for illegal date) +*********************************************************/ + +# include "swephexp.h" +# include "sweph.h" + +static AS_BOOL init_leapseconds_done = FALSE; + + +int FAR PASCAL_CONV swe_date_conversion(int y, + int m, + int d, /* day, month, year */ + double uttime, /* UT in hours (decimal) */ + char c, /* calendar g[regorian]|j[ulian] */ + double *tjd) +{ + int rday, rmon, ryear; + double rut, jd; + int gregflag = SE_JUL_CAL; + if (c == 'g') + gregflag = SE_GREG_CAL; + rut = uttime; /* hours UT */ + jd = swe_julday(y, m, d, rut, gregflag); + swe_revjul(jd, gregflag, &ryear, &rmon, &rday, &rut); + *tjd = jd; + if (rmon == m && rday == d && ryear == y) { + return OK; + } else { + return ERR; + } +} /* end date_conversion */ + +/*************** swe_julday ******************************************** + * This function returns the absolute Julian day number (JD) + * for a given calendar date. + * The arguments are a calendar date: day, month, year as integers, + * hour as double with decimal fraction. + * If gregflag = SE_GREG_CAL (1), Gregorian calendar is assumed, + * if gregflag = SE_JUL_CAL (0),Julian calendar is assumed. + + The Julian day number is a system of numbering all days continously + within the time range of known human history. It should be familiar + to every astrological or astronomical programmer. The time variable + in astronomical theories is usually expressed in Julian days or + Julian centuries (36525 days per century) relative to some start day; + the start day is called 'the epoch'. + The Julian day number is a double representing the number of + days since JD = 0.0 on 1 Jan -4712, 12:00 noon (in the Julian calendar). + + Midnight has always a JD with fraction .5, because traditionally + the astronomical day started at noon. This was practical because + then there was no change of date during a night at the telescope. + From this comes also the fact the noon ephemerides were printed + before midnight ephemerides were introduced early in the 20th century. + + NOTE: The Julian day number must not be confused with the Julian + calendar system. + + Be aware the we always use astronomical year numbering for the years + before Christ, not the historical year numbering. + Astronomical years are done with negative numbers, historical + years with indicators BC or BCE (before common era). + Year 0 (astronomical) = 1 BC + year -1 (astronomical) = 2 BC + etc. + + Original author: Marc Pottenger, Los Angeles. + with bug fix for year < -4711 15-aug-88 by Alois Treindl + (The parameter sequence m,d,y still indicates the US origin, + be careful because the similar function date_conversion() uses + other parameter sequence and also Astrodienst relative juldate.) + + References: Oliver Montenbruck, Grundlagen der Ephemeridenrechnung, + Verlag Sterne und Weltraum (1987), p.49 ff + + related functions: swe_revjul() reverse Julian day number: compute the + calendar date from a given JD + date_conversion() includes test for legal date values + and notifies errors like 32 January. + ****************************************************************/ + +double FAR PASCAL_CONV swe_julday(int year, int month, int day, double hour, int gregflag) +{ + double jd; + double u,u0,u1,u2; + u = year; + if (month < 3) u -=1; + u0 = u + 4712.0; + u1 = month + 1.0; + if (u1 < 4) u1 += 12.0; + jd = floor(u0*365.25) + + floor(30.6*u1+0.000001) + + day + hour/24.0 - 63.5; + if (gregflag == SE_GREG_CAL) { + u2 = floor(fabs(u) / 100) - floor(fabs(u) / 400); + if (u < 0.0) u2 = -u2; + jd = jd - u2 + 2; + if ((u < 0.0) && (u/100 == floor(u/100)) && (u/400 != floor(u/400))) + jd -=1; + } + return jd; +} + +/*** swe_revjul ****************************************************** + swe_revjul() is the inverse function to swe_julday(), see the description + there. + Arguments are julian day number, calendar flag (0=julian, 1=gregorian) + return values are the calendar day, month, year and the hour of + the day with decimal fraction (0 .. 23.999999). + + Be aware the we use astronomical year numbering for the years + before Christ, not the historical year numbering. + Astronomical years are done with negative numbers, historical + years with indicators BC or BCE (before common era). + Year 0 (astronomical) = 1 BC historical year + year -1 (astronomical) = 2 BC historical year + year -234 (astronomical) = 235 BC historical year + etc. + + Original author Mark Pottenger, Los Angeles. + with bug fix for year < -4711 16-aug-88 Alois Treindl +*************************************************************************/ +void FAR PASCAL_CONV swe_revjul (double jd, int gregflag, + int *jyear, int *jmon, int *jday, double *jut) +{ + double u0,u1,u2,u3,u4; + u0 = jd + 32082.5; + if (gregflag == SE_GREG_CAL) { + u1 = u0 + floor (u0/36525.0) - floor (u0/146100.0) - 38.0; + if (jd >= 1830691.5) u1 +=1; + u0 = u0 + floor (u1/36525.0) - floor (u1/146100.0) - 38.0; + } + u2 = floor (u0 + 123.0); + u3 = floor ( (u2 - 122.2) / 365.25); + u4 = floor ( (u2 - floor (365.25 * u3) ) / 30.6001); + *jmon = (int) (u4 - 1.0); + if (*jmon > 12) *jmon -= 12; + *jday = (int) (u2 - floor (365.25 * u3) - floor (30.6001 * u4)); + *jyear = (int) (u3 + floor ( (u4 - 2.0) / 12.0) - 4800); + *jut = (jd - floor (jd + 0.5) + 0.5) * 24.0; +} + +/* transform local time to UTC or UTC to local time + * + * input + * iyear ... dsec date and time + * d_timezone timezone offset + * output + * iyear_out ... dsec_out + * + * For time zones east of Greenwich, d_timezone is positive. + * For time zones west of Greenwich, d_timezone is negative. + * + * For conversion from local time to utc, use +d_timezone. + * For conversion from utc to local time, use -d_timezone. + */ +void FAR PASCAL_CONV swe_utc_time_zone( + int32 iyear, int32 imonth, int32 iday, + int32 ihour, int32 imin, double dsec, + double d_timezone, + int32 *iyear_out, int32 *imonth_out, int32 *iday_out, + int32 *ihour_out, int32 *imin_out, double *dsec_out + ) +{ + double tjd, d; + AS_BOOL have_leapsec = FALSE; + double dhour; + if (dsec >= 60.0) { + have_leapsec = TRUE; + dsec -= 1.0; + } + dhour = ((double) ihour) + ((double) imin) / 60.0 + dsec / 3600.0; + tjd = swe_julday(iyear, imonth, iday, 0, SE_GREG_CAL); + dhour -= d_timezone; + if (dhour < 0.0) { + tjd -= 1.0; + dhour += 24.0; + } + if (dhour >= 24.0) { + tjd += 1.0; + dhour -= 24.0; + } + swe_revjul(tjd + 0.001, SE_GREG_CAL, iyear_out, imonth_out, iday_out, &d); + *ihour_out = (int) dhour; + d = (dhour - (double) *ihour_out) * 60; + *imin_out = (int) d; + *dsec_out = (d - (double) *imin_out) * 60; + if (have_leapsec) + *dsec_out += 1.0; +} + +/* + * functions for the handling of UTC + */ + +/* Leap seconds were inserted at the end of the following days:*/ +#define NLEAP_SECONDS 24 +#define NLEAP_SECONDS_SPACE 100 +static int leap_seconds[NLEAP_SECONDS_SPACE] = { +19720630, +19721231, +19731231, +19741231, +19751231, +19761231, +19771231, +19781231, +19791231, +19810630, +19820630, +19830630, +19850630, +19871231, +19891231, +19901231, +19920630, +19930630, +19940630, +19951231, +19970630, +19981231, +20051231, +20081231, +0 /* keep this 0 as end mark */ +}; +#define J1972 2441317.5 +#define NLEAP_INIT 10 + +/* Read additional leap second dates from external file, if given. + */ +static int init_leapsec(void) +{ + FILE *fp; + int ndat, ndat_last; + int tabsiz = 0; + int i; + char s[AS_MAXCH]; + char *sp; + if (!init_leapseconds_done) { + init_leapseconds_done = TRUE; + tabsiz = NLEAP_SECONDS; + ndat_last = leap_seconds[NLEAP_SECONDS - 1]; + /* no error message if file is missing */ + if ((fp = swi_fopen(-1, "seleapsec.txt", swed.ephepath, NULL)) == NULL) + return NLEAP_SECONDS; + while(fgets(s, AS_MAXCH, fp) != NULL) { + sp = s; + while (*sp == ' ' || *sp == '\t') sp++; + sp++; + if (*sp == '#' || *sp == '\n') + continue; + ndat = atoi(s); + if (ndat <= ndat_last) + continue; + /* table space is limited. no error msg, if exceeded */ + if (tabsiz >= NLEAP_SECONDS_SPACE) + return tabsiz; + leap_seconds[tabsiz] = ndat; + tabsiz++; + } + if (tabsiz > NLEAP_SECONDS) leap_seconds[tabsiz] = 0; /* end mark */ + fclose(fp); + return tabsiz; + } + /* find table size */ + tabsiz = 0; + for (i = 0; i < NLEAP_SECONDS_SPACE; i++) { + if (leap_seconds[i] == 0) + break; + else + tabsiz++; + } + return tabsiz; +} + +/* + * Input: Clock time UTC, year, month, day, hour, minute, second (decimal). + * gregflag Calendar flag + * serr error string + * Output: An array of doubles: + * dret[0] = Julian day number TT (ET) + * dret[1] = Julian day number UT1 + * + * Function returns OK or Error. + * + * - Before 1972, swe_utc_to_jd() treats its input time as UT1. + * Note: UTC was introduced in 1961. From 1961 - 1971, the length of the + * UTC second was regularly changed, so that UTC remained very close to UT1. + * - From 1972 on, input time is treated as UTC. + * - If delta_t - nleap - 32.184 > 1, the input time is treated as UT1. + * Note: Like this we avoid errors greater than 1 second in case that + * the leap seconds table (or the Swiss Ephemeris version) is not updated + * for a long time. +*/ +int32 FAR PASCAL_CONV swe_utc_to_jd(int32 iyear, int32 imonth, int32 iday, int32 ihour, int32 imin, double dsec, int32 gregflag, double *dret, char *serr) +{ + double tjd_ut1, tjd_et, tjd_et_1972, dhour, d; + int iyear2, imonth2, iday2; + int i, j, ndat, nleap, tabsiz_nleap; + /* + * error handling: invalid iyear etc. + */ + tjd_ut1 = swe_julday(iyear, imonth, iday, 0, gregflag); + swe_revjul(tjd_ut1, gregflag, &iyear2, &imonth2, &iday2, &d); + if (iyear != iyear2 || imonth != imonth2 || iday != iday2) { + if (serr != NULL) + sprintf(serr, "invalid date: year = %d, month = %d, day = %d", iyear, imonth, iday); + return ERR; + } + if (ihour < 0 || ihour > 23 + || imin < 0 || imin > 59 + || dsec < 0 || dsec >= 61 + || (dsec >= 60 && (imin < 59 || ihour < 23 || tjd_ut1 < J1972))) { + if (serr != NULL) + sprintf(serr, "invalid time: %d:%d:%.2f", ihour, imin, dsec); + return ERR; + } + dhour = (double) ihour + ((double) imin) / 60.0 + dsec / 3600.0; + /* + * before 1972, we treat input date as UT1 + */ + if (tjd_ut1 < J1972) { + dret[1] = swe_julday(iyear, imonth, iday, dhour, gregflag); + dret[0] = dret[1] + swe_deltat(dret[1]); + return OK; + } + /* + * if gregflag = Julian calendar, convert to gregorian calendar + */ + if (gregflag == SE_JUL_CAL) { + gregflag = SE_GREG_CAL; + swe_revjul(tjd_ut1, gregflag, &iyear, &imonth, &iday, &d); + } + /* + * number of leap seconds since 1972: + */ + tabsiz_nleap = init_leapsec(); + nleap = NLEAP_INIT; /* initial difference between UTC and TAI in 1972 */ + ndat = iyear * 10000 + imonth * 100 + iday; + for (i = 0; i < tabsiz_nleap; i++) { + if (ndat <= leap_seconds[i]) + break; + nleap++; + } + /* + * For input dates > today: + * If leap seconds table is not up to date, we'd better interpret the + * input time as UT1, not as UTC. How do we find out? + * Check, if delta_t - nleap - 32.184 > 0.9 + */ + d = swe_deltat(tjd_ut1) * 86400.0; + if (d - (double) nleap - 32.184 >= 1.0) { + dret[1] = tjd_ut1 + dhour / 24.0; + dret[0] = dret[1] + swe_deltat(dret[1]); + return OK; + } + /* + * if input second is 60: is it a valid leap second ? + */ + if (dsec >= 60) { + j = 0; + for (i = 0; i < tabsiz_nleap; i++) { + if (ndat == leap_seconds[i]) { + j = 1; + break; + } + } + if (j != 1) { + if (serr != NULL) + sprintf(serr, "invalid time (no leap second!): %d:%d:%.2f", ihour, imin, dsec); + return ERR; + } + } + /* + * convert UTC to ET and UT1 + */ + /* the number of days between input date and 1 jan 1972: */ + d = tjd_ut1 - J1972; + /* SI time since 1972, ignoring leap seconds: */ + d += (double) ihour / 24.0 + (double) imin / 1440.0 + dsec / 86400.0; + /* ET (TT) */ + tjd_et_1972 = J1972 + (32.184 + NLEAP_INIT) / 86400.0; + tjd_et = tjd_et_1972 + d + ((double) (nleap - NLEAP_INIT)) / 86400.0; + d = swe_deltat(tjd_et); + tjd_ut1 = tjd_et - swe_deltat(tjd_et - d); + dret[0] = tjd_et; + dret[1] = tjd_ut1; + return OK; +} + +/* + * Input: tjd_et Julian day number, terrestrial time (ephemeris time). + * gregfalg Calendar flag + * Output: UTC year, month, day, hour, minute, second (decimal). + * + * - Before 1 jan 1972 UTC, output UT1. + * Note: UTC was introduced in 1961. From 1961 - 1971, the length of the + * UTC second was regularly changed, so that UTC remained very close to UT1. + * - From 1972 on, output is UTC. + * - If delta_t - nleap - 32.184 > 1, the output is UT1. + * Note: Like this we avoid errors greater than 1 second in case that + * the leap seconds table (or the Swiss Ephemeris version) has not been + * updated for a long time. + */ +void FAR PASCAL_CONV swe_jdet_to_utc(double tjd_et, int32 gregflag, int32 *iyear, int32 *imonth, int32 *iday, int32 *ihour, int32 *imin, double *dsec) +{ + int i; + int second_60 = 0; + int iyear2, imonth2, iday2, nleap, ndat, tabsiz_nleap; + double d, tjd, tjd_et_1972, tjd_ut, dret[10]; + /* + * if tjd_et is before 1 jan 1972 UTC, return UT1 + */ + tjd_et_1972 = J1972 + (32.184 + NLEAP_INIT) / 86400.0; + d = swe_deltat(tjd_et); + tjd_ut = tjd_et - swe_deltat(tjd_et - d); + if (tjd_et < tjd_et_1972) { + swe_revjul(tjd_ut, gregflag, iyear, imonth, iday, &d); + *ihour = (int32) d; + d -= (double) *ihour; + d *= 60; + *imin = (int32) d; + *dsec = (d - (double) *imin) * 60.0; + return; + } + /* + * minimum number of leap seconds since 1972; we may be missing one leap + * second + */ + tabsiz_nleap = init_leapsec(); + swe_revjul(tjd_ut-1, SE_GREG_CAL, &iyear2, &imonth2, &iday2, &d); + ndat = iyear2 * 10000 + imonth2 * 100 + iday2; + nleap = 0; + for (i = 0; i < tabsiz_nleap; i++) { + if (ndat <= leap_seconds[i]) + break; + nleap++; + } + /* date of potentially missing leapsecond */ + if (nleap < tabsiz_nleap) { + i = leap_seconds[nleap]; + iyear2 = i / 10000; + imonth2 = (i % 10000) / 100;; + iday2 = i % 100; + tjd = swe_julday(iyear2, imonth2, iday2, 0, SE_GREG_CAL); + swe_revjul(tjd+1, SE_GREG_CAL, &iyear2, &imonth2, &iday2, &d); + swe_utc_to_jd(iyear2,imonth2,iday2, 0, 0, 0, SE_GREG_CAL, dret, NULL); + d = tjd_et - dret[0]; + if (d >= 0) { + nleap++; + } else if (d < 0 && d > -1.0/86400.0) { + second_60 = 1; + } + } + /* + * UTC, still unsure about one leap second + */ + tjd = J1972 + (tjd_et - tjd_et_1972) - ((double) nleap + second_60) / 86400.0; + swe_revjul(tjd, SE_GREG_CAL, iyear, imonth, iday, &d); + *ihour = (int32) d; + d -= (double) *ihour; + d *= 60; + *imin = (int32) d; + *dsec = (d - (double) *imin) * 60.0 + second_60; + /* + * For input dates > today: + * If leap seconds table is not up to date, we'd better interpret the + * input time as UT1, not as UTC. How do we find out? + * Check, if delta_t - nleap - 32.184 > 0.9 + */ + d = swe_deltat(tjd_et); + d = swe_deltat(tjd_et - d); + if (d * 86400.0 - (double) (nleap + NLEAP_INIT) - 32.184 >= 1.0) { + swe_revjul(tjd_et - d, SE_GREG_CAL, iyear, imonth, iday, &d); + *ihour = (int32) d; + d -= (double) *ihour; + d *= 60; + *imin = (int32) d; + *dsec = (d - (double) *imin) * 60.0; + } + if (gregflag == SE_JUL_CAL) { + tjd = swe_julday(*iyear, *imonth, *iday, 0, SE_GREG_CAL); + swe_revjul(tjd, gregflag, iyear, imonth, iday, &d); + } +} + +/* + * Input: tjd_ut Julian day number, universal time (UT1). + * gregfalg Calendar flag + * Output: UTC year, month, day, hour, minute, second (decimal). + * + * - Before 1 jan 1972 UTC, output UT1. + * Note: UTC was introduced in 1961. From 1961 - 1971, the length of the + * UTC second was regularly changed, so that UTC remained very close to UT1. + * - From 1972 on, output is UTC. + * - If delta_t - nleap - 32.184 > 1, the output is UT1. + * Note: Like this we avoid errors greater than 1 second in case that + * the leap seconds table (or the Swiss Ephemeris version) has not been + * updated for a long time. + */ +void FAR PASCAL_CONV swe_jdut1_to_utc(double tjd_ut, int32 gregflag, int32 *iyear, int32 *imonth, int32 *iday, int32 *ihour, int32 *imin, double *dsec) +{ + double tjd_et = tjd_ut + swe_deltat(tjd_ut); + swe_jdet_to_utc(tjd_et, gregflag, iyear, imonth, iday, ihour, imin, dsec); +} diff --git a/swe/src/swedate.h b/swe/src/swedate.h new file mode 100644 index 0000000..a03e3e1 --- /dev/null +++ b/swe/src/swedate.h @@ -0,0 +1,82 @@ +/********************************************************* + $Header: /home/dieter/sweph/RCS/swedate.h,v 1.74 2008/06/16 10:07:20 dieter Exp $ + version 15-feb-89 16:30 +*********************************************************/ + +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _SWEDLL_H +extern EXP32 int FAR PASCAL_CONV EXP16 swe_date_conversion ( + int y , int m , int d , /* year, month, day */ + double utime, /* universal time in hours (decimal) */ + char c, /* calendar g[regorian]|j[ulian]|a[stro = greg] */ + double *tgmt); + +extern EXP32 double *FAR PASCAL_CONV EXP16 swe_julday( + int year, int month, int day, double hour, + int gregflag); + +extern EXP32 void FAR PASCAL_CONV EXP16 swe_revjul ( + double jd, + int gregflag, + int *jyear, int *jmon, int *jday, double *jut); +#endif +#ifdef __cplusplus +} /* extern C */ +#endif diff --git a/swe/src/swedll.h b/swe/src/swedll.h new file mode 100644 index 0000000..c5e6665 --- /dev/null +++ b/swe/src/swedll.h @@ -0,0 +1,525 @@ +/* SWISSEPH + * $Header: /home/dieter/sweph/RCS/swedll.h,v 1.75 2009/04/08 07:19:08 dieter Exp $ + * + * Windows DLL interface imports for the Astrodienst SWISSEPH package + * + +**************************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + +/* $Id: swedll.h,v 1.75 2009/04/08 07:19:08 dieter Exp $ */ + +#ifdef __cplusplus +extern "C" { +#endif +#ifndef _SWEDLL_H +#define _SWEDLL_H + +#ifndef _SWEPHEXP_INCLUDED +#include "swephexp.h" +#endif + +#ifdef USE_DLL16 /* 16bit DLL */ +#define DllImport extern +#else +# ifdef __cplusplus +#define DllImport extern "C" __declspec( dllimport ) +# else +#define DllImport __declspec( dllimport ) +# endif +#endif + +DllImport int32 FAR PASCAL swe_heliacal_ut(double JDNDaysUTStart, double *geopos, double *datm, double *dobs, char *ObjectName, int32 TypeEvent, int32 iflag, double *dret, char *serr); +DllImport int32 FAR PASCAL swe_heliacal_pheno_ut(double JDNDaysUT, double *geopos, double *datm, double *dobs, char *ObjectName, int32 TypeEvent, int32 helflag, double *darr, char *serr); +DllImport int32 FAR PASCAL swe_vis_limit_mag(double tjdut, double *geopos, double *datm, double *dobs, char *ObjectName, int32 helflag, double *dret, char *serr); +/* the following are secret, for Victor Reijs' */ +DllImport int32 FAR PASCAL swe_heliacal_angle(double tjdut, double *dgeo, double *datm, double *dobs, int32 helflag, double mag, double azi_obj, double azi_sun, double azi_moon, double alt_moon, double *dret, char *serr); +DllImport int32 FAR PASCAL swe_topo_arcus_visionis(double tjdut, double *dgeo, double *datm, double *dobs, int32 helflag, double mag, double azi_obj, double alt_obj, double azi_sun, double azi_moon, double alt_moon, double *dret, char *serr); + +DllImport double FAR PASCAL swe_degnorm(double deg); + +DllImport char * FAR PASCAL swe_version(char *); + +DllImport int32 FAR PASCAL swe_calc( + double tjd, int ipl, int32 iflag, + double *xx, + char *serr); + +DllImport int32 FAR PASCAL swe_calc_ut( + double tjd_ut, int32 ipl, int32 iflag, + double *xx, + char *serr); + +DllImport int32 FAR PASCAL swe_fixstar( + char *star, double tjd, int32 iflag, + double *xx, + char *serr); + +DllImport int32 FAR PASCAL swe_fixstar_ut( + char *star, double tjd_ut, int32 iflag, + double *xx, + char *serr); + +DllImport int32 FAR PASCAL swe_fixstar_mag( + char *star, double *xx, char *serr); + +DllImport double FAR PASCAL swe_sidtime0(double tjd_ut, double ecl, double nut); +DllImport double FAR PASCAL swe_sidtime(double tjd_ut); + +DllImport double FAR PASCAL swe_deltat(double tjd); + +DllImport int FAR PASCAL swe_houses( + double tjd_ut, double geolat, double geolon, int hsys, + double *hcusps, double *ascmc); + +DllImport int FAR PASCAL swe_houses_ex( + double tjd_ut, int32 iflag, double geolat, double geolon, int hsys, + double *hcusps, double *ascmc); + +DllImport int FAR PASCAL swe_houses_armc( + double armc, double geolat, double eps, int hsys, + double *hcusps, double *ascmc); + +DllImport double FAR PASCAL swe_house_pos( + double armc, double geolon, double eps, int hsys, double *xpin, char *serr); + +DllImport int32 FAR PASCAL swe_gauquelin_sector( + double t_ut, int32 ipl, char *starname, int32 iflag, int32 imeth, double *geopos, double atpress, double attemp, double *dgsect, char *serr); + +DllImport void FAR PASCAL swe_set_sid_mode( + int32 sid_mode, double t0, double ayan_t0); + +DllImport double FAR PASCAL swe_get_ayanamsa(double tjd_et); + +DllImport double FAR PASCAL swe_get_ayanamsa_ut(double tjd_ut); + +DllImport char *FAR PASCAL swe_get_ayanamsa_name(int32 isidmode); + +DllImport int FAR PASCAL swe_date_conversion( + int y , int m , int d , /* year, month, day */ + double utime, /* universal time in hours (decimal) */ + char c, /* calendar g[regorian]|j[ulian]|a[stro = greg] */ + double *tjd); + +DllImport double FAR PASCAL swe_julday( + int year, int mon, int mday, + double hour, + int gregflag); + +DllImport void FAR PASCAL swe_revjul( + double jd, int gregflag, + int *year, int *mon, int *mday, + double *hour); + +DllImport void FAR PASCAL swe_utc_time_zone( + int32 iyear, int32 imonth, int32 iday, + int32 ihour, int32 imin, double dsec, + double d_timezone, + int32 *iyear_out, int32 *imonth_out, int32 *iday_out, + int32 *ihour_out, int32 *imin_out, double *dsec_out); + +DllImport int32 FAR PASCAL swe_utc_to_jd( + int32 iyear, int32 imonth, int32 iday, + int32 ihour, int32 imin, double dsec, + int32 gregflag, double *dret, char *serr); + +DllImport void FAR PASCAL swe_jdet_to_utc( + double tjd_et, int32 gregflag, + int32 *iyear, int32 *imonth, int32 *iday, + int32 *ihour, int32 *imin, double *dsec); + +DllImport void FAR PASCAL swe_jdut1_to_utc( + double tjd_ut, int32 gregflag, + int32 *iyear, int32 *imonth, int32 *iday, + int32 *ihour, int32 *imin, double *dsec); + +DllImport int FAR PASCAL swe_time_equ( + double tjd, double *e, char *serr); + +DllImport double FAR PASCAL swe_get_tid_acc(void); +DllImport void FAR PASCAL swe_set_tid_acc(double tidacc); +DllImport void FAR PASCAL swe_set_ephe_path(char *path); +DllImport void FAR PASCAL swe_set_jpl_file(char *fname); +DllImport void FAR PASCAL swe_close(void); +DllImport char *FAR PASCAL swe_get_planet_name(int ipl, char *spname); +DllImport void FAR PASCAL swe_cotrans(double *xpo, double *xpn, double eps); +DllImport void FAR PASCAL swe_cotrans_sp(double *xpo, double *xpn, double eps); + +DllImport void FAR PASCAL swe_set_topo(double geolon, double geolat, double height); + +/**************************** + * from swecl.c + ****************************/ + +/* computes geographic location and attributes of solar + * eclipse at a given tjd */ +DllImport int32 FAR PASCAL swe_sol_eclipse_where(double tjd, int32 ifl, double *geopos, double *attr, char *serr); + +DllImport int32 FAR PASCAL swe_lun_occult_where(double tjd, int32 ipl, char *starname, int32 ifl, double *geopos, double *attr, char *serr); + +/* computes attributes of a solar eclipse for given tjd, geolon, geolat */ +DllImport int32 FAR PASCAL swe_sol_eclipse_how(double tjd, int32 ifl, double *geopos, double *attr, char *serr); + +/* finds time of next local eclipse */ +DllImport int32 FAR PASCAL swe_sol_eclipse_when_loc(double tjd_start, int32 ifl, double *geopos, double *tret, double *attr, int32 backward, char *serr); + +DllImport int32 FAR PASCAL swe_lun_occult_when_loc(double tjd_start, int32 ipl, char *starname, int32 ifl, double *geopos, double *tret, double *attr, int32 backward, char *serr); + +/* finds time of next eclipse globally */ +DllImport int32 FAR PASCAL swe_sol_eclipse_when_glob(double tjd_start, int32 ifl, int32 ifltype, double *tret, int32 backward, char *serr); + +/* finds time of next occultation globally */ +DllImport int32 FAR PASCAL swe_lun_occult_when_glob(double tjd_start, int32 ipl, char *starname, int32 ifl, int32 ifltype, double *tret, int32 backward, char *serr); + +/* computes attributes of a lunar eclipse for given tjd */ +DllImport int32 FAR PASCAL swe_lun_eclipse_how( + double tjd_ut, + int32 ifl, + double *geopos, + double *attr, + char *serr); +DllImport int32 FAR PASCAL swe_lun_eclipse_when(double tjd_start, int32 ifl, int32 ifltype, double *tret, int32 backward, char *serr); + +/* planetary phenomena */ +DllImport int32 FAR PASCAL swe_pheno(double tjd, int32 ipl, int32 iflag, + double *attr, char *serr); + +DllImport int32 FAR PASCAL swe_pheno_ut(double tjd_ut, int32 ipl, int32 iflag, double *attr, char *serr); + +DllImport double FAR PASCAL swe_refrac(double inalt, double atpress, double attemp, int32 calc_flag); +DllImport double FAR PASCAL swe_refrac_extended(double inalt, double geoalt, double atpress, double attemp, double lapse_rate, int32 calc_flag, double *dret); +DllImport void FAR PASCAL swe_set_lapse_rate(double lapse_rate); + +DllImport void FAR PASCAL swe_azalt( + double tjd_ut, + int32 calc_flag, + double *geopos, + double atpress, + double attemp, + double *xin, + double *xaz); + +DllImport void FAR PASCAL swe_azalt_rev( + double tjd_ut, + int32 calc_flag, + double *geopos, + double *xin, + double *xout); + +DllImport int32 FAR PASCAL swe_rise_trans( + double tjd_ut, int32 ipl, char *starname, + int32 epheflag, int32 rsmi, + double *geopos, + double atpress, double attemp, + double *tret, + char *serr); + +DllImport int32 FAR PASCAL swe_rise_trans_true_hor( + double tjd_ut, int32 ipl, char *starname, + int32 epheflag, int32 rsmi, + double *geopos, + double atpress, double attemp, + double horhgt, + double *tret, + char *serr); + +DllImport int32 FAR PASCAL swe_nod_aps(double tjd_et, int32 ipl, int32 iflag, + int32 method, + double *xnasc, double *xndsc, + double *xperi, double *xaphe, + char *serr); + +DllImport int32 FAR PASCAL swe_nod_aps_ut(double tjd_ut, int32 ipl, int32 iflag, + int32 method, + double *xnasc, double *xndsc, + double *xperi, double *xaphe, + char *serr); + +/*DllImport int32 FAR PASCAL HeliacalAngle(double Magn, double Age, int SN, double AziO, double AltM, double AziM, double JDNDaysUT, double AziS, double Lat, double HeightEye, double Temperature, double Pressure, double RH, double VR, double *dangret, char *serr); + +DllImport int32 FAR PASCAL HeliacalJDut(double JDNDaysUTStart, double Age, int SN, double Lat, double Longitude, double HeightEye, double Temperature, double Pressure, double RH, double VR, char *ObjectName, int TypeEvent, char *AVkind, double *dret, char *serr);*/ + +/******************************************************* + * other functions from swephlib.c; + * they are not needed for Swiss Ephemeris, + * but may be useful to former Placalc users. + ********************************************************/ + +/* normalize argument into interval [0..DEG360] */ +DllImport centisec FAR PASCAL swe_csnorm(centisec p); + +/* distance in centisecs p1 - p2 normalized to [0..360[ */ +DllImport centisec FAR PASCAL swe_difcsn (centisec p1, centisec p2); + +DllImport double FAR PASCAL swe_difdegn (double p1, double p2); + +/* distance in centisecs p1 - p2 normalized to [-180..180[ */ +DllImport centisec FAR PASCAL swe_difcs2n(centisec p1, centisec p2); + +DllImport double FAR PASCAL swe_difdeg2n(double p1, double p2); + +DllImport double FAR PASCAL swe_difdeg2n(double p1, double p2); +DllImport double FAR PASCAL swe_difrad2n(double p1, double p2); +DllImport double FAR PASCAL swe_rad_midp(double x1, double x0); +DllImport double FAR PASCAL swe_deg_midp(double x1, double x0); + +/* round second, but at 29.5959 always down */ +DllImport centisec FAR PASCAL swe_csroundsec(centisec x); + +/* double to int32 with rounding, no overflow check */ +DllImport int32 FAR PASCAL swe_d2l(double x); + +DllImport void FAR PASCAL swe_split_deg(double ddeg, int32 roundflag, int32 *ideg, int32 *imin, int32 *isec, double *dsecfr, int32 *isgn); + +/* monday = 0, ... sunday = 6 */ +DllImport int FAR PASCAL swe_day_of_week(double jd); + +DllImport char *FAR PASCAL swe_cs2timestr(CSEC t, int sep, AS_BOOL suppressZero, char *a); + +DllImport char *FAR PASCAL swe_cs2lonlatstr(CSEC t, char pchar, char mchar, char *s); + +DllImport char *FAR PASCAL swe_cs2degstr(CSEC t, char *a); + + +/* additional functions for antiquated GFA basic DLL interface. + * double -> double * + * char -> char * + * void -> int + */ + +DllImport int32 FAR PASCAL swe_calc_d( + double *tjd, int ipl, int32 iflag, + double *x, + char *serr); + +DllImport int32 FAR PASCAL swe_calc_ut_d( + double *tjd, int16 ipl, int32 iflag, + double *x, + char *serr); + +DllImport int32 FAR PASCAL swe_fixstar_d( + char *star, double *tjd, int32 iflag, + double *x, + char *serr); + +DllImport int32 FAR PASCAL swe_fixstar_ut_d( + char *star, double *tjd, int32 iflag, + double *x, + char *serr); + +DllImport int FAR PASCAL swe_close_d(int ivoid); + +DllImport int FAR PASCAL swe_set_ephe_path_d(char *path); + +DllImport int FAR PASCAL swe_set_jpl_file_d(char *fname); + +DllImport char *FAR PASCAL swe_get_planet_name_d(int ipl, char *spname); + +DllImport int FAR PASCAL swe_deltat_d(double *tjd, double *deltat); + +DllImport int FAR PASCAL swe_sidtime0_d(double *tjd_ut, double *eps, +double *nut, double *sidt); +DllImport int FAR PASCAL swe_sidtime_d(double *tjd_ut, double *sidt); + +DllImport int FAR PASCAL swe_set_sid_mode_d( + int32 sid_mode, double *t0, double *ayan_t0); + +DllImport int FAR PASCAL swe_get_ayanamsa_d(double *tjd_et, double *ayan); +DllImport int FAR PASCAL swe_get_ayanamsa_ut_d(double *tjd_et, double *ayan); + +DllImport int FAR PASCAL swe_cotrans_d(double *xpo, double *xpn, double *eps); +DllImport int FAR PASCAL swe_cotrans_sp_d(double *xpo, double *xpn, double *eps); + +DllImport int FAR PASCAL swe_set_topo_d(double *geolon, double *geolat, double *height); + +DllImport int FAR PASCAL swe_get_tid_acc_d(double *t_acc); +DllImport int FAR PASCAL swe_set_tid_acc_d(double *t_acc); + +DllImport int FAR PASCAL swe_degnorm_d(double *x); + +DllImport int FAR PASCAL swe_date_conversion_d( + int y , int m , int d , /* year, month, day */ + double *utime, /* universal time in hours (decimal) */ + char *c, /* calendar g[regorian]|j[ulian]|a[stro = greg] */ + double *tjd); + +DllImport int FAR PASCAL swe_julday_d( + int year, int month, int day, double *hour, + int gregflag, double *tjd); + +DllImport int FAR PASCAL swe_revjul_d( + double *tjd, + int gregflag, + int *jyear, int *jmon, int *jday, double *jut); + +DllImport int FAR PASCAL swe_houses_d( + double *tjd, double *geolat, double *geolon, int hsys, + double *hcusps, double *ascmc); + +DllImport int FAR PASCAL swe_houses_ex_d( + double *tjd_ut, int32 iflag, double *geolat, double *geolon, int hsys, + double *hcusps, double *ascmc); + +DllImport int FAR PASCAL swe_houses_armc_d( + double *armc, double *geolat, double *eps, int hsys, + double *hcusps, double *ascmc); + +DllImport int FAR PASCAL swe_house_pos_d( + double *armc, double *geolon, double *eps, int hsys, double *xpin, double *hpos, char *serr); + +/* normalize argument into interval [0..DEG360] */ +DllImport centisec FAR PASCAL swe_csnorm_d(centisec p); + +/* distance in centisecs p1 - p2 normalized to [0..360[ */ +DllImport centisec FAR PASCAL swe_difcsn_d(centisec p1, centisec p2); + +DllImport int FAR PASCAL swe_difdegn_d(double *p1, double *p2, double *diff); + +/* distance in centisecs p1 - p2 normalized to [-180..180[ */ +DllImport centisec FAR PASCAL swe_difcs2n_d(centisec p1, centisec p2); + +DllImport int FAR PASCAL swe_difdeg2n_d(double *p1, double *p2, double *diff); + +/* round second, but at 29.5959 always down */ +DllImport centisec FAR PASCAL swe_csroundsec_d(centisec x); + +/* double to int32 with rounding, no overflow check */ +DllImport int32 FAR PASCAL swe_d2l_d(double *x); + +DllImport int FAR PASCAL swe_split_deg_d(double *ddeg, int32 roundflag, int32 *ideg, int32 *imin, int32 *isec, double *dsecfr, int32 *isgn); + +/* monday = 0, ... sunday = 6 */ +DllImport int FAR PASCAL swe_day_of_week_d(double *jd); + +DllImport char *FAR PASCAL swe_cs2timestr_d(CSEC t, int sep, AS_BOOL suppressZero, char *a); + +DllImport char *FAR PASCAL swe_cs2lonlatstr_d(CSEC t, char *pchar, char *mchar, char *s); + +DllImport char *FAR PASCAL swe_cs2degstr_d(CSEC t, char *a); + +/**************************** + * from swecl.c + ****************************/ + +/* computes geographic location and attributes of solar + * eclipse at a given tjd */ +DllImport int32 FAR PASCAL swe_sol_eclipse_where_d(double *tjd_ut, int32 ifl, double *geopos, double *attr, char *serr); + +/* computes attributes of a solar eclipse for given tjd, geolon, geolat */ +DllImport int32 FAR PASCAL swe_sol_eclipse_how_d(double *tjd_ut, int32 ifl, double geolon, double geolat, double geohgt, double *attr, char *serr); + +/* finds time of next local eclipse */ +DllImport int32 FAR PASCAL swe_sol_eclipse_when_loc_d(double *tjd_start, int32 ifl, double *geopos, double *tret, double *attr, AS_BOOL backward, char *serr); + +/* finds time of next eclipse globally */ +DllImport int32 FAR PASCAL swe_sol_eclipse_when_glob_d(double *tjd_start, int32 ifl, int32 ifltype, + double *tret, AS_BOOL backward, char *serr); + +/* computes attributes of a lunar eclipse for given tjd */ +DllImport int32 FAR PASCAL swe_lun_eclipse_how_d( + double *tjd_ut, + int32 ifl, + double *attr, + char *serr); +DllImport int32 FAR PASCAL swe_lun_eclipse_when_d(double *tjd_start, int32 ifl, int32 ifltype, + double *tret, AS_BOOL backward, char *serr); + +DllImport int32 FAR PASCAL swe_pheno_d(double *tjd, int32 ipl, int32 iflag, + double *attr, char *serr); + +DllImport int32 FAR PASCAL swe_pheno_ut_d(double *tjd_ut, int32 ipl, int32 iflag, double *attr, char *serr); + +DllImport int FAR PASCAL swe_refrac_d(double *inalt, double *atpress, double *attemp, int32 calc_flag, double *retalt); + +DllImport int FAR PASCAL swe_azalt_d( + double *tjd_ut, + int32 calc_flag, + double *geopos, + double *atpress, + double *attemp, + double *xin, + double *xaz); + +DllImport int FAR PASCAL swe_azalt_rev_d( + double *tjd_ut, + int32 calc_flag, + double *geopos, + double *xin, + double *xout); + +DllImport int32 FAR PASCAL swe_rise_trans_d( + double *tjd_ut, int32 ipl, char *starname, + int32 epheflag, int32 rsmi, + double *geopos, + double *atpress, double *attemp, + double *tret, + char *serr); + +DllImport int32 FAR PASCAL swe_nod_aps_d(double *tjd_et, int32 ipl, int32 iflag, + int32 method, + double *xnasc, double *xndsc, + double *xperi, double *xaphe, + char *serr); + +DllImport int32 FAR PASCAL swe_nod_aps_ut_d(double *tjd_ut, int32 ipl, int32 iflag, + int32 method, + double *xnasc, double *xndsc, + double *xperi, double *xaphe, + char *serr); + +#endif /* !_SWEDLL_H */ +#ifdef __cplusplus +} /* extern C */ +#endif diff --git a/swe/src/swehel.c b/swe/src/swehel.c new file mode 100644 index 0000000..9709bab --- /dev/null +++ b/swe/src/swehel.c @@ -0,0 +1,3435 @@ +/* SWISSEPH + $Header: /home/dieter/sweph/RCS/swehel.c,v 1.1 2009/04/21 06:05:59 dieter Exp dieter $ + + Heliacal risings and related calculations + + Author: Victor Reijs + This program code is a translation of part of: + Victor Reijs' software ARCHAEOCOSMO (archaeoastronomy and + geodesy functions), + http://www.iol.ie/~geniet/eng/archaeocosmoprocedures.htm + + Translation from VB into C by Dieter Koch + + Problem reports can be sent to victor.reijs@gmail.com or dieter@astro.ch + + Copyright (c) Victor Reijs, 2008 + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + +#include "swephexp.h" +#include "sweph.h" +#include "swephlib.h" +#include + +#define PLSV 0 /*if Planet, Lunar and Stellar Visibility formula is needed PLSV=1*/ +#define criticalangle 0.0 /*[deg]*/ +#define BNIGHT 1479.0 /*[nL]*/ +#define BNIGHT_FACTOR 1.0 +#define PI M_PI +#define Min2Deg (1.0 / 60.0) +#define DEBUG 0 +#define DONE 1 +#define MaxTryHours 4 +#define TimeStepDefault 1 +#define LocalMinStep 8 + +/* time constants */ +#define Y2D 365.25 /*[Day]*/ +#define D2Y (1 / Y2D) /*[Year]*/ +#define D2H 24.0 /*[Hour]*/ +#define H2S 3600.0 /*[sec]*/ +#define D2S (D2H * H2S) /*[sec]*/ +#define S2H (1.0 / H2S) /*[Hour]*/ +#define JC2D 36525.0 /*[Day]*/ +#define M2S 60.0 /*[sec]*/ + +/* Determines which algorimths are used*/ +#define USE_DELTA_T_VR 0 +#define REFR_SINCLAIR 0 +#define REFR_BENNETTH 1 +#define FormAstroRefrac REFR_SINCLAIR /*for Astronomical refraction can be "bennetth" or "sinclair"*/ +#define GravitySource 2 /*0=RGO, 1=Wikipedia,2=Exp. Suppl. 1992,3=van der Werf*/ +#define REarthSource 1 /*0=RGO (constant), 1=WGS84 method*/ + +#define StartYear 1820 /*[year]*/ +#define Average 1.80546834626888 /*[msec/cy]*/ +#define Periodicy 1443.67123144531 /*[year]*/ +#define Amplitude 3.75606495492684 /*[msec]*/ +#define phase 0 /*[deg]*/ +#define MAX_COUNT_SYNPER 5 /* search within 10 synodic periods */ +#define MAX_COUNT_SYNPER_MAX 1000000 /* high, so there is not max count */ +#define AvgRadiusMoon (15.541 / 60) /* '[Deg] at 2007 CE or BCE*/ + +/* WGS84 ellipsoid constants + * http://w3sli.wcape.gov.za/Surveys/Mapping/wgs84.htm*/ +#define Ra 6378136.6 /*'[m]*/ +#define Rb 6356752.314 /*'[m]*/ + +/* choices in Schaefer's model */ +#define nL2erg (1.02E-15) +#define erg2nL (1 / nL2erg) /*erg2nL to nLambert*/ +#define MoonDistance 384410.4978 /*[km]*/ +#define scaleHwater 3000.0 /*[m] Ricchiazzi [1997] 8200 Schaefer [2000]*/ +#define scaleHrayleigh 8515.0 /*[m] Su [2003] 8200 Schaefer [2000]*/ +#define scaleHaerosol 3745.0 /*m Su [2003] 1500 Schaefer [2000]*/ +#define scaleHozone 20000.0 /*[m] Schaefer [2000]*/ +#define astr2tau 0.921034037197618 /*LN(10 ^ 0.4)*/ +#define tau2astr 1 / astr2tau + +/* meteorological constants*/ +#define C2K 273.15 /*[K]*/ +#define DELTA 18.36 +#define TempNulDiff 0.000001 +#define PressRef 1000 /*[mbar]*/ +#define MD 28.964 /*[kg] Mol weight of dry air van der Werf*/ +#define MW 18.016 /*[kg] Mol weight of water vapor*/ +#define GCR 8314.472 /*[L/kmol/K] van der Werf*/ +#define LapseSA 0.0065 /*[K/m] standard atmosphere*/ +#define LapseDA 0.0098 /*[K/m] dry adiabatic*/ + +/* lowest apparent altitude to provide*/ +#define LowestAppAlt -3.5 /*[Deg]*/ + +/*optimization delta*/ +#define epsilon 0.001 +/* for Airmass usage*/ +#define staticAirmass 0 /* use staticAirmass=1 instead depending on difference k's*/ + +/* optic stuff */ +#define GOpticMag 1 /*telescope magnification*/ +#define GOpticTrans 0.8 /*telescope transmission*/ +#define GBinocular 1 /*1-binocular 0=monocular*/ +#define GOpticDia 50 /*telescope diameter [mm]*/ + +static double mymin(double a, double b) +{ + if (a <= b) + return a; + return b; +} + +static double mymax(double a, double b) +{ + if (a >= b) + return a; + return b; +} + +/*###################################################################*/ +static double Tanh(double x) +{ + return (exp(x) - exp(-x)) / (exp(x) + exp(-x)); +} + +/* +' B [nL] +' SN [-] +' CVA [deg] +*/ +static double CVA(double B, double SN) +{ + /*Schaefer, Astronomy and the limits of vision, Archaeoastronomy, 1993*/ + if (B > BNIGHT) + return (40.0 / SN) * pow(10, (8.28 * pow(B, (-0.29)))) / 60.0 / 60.0; + else + return mymin(900, 380 / SN * pow(10, (0.3 * pow(B, (-0.29))))) / 60.0 / 60.0; +} + +/* +' age [year] +' B [nL] +' PupilDia [mm] +*/ +static double PupilDia(double Age, double B) +{ + /* age dependancy from Garstang [2000]*/ + return (0.534 - 0.00211 * Age - (0.236 - 0.00127 * Age) * Tanh(0.4 * log(B) / log(10) - 2.2)) * 10; +} + +/* +'Input +' Bback [nL] +' kX [-] +' Binocular [-] +' OpticMag [-] +' OpticDia [mm] +' OpticTrans [-] +' JDNDaysUT [JDN] +' Age [Year] +' SN [-] +' ObjectName +' TypeFactor [0=itensity factor 1=background factor] +'Output +' OpticFactor [-] +*/ +static double OpticFactor(double Bback, double kX, double *dobs, double JDNDaysUT, char *ObjectName, int TypeFactor, int helflag) +{ + double Pst, CIb, CIi, ObjectSize, Fb, Fe, Fsc, Fci, Fcb, Ft, Fp, Fa, Fr, Fm; + double Age = dobs[0]; + double SN = dobs[1], SNi; + double Binocular = dobs[2]; + double OpticMag = dobs[3]; + double OpticDia = dobs[4]; + double OpticTrans = dobs[5]; + SNi = SN; + if (SNi <= 0.00000001) SNi = 0.00000001; + /* 23 jaar as standard from Garstang*/ + Pst = PupilDia(23, Bback); + if (OpticMag == 1) { /*OpticMagn=1 means using eye*/ + OpticTrans = 1; + OpticDia = Pst; + } +#if 0 /*is done in default_heliacal_parameters()*/ + if (OpticMag == 0) { /*OpticMagn=0 (undefined) using eye*/ + OpticTrans = 1; + OpticDia = Pst; + Binocular = 1; + OpticMag = 1; + } +#endif + /* Schaefer, Astronomy and the limits of vision, Archaeoastronomy, 1993*/ + CIb = 0.7; /* color of background (from Ben Sugerman)*/ + CIi = 0.5; /* Color index for white (from Ben Sugerman), should be function of ObjectName*/ + ObjectSize = 0; + if (strcmp(ObjectName, "moon") == 0) { + /*ObjectSize and CI needs to be determined (depending on JDNDaysUT)*/ + ; + } + Fb = 1; + if (Binocular == 0) Fb = 1.41; + if (Bback < BNIGHT && !(helflag & SE_HELFLAG_VISLIM_PHOTOPIC)) { + Fe = pow(10, (0.48 * kX)); + Fsc = mymin(1, (1 - pow(Pst / 124.4, 4)) / (1 - pow((OpticDia / OpticMag / 124.4), 4))); + Fci = pow(10, (-0.4 * (1 - CIi / 2.0))); + Fcb = pow(10, (-0.4 * (1 - CIb / 2.0))); + } else { + Fe = pow(10, (0.4 * kX)); + Fsc = mymin(1, pow((OpticDia / OpticMag / Pst), 2) * (1 - exp(-pow((Pst / 6.2), 2))) / (1 - exp(-pow((OpticDia / OpticMag / 6.2), 2)))); + Fci = 1; + Fcb = 1; + } + Ft = 1 / OpticTrans; + Fp = mymax(1, pow((Pst / (OpticMag * PupilDia(Age, Bback))), 2)); + Fa = pow((Pst / OpticDia), 2); + Fr = (1 + 0.03 * pow((OpticMag * ObjectSize / CVA(Bback, SNi)), 2)) / pow(SNi, 2); + Fm = pow(OpticMag, 2); +#if DEBUG + fprintf(stderr, "Pst=%f\n", Pst); + fprintf(stderr, "Fb =%f\n", Fb); + fprintf(stderr, "Fe =%f\n", Fe); + fprintf(stderr, "Ft =%f\n", Ft); + fprintf(stderr, "Fp =%f\n", Fp); + fprintf(stderr, "Fa =%f\n", Fa); + fprintf(stderr, "Fm =%f\n", Fm); + fprintf(stderr, "Fsc=%f\n", Fsc); + fprintf(stderr, "Fci=%f\n", Fci); + fprintf(stderr, "Fcb=%f\n", Fcb); + fprintf(stderr, "Fr =%f\n", Fr ); +#endif + if (TypeFactor == 0) + return Fb * Fe * Ft * Fp * Fa * Fr * Fsc * Fci; + else + return Fb * Ft * Fp * Fa * Fm * Fsc * Fcb; +} + +/*################################################################### +*/ +static int32 DeterObject(char *ObjectName) +{ + char s[AS_MAXCH]; + char *sp; + int32 ipl; + strcpy(s, ObjectName); + for (sp = s; *sp != '\0'; sp++) + *sp = tolower(*sp); + if (strncmp(s, "sun", 3) == 0) + return SE_SUN; + if (strncmp(s, "venus", 5) == 0) + return SE_VENUS; + if (strncmp(s, "mars", 4) == 0) + return SE_MARS; + if (strncmp(s, "mercur", 6) == 0) + return SE_MERCURY; + if (strncmp(s, "jupiter", 7) == 0) + return SE_JUPITER; + if (strncmp(s, "saturn", 6) == 0) + return SE_SATURN; + if (strncmp(s, "uranus", 6) == 0) + return SE_URANUS; + if (strncmp(s, "neptun", 6) == 0) + return SE_NEPTUNE; + if (strncmp(s, "moon", 4) == 0) + return SE_MOON; + if ((ipl = atoi(s)) > 0) { + ipl += SE_AST_OFFSET; + return ipl; + } + return -1; +} + +#if 0 +int32 call_swe_calc(double tjd, int32 ipl, int32 iflag, double *x, char *serr) +{ + int32 retval = OK, ipli, i; + double dtjd; + static double tjdsv[3]; + static double xsv[3][6]; + static int32 iflagsv[3]; + ipli = ipl; + if (ipli > SE_MOON) + ipli = 2; + dtjd = tjd - tjdsv[ipli]; + if (tjdsv[ipli] != 0 && iflag == iflagsv[ipli] && fabs(dtjd) < 5.0 / 1440.0) { + for (i = 0; i < 3; i++) + x[i] = xsv[ipli][i] + dtjd * xsv[ipli][i+3]; + for (i = 3; i < 6; i++) + x[i] = xsv[ipli][i]; + } else { + retval = swe_calc(tjd, ipl, iflag, x, serr); + tjdsv[ipli] = tjd; + iflagsv[ipli] = iflag; + for (i = 0; i < 6; i++) + xsv[ipli][i] = x[i]; + } + return retval; +} +#endif + +/* avoids problems with star name string that may be overwritten by + swe_fixstar() */ +int32 call_swe_fixstar(char *star, double tjd, int32 iflag, double *xx, char *serr) +{ + int32 retval; + char star2[AS_MAXCH]; + strcpy(star2, star); + retval = swe_fixstar(star2, tjd, iflag, xx, serr); + return retval; +} + +/* avoids problems with star name string that may be overwritten by + swe_fixstar_mag() */ +int32 call_swe_fixstar_mag(char *star, double *mag, char *serr) +{ + int32 retval; + char star2[AS_MAXCH]; + static double dmag; + static char star_save[AS_MAXCH]; + if (strcmp(star, star_save) == 0) { + *mag = dmag; + return OK; + } + strcpy(star_save, star); + strcpy(star2, star); + retval = swe_fixstar_mag(star2, &dmag, serr); + *mag = dmag; + return retval; +} + +/* avoids problems with star name string that may be overwritten by + swe_fixstar() */ +int32 call_swe_rise_trans(double tjd, int32 ipl, char *star, int32 helflag, int32 eventtype, double *dgeo, double atpress, double attemp, double *tret, char *serr) +{ + int32 retval; + int32 iflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + char star2[AS_MAXCH]; + strcpy(star2, star); + retval = swe_rise_trans(tjd, ipl, star2, iflag, eventtype, dgeo, atpress, attemp, tret, serr); + return retval; +} + +/* + * Written by Dieter Koch: + * Fast function for risings and settings of planets, can be used instead of + * swe_rise_trans(), which is much slower. + * For circumpolar and near-circumpolar planets use swe_rise_trans(), or + * generally use it for geographical latitudes higher than 58N/S. + * For fixed stars, swe_rise_trans() is fast enough. + */ +static int32 calc_rise_and_set(double tjd_start, int32 ipl, double *dgeo, double *datm, int32 eventflag, int32 helflag, double *trise, char *serr) +{ + int retc = OK, i; + double sda, xs[6], xx[6], xaz[6], xaz2[6], dfac = 1/365.25; + double rdi, rh; + double tjd0 = tjd_start, tjdrise; + double tjdnoon = (int) tjd0 - dgeo[0] / 15.0 / 24.0; + int32 iflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + iflag |= SEFLG_EQUATORIAL; + if (!(helflag & SE_HELFLAG_HIGH_PRECISION)) + iflag |= SEFLG_NONUT|SEFLG_TRUEPOS; + if (swe_calc_ut(tjd0, SE_SUN, iflag, xs, serr) == 0) { + if (serr != NULL) + strcpy(serr, "error in calc_rise_and_set(): calc(sun) failed "); + return ERR; + } + if (swe_calc_ut(tjd0, ipl, iflag, xx, serr) == 0) { + if (serr != NULL) + strcpy(serr, "error in calc_rise_and_set(): calc(sun) failed "); + return ERR; + } + tjdnoon -= swe_degnorm(xs[0] - xx[0])/360.0 + 0; + /* is planet above horizon or below? */ + swe_azalt(tjd0, SE_EQU2HOR, dgeo, datm[0], datm[1], xx, xaz); +if (eventflag & SE_CALC_RISE) { + if (xaz[2] > 0) { + while (tjdnoon - tjd0 < 0.5) {/*printf("e");*/tjdnoon += 1;} + while (tjdnoon - tjd0 > 1.5) {/*printf("f");*/tjdnoon -= 1;} + } else { + while (tjdnoon - tjd0 < 0.0) {/*printf("g");*/tjdnoon += 1;} + while (tjdnoon - tjd0 > 1.0) {/*printf("h");*/tjdnoon -= 1;} + } +} else { + if (xaz[2] > 0) { + while (tjd0 - tjdnoon > 0.5) {/*printf("a");*/ tjdnoon += 1;} + while (tjd0 - tjdnoon < -0.5) {/*printf("b");*/ tjdnoon -= 1;} + } else { + while (tjd0 - tjdnoon > 0.0) {/*printf("c");*/ tjdnoon += 1;} + while (tjd0 - tjdnoon < -1.0) {/*printf("d");*/ tjdnoon -= 1;} + } +} + /* position of planet */ + if (swe_calc_ut(tjdnoon, ipl, iflag, xx, serr) == ERR) { + if (serr != NULL) + strcpy(serr, "error in calc_rise_and_set(): calc(sun) failed "); + return ERR; + } + /* apparent radius of solar disk (ignoring refraction) */ + rdi = asin(696000000.0 / 1.49597870691e+11 / xx[2]) / DEGTORAD; + if (eventflag & SE_BIT_DISC_CENTER) + rdi = 0; + /* true altitude of sun, when it appears at the horizon */ + /* refraction for a body visible at the horizon at 0m above sea, + * atmospheric temperature 10 deg C, atmospheric pressure 1013.25 is 34.5 arcmin*/ + rh = -(34.5 / 60.0 + rdi); + /* semidiurnal arc of sun */ + sda = acos(-tan(dgeo[1] * DEGTORAD) * tan(xx[1] * DEGTORAD)) * RADTODEG; + /* rough rising and setting times */ +if (eventflag & SE_CALC_RISE) + tjdrise = tjdnoon - sda / 360.0; +else + tjdrise = tjdnoon + sda / 360.0; + /*ph->tset = tjd_start + sda / 360.0;*/ + /* now calculate more accurate rising and setting times. + * use vertical speed in order to determine crossing of the horizon + * refraction of 34' and solar disk diameter of 16' = 50' = 0.84 deg */ + iflag = SEFLG_SPEED|SEFLG_EQUATORIAL; + if (ipl == SE_MOON) + iflag |= SEFLG_TOPOCTR; + if (!(helflag & SE_HELFLAG_HIGH_PRECISION)) + iflag |= SEFLG_NONUT|SEFLG_TRUEPOS; + for (i = 0; i < 2; i++) { + if (swe_calc_ut(tjdrise, ipl, iflag, xx, serr) == ERR) + return ERR; + swe_azalt(tjdrise, SE_EQU2HOR, dgeo, datm[0], datm[1], xx, xaz); + xx[0] -= xx[3] * dfac; + xx[1] -= xx[4] * dfac; + swe_azalt(tjdrise - dfac, SE_EQU2HOR, dgeo, datm[0], datm[1], xx, xaz2); + tjdrise -= (xaz[1] - rh) / (xaz[1] - xaz2[1]) * dfac; + /*fprintf(stderr, "%f\n", ph->trise);*/ + } + *trise = tjdrise; + return retc; +} + +static int32 my_rise_trans(double tjd, int32 ipl, char* starname, int32 eventtype, int32 helflag, double *dgeo, double *datm, double *tret, char *serr) +{ + int retc = OK; + if (starname != NULL && *starname != '\0') + ipl = DeterObject(starname); + /* for non-circumpolar planets we can use a faster algorithm */ + /*if (!(helflag & SE_HELFLAG_HIGH_PRECISION) && ipl != -1 && fabs(dgeo[1]) < 58) {*/ + if (ipl != -1 && fabs(dgeo[1]) < 63) { + retc = calc_rise_and_set(tjd, ipl, dgeo, datm, eventtype, helflag, tret, serr); + /* for stars and circumpolar planets we use a rigorous algorithm */ + } else { + retc = call_swe_rise_trans(tjd, ipl, starname, helflag, eventtype, dgeo, datm[0], datm[1], tret, serr); + } +/* printf("%f, %f\n", tjd, *tret);*/ + return retc; +} + +/*################################################################### +' JDNDaysUT [Days] +' dgeo [array: longitude, latitude, eye height above sea m] +' TempE [C] +' PresE [mbar] +' ObjectName (string) +' RSEvent (1=rise, 2=set,3=up transit,4=down transit) +' Rim [0=center,1=top] +' RiseSet [Day] +*/ +static int32 RiseSet(double JDNDaysUT, double *dgeo, double *datm, char *ObjectName, int32 RSEvent, int32 helflag, int32 Rim, double *tret, char *serr) +{ + int32 eventtype = RSEvent, Planet, retval; + if (Rim == 0) + eventtype |= SE_BIT_DISC_CENTER; + Planet = DeterObject(ObjectName); + if (Planet != -1) + retval = my_rise_trans(JDNDaysUT, Planet, "", eventtype, helflag, dgeo, datm, tret, serr); + else + retval = my_rise_trans(JDNDaysUT, -1, ObjectName, eventtype, helflag, dgeo, datm, tret, serr); + return retval; +} + +/*################################################################### +' JDNDaysUT [Days] +' actual [0= approximation, 1=actual] +' SunRA [deg] +*/ +static double SunRA(double JDNDaysUT, int32 helflag, char *serr) +{ + int imon, iday, iyar, calflag = SE_GREG_CAL; + double dut; + static double tjdlast; + static double ralast; + if (JDNDaysUT == tjdlast) + return ralast; +#ifndef SIMULATE_VICTORVB + if (1) { /*helflag & SE_HELFLAG_HIGH_PRECISION) {*/ + double tjd_tt; + double x[6]; + int32 epheflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + int32 iflag = epheflag | SEFLG_EQUATORIAL; + iflag |= SEFLG_NONUT | SEFLG_TRUEPOS; + tjd_tt = JDNDaysUT + swe_deltat(JDNDaysUT); + if (swe_calc(tjd_tt, SE_SUN, iflag, x, serr) != ERR) { + ralast = x[0]; + tjdlast = JDNDaysUT; + return ralast; + } + } +#endif + swe_revjul(JDNDaysUT, calflag, &iyar, &imon, &iday, &dut); /* this seems to be much faster than calling swe_revjul() ! Note: only because SunRA is called 1000s of times */ + tjdlast = JDNDaysUT; + ralast = swe_degnorm((imon + (iday - 1) / 30.4 - 3.69) * 30); + /*ralast = (DatefromJDut(JDNDaysUT, 2) + (DatefromJDut(JDNDaysUT, 3) - 1) / 30.4 - 3.69) * 30;*/ + return ralast; +} + +/*################################################################### +' Temp [C] +' Kelvin [K] +*/ +static double Kelvin(double Temp) +{ + /*' http://en.wikipedia.org/wiki/Kelvin*/ + return Temp + C2K; +} + +/*################################################################### +' AppAlt [deg] +' TempE [C] +' PresE [mbar] +' TopoAltitudefromAppAlt [deg] +*/ +static double TopoAltfromAppAlt(double AppAlt, double TempE, double PresE) +{ + double R = 0; + double retalt = 0; + if (AppAlt >= LowestAppAlt) { + if (AppAlt > 17.904104638432) + R = 0.97 / tan(AppAlt * DEGTORAD); + else + R = (34.46 + 4.23 * AppAlt + 0.004 * AppAlt * AppAlt) / (1 + 0.505 * AppAlt + 0.0845 * AppAlt * AppAlt); + R = (PresE - 80) / 930 / (1 + 0.00008 * (R + 39) * (TempE - 10)) * R; + retalt = AppAlt - R * Min2Deg; + } else { + retalt = AppAlt; + } + return retalt; +} + +/*################################################################### +' TopoAlt [deg] +' TempE [C] +' PresE [mbar] +' AppAltfromTopoAlt [deg] +' call this instead of swe_azalt(), because it is faster (lower precision +' is required) +*/ +static double AppAltfromTopoAlt(double TopoAlt, double TempE, double PresE, int32 helflag) +{ + /* using methodology of Newtown derivatives (analogue to what Swiss Emphemeris uses)*/ + int i, nloop = 2; + double newAppAlt = TopoAlt; + double newTopoAlt = 0.0; + double oudAppAlt = newAppAlt; + double oudTopoAlt = newTopoAlt; + double verschil, retalt; + if (helflag & SE_HELFLAG_HIGH_PRECISION) + nloop = 5; + for (i = 0; i <= nloop; i++) { + newTopoAlt = newAppAlt - TopoAltfromAppAlt(newAppAlt, TempE, PresE); + /*newTopoAlt = newAppAlt - swe_refrac(newAppAlt, PresE, TempE, SE_CALC_APP_TO_TRUE);*/ + verschil = newAppAlt - oudAppAlt; + oudAppAlt = newTopoAlt - oudTopoAlt - verschil; + if ((verschil != 0) && (oudAppAlt != 0)) + verschil = newAppAlt - verschil * (TopoAlt + newTopoAlt - newAppAlt) / oudAppAlt; + else + verschil = TopoAlt + newTopoAlt; + oudAppAlt = newAppAlt; + oudTopoAlt = newTopoAlt; + newAppAlt = verschil; + } + retalt = TopoAlt + newTopoAlt; + if (retalt < LowestAppAlt) + retalt = TopoAlt; + return retalt; +} + +/*################################################################### +' TopoAlt [deg] +' TopoDecl [deg] +' Lat [deg] +' HourAngle [hour] +*/ +static double HourAngle(double TopoAlt, double TopoDecl, double Lat) +{ + double Alti = TopoAlt * DEGTORAD; + double decli = TopoDecl * DEGTORAD; + double Lati = Lat * DEGTORAD; + double ha = (sin(Alti) - sin(Lati) * sin(decli)) / cos(Lati) / cos(decli); + if (ha < -1) ha = -1; + if (ha > 1) ha = 1; + /* from http://star-www.st-and.ac.uk/~fv/webnotes/chapt12.htm*/ + return acos(ha) / DEGTORAD / 15.0; +} + +/*################################################################### +' JDNDays [Days] +' COD [msec/cy] +' DeltaTSE [Sec] +*/ +static double DeltaTSE(double JDNDays, int COD) +{ + double OffSetYear; + int gregflag = SE_GREG_CAL; + if (StartYear < 1583) + gregflag = SE_JUL_CAL; + /* from Swiss Emphemeris */ + if (COD != 0) { + /* Determined by V. Reijs*/ + OffSetYear = (swe_julday((int) StartYear, 1, 1, 0, gregflag) - JDNDays) / 365.25; + return (OffSetYear * OffSetYear / 100.0 / 2.0 * COD * Y2D) / 1000.0; + } + return swe_deltat(JDNDays) * D2S; +} + +/*################################################################### +' JDNDays [Day] +' COD [msec/cy] +' DeltaTVR [Sec] +*/ +static double DeltaTVR(double JDNDays, int COD) +{ + /* Determined by V. Reijs */ + double DeltaTVR; + int gregflag = SE_GREG_CAL; + double OffSetYear; + if (StartYear < 1583) + gregflag = SE_JUL_CAL; + OffSetYear = (swe_julday((int) StartYear, 1, 1, 0, gregflag) - JDNDays) / 365.25; + if (COD == 0) { + DeltaTVR = (OffSetYear * OffSetYear / 100.0 / 2.0 * Average + Periodicy / 2.0 / PI * Amplitude * (cos((2 * PI * OffSetYear / Periodicy)) - 1)) * Y2D; + } else { + DeltaTVR = OffSetYear * OffSetYear / 100.0 / 2.0 * COD * Y2D; + } + return DeltaTVR / 1000.0; +} + +/*################################################################### +' JDNDays [Days] +' COD [msec/cy] +' DeltaT [Sec] +*/ +static double DeltaT(double JDNDays, int COD) +{ + if (USE_DELTA_T_VR) + return DeltaTVR(JDNDays, COD); + return DeltaTSE(JDNDays, COD); +} + +/*################################################################### +' JDNDaysUT [Days] +' dgeo [array: longitude, latitude, eye height above sea m] +' TempE [C] +' PresE [mbar] +' ObjectName [-] +' Angle (0 = TopoAlt, 1 = Azi, 2=Topo Declination, 3=Topo Rectascension, 4=AppAlt,5=Geo Declination, 6=Geo Rectascension) +' ObjectLoc [deg] + */ +static int32 ObjectLoc(double JDNDaysUT, double *dgeo, double *datm, char *ObjectName, int32 Angle, int32 helflag, double *dret, char *serr) +{ + double x[6], xin[3], xaz[3], tjd_tt; + int32 Planet; + int32 epheflag; + int32 iflag = SEFLG_EQUATORIAL; + epheflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + iflag |= epheflag; + if (!(helflag & SE_HELFLAG_HIGH_PRECISION)) + iflag |= SEFLG_NONUT | SEFLG_TRUEPOS; + if (Angle < 5) iflag = iflag | SEFLG_TOPOCTR; + if (Angle == 7) Angle = 0; + tjd_tt = JDNDaysUT + DeltaT(JDNDaysUT, 0) / D2S; + Planet = DeterObject(ObjectName); + if (Planet != -1) { + if (swe_calc(tjd_tt, Planet, iflag, x, serr) == ERR) + return ERR; + } else { + if (call_swe_fixstar(ObjectName, tjd_tt, iflag, x, serr) == ERR) + return ERR; + } + if (Angle == 2 || Angle == 5) { + *dret = x[1]; + } else { + if (Angle == 3 || Angle == 6) { + *dret = x[0]; + } else { + xin[0] = x[0]; + xin[1] = x[1]; + swe_azalt(JDNDaysUT, SE_EQU2HOR, dgeo, datm[0], datm[1], xin, xaz); + if (Angle == 0) + *dret = xaz[1]; + if (Angle == 4) + *dret = AppAltfromTopoAlt(xaz[1], datm[0], datm[1], helflag); + if (Angle == 1) { + xaz[0] += 180; + if (xaz[0] >= 360) + xaz[0] -= 360; + *dret = xaz[0]; + } + } + } + return OK; +} + +/*################################################################### +' JDNDaysUT [Days] +' dgeo [array: longitude, latitude, eye height above sea m] +' TempE [C] +' PresE [mbar] +' ObjectName [-] +' Angle (0 = TopoAlt, 1 = Azi, 2=Topo Declination, 3=Topo Rectascension, 4=AppAlt,5=Geo Declination, 6=Geo Rectascension) +' ObjectLoc [deg] + */ +static int32 azalt_cart(double JDNDaysUT, double *dgeo, double *datm, char *ObjectName, int32 helflag, double *dret, char *serr) +{ + double x[6], xin[3], xaz[3], tjd_tt; + int32 Planet; + int32 epheflag; + int32 iflag = SEFLG_EQUATORIAL; + epheflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + iflag |= epheflag; + if (!(helflag & SE_HELFLAG_HIGH_PRECISION)) + iflag |= SEFLG_NONUT | SEFLG_TRUEPOS; + iflag = iflag | SEFLG_TOPOCTR; + tjd_tt = JDNDaysUT + DeltaT(JDNDaysUT, 0) / D2S; + Planet = DeterObject(ObjectName); + if (Planet != -1) { + if (swe_calc(tjd_tt, Planet, iflag, x, serr) == ERR) + return ERR; + } else { + if (call_swe_fixstar(ObjectName, tjd_tt, iflag, x, serr) == ERR) + return ERR; + } + xin[0] = x[0]; + xin[1] = x[1]; + swe_azalt(JDNDaysUT, SE_EQU2HOR, dgeo, datm[0], datm[1], xin, xaz); + dret[0] = xaz[0]; + dret[1] = xaz[1]; /* true altitude */ + dret[2] = xaz[2]; /* apparent altitude */ + /* also return cartesian coordinates, for apparent altitude */ + xaz[1] = xaz[2]; + xaz[2] = 1; + swi_polcart(xaz, xaz); + dret[3] = xaz[0]; + dret[4] = xaz[1]; + dret[5] = xaz[2]; + return OK; +} + +/*################################################################### +' LatA [rad] +' LongA [rad] +' LatB [rad] +' LongB [rad] +' DistanceAngle [rad] +*/ +static double DistanceAngle(double LatA, double LongA, double LatB, double LongB) +{ + double dlon = LongB - LongA; + double dlat = LatB - LatA; + /* Haversine formula + * http://www.movable-type.co.uk/scripts/GIS-FAQ-5.1.html + * R.W. Sinnott, Virtues of the Haversine, Sky and Telescope, vol. 68, no. 2, 1984, p. 159 + */ + double sindlat2 = sin(dlat / 2); + double sindlon2 = sin(dlon / 2); + double corde = sindlat2 * sindlat2 + cos(LatA) * cos(LatB) * sindlon2 *sindlon2; + if (corde > 1) corde = 1; + return 2 * asin(sqrt(corde)); +} + +/*################################################################### +' heighteye [m] +' TempS [C] +' RH [%] +' kW [-] +*/ +static double kW(double HeightEye, double TempS, double RH) +{ + /* From Schaefer , Archaeoastronomy, XV, 2000, page 128*/ + double WT = 0.031; + WT *= 0.94 * (RH / 100.0) * exp(TempS / 15) * exp(-1 * HeightEye / scaleHwater); + return WT; +} + +/*################################################################### +' JDNDaysUT [-] +' AltS [deg] +' lat [deg] +' kOZ [-] +*/ +static double kOZ(double AltS, double sunra, double Lat) +{ + double CHANGEKO, OZ, LT, kOZret; + static double koz_last, alts_last, sunra_last; + if (AltS == alts_last && sunra == sunra_last) + return koz_last; + alts_last = AltS; sunra_last = sunra; + OZ = 0.031; + LT = Lat * DEGTORAD; + /* From Schaefer , Archaeoastronomy, XV, 2000, page 128*/ + kOZret = OZ * (3.0 + 0.4 * (LT * cos(sunra * DEGTORAD) - cos(3 * LT))) / 3.0; + /* depending on day/night vision (altitude of sun < start astronomical twilight), KO changes from 100% to 30% + * see extinction section of Vistas in Astronomy page 343*/ + CHANGEKO = (100 - 11.6 * mymin(6, mymax(-AltS - 12, 0))) / 100; + koz_last = kOZret * CHANGEKO; + return koz_last; +} + +/*################################################################### +' AltS [deg] +' heighteye [m] +' kR [-] +*/ +static double kR(double AltS, double HeightEye) +{ + /* depending on day/night vision (altitude of sun < start astronomical twilight), + * lambda eye sensibility changes + * see extinction section of Vistas in Astronomy page 343*/ + double CHANGEK, LAMBDA; + double val = -AltS - 12; + if (val < 0) val = 0; + if (val > 6) val = 6; + /*CHANGEK = (1 - 0.166667 * Min(6, Max(-AltS - 12, 0)));*/ + CHANGEK = (1 - 0.166667 * val ); + LAMBDA = 0.55 + (CHANGEK - 1) * 0.04; + /* From Schaefer , Archaeoastronomy, XV, 2000, page 128 */ + return 0.1066 * exp(-1 * HeightEye / scaleHrayleigh) * pow(LAMBDA / 0.55 , -4); +} + +static int Sgn(double x) +{ + if (x < 0) + return -1; + return 1; +} + +/*################################################################### +' JDNDaysUT [-] +' AltS [deg] +' lat [deg] +' heighteye [m] +' TempS [C] +' RH [%] +' VR [km] +' ka [-] +*/ +static double ka(double AltS, double sunra, double Lat, double HeightEye, double TempS, double RH, double VR, char *serr) +{ + double CHANGEKA, LAMBDA, BetaVr, Betaa, kaact; + double SL = Sgn(Lat); + /* depending on day/night vision (altitude of sun < start astronomical twilight), + * lambda eye sensibility changes + * see extinction section of Vistas in Astronomy page 343 */ + static double alts_last, sunra_last, ka_last; + if (AltS == alts_last && sunra == sunra_last) + return ka_last; + alts_last = AltS; sunra_last = sunra; + CHANGEKA = (1 - 0.166667 * mymin(6, mymax(-AltS - 12, 0))); + LAMBDA = 0.55 + (CHANGEKA - 1) * 0.04; + if (VR != 0) { + if (VR >= 1) { + /* Visbility range from http://www1.cs.columbia.edu/CAVE/publications/pdfs/Narasimhan_CVPR03.pdf + * http://www.icao.int/anb/SG/AMOSSG/meetings/amossg3/wp/SN11Rev.pdf where MOR=2.995/ke + * factor 1.3 is the relation between "prevailing visibility" and + * meteorological range was derived by Koshmeider in the 1920's */ + BetaVr = 3.912 / VR; + Betaa = BetaVr - (kW(HeightEye, TempS, RH) / scaleHwater + kR(AltS, HeightEye) / scaleHrayleigh) * 1000 * astr2tau; + kaact = Betaa * scaleHaerosol / 1000 * tau2astr; + if (kaact < 0) { + if (serr != NULL) + strcpy(serr, "The provided Meteorological range is too long, when taking into acount other atmospheric parameters"); /* is a warning */ + /* return 0; * return "#HIGHVR"; */ + } + } else { + kaact = VR - kW(HeightEye, TempS, RH) - kR(AltS, HeightEye) - kOZ(AltS, sunra, Lat); + if (kaact < 0) { + if (serr != NULL) + strcpy(serr, "The provided atmosphic coeefficent (ktot) is too low, when taking into acount other atmospheric parameters"); /* is a warning */ + /* return 0; * "#LOWktot"; */ + } + } + } else { + /* From Schaefer , Archaeoastronomy, XV, 2000, page 128 */ +#ifdef SIMULATE_VICTORVB + if (RH <= 0.00000001) RH = 0.00000001; + if (RH >= 99.99999999) RH = 99.99999999; +#endif + kaact = 0.1 * exp(-1 * HeightEye / scaleHaerosol) * pow(1 - 0.32 / log(RH / 100.0), 1.33) * (1 + 0.33 * SL * sin(sunra * DEGTORAD)); + kaact = kaact * pow(LAMBDA / 0.55, -1.3); + } + ka_last = kaact; + return kaact; +} + +/*################################################################### +' JDNDaysUT [-] +' AltS [deg] +' lat [deg] +' heighteye [m] +' TempS [C] +' RH [%] +' VR [km] +' ExtType [0=ka,1=kW,2=kR,3=kOZ,4=ktot] +' kt [-] +*/ +static double kt(double AltS, double sunra, double Lat, double HeightEye, double TempS, double RH, double VR, int32 ExtType, char *serr) +{ + double kRact = 0; + double kWact = 0; + double kOZact = 0; + double kaact = 0; + if (ExtType == 2 || ExtType == 4) + kRact = kR(AltS, HeightEye); + if (ExtType == 1 || ExtType == 4) + kWact = kW(HeightEye, TempS, RH); + if (ExtType == 3 || ExtType == 4) + kOZact = kOZ(AltS, sunra, Lat); + if (ExtType == 0 || ExtType == 4) + kaact = ka(AltS, sunra, Lat, HeightEye, TempS, RH, VR, serr); + if (kaact < 0) + kaact = 0; + return kWact + kRact + kOZact + kaact; +} + +/*################################################################### +' AppAlt0 [deg] +' PresS [mbar] +' Airmass [??] +*/ +static double Airmass(double AppAltO, double Press) +{ + double airm, zend; + zend = (90 - AppAltO) * DEGTORAD; + if (zend > PI / 2) + zend = PI / 2; + airm = 1 / (cos(zend) + 0.025 * exp(-11 * cos(zend))); + return Press / 1013 * airm; +} + +/*################################################################### +' scaleH '[m] +' zend [rad] +' PresS [mbar] +' Xext [-] +*/ +static double Xext(double scaleH, double zend, double Press) +{ + return Press / 1013.0 / (cos(zend) + 0.01 * sqrt(scaleH / 1000.0) * exp(-30.0 / sqrt(scaleH / 1000.0) * cos(zend))); +} + +/*################################################################### +' scaleH '[m] +' zend [rad] +' PresS [mbar] +' Xlay [-] +*/ +static double Xlay(double scaleH, double zend, double Press) +{ + /*return Press / 1013.0 / sqrt(1.0 - pow(sin(zend) / (1.0 + (scaleH / Ra)), 2));*/ + double a = sin(zend) / (1.0 + (scaleH / Ra)); + return Press / 1013.0 / sqrt(1.0 - a * a); +} + +/*################################################################### +' Meteorological formula +'################################################################### +' TempS [C] +' HeightEye [m] +' TempEfromTempS [C] +*/ +static double TempEfromTempS(double TempS, double HeightEye, double Lapse) +{ + return TempS - Lapse * HeightEye; +} + +/*################################################################### +' TempS [C] +' PresS [mbar] +' HeightEye [m] +' PresEfromPresS [mbar] +*/ +static double PresEfromPresS(double TempS, double Press, double HeightEye) +{ + return Press * exp(-9.80665 * 0.0289644 / (Kelvin(TempS) + 3.25 * HeightEye / 1000) / 8.31441 * HeightEye); +} + +/*################################################################### +' AltO [deg] +' JDNDaysUT [-] +' AltS [deg] +' lat [deg] +' heighteye [m] +' TempS [C] +' PresS [mbar] +' RH [%] +' VR [km] +' Deltam [-] +*/ +static double Deltam(double AltO, double AltS, double sunra, double Lat, double HeightEye, double *datm, int32 helflag, char *serr) +{ + double zend, xR, XW, Xa, XOZ; + double PresE = PresEfromPresS(datm[1], datm[0], HeightEye); + double TempE = TempEfromTempS(datm[1], HeightEye, LapseSA); + double AppAltO = AppAltfromTopoAlt(AltO, TempE, PresE, helflag); + double deltam; + static double alts_last, alto_last, sunra_last, deltam_last; + if (AltS == alts_last && AltO == alto_last && sunra == sunra_last) + return deltam_last; + alts_last = AltS; alto_last = AltO; sunra_last = sunra; + if (staticAirmass == 0) { + zend = (90 - AppAltO) * DEGTORAD; + if (zend > PI / 2) + zend = PI / 2; + /* From Schaefer , Archaeoastronomy, XV, 2000, page 128*/ + xR = Xext(scaleHrayleigh, zend, datm[0]); + XW = Xext(scaleHwater, zend, datm[0]); + Xa = Xext(scaleHaerosol, zend, datm[0]); + XOZ = Xlay(scaleHozone, zend, datm[0]); + deltam = kR(AltS, HeightEye) * xR + kt(AltS, sunra, Lat, HeightEye, datm[1], datm[2], datm[3], 0, serr) * Xa + kOZ(AltS, sunra, Lat) * XOZ + kW(HeightEye, datm[1], datm[2]) * XW; + } else { + deltam = kt(AltS, sunra, Lat, HeightEye, datm[1], datm[2], datm[3], 4, serr) * Airmass(AppAltO, datm[0]); + } + deltam_last = deltam; + return deltam; +} + +/*################################################################### +' AltO [deg] +' JDNDaysUT [-] +' AltS [deg] +' lat [deg] +' heighteye [m] +' TempS [C] +' PresS [mbar] +' RH [%] +' VR [km] +' Bn [nL] +*/ +static double Bn(double AltO, double JDNDayUT, double AltS, double sunra, double Lat, double HeightEye, double *datm, int32 helflag, char *serr) +{ + double PresE = PresEfromPresS(datm[1], datm[0], HeightEye); + double TempE = TempEfromTempS(datm[1], HeightEye, LapseSA); + double AppAltO = AppAltfromTopoAlt(AltO, TempE, PresE, helflag); + double zend, YearB, MonthB, DayB, Bna, kX, Bnb; + double B0 = 0.0000000000001, dut; + int iyar, imon, iday; + /* Below altitude of 10 degrees, the Bn stays the same (see page 343 Vistas in Astronomy) */ + if (AppAltO < 10) + AppAltO = 10; + zend = (90 - AppAltO) * DEGTORAD; + /* From Schaefer , Archaeoastronomy, XV, 2000, page 128 and adjusted for sunspot period*/ + /*YearB = DatefromJDut(JDNDayUT, 1); + MonthB = DatefromJDut(JDNDayUT, 2); + DayB = DatefromJDut(JDNDayUT, 3);*/ + swe_revjul(JDNDayUT, SE_GREG_CAL, &iyar, &imon, &iday, &dut); + YearB = iyar; MonthB = imon; DayB = iday; + Bna = B0 * (1 + 0.3 * cos(6.283 * (YearB + ((DayB - 1) / 30.4 + MonthB - 1) / 12 - 1990.33) / 11.1)); + kX = Deltam(AltO, AltS, sunra, Lat, HeightEye, datm, helflag, serr); + /* From Schaefer , Archaeoastronomy, XV, 2000, page 129 */ + Bnb = Bna * (0.4 + 0.6 / sqrt(1 - 0.96 * pow(sin(zend), 2))) * pow(10, -0.4 * kX); + return mymax(Bnb, 0) * erg2nL; +} + +/*################################################################### +' JDNDaysUT [-] +' dgeo [array: longitude, latitude, eye height above sea m] +' TempE [C] +' PresE [mbar] +' ObjectName [-] +' Magnitude [-] +*/ +static int32 Magnitude(double JDNDaysUT, double *dgeo, char *ObjectName, int32 helflag, double *dmag, char *serr) +{ + double x[20]; + int32 Planet, iflag, epheflag; + epheflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + *dmag = -99.0; + Planet = DeterObject(ObjectName); + iflag = SEFLG_TOPOCTR | SEFLG_EQUATORIAL | epheflag; + if (!(helflag & SE_HELFLAG_HIGH_PRECISION)) + iflag |= SEFLG_NONUT|SEFLG_TRUEPOS; + if (Planet != -1) { + /**dmag = Phenomena(JDNDaysUT, Lat, Longitude, HeightEye, TempE, PresE, ObjectName, 4);*/ + swe_set_topo(dgeo[0], dgeo[1], dgeo[2]); + if (swe_pheno_ut(JDNDaysUT, Planet, iflag, x, serr) == ERR) + return ERR; + *dmag = x[4]; + } else { + if (call_swe_fixstar_mag(ObjectName, dmag, serr) == ERR) + return ERR; + } + return OK; +} + +#if 0 +static int32 fast_magnitude(double tjd, double *dgeo, char *ObjectName, int32 helflag, double *dmag, char *serr) +{ + int32 retval = OK, ipl, ipli; + double dtjd; + static double tjdsv[3]; + static double dmagsv[3]; + static int32 helflagsv[3]; + ipl = DeterObject(ObjectName); + ipli = ipl; + if (ipli > SE_MOON) + ipli = 2; + dtjd = tjd - tjdsv[ipli]; + if (tjdsv[ipli] != 0 && helflag == helflagsv[ipli] && fabs(dtjd) < 5.0 / 1440.0) { + *dmag = dmagsv[ipli]; + } else { + retval = Magnitude(tjd, dgeo, ObjectName, helflag, dmag, serr); + tjdsv[ipli] = tjd; + helflagsv[ipli] = helflag; + dmagsv[ipli] = *dmag; + } + return retval; +} +#endif + +/*################################################################### +' dist [km] +' phasemoon [-] +' MoonsBrightness [-] +*/ +static double MoonsBrightness(double dist, double phasemoon) +{ + double log10 = 2.302585092994; + /*Moon's brightness changes with distance: http://hem.passagen.se/pausch/comp/ppcomp.html#15 */ + return -21.62 + 5 * log(dist / (Ra / 1000)) / log10 + 0.026 * fabs(phasemoon) + 0.000000004 * pow(phasemoon, 4); +} + +/*################################################################### +' AltM [deg] +' AziM [deg] +' AziS [deg] +' MoonPhase [deg] +*/ +static double MoonPhase(double AltM, double AziM, double AziS) +{ + double AltMi = AltM * DEGTORAD; + double AziMi = AziM * DEGTORAD; + double AziSi = AziS * DEGTORAD; + return 180 - acos(cos(AziSi - AziMi) * cos(AltMi + 0.95 * DEGTORAD)) / DEGTORAD; +} + +/*################################################################### +' Pressure [mbar] +*/ +static double Bm(double AltO, double AziO, double AltM, double AziM, double AltS, double AziS, double sunra, double Lat, double HeightEye, double *datm, int32 helflag, char *serr) +{ + double M0 = -11.05; + double Bm = 0; + double RM, kXM, kX, C3, FM, phasemoon, MM; + if (AltM > -0.26) { + /* moon only adds light when (partly) above horizon + * From Schaefer , Archaeoastronomy, XV, 2000, page 129*/ + RM = DistanceAngle(AltO * DEGTORAD, AziO * DEGTORAD, AltM * DEGTORAD, AziM * DEGTORAD) / DEGTORAD; + kXM = Deltam(AltM, AltS, sunra, Lat, HeightEye, datm, helflag, serr); + kX = Deltam(AltO, AltS, sunra, Lat, HeightEye, datm, helflag, serr); + C3 = pow(10, -0.4 * kXM); + FM = (62000000.0) / RM / RM + pow(10, 6.15 - RM / 40) + pow(10, 5.36) * (1.06 + pow(cos(RM * DEGTORAD), 2)); + Bm = FM * C3 + 440000 * (1 - C3); + phasemoon = MoonPhase(AltM, AziM, AziS); + MM = MoonsBrightness(MoonDistance, phasemoon); + Bm = Bm * pow(10, -0.4 * (MM - M0 + 43.27)); + Bm = Bm * (1 - pow(10, -0.4 * kX)); + } + Bm = mymax(Bm, 0) * erg2nL; + return Bm; +} + +/*################################################################### +' Pressure [mbar] +*/ +static double Btwi(double AltO, double AziO, double AltS, double AziS, double sunra, double Lat, double HeightEye, double *datm, int32 helflag, char *serr) +{ +double M0 = -11.05; +double MS = -26.74; +double PresE = PresEfromPresS(datm[1], datm[0], HeightEye); +double TempE = TempEfromTempS(datm[1], HeightEye, LapseSA); +double AppAltO = AppAltfromTopoAlt(AltO, TempE, PresE, helflag); +double ZendO = 90 - AppAltO; +double RS = DistanceAngle(AltO * DEGTORAD, AziO * DEGTORAD, AltS * DEGTORAD, AziS * DEGTORAD) / DEGTORAD; +double kX = Deltam(AltO, AltS, sunra, Lat, HeightEye, datm, helflag, serr); +double k = kt(AltS, sunra, Lat, HeightEye, datm[1], datm[2], datm[3], 4, serr); +/* From Schaefer , Archaeoastronomy, XV, 2000, page 129*/ +double Btwi = pow(10, -0.4 * (MS - M0 + 32.5 - AltS - (ZendO / (360 * k)))); +Btwi = Btwi * (100 / RS) * (1 - pow(10, -0.4 * kX)); +Btwi = mymax(Btwi, 0) * erg2nL; +return Btwi; +} + +/*################################################################### +' Pressure [mbar] +*/ +static double Bday(double AltO, double AziO, double AltS, double AziS, double sunra, double Lat, double HeightEye, double *datm, int32 helflag, char *serr) +{ + double M0 = -11.05; + double MS = -26.74; + double RS = DistanceAngle(AltO * DEGTORAD, AziO * DEGTORAD, AltS * DEGTORAD, AziS * DEGTORAD) / DEGTORAD; + double kXS = Deltam(AltS, AltS, sunra, Lat, HeightEye, datm, helflag, serr); + double kX = Deltam(AltO, AltS, sunra, Lat, HeightEye, datm, helflag, serr); + /* From Schaefer , Archaeoastronomy, XV, 2000, page 129*/ + double C4 = pow(10, -0.4 * kXS); + double FS = (62000000.0) / RS / RS + pow(10, (6.15 - RS / 40)) + pow(10, 5.36) * (1.06 + pow(cos(RS * DEGTORAD), 2)); + double Bday = FS * C4 + 440000.0 * (1 - C4); + Bday = Bday * pow(10, (-0.4 * (MS - M0 + 43.27))); + Bday = Bday * (1 - pow(10, -0.4 * kX)); + Bday = mymax(Bday, 0) * erg2nL; + return Bday; +} + +/*################################################################### +' Value [nL] +' PresS [mbar] +' Bcity [nL] +*/ +static double Bcity(double Value, double Press) +{ + double Bcity = Value; + Bcity = mymax(Bcity, 0); + return Bcity; +} + +/*################################################################### +' Pressure [mbar] +*/ +static double Bsky(double AltO, double AziO, double AltM, double AziM, double JDNDaysUT, double AltS, double AziS, double sunra, double Lat, double HeightEye, double *datm, int32 helflag, char *serr) +{ + double Bsky = 0; + if (AltS < -3) { + Bsky += Btwi(AltO, AziO, AltS, AziS, sunra, Lat, HeightEye, datm, helflag, serr); + } else { + if (AltS > 4) { + Bsky += Bday(AltO, AziO, AltS, AziS, sunra, Lat, HeightEye, datm, helflag, serr); + } else { + Bsky += mymin(Bday(AltO, AziO, AltS, AziS, sunra, Lat, HeightEye, datm, helflag, serr), Btwi(AltO, AziO, AltS, AziS, sunra, Lat, HeightEye, datm, helflag, serr)); + } + } + /* if max. Bm [1E7] <5% of Bsky don't add Bm*/ + if (Bsky < 200000000.0) + Bsky += Bm(AltO, AziO, AltM, AziM, AltS, AziS, sunra, Lat, HeightEye, datm, helflag, serr); + if (AltS <= 0) + Bsky += Bcity(0, datm[0]); + /* if max. Bn [250] <5% of Bsky don't add Bn*/ + if (Bsky < 5000) + Bsky = Bsky + Bn(AltO, JDNDaysUT, AltS, sunra, Lat, HeightEye, datm, helflag, serr); + /* if max. Bm [1E7] <5% of Bsky don't add Bm*/ + return Bsky; +} + +/* default handling: + * 1. datm (atmospheric conditions): + * datm consists of + * [0] atmospheric pressure + * [1] temperature + * [2] relative humidity + * [3] extinction coefficient + * In order to get default values for [0..2], set datm[0] = 0. + * Default values for [1-2] are only provided if [0] == 0. + * [3] defaults outside this function, depending on [0-2]. + * + * 2. dobs (observer definition): + * [0] age (default 36) + * [1] Snellen ratio or visual acuity of observer (default 1) + */ +static void default_heliacal_parameters(double *datm, double *dgeo, double *dobs, int helflag) +{ + int i; + if (datm[0] <= 0) { + /* estimate atmospheric pressure, according to the + * International Standard Atmosphere (ISA) */ + datm[0] = 1013.25 * pow(1 - 0.0065 * dgeo[2] / 288, 5.255); + /* temperature */ + if (datm[1] == 0) + datm[1] = 15 - 0.0065 * dgeo[2]; + /* relative humidity, independent of atmospheric pressure and altitude */ + if (datm[2] == 0) + datm[2] = 40; + /* note: datm[3] / VR defaults outside this function */ + } else { +#ifndef SIMULATE_VICTORVB + if (datm[2] <= 0.00000001) datm[2] = 0.00000001; + if (datm[2] >= 99.99999999) datm[2] = 99.99999999; +#endif + } + /* age of observer */ + if (dobs[0] == 0) + dobs[0] = 36; + /* SN Snellen factor of the visual acuity of the observer */ + if (dobs[1] == 0) + dobs[1] = 1; + if (!(helflag & SE_HELFLAG_OPTICAL_PARAMS)) { + for (i = 2; i <= 5; i++) + dobs[i] = 0; + } + /* OpticMagn undefined -> use eye */ + if (dobs[3] == 0) { + dobs[2] = 1; /* Binocular = 1 */ + dobs[3] = 1; /* OpticMagn = 1: use eye */ + /* dobs[4] and dobs[5] (OpticDia and OpticTrans) will be defaulted in + * OpticFactor() */ + } +} + +/*################################################################### +' age [Year] +' SN [-] +' AltO [deg] +' AziO [deg] +' AltM [deg] +' AziM [deg] +' MoonDistance [km] +' JDNDaysUT [-] +' AltS [deg] +' AziS [deg] +' lat [deg] +' heighteye [m] +' TempS [C] +' PresS [mbar] +' RH [%] +' VR [km] +' VisLimMagn [-] +*/ +static double VisLimMagn(double *dobs, double AltO, double AziO, double AltM, double AziM, double JDNDaysUT, double AltS, double AziS, double sunra, double Lat, double HeightEye, double *datm, int32 helflag, int32 *scotopic_flag, char *serr) +{ + double C1, C2, Th, kX, Bsk, CorrFactor1, CorrFactor2; + double log10 = 2.302585092994; + /*double Age = dobs[0];*/ + /*double SN = dobs[1];*/ + Bsk = Bsky(AltO, AziO, AltM, AziM, JDNDaysUT, AltS, AziS, sunra, Lat, HeightEye, datm, helflag, serr); + /* Schaefer, Astronomy and the limits of vision, Archaeoastronomy, 1993 Verder:*/ + kX = Deltam(AltO, AltS, sunra, Lat, HeightEye, datm, helflag, serr); + /* influence of age*/ + /*Fa = mymax(1, pow(p(23, Bsk) / p(Age, Bsk), 2)); */ + CorrFactor1 = OpticFactor(Bsk, kX, dobs, JDNDaysUT, "", 1, helflag); + CorrFactor2 = OpticFactor(Bsk, kX, dobs, JDNDaysUT, "", 0, helflag); + /* From Schaefer , Archaeoastronomy, XV, 2000, page 129*/ + if (Bsk < BNIGHT && !(helflag & SE_HELFLAG_VISLIM_PHOTOPIC)) { + C1 = 1.5848931924611e-10; /*pow(10, -9.8);*/ /* C1 = 10 ^ (-9.8);*/ + C2 = 0.012589254117942; /*pow(10, -1.9);*/ /* C2 = 10 ^ (-1.9);*/ + if (scotopic_flag != NULL) + *scotopic_flag = 1; + } else { + C1 = 4.4668359215096e-9; /*pow(10, -8.35);*/ /* C1 = 10 ^ (-8.35);*/ + C2 = 1.2589254117942e-6; /*pow(10, -5.9);*/ /* C2 = 10 ^ (-5.9);*/ + if (scotopic_flag != NULL) + *scotopic_flag = 0; + } + if (scotopic_flag != NULL) { + if (BNIGHT * BNIGHT_FACTOR > Bsk && BNIGHT / BNIGHT_FACTOR < Bsk) + *scotopic_flag |= 2; + } + /*Th = C1 * pow(1 + sqrt(C2 * Bsk), 2) * Fa;*/ + Bsk = Bsk / CorrFactor1; + Th = C1 * pow(1 + sqrt(C2 * Bsk), 2) * CorrFactor2; +#if DEBUG + fprintf(stderr, "Bsk=%f\n", Bsk); + fprintf(stderr, "kX =%f\n", kX); + fprintf(stderr, "Th =%f\n", Th); + fprintf(stderr, "CorrFactor1=%f\n", CorrFactor1); + fprintf(stderr, "CorrFactor2=%f\n", CorrFactor2); +#endif + /* Visual limiting magnitude of point source*/ +#if 0 + if (SN <= 0.00000001) + SN = 0.00000001; + return -16.57 - 2.5 * (log(Th) / log10) - kX + 5.0 * (log(SN) / log10);*/ +#endif + return -16.57 - 2.5 * (log(Th) / log10); +} + +/* Limiting magnitude in dark skies + * function returns: + * -1 Error + * -2 Object is below horizon + * 0 OK, photopic vision + * |1 OK, scotopic vision + * |2 OK, near limit photopic/scotopic +*/ +int32 FAR PASCAL_CONV swe_vis_limit_mag(double tjdut, double *dgeo, double *datm, double *dobs, char *ObjectName, int32 helflag, double *dret, char *serr) +{ + int32 retval = OK, i, scotopic_flag = 0; + double AltO, AziO, AltM, AziM, AltS, AziS; + double sunra = SunRA(tjdut, helflag, serr); + default_heliacal_parameters(datm, dgeo, dobs, helflag); + swe_set_topo(dgeo[0], dgeo[1], dgeo[2]); + for (i = 0; i < 7; i++) + dret[i] = 0; + if (ObjectLoc(tjdut, dgeo, datm, ObjectName, 0, helflag, &AltO, serr) == ERR) + return ERR; + if (AltO < 0 && serr != NULL) { + strcpy(serr, "object is below local horizon"); + *dret = -100; + return -2; + } + if (ObjectLoc(tjdut, dgeo, datm, ObjectName, 1, helflag, &AziO, serr) == ERR) + return ERR; + if (helflag & SE_HELFLAG_VISLIM_DARK) { + AltS = -90; + AziS = 0; + } else { + if (ObjectLoc(tjdut, dgeo, datm, "sun", 0, helflag, &AltS, serr) == ERR) + return ERR; + if (ObjectLoc(tjdut, dgeo, datm, "sun", 1, helflag, &AziS, serr) == ERR) + return ERR; + } + if (strncmp(ObjectName, "moon", 4) == 0 || + (helflag & SE_HELFLAG_VISLIM_DARK) || + (helflag & SE_HELFLAG_VISLIM_NOMOON) + ) { + AltM = -90; AziM = 0; + } else { + if (ObjectLoc(tjdut, dgeo, datm, "moon", 0, helflag, &AltM, serr) == ERR) + return ERR; + if (ObjectLoc(tjdut, dgeo, datm, "moon", 1, helflag, &AziM, serr) == ERR) + return ERR; + } +#if DEBUG +{ + int i; + for (i = 0; i < 6;i++) + printf("dobs[%d] = %f\n", i, dobs[i]); + printf("AltO = %.10f, AziO = %.10f\n", AltO, AziO); + printf("AltM = %.10f, AziM = %.10f\n", AltM, AziM); + printf("AltS = %.10f, AziS = %.10f\n", AltS, AziS); + printf("JD = %.10f\n", tjdut); + printf("lat = %f, eyeh = %f\n", dgeo[1], dgeo[2]); + for (i = 0; i < 4;i++) + printf("datm[%d] = %f\n", i, datm[i]); + printf("helflag = %d\n", helflag); +} +#endif + dret[0] = VisLimMagn(dobs, AltO, AziO, AltM, AziM, tjdut, AltS, AziS, sunra, dgeo[1], dgeo[2], datm, helflag, &scotopic_flag, serr); + dret[1] = AltO; + dret[2] = AziO; + dret[3] = AltS; + dret[4] = AziS; + dret[5] = AltM; + dret[6] = AziM; + if (Magnitude(tjdut, dgeo, ObjectName, helflag, &(dret[7]), serr) == ERR) + return ERR; + retval = scotopic_flag; + /*dret[8] = (double) is_scotopic;*/ + /*if (*serr != '\0') * in VisLimMagn(), serr is only a warning * + retval = ERR; */ + return retval; +} + +/*################################################################### +' Magn [-] +' age [Year] +' SN [-] +' AltO [deg] +' AziO [deg] +' AltM [deg] +' AziM [deg] +' MoonDistance [km] +' JDNDaysUT [-] +' AziS [deg] +' lat [deg] +' heighteye [m] +' Temperature [C] +' Pressure [mbar] +' RH [%] +' VR [km] +' TopoArcVisionis [deg] +*/ +static int32 TopoArcVisionis(double Magn, double *dobs, double AltO, double AziO, double AltM, double AziM, double JDNDaysUT, double AziS, double sunra, double Lat, double HeightEye, double *datm, int32 helflag, double *dret, char *serr) +{ + double Xm, Ym, AltSi, AziSi; + double xR = 0; + double Xl = 45; + double Yl, Yr; + Yl = Magn - VisLimMagn(dobs, AltO, AziO, AltM, AziM, JDNDaysUT, AltO - Xl, AziS, sunra, Lat, HeightEye, datm, helflag, NULL, serr); + /* if (*serr != '\0') return ERR; * serr is only a warning */ + Yr = Magn - VisLimMagn(dobs, AltO, AziO, AltM, AziM, JDNDaysUT, AltO - xR, AziS, sunra, Lat, HeightEye, datm, helflag, NULL, serr); + /* if (*serr != '\0') return ERR; * serr is only a warning */ + /* http://en.wikipedia.org/wiki/Bisection_method*/ + if ((Yl * Yr) <= 0) { + while(fabs(xR - Xl) > epsilon) { + /*Calculate midpoint of domain*/ + Xm = (xR + Xl) / 2.0; + AltSi = AltO - Xm; + AziSi = AziS; + Ym = Magn - VisLimMagn(dobs, AltO, AziO, AltM, AziM, JDNDaysUT, AltSi, AziSi, sunra, Lat, HeightEye, datm, helflag, NULL, serr); + /* if (*serr != '\0') return ERR; * serr is only a warning */ + if ((Yl * Ym) > 0) { + /* Throw away left half*/ + Xl = Xm; + Yl = Ym; + } else { + /* Throw away right half */ + xR = Xm; + Yr = Ym; + } + } + Xm = (xR + Xl) / 2.0; + } else { + Xm = 99; + } + if (Xm < AltO) + Xm = AltO; + *dret = Xm; + return OK; +} + +int32 FAR PASCAL_CONV swe_topo_arcus_visionis(double tjdut, double *dgeo, double *datm, double *dobs, int32 helflag, double mag, double azi_obj, double alt_obj, double azi_sun, double azi_moon, double alt_moon, double *dret, char *serr) +{ + double sunra = SunRA(tjdut, helflag, serr); + if (serr != NULL && *serr != '\0') + return ERR; + return TopoArcVisionis(mag, dobs, alt_obj, azi_obj, alt_moon, azi_moon, tjdut, azi_sun, sunra, dgeo[1], dgeo[2], datm, helflag, dret, serr); +} + +/*###################################################################*/ +/*' Magn [-] +' age [Year] +' SN Snellen factor of the visual aquity of the observer + see: http://www.i-see.org/eyecharts.html#make-your-own +' AziO [deg] +' AltM [deg] +' AziM [deg] +' MoonDistance [km] +' JDNDaysUT [-] +' AziS [deg] +' Lat [deg] +' HeightEye [m] +' Temperature [C] +' Pressure [mbar] +' RH [%] relative humidity +' VR [km] Meteorological Range, + see http://www.iol.ie/~geniet/eng/atmoastroextinction.htm +' TypeAngle +' [0=Object's altitude, +' 1=Arcus Visonis (Object's altitude - Sun's altitude), +' 2=Sun's altitude] +' HeliacalAngle [deg] +*/ +static int32 HeliacalAngle(double Magn, double *dobs, double AziO, double AltM, double AziM, double JDNDaysUT, double AziS, double *dgeo, double *datm, int32 helflag, double *dangret, char *serr) +{ + double x, minx, maxx, xmin, ymin, Xl, xR, Yr, Yl, Xm, Ym, xmd, ymd; + double Arc, DELTAx; + double sunra = SunRA(JDNDaysUT, helflag, serr); + double Lat = dgeo[1]; + double HeightEye = dgeo[2]; + if (PLSV == 1) { + dangret[0] = criticalangle; + dangret[1] = criticalangle + Magn * 2.492 + 13.447; + dangret[2] = -(Magn * 2.492 + 13.447); /* Magn * 1.1 + 8.9;*/ + return OK; + } + minx = 2; + maxx = 20; + xmin = 0; + ymin = 10000; + for (x = minx; x <= maxx; x++) { + if (TopoArcVisionis(Magn, dobs, x, AziO, AltM, AziM, JDNDaysUT, AziS, sunra, Lat, HeightEye, datm, helflag, &Arc, serr) == ERR) + return ERR; + if (Arc < ymin) { + ymin = Arc; + xmin = x; + } + } + Xl = xmin - 1; + xR = xmin + 1; + if (TopoArcVisionis(Magn, dobs, xR, AziO, AltM, AziM, JDNDaysUT, AziS, sunra, Lat, HeightEye, datm, helflag, &Yr, serr) == ERR) + return ERR; + if (TopoArcVisionis(Magn, dobs, Xl, AziO, AltM, AziM, JDNDaysUT, AziS, sunra, Lat, HeightEye, datm, helflag, &Yl, serr) == ERR) + return ERR; + /* http://en.wikipedia.org/wiki/Bisection_method*/ + while(fabs(xR - Xl) > 0.1) { + /* Calculate midpoint of domain */ + Xm = (xR + Xl) / 2.0; + DELTAx = 0.025; + xmd = Xm + DELTAx; + if (TopoArcVisionis(Magn, dobs, Xm, AziO, AltM, AziM, JDNDaysUT, AziS, sunra, Lat, HeightEye, datm, helflag, &Ym, serr) == ERR) + return ERR; + if (TopoArcVisionis(Magn, dobs, xmd, AziO, AltM, AziM, JDNDaysUT, AziS, sunra, Lat, HeightEye, datm, helflag, &ymd, serr) == ERR) + return ERR; + if (Ym >= ymd) { + /* Throw away left half */ + Xl = Xm; + Yl = Ym; + } else { + /*Throw away right half */ + xR = Xm; + Yr = Ym; + } + } + Xm = (xR + Xl) / 2.0; + Ym = (Yr + Yl) / 2.0; + dangret[1] = Ym; + dangret[2] = Xm - Ym; + dangret[0] = Xm; + return OK; +} + +int32 FAR PASCAL_CONV swe_heliacal_angle(double tjdut, double *dgeo, double *datm, double *dobs, int32 helflag, double mag, double azi_obj, double azi_sun, double azi_moon, double alt_moon, double *dret, char *serr) +{ + return HeliacalAngle(mag, dobs, azi_obj, alt_moon, azi_moon, tjdut, azi_sun, dgeo, datm, helflag, dret, serr); +} + +/*################################################################### +' AltO [deg] +' AziO [deg] +' AltS [deg] +' AziS [deg] +' parallax [deg] +' WidthMoon [deg] +*/ +static double WidthMoon(double AltO, double AziO, double AltS, double AziS, double parallax) +{ + /* Yallop 1998, page 3*/ + double GeoAltO = AltO + parallax; + return 0.27245 * parallax * (1 + sin(GeoAltO * DEGTORAD) * sin(parallax * DEGTORAD)) * (1 - cos((AltS - GeoAltO) * DEGTORAD) * cos((AziS - AziO) * DEGTORAD)); +} + +/*################################################################### +' W [deg] +' LengthMoon [deg] +*/ +static double LengthMoon(double W, double Diamoon) +{ + double Wi, D; + if (Diamoon == 0) Diamoon = AvgRadiusMoon * 2; + Wi = W * 60; + D = Diamoon * 60; + /* Crescent length according: http://calendar.ut.ac.ir/Fa/Crescent/Data/Sultan2005.pdf*/ + return (D - 0.3 * (D + Wi) / 2.0 / Wi) / 60.0; +} + +/*################################################################### +' W [deg] +' GeoARCVact [deg] +' q [-] +*/ +static double qYallop(double W, double GeoARCVact) +{ + double Wi = W * 60; + return (GeoARCVact - (11.8371 - 6.3226 * Wi + 0.7319 * Wi * Wi - 0.1018 * Wi * Wi * Wi)) / 10; +} + +/*################################################################### +'A (0,p) +'B (1,q) +'C (0,r) +'D (1,s) +*/ +static double crossing(double A, double B, double C, double D) +{ +return (C - A) / ((B - A) - (D - C)); +} + +/*###################################################################*/ +static int32 DeterTAV(double *dobs, double JDNDaysUT, double *dgeo, double *datm, char *ObjectName, int32 helflag, double *dret, char *serr) +{ + double Magn, AltO, AziS, AziO, AziM, AltM; + double sunra = SunRA(JDNDaysUT, helflag, serr); + if (Magnitude(JDNDaysUT, dgeo, ObjectName, helflag, &Magn, serr) == ERR) + return ERR; + if (ObjectLoc(JDNDaysUT, dgeo, datm, ObjectName, 0, helflag, &AltO, serr) == ERR) + return ERR; + if (ObjectLoc(JDNDaysUT, dgeo, datm, ObjectName, 1, helflag, &AziO, serr) == ERR) + return ERR; + if (strncmp(ObjectName, "moon", 4) == 0) { + AltM = -90; + AziM = 0; + } else { + if (ObjectLoc(JDNDaysUT, dgeo, datm, "moon", 0, helflag, &AltM, serr) == ERR) + return ERR; + if (ObjectLoc(JDNDaysUT, dgeo, datm, "moon", 1, helflag, &AziM, serr) == ERR) + return ERR; + } + if (ObjectLoc(JDNDaysUT, dgeo, datm, "sun", 1, helflag, &AziS, serr) == ERR) + return ERR; + if (TopoArcVisionis(Magn, dobs, AltO, AziO, AltM, AziM, JDNDaysUT, AziS, sunra, dgeo[1], dgeo[2], datm, helflag, dret, serr) == ERR) + return ERR; + return OK; +} + +/*################################################################### +' A y-value at x=1 +' B y-value at x=0 +' C y-value at x=-1 +' x2min minimum for the quadratic function +*/ +static double x2min(double A, double B, double C) +{ + double term = A + C - 2 * B; + if (term == 0) + return 0; + return -(A - C) / 2.0 / term; +} + + +/*################################################################### +' A y-value at x=1 +' B y-value at x=0 +' C y-value at x=-1 +' x +' y is y-value of quadratic function +*/ +static double funct2(double A, double B, double C, double x) +{ + return (A + C - 2 * B) / 2.0 * x * x + (A - C) / 2.0 * x + B; +} + +static void strcpy_VBsafe(char *sout, char *sin) +{ + char *sp, *sp2; + int iw = 0; + sp = sin; + sp2 = sout; + while((isalnum(*sp) || *sp == ' ' || *sp == '-') && iw < 30) { + *sp2 = *sp; + sp++; sp2++; iw++; + } + *sp2 = '\0'; +} + +/*################################################################### +' JDNDaysUT [JDN] +' HPheno +'0=AltO [deg] topocentric altitude of object (unrefracted) +'1=AppAltO [deg] apparent altitude of object (refracted) +'2=GeoAltO [deg] geocentric altitude of object +'3=AziO [deg] azimuth of object +'4=AltS [deg] topocentric altitude of Sun +'5=AziS [deg] azimuth of Sun +'6=TAVact [deg] actual topocentric arcus visionis +'7=ARCVact [deg] actual (geocentric) arcus visionis +'8=DAZact [deg] actual difference between object's and sun's azimuth +'9=ARCLact [deg] actual longitude difference between object and sun +'10=kact [-] extinction coefficient +'11=minTAV [deg] smallest topocentric arcus visionis +'12=TfistVR [JDN] first time object is visible, according to VR +'13=TbVR [JDN] optimum time the object is visible, according to VR +'14=TlastVR [JDN] last time object is visible, according to VR +'15=TbYallop[JDN] best time the object is visible, according to Yallop +'16=WMoon [deg] cresent width of moon +'17=qYal [-] q-test value of Yallop +'18=qCrit [-] q-test criterion of Yallop +'19=ParO [deg] parallax of object +'20 Magn [-] magnitude of object +'21=RiseO [JDN] rise/set time of object +'22=RiseS [JDN] rise/set time of sun +'23=Lag [JDN] rise/set time of object minus rise/set time of sun +'24=TvisVR [JDN] visibility duration +'25=LMoon [deg] cresent length of moon +'26=CVAact [deg] +'27=Illum [%] 'new +'28=CVAact [deg] 'new +'29=MSk [-] +*/ +int32 FAR PASCAL_CONV swe_heliacal_pheno_ut(double JDNDaysUT, double *dgeo, double *datm, double *dobs, char *ObjectNameIn, int32 TypeEvent, int32 helflag, double *darr, char *serr) +{ + double AziS, AltS, AltS2, AziO, AltO, AltO2, GeoAltO, AppAltO, DAZact, TAVact, ParO, MagnO; + double ARCVact, ARCLact, kact, WMoon, LMoon = 0, qYal, qCrit; + double RiseSetO, RiseSetS, Lag, TbYallop, TfirstVR, TlastVR, TbVR; + double MinTAV = 0, MinTAVact, Ta, Tc, TimeStep, TimePointer, MinTAVoud = 0, DeltaAltoud = 0, DeltaAlt, TvisVR, crosspoint; + double OldestMinTAV, extrax, illum; + double elong, attr[30]; + double TimeCheck, LocalminCheck; + int32 retval = OK, RS, Planet; + AS_BOOL noriseO = FALSE; + char ObjectName[AS_MAXCH]; + double sunra = SunRA(JDNDaysUT, helflag, serr); + int32 iflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + /* note, the fixed stars functions rewrite the star name. The input string + may be too short, so we have to make sure we have enough space */ + strcpy_VBsafe(ObjectName, ObjectNameIn); + default_heliacal_parameters(datm, dgeo, dobs, helflag); + swe_set_topo(dgeo[0], dgeo[1], dgeo[2]); + retval = ObjectLoc(JDNDaysUT, dgeo, datm, "sun", 1, helflag, &AziS, serr); + if (retval == OK) + retval = ObjectLoc(JDNDaysUT, dgeo, datm, "sun", 0, helflag, &AltS, serr); + if (retval == OK) + retval = ObjectLoc(JDNDaysUT, dgeo, datm, ObjectName, 1, helflag, &AziO, serr); + if (retval == OK) + retval = ObjectLoc(JDNDaysUT, dgeo, datm, ObjectName, 0, helflag, &AltO, serr); + if (retval == OK) + retval = ObjectLoc(JDNDaysUT, dgeo, datm, ObjectName, 7, helflag, &GeoAltO, serr); + if (retval == ERR) + return ERR; + AppAltO = AppAltfromTopoAlt(AltO, datm[1], datm[0], helflag); + DAZact = AziS - AziO; + TAVact = AltO - AltS; + /*this parallax seems to be somewhat smaller then in Yallop and SkyMap! Needs to be studied*/ + ParO = GeoAltO - AltO; + if (Magnitude(JDNDaysUT, dgeo, ObjectName, helflag, &MagnO, serr) == ERR) + return ERR; + ARCVact = TAVact + ParO; + ARCLact = acos(cos(ARCVact * DEGTORAD) * cos(DAZact * DEGTORAD)) / DEGTORAD; + Planet = DeterObject(ObjectName); + if (Planet == -1) { + elong = ARCLact; + illum = 100; + } else { + retval = swe_pheno_ut(JDNDaysUT, Planet, iflag|(SEFLG_TOPOCTR|SEFLG_EQUATORIAL), attr, serr); + if (retval == ERR) return ERR; + elong = attr[2]; + illum = attr[1] * 100; + } + kact = kt(AltS, sunra, dgeo[1], dgeo[2], datm[1], datm[2], datm[3], 4, serr); + if (0) { +darr[26] = kR(AltS, dgeo[2]); +darr[27] = kW(dgeo[2], datm[1], datm[2]); +darr[28] = kOZ(AltS, sunra, dgeo[1]); +darr[29] = ka(AltS, sunra, dgeo[1], dgeo[2], datm[1], datm[2], datm[3], serr); +darr[30] = darr[26] + darr[27] + darr[28] + darr[29]; + } + WMoon = 0; + qYal = 0; + qCrit = 0; + LMoon = 0; + if (Planet == SE_MOON) { + WMoon = WidthMoon(AltO, AziO, AltS, AziS, ParO); + LMoon = LengthMoon(WMoon, 0); + qYal = qYallop(WMoon, ARCVact); + if (qYal > 0.216) qCrit = 1; /* A */ + if (qYal < 0.216 && qYal > -0.014) qCrit = 2; /* B */ + if (qYal < -0.014 && qYal > -0.16) qCrit = 3; /* C */ + if (qYal < -0.16 && qYal > -0.232) qCrit = 4; /* D */ + if (qYal < -0.232 && qYal > -0.293) qCrit = 5; /* E */ + if (qYal < -0.293) qCrit = 6; /* F */ + } + /*determine if rise or set event*/ + RS = 2; + if (TypeEvent == 1 || TypeEvent == 4) RS = 1; + retval = RiseSet(JDNDaysUT - 4.0 / 24.0, dgeo, datm, "sun", RS, helflag, 0, &RiseSetS, serr); + if (retval == ERR) + return ERR; + retval = RiseSet(JDNDaysUT - 4.0 / 24.0, dgeo, datm, ObjectName, RS, helflag, 0, &RiseSetO, serr); + if (retval == ERR) + return ERR; + TbYallop = TJD_INVALID; + if (retval == -2) { /* object does not rise or set */ + Lag = 0; + noriseO = TRUE; + } else { + Lag = RiseSetO - RiseSetS; + if (Planet == SE_MOON) + TbYallop = (RiseSetO * 4 + RiseSetS * 5) / 9.0; + } + if ((TypeEvent == 3 || TypeEvent == 4) && (Planet == -1 || Planet >= SE_MARS)) { + TfirstVR = TJD_INVALID; + TbVR = TJD_INVALID; + TlastVR = TJD_INVALID; + TvisVR = 0; + MinTAV = 0; + goto output_heliacal_pheno; + } + /* If HPheno >= 11 And HPheno <= 14 Or HPheno = 24 Then*/ + /*te bepalen m.b.v. walkthrough*/ + MinTAVact = 199; + DeltaAlt = 0; + OldestMinTAV = 0; + Ta = 0; + Tc = 0; + TbVR = 0; + TimeStep = -TimeStepDefault / 24.0 / 60.0; + if (RS == 2) TimeStep = -TimeStep; + TimePointer = RiseSetS - TimeStep; + do { + TimePointer = TimePointer + TimeStep; + OldestMinTAV = MinTAVoud; + MinTAVoud = MinTAVact; + DeltaAltoud = DeltaAlt; + retval = ObjectLoc(TimePointer, dgeo, datm, "sun", 0, helflag, &AltS2, serr); + if (retval == OK) + retval = ObjectLoc(TimePointer, dgeo, datm, ObjectName, 0, helflag, &AltO2, serr); + if (retval != OK) + return ERR; + DeltaAlt = AltO2 - AltS2; + if (DeterTAV(dobs, TimePointer, dgeo, datm, ObjectName, helflag, &MinTAVact, serr) == ERR) + return ERR; + if (MinTAVoud < MinTAVact && TbVR == 0) { + /* determine if this is a local minimum with object still above horizon*/ + TimeCheck = TimePointer + Sgn(TimeStep) * LocalMinStep / 24.0 / 60.0; + if (RiseSetO != 0) { + if (TimeStep > 0) + TimeCheck = mymin(TimeCheck, RiseSetO); + else + TimeCheck = mymax(TimeCheck, RiseSetO); + } + if (DeterTAV(dobs, TimeCheck, dgeo, datm, ObjectName, helflag, &LocalminCheck, serr) == ERR) + return ERR; + if (LocalminCheck > MinTAVact) { + extrax = x2min(MinTAVact, MinTAVoud, OldestMinTAV); + TbVR = TimePointer - (1 - extrax) * TimeStep; + MinTAV = funct2(MinTAVact, MinTAVoud, OldestMinTAV, extrax); + } + } + if (DeltaAlt > MinTAVact && Tc == 0 && TbVR == 0) { + crosspoint = crossing(DeltaAltoud, DeltaAlt, MinTAVoud, MinTAVact); + Tc = TimePointer - TimeStep * (1 - crosspoint); + } + if (DeltaAlt < MinTAVact && Ta == 0 && Tc != 0) { + crosspoint = crossing(DeltaAltoud, DeltaAlt, MinTAVoud, MinTAVact); + Ta = TimePointer - TimeStep * (1 - crosspoint); + } + } while (fabs(TimePointer - RiseSetS) <= MaxTryHours / 24.0 && Ta == 0 && !((TbVR != 0 && (TypeEvent == 3 || TypeEvent == 4) && (strncmp(ObjectName, "moon", 4) != 0 && strncmp(ObjectName, "venus", 5) != 0 && strncmp(ObjectName, "mercury", 7) != 0)))); + if (RS == 2) { + TfirstVR = Tc; + TlastVR = Ta; + } else { + TfirstVR = Ta; + TlastVR = Tc; + } + if (TfirstVR == 0 && TlastVR == 0) { + if (RS == 1) + TfirstVR = TbVR - 0.000001; + else + TlastVR = TbVR + 0.000001; + } + if (!noriseO) { + if (RS == 1) + TfirstVR = mymax(TfirstVR, RiseSetO); + else + TlastVR = mymin(TlastVR, RiseSetO); + } + TvisVR = TJD_INVALID; /*"#NA!" */ + if (TlastVR != 0 && TfirstVR != 0) + TvisVR = TlastVR - TfirstVR; + if (TlastVR == 0) TlastVR = TJD_INVALID; /*"#NA!" */ + if (TbVR == 0) TbVR = TJD_INVALID; /*"#NA!" */ + if (TfirstVR == 0) TfirstVR = TJD_INVALID; /*"#NA!" */ +output_heliacal_pheno: + /*End If*/ + darr[0] = AltO; + darr[1] = AppAltO; + darr[2] = GeoAltO; + darr[3] = AziO; + darr[4] = AltS; + darr[5] = AziS; + darr[6] = TAVact; + darr[7] = ARCVact; + darr[8] = DAZact; + darr[9] = ARCLact; + darr[10] = kact; + darr[11] = MinTAV; + darr[12] = TfirstVR; + darr[13] = TbVR; + darr[14] = TlastVR; + darr[15] = TbYallop; + darr[16] = WMoon; + darr[17] = qYal; + darr[18] = qCrit; + darr[19] = ParO; + darr[20] = MagnO; + darr[21] = RiseSetO; + darr[22] = RiseSetS; + darr[23] = Lag; + darr[24] = TvisVR; + darr[25] = LMoon; + darr[26] = elong; + darr[27] = illum; + return OK; +} + +#if 0 +int32 FAR PASCAL_CONV HeliacalJDut(double JDNDaysUTStart, double Age, double SN, double Lat, double Longitude, double HeightEye, double Temperature, double Pressure, double RH, double VR, char *ObjectName, int TypeEvent, char *AVkind, double *dret, char *serr) +{ + double dgeo[3], datm[4], dobs[6]; + int32 helflag = SE_HELFLAG_HIGH_PRECISION; + helflag |= SE_HELFLAG_AVKIND_VR; + dgeo[0] = Longitude; + dgeo[1] = Lat; + dgeo[2] = HeightEye; + datm[0] = Pressure; + datm[1] = Temperature; + datm[2] = RH; + datm[3] = VR; + dobs[0] = Age; + dobs[1] = SN; + return swe_heliacal_ut(JDNDaysUTStart, dgeo, datm, dobs, ObjectName, TypeEvent, helflag, dret, serr); +} +#endif + +static double get_synodic_period(int Planet) +{ + /* synodic periods from: + * Kelley/Milone/Aveni, "Exploring ancient Skies", p. 43. */ + switch(Planet) { + case SE_MOON: return 29.530588853; + case SE_MERCURY: return 115.8775; + case SE_VENUS: return 583.9214; + case SE_MARS: return 779.9361; + case SE_JUPITER: return 398.8840; + case SE_SATURN: return 378.0919; + case SE_URANUS: return 369.6560; + case SE_NEPTUNE: return 367.4867; + case SE_PLUTO: return 366.7207; + } + return 366; /* for stars and default for far away planets */ +} + +/*###################################################################*/ +static int32 moon_event_arc_vis(double JDNDaysUTStart, double *dgeo, double *datm, double *dobs, int32 TypeEvent, int32 helflag, double *dret, char *serr) +{ + double x[20], MinTAV, MinTAVoud, OldestMinTAV; + double phase1, phase2, JDNDaysUT, JDNDaysUTi; + double tjd_moonevent, tjd_moonevent_start; + double DeltaAltoud, TimeCheck, LocalminCheck; + double AltS, AltO, DeltaAlt = 90; + char ObjectName[30]; + int32 iflag, Daystep, goingup, Planet, retval; + int32 avkind = helflag & SE_HELFLAG_AVKIND; + int32 epheflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + dret[0] = JDNDaysUTStart; /* will be returned in error case */ + if (avkind == 0) + avkind = SE_HELFLAG_AVKIND_VR; + if (avkind != SE_HELFLAG_AVKIND_VR) { + if (serr != NULL) + strcpy(serr, "error: in valid AV kind for the moon"); + return ERR; + } + if (TypeEvent == 1 || TypeEvent == 2) { + if (serr != NULL) + strcpy(serr, "error: the moon has no morning first or evening last"); + return ERR; + } + strcpy(ObjectName, "moon"); + Planet = SE_MOON; + iflag = SEFLG_TOPOCTR | SEFLG_EQUATORIAL | epheflag; + if (!(helflag & SE_HELFLAG_HIGH_PRECISION)) + iflag |= SEFLG_NONUT|SEFLG_TRUEPOS; + Daystep = 1; + if (TypeEvent == 3) { + /*morning last */ + TypeEvent = 2; + } else { + /*evening first*/ + TypeEvent = 1; + Daystep = -Daystep; + } + /* check Synodic/phase Period */ + JDNDaysUT = JDNDaysUTStart; + /* start 30 days later if TypeEvent=4 (1) */ + if (TypeEvent == 1) JDNDaysUT = JDNDaysUT + 30; + /* determination of new moon date */ + swe_pheno_ut(JDNDaysUT, Planet, iflag, x, serr); + phase2 = x[0]; + goingup = 0; + do { + JDNDaysUT = JDNDaysUT + Daystep; + phase1 = phase2; + swe_pheno_ut(JDNDaysUT, Planet, iflag, x, serr); + phase2 = x[0]; + if (phase2 > phase1) + goingup = 1; + } while (goingup == 0 || (goingup == 1 && (phase2 > phase1))); + /* fix the date to get the day with the smallest phase (nwest moon) */ + JDNDaysUT = JDNDaysUT - Daystep; + /* initialize the date to look for set */ + JDNDaysUTi = JDNDaysUT; + JDNDaysUT = JDNDaysUT - Daystep; + MinTAVoud = 199; + do { + JDNDaysUT = JDNDaysUT + Daystep; + if ((retval = RiseSet(JDNDaysUT, dgeo, datm, ObjectName, TypeEvent, helflag, 0, &tjd_moonevent, serr)) != OK) + return retval; + tjd_moonevent_start = tjd_moonevent; + MinTAV = 199; + OldestMinTAV = MinTAV; + do { + OldestMinTAV = MinTAVoud; + MinTAVoud = MinTAV; + DeltaAltoud = DeltaAlt; + tjd_moonevent = tjd_moonevent - 1.0 / 60.0 / 24.0 * Sgn(Daystep); + if (ObjectLoc(tjd_moonevent, dgeo, datm, "sun", 0, helflag, &AltS, serr) == ERR) + return ERR; + if (ObjectLoc(tjd_moonevent, dgeo, datm, ObjectName, 0, helflag, &AltO, serr) == ERR) + return ERR; + DeltaAlt = AltO - AltS; + if (DeterTAV(dobs, tjd_moonevent, dgeo, datm, ObjectName, helflag, &MinTAV, serr) == ERR) + return ERR; + TimeCheck = tjd_moonevent - LocalMinStep / 60.0 / 24.0 * Sgn(Daystep); + if (DeterTAV(dobs, TimeCheck, dgeo, datm, ObjectName, helflag, &LocalminCheck, serr) == ERR) + return ERR; +/*printf("%f, %f <= %f\n", tjd_moonevent, MinTAV, MinTAVoud);*/ + /* while (MinTAV <= MinTAVoud && fabs(tjd_moonevent - tjd_moonevent_start) < 120.0 / 60.0 / 24.0);*/ + } while ((MinTAV <= MinTAVoud || LocalminCheck < MinTAV) && fabs(tjd_moonevent - tjd_moonevent_start) < 120.0 / 60.0 / 24.0); + /* while (DeltaAlt < MinTAVoud && fabs(JDNDaysUT - JDNDaysUTi) < 15);*/ + } while (DeltaAltoud < MinTAVoud && fabs(JDNDaysUT - JDNDaysUTi) < 15); + if (fabs(JDNDaysUT - JDNDaysUTi) < 15) { + tjd_moonevent += (1 - x2min(MinTAV, MinTAVoud, OldestMinTAV)) * Sgn(Daystep) / 60.0 / 24.0; + } else { + strcpy(serr, "no date found for lunar event"); + return ERR; + } + dret[0] = tjd_moonevent; + return OK; +} + +static int32 heliacal_ut_arc_vis(double JDNDaysUTStart, double *dgeo, double *datm, double *dobs, char *ObjectName, int32 TypeEventIn, int32 helflag, double *dret, char *serr_ret) +{ + double x[6]; + double xin[2]; + double xaz[2]; + double dang[3]; + double objectmagn = 0, maxlength, DayStep; + double JDNDaysUT, JDNDaysUTfinal, JDNDaysUTstep, JDNDaysUTstepoud, JDNarcvisUT, tjd_tt, tret, OudeDatum, JDNDaysUTinp = JDNDaysUTStart, JDNDaysUTtijd; + double ArcusVis, ArcusVisDelta, ArcusVisPto, ArcusVisDeltaoud; + double Trise, sunsangle, Theliacal, Tdelta, Angle; + double TimeStep, TimePointer, OldestMinTAV, MinTAVoud, MinTAVact, extrax, TbVR = 0; + double AziS, AltS, AziO, AltO, DeltaAlt; + double direct, Pressure, Temperature, d; + int32 epheflag, retval = OK; + int32 iflag, Planet, eventtype; + int32 TypeEvent = TypeEventIn; + int doneoneday; + char serr[AS_MAXCH]; + *dret = JDNDaysUTStart; + *serr = '\0'; + Planet = DeterObject(ObjectName); + Pressure = datm[0]; + Temperature = datm[1]; + /* determine Magnitude of star*/ + if ((retval = Magnitude(JDNDaysUTStart, dgeo, ObjectName, helflag, &objectmagn, serr)) == ERR) + goto swe_heliacal_err; + epheflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + iflag = SEFLG_TOPOCTR | SEFLG_EQUATORIAL | epheflag; + if (!(helflag & SE_HELFLAG_HIGH_PRECISION)) + iflag |= SEFLG_NONUT | SEFLG_TRUEPOS; + /* start values for search of heliacal rise + * maxlength = phase period in days, smaller than minimal synodic period */ + /* days per step (for heliacal rise) in power of two */ + switch(Planet) { + case SE_MERCURY: + DayStep = 1; maxlength = 100; break; + case SE_VENUS: + DayStep = 64; maxlength = 384; break; + case SE_MARS: + DayStep = 128; maxlength = 640; break; + case SE_JUPITER: + DayStep = 64; maxlength = 384; break; + case SE_SATURN: + DayStep = 64; maxlength = 256; break; + default: + DayStep = 64; maxlength = 256; break; + } + /* heliacal setting */ + eventtype = TypeEvent; + if (eventtype == 2) DayStep = -DayStep; + /* acronychal setting */ + if (eventtype == 4) { + eventtype = 1; + DayStep = -DayStep; + } + /* acronychal rising */ + if (eventtype == 3) eventtype = 2; + eventtype |= SE_BIT_DISC_CENTER; + /* normalize the maxlength to the step size */ + { + /* check each Synodic/phase Period */ + JDNDaysUT = JDNDaysUTStart; + /* make sure one can find an event on the just after the JDNDaysUTStart */ + JDNDaysUTfinal = JDNDaysUT + maxlength; + JDNDaysUT = JDNDaysUT - 1; + if (DayStep < 0) { + JDNDaysUTtijd = JDNDaysUT; + JDNDaysUT = JDNDaysUTfinal; + JDNDaysUTfinal = JDNDaysUTtijd; + } + /* prepair the search */ + JDNDaysUTstep = JDNDaysUT - DayStep; + doneoneday = 0; + ArcusVisDelta = 199; + ArcusVisPto = -5.55; + do { /* this is a do {} while() loop */ + if (fabs(DayStep) == 1) doneoneday = 1; + do { /* this is a do {} while() loop */ + /* init search for heliacal rise */ + JDNDaysUTstepoud = JDNDaysUTstep; + ArcusVisDeltaoud = ArcusVisDelta; + JDNDaysUTstep = JDNDaysUTstep + DayStep; + /* determine rise/set time */ + if ((retval = my_rise_trans(JDNDaysUTstep, SE_SUN, "", eventtype, helflag, dgeo, datm, &tret, serr)) == ERR) + goto swe_heliacal_err; + /* determine time compensation to get Sun's altitude at heliacal rise */ + tjd_tt = tret + DeltaT(tret, 0) / D2S; + if ((retval = swe_calc(tjd_tt, SE_SUN, iflag, x, serr)) == ERR) + goto swe_heliacal_err; + xin[0] = x[0]; + xin[1] = x[1]; + swe_azalt(tret, SE_EQU2HOR, dgeo, Pressure, Temperature, xin, xaz); + Trise = HourAngle(xaz[1], x[1], dgeo[1]); + sunsangle = ArcusVisPto; + if (helflag & SE_HELFLAG_AVKIND_MIN7) sunsangle = -7; + if (helflag & SE_HELFLAG_AVKIND_MIN9) sunsangle = -9; + Theliacal = HourAngle(sunsangle, x[1], dgeo[1]); + Tdelta = Theliacal - Trise; + if (TypeEvent == 2 || TypeEvent== 3) Tdelta = -Tdelta; + /* determine appr.time when sun is at the wanted Sun's altitude */ + JDNarcvisUT = tret - Tdelta / 24; + tjd_tt = JDNarcvisUT + DeltaT(JDNarcvisUT, 0) / D2S; + /* determine Sun's position */ + if ((retval = swe_calc(tjd_tt, SE_SUN, iflag, x, serr)) == ERR) + goto swe_heliacal_err; + xin[0] = x[0]; + xin[1] = x[1]; + swe_azalt(JDNarcvisUT, SE_EQU2HOR, dgeo, Pressure, Temperature, xin, xaz); + AziS = xaz[0] + 180; + if (AziS >= 360) AziS = AziS - 360; + AltS = xaz[1]; + /* determine Moon's position */ +#if 0 + double AltM, AziM; + if ((retval = swe_calc(tjd_tt, SE_MOON, iflag, x, serr)) == ERR) + goto swe_heliacal_err; + xin[0] = x[0]; + xin[1] = x[1]; + swe_azalt(JDNarcvisUT, SE_EQU2HOR, dgeo, Pressure, Temperature, xin, xaz); + AziM = xaz[0] + 180; + if (AziM >= 360) AziM = AziM - 360; + AltM = xaz[1]; +#endif + /* determine object's position */ + if (Planet != -1) { + if ((retval = swe_calc(tjd_tt, Planet, iflag, x, serr)) == ERR) + goto swe_heliacal_err; + /* determine magnitude of Planet */ + if ((retval = Magnitude(JDNarcvisUT, dgeo, ObjectName, helflag, &objectmagn, serr)) == ERR) + goto swe_heliacal_err; + } else { + if ((retval = call_swe_fixstar(ObjectName, tjd_tt, iflag, x, serr)) == ERR) + goto swe_heliacal_err; + } + xin[0] = x[0]; + xin[1] = x[1]; + swe_azalt(JDNarcvisUT, SE_EQU2HOR, dgeo, Pressure, Temperature, xin, xaz); + AziO = xaz[0] + 180; + if (AziO >= 360) AziO = AziO - 360; + AltO = xaz[1]; + /* determine arcusvisionis */ + DeltaAlt = AltO - AltS; + /*if ((retval = HeliacalAngle(objectmagn, dobs, AziO, AltM, AziM, JDNarcvisUT, AziS, dgeo, datm, helflag, dang, serr)) == ERR)*/ + if ((retval = HeliacalAngle(objectmagn, dobs, AziO, -1, 0, JDNarcvisUT, AziS, dgeo, datm, helflag, dang, serr)) == ERR) + goto swe_heliacal_err; + ArcusVis = dang[1]; + ArcusVisPto = dang[2]; + ArcusVisDelta = DeltaAlt - ArcusVis; + /*} while (((ArcusVisDeltaoud > 0 && ArcusVisDelta < 0) || ArcusVisDelta < 0) && (JDNDaysUTfinal - JDNDaysUTstep) * Sgn(DayStep) > 0);*/ + } while ((ArcusVisDeltaoud > 0 || ArcusVisDelta < 0) && (JDNDaysUTfinal - JDNDaysUTstep) * Sgn(DayStep) > 0); + if (doneoneday == 0 && (JDNDaysUTfinal - JDNDaysUTstep) * Sgn(DayStep) > 0) { + /* go back to date before heliacal altitude */ + ArcusVisDelta = ArcusVisDeltaoud; + DayStep = ((int) (fabs(DayStep) / 2.0)) * Sgn(DayStep); + JDNDaysUTstep = JDNDaysUTstepoud; + } + } while (doneoneday == 0 && (JDNDaysUTfinal - JDNDaysUTstep) * Sgn(DayStep) > 0); + } + d = (JDNDaysUTfinal - JDNDaysUTstep) * Sgn(DayStep); + if (d <= 0 || d >= maxlength) { + dret[0] = JDNDaysUTinp; /* no date found, just return input */ + retval = -2; /* marks "not found" within synodic period */ + sprintf(serr, "heliacal event not found within maxlength %f\n", maxlength); + goto swe_heliacal_err; + } +#if 0 + if (helflag & SE_HELFLAG_AVKIND_VR) { + double darr[40]; + if (swe_heliacal_pheno_ut(JDNarcvisUT, dgeo, datm, dobs, ObjectName, TypeEvent, helflag, darr, serr) != OK) + return ERR; + JDNarcvisUT = darr[13]; + } + } +#endif + direct = TimeStepDefault / 24.0 / 60.0; + if (DayStep < 0) direct = -direct; + if (helflag & SE_HELFLAG_AVKIND_VR) { + /*te bepalen m.b.v. walkthrough*/ + TimeStep = direct; + TbVR = 0; + TimePointer = JDNarcvisUT; + if (DeterTAV(dobs, TimePointer, dgeo, datm, ObjectName, helflag, &OldestMinTAV, serr) == ERR) + return ERR; + TimePointer = TimePointer + TimeStep; + if (DeterTAV(dobs, TimePointer, dgeo, datm, ObjectName, helflag, &MinTAVoud, serr) == ERR) + return ERR; + if (MinTAVoud > OldestMinTAV) { + TimePointer = JDNarcvisUT; + TimeStep = -TimeStep; + MinTAVact = OldestMinTAV; + } else { + MinTAVact = MinTAVoud; + MinTAVoud = OldestMinTAV; + } + /*TimePointer = TimePointer - Timestep*/ + do { + TimePointer = TimePointer + TimeStep; + OldestMinTAV = MinTAVoud; + MinTAVoud = MinTAVact; + if (DeterTAV(dobs, TimePointer, dgeo, datm, ObjectName, helflag, &MinTAVact, serr) == ERR) + return ERR; + if (MinTAVoud < MinTAVact) { + extrax = x2min(MinTAVact, MinTAVoud, OldestMinTAV); + TbVR = TimePointer - (1 - extrax) * TimeStep; + } + } while (TbVR == 0); + JDNarcvisUT = TbVR; + } + /*if (strncmp(AVkind, "pto", 3) == 0) */ + if (helflag & SE_HELFLAG_AVKIND_PTO) { + do { + OudeDatum = JDNarcvisUT; + JDNarcvisUT = JDNarcvisUT - direct; + tjd_tt = JDNarcvisUT + DeltaT(JDNarcvisUT, 0) / D2S; + if (Planet != -1) { + if ((retval = swe_calc(tjd_tt, Planet, iflag, x, serr)) == ERR) + goto swe_heliacal_err; + } else { + if ((retval = call_swe_fixstar(ObjectName, tjd_tt, iflag, x, serr)) == ERR) + goto swe_heliacal_err; + } + xin[0] = x[0]; + xin[1] = x[1]; + swe_azalt(JDNarcvisUT, SE_EQU2HOR, dgeo, Pressure, Temperature, xin, xaz); + Angle = xaz[1]; + } while (Angle > 0); + JDNarcvisUT = (JDNarcvisUT + OudeDatum) / 2.0; + } + if (JDNarcvisUT < -9999999 || JDNarcvisUT > 9999999) { + dret[0] = JDNDaysUT; /* no date found, just return input */ + strcpy(serr, "no heliacal date found"); + retval = ERR; + goto swe_heliacal_err; + } + dret[0] = JDNarcvisUT; +swe_heliacal_err: + if (serr_ret != NULL && *serr != '\0') + strcpy(serr_ret, serr); + return retval; +} + +static int32 get_asc_obl(double tjd, int32 ipl, char *star, int32 iflag, double + *dgeo, AS_BOOL desc_obl, double *daop, char *serr) +{ + int32 retval; + int32 epheflag = iflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + double x[6], adp; + char s[AS_MAXCH]; + char star2[AS_MAXCH]; + strcpy(star2, star); + if (ipl == -1) { + if ((retval = swe_fixstar(star2, tjd, epheflag | SEFLG_EQUATORIAL, x, serr)) == ERR) + return ERR; + } else { + if ((retval = swe_calc(tjd, ipl, epheflag | SEFLG_EQUATORIAL, x, serr)) == ERR) + return ERR; + } + adp = tan(dgeo[1] * DEGTORAD) * tan(x[1] * DEGTORAD); + if (fabs(adp) > 1) { + if (star != NULL && *star != '\0') + strcpy(s, star); + else + swe_get_planet_name(ipl, s); + sprintf(serr, "%s is circumpolar, cannot calculate heliacal event", s); + return -2; + } + adp = asin(adp) / DEGTORAD; + if (desc_obl) + *daop = x[0] + adp; + else + *daop = x[0] - adp; + *daop = swe_degnorm(*daop); + return OK; +} + +#if 0 +static int32 get_asc_obl_old(double tjd, int32 ipl, char *star, int32 iflag, double *dgeo, AS_BOOL desc_obl, double *daop, char *serr) +{ + int32 retval; + int32 epheflag = iflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + double x[6], adp; + char s[AS_MAXCH]; + if (star != NULL && *star != '\0') { + if ((retval = call_swe_fixstar(star, tjd, epheflag | SEFLG_EQUATORIAL, x, serr)) == ERR) + return ERR; + } else { + if ((retval = swe_calc(tjd, ipl, epheflag | SEFLG_EQUATORIAL, x, serr)) == ERR) + return ERR; + } + adp = tan(dgeo[1] * DEGTORAD) * tan(x[1] * DEGTORAD); + if (fabs(adp) > 1) { + if (star != NULL && *star != '\0') + strcpy(s, star); + else + swe_get_planet_name(ipl, s); + sprintf(serr, "%s is circumpolar, cannot calculate heliacal event", s); + return -2; + } + adp = asin(adp) / DEGTORAD; + if (desc_obl) + *daop = x[0] + adp; + else + *daop = x[0] - adp; + *daop = swe_degnorm(*daop); + return OK; +} +#endif + +static int32 get_asc_obl_diff(double tjd, int32 ipl, char *star, int32 iflag, double *dgeo, AS_BOOL desc_obl, AS_BOOL is_acronychal, double *dsunpl, char *serr) +{ + int32 retval = OK; + double aosun, aopl; + /* ascensio obliqua of sun */ + retval = get_asc_obl(tjd, SE_SUN, "", iflag, dgeo, desc_obl, &aosun, serr); + if (retval != OK) + return retval; + if (is_acronychal) { + if (desc_obl == TRUE) + desc_obl = FALSE; + else + desc_obl = TRUE; + } + /* ascensio obliqua of body */ + retval = get_asc_obl(tjd, ipl, star, iflag, dgeo, desc_obl, &aopl, serr); + if (retval != OK) + return retval; + *dsunpl = swe_degnorm(aosun - aopl); + if (is_acronychal) + *dsunpl = swe_degnorm(*dsunpl - 180); + if (*dsunpl > 180) *dsunpl -= 360; + return OK; +} + +#if 0 +static int32 get_asc_obl_diff_old(double tjd, int32 ipl, char *star, int32 iflag, double *dgeo, AS_BOOL desc_obl, double *dsunpl, char *serr) +{ + int32 retval = OK; + double aosun, aopl; + /* ascensio obliqua of sun */ + retval = get_asc_obl(tjd, SE_SUN, "", iflag, dgeo, desc_obl, &aosun, serr); + if (retval != OK) + return retval; + /* ascensio obliqua of body */ + retval = get_asc_obl(tjd, ipl, star, iflag, dgeo, desc_obl, &aopl, serr); + if (retval != OK) + return retval; + *dsunpl = swe_degnorm(aosun - aopl); + return OK; +} +#endif + +/* times of + * - superior and inferior conjunction (Mercury and Venus) + * - conjunction and opposition (ipl >= Mars) + */ +static double tcon[] = +{ + 0, 0, + 2451550, 2451550, /* Moon */ + 2451604, 2451670, /* Mercury */ + 2451980, 2452280, /* Venus */ + 2451727, 2452074, /* Mars */ + 2451673, 2451877, /* Jupiter */ + 2451675, 2451868, /* Saturn */ + 2451581, 2451768, /* Uranus */ + 2451568, 2451753, /* Neptune */ +}; + +static int32 find_conjunct_sun(double tjd_start, int32 ipl, int32 helflag, int32 TypeEvent, double *tjd, char *serr) +{ + int32 epheflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + int i; + double tjdcon, tjd0, ds, dsynperiod, x[6], xs[6], daspect = 0; + if (ipl >= SE_MARS && TypeEvent >= 3) + daspect = 180; + i = (TypeEvent - 1) / 2 + ipl * 2; + tjd0 = tcon[i]; + dsynperiod = get_synodic_period(ipl); + tjdcon = tjd0 + ((floor) ((tjd_start - tjd0) / dsynperiod) + 1) * dsynperiod; + ds = 100; + while (ds > 0.5) { + if (swe_calc(tjdcon, ipl, epheflag|SEFLG_SPEED, x, serr) == ERR) + return ERR; + if (swe_calc(tjdcon, SE_SUN, epheflag|SEFLG_SPEED, xs, serr) == ERR) + return ERR; + ds = swe_degnorm(x[0] - xs[0] - daspect); + if (ds > 180) ds -= 360; + tjdcon -= ds / (x[3] - xs[3]); + } + *tjd = tjdcon; + return OK; +} + +static int32 get_asc_obl_with_sun(double tjd_start, int32 ipl, char *star, int32 helflag, int32 evtyp, double dperiod, double *dgeo, double *tjdret, char *serr) +{ + int i, retval; + int32 is_acronychal = FALSE; + int32 epheflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + double dsunpl = 1, dsunpl_save, dsunpl_test, tjd, daystep; + AS_BOOL desc_obl = FALSE, retro = FALSE; + if (evtyp == SE_EVENING_LAST || evtyp == SE_EVENING_FIRST) + desc_obl = TRUE; + if (evtyp == SE_MORNING_FIRST || evtyp == SE_EVENING_LAST) + retro = TRUE; + if (evtyp == SE_ACRONYCHAL_RISING) + desc_obl = TRUE; + if (evtyp == SE_ACRONYCHAL_RISING || evtyp == SE_ACRONYCHAL_SETTING) { + is_acronychal = TRUE; + if (ipl != SE_MOON) + retro = TRUE; + } + // if (evtyp == 3 || evtyp == 4) + // dangsearch = 180; + /* find date when sun and object have the same ascensio obliqua */ + tjd = tjd_start; + dsunpl_save = -999999999; + retval = get_asc_obl_diff(tjd, ipl, star, epheflag, dgeo, desc_obl, is_acronychal, &dsunpl, serr); + if (retval != OK) /* retval may be ERR or -2 */ + return retval; + daystep = 20; + i = 0; + while (dsunpl_save == -999999999 || + /*fabs(dsunpl - dsunpl_save) > 180 ||*/ + fabs(dsunpl) + fabs(dsunpl_save) > 180 || + (retro && !(dsunpl_save < 0 && dsunpl >= 0)) || + (!retro && !(dsunpl_save >= 0 && dsunpl < 0))) { + i++; + if (i > 5000) { + sprintf(serr, "loop in get_asc_obl_with_sun() (1)"); + return ERR; + } + dsunpl_save = dsunpl; + tjd += 10.0; + if (dperiod > 0 && tjd - tjd_start > dperiod) + return -2; + retval = get_asc_obl_diff(tjd, ipl, star, epheflag, dgeo, desc_obl, is_acronychal, &dsunpl, serr); + if (retval != OK) /* retval may be ERR or -2 */ + return retval; + } + tjd_start = tjd - daystep; + daystep /= 2.0; + tjd = tjd_start + daystep; + retval = get_asc_obl_diff(tjd, ipl, star, epheflag, dgeo, desc_obl, is_acronychal, &dsunpl_test, serr); + if (retval != OK) /* retval may be ERR or -2 */ + return retval; + i = 0; + while (fabs(dsunpl) > 0.00001) { + i++; + if (i > 5000) { + sprintf(serr, "loop in get_asc_obl_with_sun() (2)"); + return ERR; + } + if (dsunpl_save * dsunpl_test >= 0) { + dsunpl_save = dsunpl_test; + tjd_start = tjd; + } else { + dsunpl = dsunpl_test; + } + daystep /= 2.0; + tjd = tjd_start + daystep; + retval = get_asc_obl_diff(tjd, ipl, star, epheflag, dgeo, desc_obl, is_acronychal, &dsunpl_test, serr); + if (retval != OK) /* retval may be ERR or -2 */ + return retval; + } + *tjdret = tjd; + return OK; +} + +#if 0 +/* works only for fixed stars */ +static int32 get_asc_obl_with_sun_old(double tjd_start, int32 ipl, char *star, int32 helflag, int32 TypeEvent, double *dgeo, double *tjdret, char *serr) +{ + int retval; + int32 epheflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + double dsunpl = 1, tjd, daystep, dsunpl_save; + double dsynperiod = 367; + double dangsearch = 0; + AS_BOOL desc_obl = FALSE; + if (TypeEvent == 2 || TypeEvent == 3) + desc_obl = TRUE; + if (TypeEvent == 3 || TypeEvent == 4) + dangsearch = 180; + /* find date when sun and object have the same ascensio obliqua */ + daystep = dsynperiod; + tjd = tjd_start; + retval = get_asc_obl_diff(tjd, ipl, star, epheflag, dgeo, desc_obl, &dsunpl, serr); + if (retval != OK) /* retval may be ERR or -2 */ + return retval; + while (dsunpl < 359.99999) { + dsunpl_save = dsunpl; + daystep /= 2.0; + retval = get_asc_obl_diff(tjd + daystep, ipl, star, epheflag, dgeo, desc_obl, &dsunpl, serr); + if (retval != OK) /* retval may be ERR or -2 */ + return retval; + if (dsunpl > dsunpl_save) + tjd += daystep; + else + dsunpl = dsunpl_save; + } + *tjdret = tjd; + return OK; +} +#endif + +#if 0 +/* works only for fixed stars */ +static int32 get_asc_obl_acronychal(double tjd_start, int32 ipl, char *star, int32 helflag, int32 TypeEvent, double *dgeo, double *tjdret, char *serr) +{ + int retval; + int32 epheflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + double dsunpl = 1, tjd, daystep, dsunpl_save; + double dsynperiod = 367; + double aosun, aopl; + AS_BOOL sun_desc = TRUE, obj_desc = FALSE; + daystep = dsynperiod; + tjd = tjd_start; + if (TypeEvent == 4) { + sun_desc = FALSE; + obj_desc = TRUE; + } + /* ascensio (descensio) obliqua of sun */ + retval = get_asc_obl(tjd, SE_SUN, "", epheflag, dgeo, sun_desc, &aosun, serr); + if (retval != OK) /* retval may be ERR or -2 */ + return retval; + /* ascensio (descensio) obliqua of body */ + retval = get_asc_obl(tjd, ipl, star, epheflag, dgeo, obj_desc, &aopl, serr); + if (retval != OK) /* retval may be ERR or -2 */ + return retval; + dsunpl = swe_degnorm(aosun - aopl + 180); + while (dsunpl < 359.99999) { + dsunpl_save = dsunpl; + daystep /= 2.0; + /* ascensio (descensio) obliqua of sun */ + retval = get_asc_obl(tjd+daystep, SE_SUN, "", epheflag, dgeo, sun_desc, &aosun, serr); + if (retval != OK) /* retval may be ERR or -2 */ + return retval; + /* ascensio (descensio) obliqua of body */ + retval = get_asc_obl(tjd+daystep, ipl, star, epheflag, dgeo, obj_desc, &aopl, serr); + if (retval != OK) /* retval may be ERR or -2 */ + return retval; + dsunpl = swe_degnorm(aosun - aopl + 180); + if (dsunpl > dsunpl_save) + tjd += daystep; + else + dsunpl = dsunpl_save; + } + *tjdret = tjd; + return OK; +} +#endif + +static int32 get_heliacal_day(double tjd, double *dgeo, double *datm, double *dobs, char *ObjectName, int32 helflag, int32 TypeEvent, double *thel, char *serr) +{ + int32 is_rise_or_set = 0, ndays, retval, retval_old; + double direct_day = 0, direct_time = 0, tfac, tend, daystep, tday, vdelta, tret; + double darr[30], vd, dmag; + int32 ipl = DeterObject(ObjectName); + /* + * find the day and minute on which the object becomes visible + */ + switch (TypeEvent) { + /* morning first */ + case 1: is_rise_or_set = SE_CALC_RISE; + direct_day = 1; direct_time = -1; + break; + /* evening last */ + case 2: is_rise_or_set = SE_CALC_SET; + direct_day = -1; direct_time = 1; + break; + /* evening first */ + case 3: is_rise_or_set = SE_CALC_SET; + direct_day = 1; direct_time = 1; + break; + /* morning last */ + case 4: is_rise_or_set = SE_CALC_RISE; + direct_day = -1; direct_time = -1; + break; + } + tfac = 1; + switch (ipl) { + case SE_MOON: + ndays = 6; + daystep = 1; + break; + case SE_MERCURY: + ndays = 60; tjd -= 0 * direct_day; + daystep = 5; + tfac = 5; + break; + case SE_VENUS: + ndays = 300; tjd -= 30 * direct_day; + daystep = 5; + if (TypeEvent >= 3) { + daystep = 15; + tfac = 3; + } + break; + case SE_MARS: + ndays = 400; + daystep = 15; + tfac = 5; + break; + case SE_SATURN: + ndays = 300; + daystep = 20; + tfac = 5; + break; + case -1: + ndays = 300; + if (call_swe_fixstar_mag(ObjectName, &dmag, serr) == ERR) + return ERR; + daystep = 15; + tfac = 10; + if (dmag > 2) { + daystep = 15; + } + if (dmag < 0) { + tfac = 3; + } + break; + default: + ndays = 300; + daystep = 15; + tfac = 3; + break; + } + tend = tjd + ndays * direct_day; + retval_old = -2; + for (tday = tjd; + (direct_day > 0 && tday < tend) || (direct_day < 0 && tday > tend); + tday += daystep * direct_day) { + vdelta = -100; + if ((retval = my_rise_trans(tday, SE_SUN, "", is_rise_or_set, helflag, dgeo, datm, &tret, serr)) == ERR) + return ERR; + /* sun does not rise: try next day */ + if (retval == -2) { + retval_old = retval; + continue; + } + retval = swe_vis_limit_mag(tret, dgeo, datm, dobs, ObjectName, helflag, darr, serr); + if (retval == ERR) + return ERR; +#if 1 + /* object has appeared above horizon: reduce daystep */ + if (retval_old == -2 && retval >= 0 && daystep > 1) { + retval_old = retval; + tday -= daystep * direct_day; + daystep = 1; + /* Note: beyond latitude 55N (?), Mars can have a morning last. + * If the period of visibility is less than 5 days, we may miss the + * event. I don't know if this happens */ + if (ipl >= SE_MARS || ipl == -1) + daystep = 5; + continue; + } + retval_old = retval; +#endif + /* object below horizon: try next day */ + if (retval == -2) + continue; + vdelta = darr[0] - darr[7]; + /* find minute of object's becoming visible */ + while (retval != -2 && (vd = darr[0] - darr[7]) < 0) { + if (vd < -1.0) + tret += 5.0 / 1440.0 * direct_time * tfac; + else if (vd < -0.5) + tret += 2.0 / 1440.0 * direct_time * tfac; + else if (vd < -0.1) + tret += 1.0 / 1440.0 * direct_time * tfac; + else + tret += 1.0 / 1440.0 * direct_time; + retval = swe_vis_limit_mag(tret, dgeo, datm, dobs, ObjectName, helflag, darr, serr); + if (retval == ERR) + return ERR; + } + vdelta = darr[0] - darr[7]; + /* object is visible, save time of appearance */ + if (vdelta > 0) { + if ((ipl >= SE_MARS || ipl == -1) && daystep > 1) { + tday -= daystep * direct_day; + daystep = 1; + } else { + *thel = tret; + return OK; + } + } + } + sprintf(serr, "heliacal event does not happen"); + return -2; +} + +#if 0 +static int32 get_acronychal_day_new(double tjd, double *dgeo, double *datm, double *dobs, char *ObjectName, int32 helflag, int32 TypeEvent, double *thel, char *serr) { + double tjdc = tjd, tret, x[6], xaz[6], AltO = -10; + int32 retval, is_rise_or_set, iter_day; + int32 ipl = DeterObject(ObjectName); + int32 epheflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + int32 iflag = epheflag | SEFLG_EQUATORIAL | SEFLG_TOPOCTR; + if ((retval = my_rise_trans(tret, 0, ObjectName, SE_CALC_RISE, helflag, dgeo, datm, &tret, serr)) == ERR) return ERR; + trise = tret; + tret += 0.01 + if ((retval = my_rise_trans(tret, 0, ObjectName, SE_CALC_SET, helflag, dgeo, datm, &tret, serr)) == ERR) return ERR; + trise = tset; + + *thel = tret; + return OK; +} +#endif + +#if 0 +static int32 get_acronychal_day_old(double tjd, double *dgeo, double *datm, double *dobs, char *ObjectName, int32 helflag, int32 TypeEvent, double *thel, char *serr) { + double tjdc = tjd, tret, x[6], xaz[6], AltO = -10; + int32 retval, is_rise_or_set, iter_day; + int32 ipl = DeterObject(ObjectName); + int32 epheflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + int32 iflag = epheflag | SEFLG_EQUATORIAL | SEFLG_TOPOCTR; + if (TypeEvent == 3) { + is_rise_or_set = SE_CALC_SET; + tret = tjdc - 3; + if (ipl >= SE_MARS) + tret = tjdc - 3; + iter_day = 1; + } else { + is_rise_or_set = SE_CALC_RISE; + tret = tjdc + 3; + if (ipl >= SE_MARS) + tret = tjdc + 3; + iter_day = -1; + } + while (AltO < 0) { + tret += 0.3 * iter_day; + if (iter_day == -1) + tret -= 1; + retval = my_rise_trans(tret, SE_SUN, "", is_rise_or_set, helflag, dgeo, datm, &tret, serr); + if (retval != OK) + return retval; + /* determine object's position */ + if (ipl == -1) + retval = call_swe_fixstar(ObjectName, tret+swe_deltat(tret), iflag, x, serr); + else + retval = swe_calc(tret+swe_deltat(tret), ipl, iflag, x, serr); + if (retval == ERR) return ERR; + swe_azalt(tret, SE_EQU2HOR, dgeo, datm[0], datm[1], x, xaz); + AltO = xaz[2]; + } + *thel = tret; + return OK; +} +#endif + +static int32 time_optimum_visibility(double tjd, double *dgeo, double *datm, double *dobs, char *ObjectName, int32 helflag, double *tret, char *serr) +{ + int32 retval, retval_sv, i; + double d, vl, darr[10], phot_scot_opic, phot_scot_opic_sv; + *tret = tjd; + retval = swe_vis_limit_mag(tjd, dgeo, datm, dobs, ObjectName, helflag, darr, serr); + if (retval == ERR) return ERR; + retval_sv = retval; + vl = darr[0] - darr[7]; + phot_scot_opic_sv = retval & SE_SCOTOPIC_FLAG; + for (i = 0, d = 100.0 / 86400.0; i < 3; i++, d /= 10.0) { + while((retval = swe_vis_limit_mag(tjd - d, dgeo, datm, dobs, ObjectName, helflag, darr, serr)) >= 0 + && darr[0] > darr[7] + && darr[0] - darr[7] > vl) { + tjd -= d; vl = darr[0] - darr[7]; + retval_sv = retval; + phot_scot_opic_sv = retval & SE_SCOTOPIC_FLAG; + /* printf("1: %f\n", darr[8]);*/ + } + if (retval == ERR) return ERR; + while((retval = swe_vis_limit_mag(tjd + d, dgeo, datm, dobs, ObjectName, helflag, darr, serr)) >= 0 + && darr[0] > darr[7] + && darr[0] - darr[7] > vl) { + tjd += d; vl = darr[0] - darr[7]; + retval_sv = retval; + phot_scot_opic_sv = retval & SE_SCOTOPIC_FLAG; + /* printf("2: %f\n", darr[8]);*/ + } + if (retval == ERR) return ERR; + } + /* printf("3: %f <-> %f\n", darr[8], phot_scot_opic_sv);*/ + *tret = tjd; + if (retval >= 0) { + /* search for optimum came to an end because change scotopic/photopic: */ + phot_scot_opic = (retval & SE_SCOTOPIC_FLAG); + if (phot_scot_opic_sv != phot_scot_opic) { + /* calling function writes warning into serr */ + return -2; + } + /* valid result found but it is close to the scotopic/photopic limit */ + if (retval_sv & SE_MIXEDOPIC_FLAG) { + return -2; + } + } + return OK; +} + +static int32 time_limit_invisible(double tjd, double *dgeo, double *datm, double *dobs, char *ObjectName, int32 helflag, int32 direct, double *tret, char *serr) +{ + int32 retval, retval_sv, i, ncnt = 3; + double d = 0, darr[10], phot_scot_opic, phot_scot_opic_sv; + double d0 = 100.0 / 86400.0; + *tret = tjd; + if (strcmp(ObjectName, "moon") == 0) { + d0 *= 10; + ncnt = 4; + } + retval = swe_vis_limit_mag(tjd + d * direct, dgeo, datm, dobs, ObjectName, helflag, darr, serr); + if (retval == ERR) return ERR; + retval_sv = retval; + phot_scot_opic_sv = retval & SE_SCOTOPIC_FLAG; + for (i = 0, d = d0; i < ncnt; i++, d /= 10.0) { + while((retval = swe_vis_limit_mag(tjd + d * direct, dgeo, datm, dobs, ObjectName, helflag, darr, serr)) >= 0 + && darr[0] > darr[7]) { + tjd += d * direct; + retval_sv = retval; + phot_scot_opic_sv = retval & SE_SCOTOPIC_FLAG; + /* printf("%d: %f\n", direct, darr[8]); */ + } + } + /* printf("4: %f, %f/%f %f <-> %f\n", darr[8], darr[0], darr[7], tjd, phot_scot_opic_sv); */ + *tret = tjd; + /* if object disappears at setting, retval is -2, but we want it OK, and + * also suppress the warning "object is below local horizon" */ + *serr = '\0'; + if (retval >= 0) { + /* search for limit came to an end because change scotopic/photopic: */ + phot_scot_opic = (retval & SE_SCOTOPIC_FLAG); + if (phot_scot_opic_sv != phot_scot_opic) { + /* calling function writes warning into serr */ + return -2; + } + /* valid result found but it is close to the scotopic/photopic limit */ + if (retval_sv & SE_MIXEDOPIC_FLAG) { + return -2; + } + } + return OK; +} + +static int32 get_acronychal_day(double tjd, double *dgeo, double *datm, double *dobs, char *ObjectName, int32 helflag, int32 TypeEvent, double *thel, char *serr) { + double tret, tret_dark, darr[30], dtret; + /* x[6], xaz[6], alto, azio, alto_dark, azio_dark;*/ + int32 retval, is_rise_or_set, direct; + int32 ipl = DeterObject(ObjectName); + helflag |= SE_HELFLAG_VISLIM_PHOTOPIC; + /*int32 epheflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH);*/ + /* int32 iflag = epheflag | SEFLG_EQUATORIAL | SEFLG_TOPOCTR;*/ + if (TypeEvent == 3 || TypeEvent == 5) { + is_rise_or_set = SE_CALC_RISE; + /* tret = tjdc - 3; + if (ipl >= SE_MARS) + tret = tjdc - 3;*/ + direct = -1; + } else { + is_rise_or_set = SE_CALC_SET; + /*tret = tjdc + 3; + if (ipl >= SE_MARS) + tret = tjdc + 3;*/ + direct = 1; + } + dtret = 999; +#if 0 + while (fabs(dtret) > 0.5) { +#else + while (fabs(dtret) > 0.5 / 1440.0) { +#endif + tjd += 0.7 * direct; + if (direct < 0) tjd -= 1; + retval = my_rise_trans(tjd, ipl, ObjectName, is_rise_or_set, helflag, dgeo, datm, &tjd, serr); + if (retval == ERR) return ERR; + retval = swe_vis_limit_mag(tjd, dgeo, datm, dobs, ObjectName, helflag, darr, serr); + while(darr[0] < darr[7]) { + tjd += 10.0 / 1440.0 * -direct; + retval = swe_vis_limit_mag(tjd, dgeo, datm, dobs, ObjectName, helflag, darr, serr); + } + retval = time_limit_invisible(tjd, dgeo, datm, dobs, ObjectName, helflag | SE_HELFLAG_VISLIM_DARK, direct, &tret_dark, serr); + if (retval == ERR) return ERR; + retval = time_limit_invisible(tjd, dgeo, datm, dobs, ObjectName, helflag | SE_HELFLAG_VISLIM_NOMOON, direct, &tret, serr); + if (retval == ERR) return ERR; +#if 0 + if (azalt_cart(tret_dark, dgeo, datm, ObjectName, helflag, darr, serr) == ERR) + return ERR; + if (azalt_cart(tret, dgeo, datm, ObjectName, helflag, darr+6, serr) == ERR) + return ERR; + dtret = acos(swi_dot_prod_unit(darr+3, darr+9)) / DEGTORAD; +#else + dtret = fabs(tret - tret_dark); +#endif + } + if (azalt_cart(tret, dgeo, datm, "sun", helflag, darr, serr) == ERR) + return ERR; + *thel = tret; + if (darr[1] < -12) { + sprintf(serr, "acronychal rising/setting not available, %f", darr[1]); + return OK; + } else { + sprintf(serr, "solar altitude, %f", darr[1]); + } + return OK; +} + +static int32 get_heliacal_details(double tday, double *dgeo, double *datm, double *dobs, char *ObjectName, int32 TypeEvent, int32 helflag, double *dret, char *serr) +{ + int32 i, retval, direct; + AS_BOOL optimum_undefined, limit_1_undefined, limit_2_undefined; + /* find next optimum visibility */ + optimum_undefined = FALSE; + retval = time_optimum_visibility(tday, dgeo, datm, dobs, ObjectName, helflag, &(dret[1]), serr); + if (retval == ERR) return ERR; + if (retval == -2) { + retval = OK; + optimum_undefined = TRUE; /* change photopic <-> scotopic vision */ + } + /* find moment of becoming visible */ + direct = 1; + if (TypeEvent == 1 || TypeEvent == 4) + direct = -1; + limit_1_undefined = FALSE; + retval = time_limit_invisible(tday, dgeo, datm, dobs, ObjectName, helflag, direct, &(dret[0]), serr); + if (retval == ERR) return ERR; + if (retval == -2) { + retval = OK; + limit_1_undefined = TRUE; /* change photopic <-> scotopic vision */ + } + /* find moment of end of visibility */ + direct *= -1; + limit_2_undefined = FALSE; + retval = time_limit_invisible(dret[1], dgeo, datm, dobs, ObjectName, helflag, direct, &(dret[2]), serr); + if (retval == ERR) return ERR; + if (retval == -2) { + retval = OK; + limit_2_undefined = TRUE; /* change photopic <-> scotopic vision */ + } + /* correct sequence of times: + * with event types 2 and 3 swap dret[0] and dret[2] */ + if (TypeEvent == 2 || TypeEvent == 3) { + tday = dret[2]; + dret[2] = dret[0]; + dret[0] = tday; + i = (int) limit_1_undefined; + limit_1_undefined = limit_2_undefined; + limit_2_undefined = (AS_BOOL) i; + } + /*if (retval == OK && dret[0] == dret[1]) */ + if (optimum_undefined || limit_1_undefined || limit_2_undefined) { + sprintf(serr, "return values ["); + if (limit_1_undefined) + strcat(serr, "0,"); + if (optimum_undefined) + strcat(serr, "1,"); + if (limit_2_undefined) + strcat(serr, "2,"); + strcat(serr, "] are uncertain due to change between photopic and scotopic vision"); + } + return OK; +} + +static int32 heliacal_ut_vis_lim(double tjd_start, double *dgeo, double *datm, double *dobs, char *ObjectName, int32 TypeEventIn, int32 helflag, double *dret, char *serr_ret) +{ + int i; + double d, darr[10], direct = 1, tjd, tday; + int32 epheflag, retval = OK, helflag2; + int32 iflag, ipl; + int32 TypeEvent = TypeEventIn; + char serr[AS_MAXCH]; + for (i = 0; i < 10; i++) + dret[i] = 0; + *dret = tjd_start; + *serr = '\0'; + ipl = DeterObject(ObjectName); + epheflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + iflag = SEFLG_TOPOCTR | SEFLG_EQUATORIAL | epheflag; + if (!(helflag & SE_HELFLAG_HIGH_PRECISION)) + iflag |= SEFLG_NONUT | SEFLG_TRUEPOS; + if (ipl == SE_MERCURY) + tjd = tjd_start - 30; + else + tjd = tjd_start - 50; /* -50 makes sure, that no event is missed, + * but may return an event before start date */ + helflag2 = helflag; + /*helflag2 &= ~SE_HELFLAG_HIGH_PRECISION;*/ + /* + * heliacal event + */ + if (ipl == SE_MERCURY || ipl == SE_VENUS || TypeEvent <= 2) { + if (ipl == -1) { + /* find date when star rises with sun (cosmic rising) */ + retval = get_asc_obl_with_sun(tjd, ipl, ObjectName, helflag, TypeEvent, 0, dgeo, &tjd, serr); + if (retval != OK) + goto swe_heliacal_err; /* retval may be -2 or ERR */ + } else { + /* find date of conjunction of object with sun */ + if ((retval = find_conjunct_sun(tjd, ipl, helflag, TypeEvent, &tjd, serr)) == ERR) + goto swe_heliacal_err; + } + /* find the day and minute on which the object becomes visible */ + retval = get_heliacal_day(tjd, dgeo, datm, dobs, ObjectName, helflag2, TypeEvent, &tday, serr); + if (retval != OK) + goto swe_heliacal_err; + /* + * acronychal event + */ + } else { + if (1 || ipl == -1) { + /*retval = get_asc_obl_acronychal(tjd, ipl, ObjectName, helflag2, TypeEvent, dgeo, &tjd, serr);*/ + retval = get_asc_obl_with_sun(tjd, ipl, ObjectName, helflag, TypeEvent, 0, dgeo, &tjd, serr); + if (retval != OK) + goto swe_heliacal_err; + } else { + /* find date of conjunction of object with sun */ + if ((retval = find_conjunct_sun(tjd, ipl, helflag, TypeEvent, &tjd, serr)) == ERR) + goto swe_heliacal_err; + } + tday = tjd; + retval = get_acronychal_day(tjd, dgeo, datm, dobs, ObjectName, helflag2, TypeEvent, &tday, serr); + if (retval != OK) + goto swe_heliacal_err; + } + dret[0] = tday; + if (!(helflag & SE_HELFLAG_NO_DETAILS)) { + /* more precise event times for + * - morning first, evening last + * - venus and mercury's evening first and morning last + */ + if (ipl == SE_MERCURY || ipl == SE_VENUS || TypeEvent <= 2) { + retval = get_heliacal_details(tday, dgeo, datm, dobs, ObjectName, TypeEvent, helflag2, dret, serr); + if (retval == ERR) goto swe_heliacal_err; + } else if (0) { + if (TypeEvent == 4 || TypeEvent == 6) direct = -1; + for (i = 0, d = 100.0 / 86400.0; i < 3; i++, d /= 10.0) { + while((retval = swe_vis_limit_mag(*dret + d * direct, dgeo, datm, dobs, ObjectName, helflag, darr, serr)) == -2 || (retval >= 0 && darr[0] < darr[7])) { + *dret += d * direct; + } + } + /* the last time step must be added */ + if (retval == OK) + *dret += 1.0 / 86400.0 * direct; + } + } /* if (1) */ +swe_heliacal_err: + if (serr_ret != NULL && *serr != '\0') + strcpy(serr_ret, serr); + return retval; +} + +/*###################################################################*/ +static int32 moon_event_vis_lim(double tjdstart, double *dgeo, double *datm, double *dobs, int32 TypeEvent, int32 helflag, double *dret, char *serr_ret) +{ + double tjd, trise; + char serr[AS_MAXCH]; + char ObjectName[30]; + int32 iflag, ipl, retval, helflag2, direct; + int32 epheflag = helflag & (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH); + dret[0] = tjdstart; /* will be returned in error case */ + if (TypeEvent == 1 || TypeEvent == 2) { + if (serr != NULL) + strcpy(serr, "error: the moon has no morning first or evening last"); + return ERR; + } + strcpy(ObjectName, "moon"); + ipl = SE_MOON; + iflag = SEFLG_TOPOCTR | SEFLG_EQUATORIAL | epheflag; + if (!(helflag & SE_HELFLAG_HIGH_PRECISION)) + iflag |= SEFLG_NONUT|SEFLG_TRUEPOS; + helflag2 = helflag; + helflag2 &= ~SE_HELFLAG_HIGH_PRECISION; + /* check Synodic/phase Period */ + tjd = tjdstart - 30; /* -50 makes sure, that no event is missed, + * but may return an event before start date */ + if ((retval = find_conjunct_sun(tjd, ipl, helflag, TypeEvent, &tjd, serr)) == ERR) + return ERR; + /* find the day and minute on which the object becomes visible */ + retval = get_heliacal_day(tjd, dgeo, datm, dobs, ObjectName, helflag2, TypeEvent, &tjd, serr); + if (retval != OK) + goto moon_event_err; + dret[0] = tjd; + /* find next optimum visibility */ + retval = time_optimum_visibility(tjd, dgeo, datm, dobs, ObjectName, helflag, &tjd, serr); + if (retval == ERR) goto moon_event_err; + dret[1] = tjd; + /* find moment of becoming visible */ + /* Note: The on the day of fist light the moon may become visible + * already during day. It also may appear during day, disappear again + * and then reappear after sunset */ + direct = 1; + if (TypeEvent == 4) + direct = -1; + retval = time_limit_invisible(tjd, dgeo, datm, dobs, ObjectName, helflag, direct, &tjd, serr); + if (retval == ERR) goto moon_event_err; + dret[2] = tjd; + /* find moment of end of visibility */ + direct *= -1; + retval = time_limit_invisible(dret[1], dgeo, datm, dobs, ObjectName, helflag, direct, &tjd, serr); + dret[0] = tjd; + if (retval == ERR) goto moon_event_err; + /* if the moon is visible before sunset, we return sunset as start time */ + if (TypeEvent == 3) { + if ((retval = my_rise_trans(tjd, SE_SUN, "", SE_CALC_SET, helflag, dgeo, datm, &trise, serr)) == ERR) + return ERR; + if (trise < dret[1]) { + dret[0] = trise; + /* do not warn, it happens too often */ + /*strcpy(serr, "start time given is sunset, but moon is observable before that");*/ + } + /* if the moon is visible after sunrise, we return sunrise as end time */ + } else { + if ((retval = my_rise_trans(dret[1], SE_SUN, "", SE_CALC_RISE, helflag, dgeo, datm, &trise, serr)) == ERR) + return ERR; + if (dret[0] > trise) { + dret[0] = trise; + /* do not warn, it happens too often */ + /*strcpy(serr, "end time given is sunrise, but moon is observable after that");*/ + } + } + /* correct order of the three times: */ + if (TypeEvent == 4) { + tjd = dret[0]; + dret[0] = dret[2]; + dret[2] = tjd; + } +moon_event_err: + if (serr_ret != NULL && *serr != '\0') + strcpy(serr_ret, serr); + return retval; +} + +static int32 MoonEventJDut(double JDNDaysUTStart, double *dgeo, double *datm, double *dobs, int32 TypeEvent, int32 helflag, double *dret, char *serr) +{ + int32 avkind = helflag & SE_HELFLAG_AVKIND; + if (avkind) + return moon_event_arc_vis(JDNDaysUTStart, dgeo, datm, dobs, TypeEvent, helflag, dret, serr); + else + return moon_event_vis_lim(JDNDaysUTStart, dgeo, datm, dobs, TypeEvent, helflag, dret, serr); +} + +static int32 heliacal_ut(double JDNDaysUTStart, double *dgeo, double *datm, double *dobs, char *ObjectName, int32 TypeEventIn, int32 helflag, double *dret, char *serr_ret) +{ + int32 avkind = helflag & SE_HELFLAG_AVKIND; + if (avkind) + return heliacal_ut_arc_vis(JDNDaysUTStart, dgeo, datm, dobs, ObjectName, TypeEventIn, helflag, dret, serr_ret); + else + return heliacal_ut_vis_lim(JDNDaysUTStart, dgeo, datm, dobs, ObjectName, TypeEventIn, helflag, dret, serr_ret); +} + +/*' Magn [-] +' tjd_ut start date (JD) for event search +' dgeo[3] geogr. longitude, latitude, eye height (m above sea level) +' datm[4] atm. pressure, temperature, RH, and VR +' - pressure atmospheric pressure (mbar, =hPa) default 1013.25hPa +' - temperature deg C, default 15 deg C (if at +' If both attemp and atpress are 0, a temperature and +' atmospheric pressure are estimated from the above-mentioned +' default values and the height above sea level. +' - RH relative humidity in % +' - VR VR>=1: the Meteorological range: default 40 km +' 1>VR>0: the ktot (so the total atmospheric coefficient): +' a good default would be 0.25 +' VR=-1: the ktot is calculated from the other atmospheric +' constants. +' age [Year] default 36, experienced sky observer in ancient times +' optimum age is 23 +' SN Snellen factor of the visual aquity of the observer +' default 1 +' see: http://www.i-see.org/eyecharts.html#make-your-own +' TypeEvent 1 morning first +' 2 evening last +' 3 evening first +' 4 morning last +' dret output: time (tjd_ut) of heliacal event +' see http://www.iol.ie/~geniet/eng/atmoastroextinction.htm +*/ +int32 FAR PASCAL_CONV swe_heliacal_ut(double JDNDaysUTStart, double *dgeo, double *datm, double *dobs, char *ObjectNameIn, int32 TypeEvent, int32 helflag, double *dret, char *serr_ret) +{ + int32 retval, Planet, itry; + char ObjectName[AS_MAXCH], serr[AS_MAXCH], s[AS_MAXCH]; + double tjd0 = JDNDaysUTStart, tjd, dsynperiod, tjdmax, tadd; + int32 MaxCountSynodicPeriod = MAX_COUNT_SYNPER; + char *sevent[7] = {"", "morning first", "evening last", "evening first", "morning last", "acronychal rising", "acronychal setting"}; + if (helflag & SE_HELFLAG_LONG_SEARCH) + MaxCountSynodicPeriod = MAX_COUNT_SYNPER_MAX; +/* if (helflag & SE_HELFLAG_SEARCH_1_PERIOD) + MaxCountSynodicPeriod = 1; */ + *serr = '\0'; + if (serr_ret != NULL) + *serr_ret = '\0'; + /* note, the fixed stars functions rewrite the star name. The input string + may be too short, so we have to make sure we have enough space */ + strcpy_VBsafe(ObjectName, ObjectNameIn); + default_heliacal_parameters(datm, dgeo, dobs, helflag); + swe_set_topo(dgeo[0], dgeo[1], dgeo[2]); + Planet = DeterObject(ObjectName); + /* + * Moon events + */ + if (Planet == SE_MOON) { + if (TypeEvent == 1 || TypeEvent == 2) { + if (serr_ret != NULL) + sprintf(serr_ret, "%s (event type %d) does not exist for the moon\n", sevent[TypeEvent], TypeEvent); + return ERR; + } + tjd = tjd0; + retval = MoonEventJDut(tjd, dgeo, datm, dobs, TypeEvent, helflag, dret, serr); + while (retval != -2 && *dret < tjd0) { + tjd += 15; + *serr = '\0'; + retval = MoonEventJDut(tjd, dgeo, datm, dobs, TypeEvent, helflag, dret, serr); + } + if (serr_ret != NULL && *serr != '\0') + strcpy(serr_ret, serr); + return retval; + } + /* + * planets and fixed stars + */ + if (!(helflag & SE_HELFLAG_AVKIND)) { + if (Planet == -1 || Planet >= SE_MARS) { + if (TypeEvent == 3 || TypeEvent == 4) { + if (serr_ret != NULL) { + if (Planet == -1) + strcpy(s, ObjectName); + else + swe_get_planet_name(Planet, s); + sprintf(serr_ret, "%s (event type %d) does not exist for %s\n", sevent[TypeEvent], TypeEvent, s); + } + return ERR; + } + } + } + /* arcus visionis method: set the TypeEvent for acronychal events */ + if (helflag & SE_HELFLAG_AVKIND) { + if (Planet == -1 || Planet >= SE_MARS) { + if (TypeEvent == SE_ACRONYCHAL_RISING) + TypeEvent = 3; + if (TypeEvent == SE_ACRONYCHAL_SETTING) + TypeEvent = 4; + } + /* acronychal rising and setting (cosmic setting) are ill-defined. + * We do not calculate them with the "visibility limit method" */ + } else if (1) { + if (TypeEvent == SE_ACRONYCHAL_RISING || TypeEvent == SE_ACRONYCHAL_SETTING) { + if (serr_ret != NULL) { + if (Planet == -1) + strcpy(s, ObjectName); + else + swe_get_planet_name(Planet, s); + sprintf(serr_ret, "%s (event type %d) is not provided for %s\n", sevent[TypeEvent], TypeEvent, s); + } + return ERR; + } + } + dsynperiod = get_synodic_period(Planet); + tjdmax = tjd0 + dsynperiod * MaxCountSynodicPeriod; + tadd = dsynperiod * 0.6; + if (Planet == SE_MERCURY) + tadd = 30; + /* + * this is the outer loop over n synodic periods + */ + tjd = tjd0; + retval = -2; /* indicates that another synodic period has to be done */ + for (itry = 0; + tjd < tjdmax && retval == -2; + itry++, tjd += tadd) { + *serr = '\0'; + retval = heliacal_ut(tjd, dgeo, datm, dobs, ObjectName, TypeEvent, helflag, dret, serr); + /* if resulting event date < start date for search (tjd0): retry starting + * from half a period later. The event must be found now, unless there + * is none, as is often the case with Mercury */ + while (retval != -2 && *dret < tjd0) { + tjd += tadd; + *serr = '\0'; + retval = heliacal_ut(tjd, dgeo, datm, dobs, ObjectName, TypeEvent, helflag, dret, serr); + } + } + /* + * no event was found within MaxCountSynodicPeriod, return error + */ + if ((helflag & SE_HELFLAG_SEARCH_1_PERIOD) && (retval == -2 || dret[0] > tjd0 + dsynperiod * 1.5)) { + strcpy(serr, "no heliacal date found within this synodic period"); + retval = -2; + } else if (retval == -2) { + sprintf(serr, "no heliacal date found within %d synodic periods", MaxCountSynodicPeriod); + retval = ERR; + } + if (serr_ret != NULL && *serr != '\0') + strcpy(serr_ret, serr); + return retval; +} diff --git a/swe/src/swehouse.c b/swe/src/swehouse.c new file mode 100644 index 0000000..930b18f --- /dev/null +++ b/swe/src/swehouse.c @@ -0,0 +1,1739 @@ + +/******************************************************* +$Header: /home/dieter/sweph/RCS/swehouse.c,v 1.74 2008/06/16 10:07:20 dieter Exp $ +module swehouse.c +house and (simple) aspect calculation + +************************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + +#include "sweodef.h" +#include "swephexp.h" +#include "sweph.h" +#include "swephlib.h" +#include "swehouse.h" +#include + +#define MILLIARCSEC (1.0 / 3600000.0) + +static double Asc1(double, double, double, double); +static double Asc2(double, double, double, double); +static int CalcH( + double th, double fi, double ekl, char hsy, + int iteration_count, struct houses *hsp ); +static int sidereal_houses_ecl_t0(double tjde, + double armc, + double eps, + double *nutlo, + double lat, + int hsys, + double *cusp, + double *ascmc); +static int sidereal_houses_trad(double tjde, + double armc, + double eps, + double nutl, + double lat, + int hsys, + double *cusp, + double *ascmc); +static int sidereal_houses_ssypl(double tjde, + double armc, + double eps, + double *nutlo, + double lat, + int hsys, + double *cusp, + double *ascmc); + +/* housasp.c + * cusps are returned in double cusp[13], + * or cusp[37] with house system 'G'. + * cusp[1...12] houses 1 - 12 + * additional points are returned in ascmc[10]. + * ascmc[0] = ascendant + * ascmc[1] = mc + * ascmc[2] = armc + * ascmc[3] = vertex + * ascmc[4] = equasc * "equatorial ascendant" * + * ascmc[5] = coasc1 * "co-ascendant" (W. Koch) * + * ascmc[6] = coasc2 * "co-ascendant" (M. Munkasey) * + * ascmc[7] = polasc * "polar ascendant" (M. Munkasey) * + */ +int FAR PASCAL_CONV swe_houses(double tjd_ut, + double geolat, + double geolon, + int hsys, + double *cusp, + double *ascmc) +{ + int i, retc = 0; + double armc, eps, nutlo[2]; + double tjde = tjd_ut + swe_deltat(tjd_ut); + eps = swi_epsiln(tjde) * RADTODEG; + swi_nutation(tjde, nutlo); + for (i = 0; i < 2; i++) + nutlo[i] *= RADTODEG; + armc = swe_degnorm(swe_sidtime0(tjd_ut, eps + nutlo[1], nutlo[0]) * 15 + geolon); +#ifdef TRACE + swi_open_trace(NULL); + if (swi_trace_count <= TRACE_COUNT_MAX) { + if (swi_fp_trace_c != NULL) { + fputs("\n/*SWE_HOUSES*/\n", swi_fp_trace_c); + fprintf(swi_fp_trace_c, "#if 0\n"); + fprintf(swi_fp_trace_c, " tjd = %.9f;", tjd_ut); + fprintf(swi_fp_trace_c, " geolon = %.9f;", geolon); + fprintf(swi_fp_trace_c, " geolat = %.9f;", geolat); + fprintf(swi_fp_trace_c, " hsys = %d;\n", hsys); + fprintf(swi_fp_trace_c, " retc = swe_houses(tjd, geolat, geolon, hsys, cusp, ascmc);\n"); + fprintf(swi_fp_trace_c, " /* swe_houses calls swe_houses_armc as follows: */\n"); + fprintf(swi_fp_trace_c, "#endif\n"); + fflush(swi_fp_trace_c); + } + } +#endif + retc = swe_houses_armc(armc, geolat, eps + nutlo[1], hsys, cusp, ascmc); + return retc; +} + +/* housasp.c + * cusps are returned in double cusp[13], + * or cusp[37] with house system 'G'. + * cusp[1...12] houses 1 - 12 + * additional points are returned in ascmc[10]. + * ascmc[0] = ascendant + * ascmc[1] = mc + * ascmc[2] = armc + * ascmc[3] = vertex + * ascmc[4] = equasc * "equatorial ascendant" * + * ascmc[5] = coasc1 * "co-ascendant" (W. Koch) * + * ascmc[6] = coasc2 * "co-ascendant" (M. Munkasey) * + * ascmc[7] = polasc * "polar ascendant" (M. Munkasey) * + */ +int FAR PASCAL_CONV swe_houses_ex(double tjd_ut, + int32 iflag, + double geolat, + double geolon, + int hsys, + double *cusp, + double *ascmc) +{ + int i, retc = 0; + double armc, eps_mean, nutlo[2]; + double tjde = tjd_ut + swe_deltat(tjd_ut); + struct sid_data *sip = &swed.sidd; + int ito; + if (toupper(hsys) == 'G') + ito = 36; + else + ito = 12; + if ((iflag & SEFLG_SIDEREAL) && !swed.ayana_is_set) + swe_set_sid_mode(SE_SIDM_FAGAN_BRADLEY, 0, 0); + eps_mean = swi_epsiln(tjde) * RADTODEG; + swi_nutation(tjde, nutlo); + for (i = 0; i < 2; i++) + nutlo[i] *= RADTODEG; +#ifdef TRACE + swi_open_trace(NULL); + if (swi_trace_count <= TRACE_COUNT_MAX) { + if (swi_fp_trace_c != NULL) { + fputs("\n/*SWE_HOUSES_EX*/\n", swi_fp_trace_c); + fprintf(swi_fp_trace_c, "#if 0\n"); + fprintf(swi_fp_trace_c, " tjd = %.9f;", tjd_ut); + fprintf(swi_fp_trace_c, " iflag = %d;\n", iflag); + fprintf(swi_fp_trace_c, " geolon = %.9f;", geolon); + fprintf(swi_fp_trace_c, " geolat = %.9f;", geolat); + fprintf(swi_fp_trace_c, " hsys = %d;\n", hsys); + fprintf(swi_fp_trace_c, " retc = swe_houses_ex(tjd, iflag, geolat, geolon, hsys, cusp, ascmc);\n"); + fprintf(swi_fp_trace_c, " /* swe_houses calls swe_houses_armc as follows: */\n"); + fprintf(swi_fp_trace_c, "#endif\n"); + fflush(swi_fp_trace_c); + } + } +#endif + /*houses_to_sidereal(tjde, geolat, hsys, eps, cusp, ascmc, iflag);*/ + armc = swe_degnorm(swe_sidtime0(tjd_ut, eps_mean + nutlo[1], nutlo[0]) * 15 + geolon); + if (iflag & SEFLG_SIDEREAL) { + if (sip->sid_mode & SE_SIDBIT_ECL_T0) + retc = sidereal_houses_ecl_t0(tjde, armc, eps_mean + nutlo[1], nutlo, geolat, hsys, cusp, ascmc); + else if (sip->sid_mode & SE_SIDBIT_SSY_PLANE) + retc = sidereal_houses_ssypl(tjde, armc, eps_mean + nutlo[1], nutlo, geolat, hsys, cusp, ascmc); + else + retc = sidereal_houses_trad(tjde, armc, eps_mean + nutlo[1], nutlo[0], geolat, hsys, cusp, ascmc); + } else { + retc = swe_houses_armc(armc, geolat, eps_mean + nutlo[1], hsys, cusp, ascmc); + } + if (iflag & SEFLG_RADIANS) { + for (i = 1; i <= ito; i++) + cusp[i] *= DEGTORAD; + for (i = 0; i < SE_NASCMC; i++) + ascmc[i] *= DEGTORAD; + } + return retc; +} + +/* + * houses to sidereal + * ------------------ + * there are two methods: + * a) the traditional one + * houses are computed tropically, then nutation and the ayanamsa + * are subtracted. + * b) the projection on the ecliptic of t0 + * The house computation is then as follows: + * + * Be t the birth date and t0 the epoch at which ayanamsa = 0. + * 1. Compute the angle between the mean ecliptic at t0 and + * the true equator at t. + * The intersection point of these two circles we call the + * "auxiliary vernal point", and the angle between them the + * "auxiliary obliquity". + * 2. Compute the distance of the auxiliary vernal point from the + * vernal point at t. (this is a section on the equator) + * 3. subtract this value from the armc of t = aux. armc. + * 4. Compute the axes and houses for this aux. armc and aux. obliquity. + * 5. Compute the distance between the auxiliary vernal point and the + * vernal point at t0 (this is the ayanamsa at t, measured on the + * ecliptic of t0) + * 6. subtract this distance from all house cusps. + * 7. subtract ayanamsa_t0 from all house cusps. + */ +static int sidereal_houses_ecl_t0(double tjde, + double armc, + double eps, + double *nutlo, + double lat, + int hsys, + double *cusp, + double *ascmc) +{ + int i, j, retc = OK; + double x[6], xvpx[6], x2[6], epst0, xnorm[6]; + double rxy, rxyz, c2, epsx, sgn, fac, dvpx, dvpxe; + double armcx; + struct sid_data *sip = &swed.sidd; + int ito; + if (toupper(hsys) == 'G') + ito = 36; + else + ito = 12; + /* epsilon at t0 */ + epst0 = swi_epsiln(sip->t0); + /* cartesian coordinates of an imaginary moving body on the + * the mean ecliptic of t0; we take the vernal point: */ + x[0] = x[4] = 1; + x[1] = x[2] = x[3] = x[5] = 0; + /* to equator */ + swi_coortrf(x, x, -epst0); + swi_coortrf(x+3, x+3, -epst0); + /* to tjd_et */ + swi_precess(x, sip->t0, J_TO_J2000); + swi_precess(x, tjde, J2000_TO_J); + swi_precess(x+3, sip->t0, J_TO_J2000); + swi_precess(x+3, tjde, J2000_TO_J); + /* to true equator of tjd_et */ + swi_coortrf(x, x, (eps - nutlo[1]) * DEGTORAD); + swi_coortrf(x+3, x+3, (eps - nutlo[1]) * DEGTORAD); + swi_cartpol_sp(x, x); + x[0] += nutlo[0] * DEGTORAD; + swi_polcart_sp(x, x); + swi_coortrf(x, x, -eps * DEGTORAD); + swi_coortrf(x+3, x+3, -eps * DEGTORAD); + /* now, we have the moving point precessed to tjd_et. + * next, we compute the auxiliary epsilon: */ + swi_cross_prod(x, x+3, xnorm); + rxy = xnorm[0] * xnorm[0] + xnorm[1] * xnorm[1]; + c2 = (rxy + xnorm[2] * xnorm[2]); + rxyz = sqrt(c2); + rxy = sqrt(rxy); + epsx = asin(rxy / rxyz) * RADTODEG; /* 1a */ + /* auxiliary vernal point */ + if (fabs(x[5]) < 1e-15) + x[5] = 1e-15; + fac = x[2] / x[5]; + sgn = x[5] / fabs(x[5]); + for (j = 0; j <= 2; j++) + xvpx[j] = (x[j] - fac * x[j+3]) * sgn; /* 1b */ + /* distance of the auxiliary vernal point from + * the zero point at tjd_et (a section on the equator): */ + swi_cartpol(xvpx, x2); + dvpx = x2[0] * RADTODEG; /* 2 */ + /* auxiliary armc */ + armcx = swe_degnorm(armc - dvpx); /* 3 */ + /* compute axes and houses: */ + retc = swe_houses_armc(armcx, lat, epsx, hsys, cusp, ascmc); /* 4 */ + /* distance between auxiliary vernal point and + * vernal point of t0 (a section on the sidereal plane) */ + dvpxe = acos(swi_dot_prod_unit(x, xvpx)) * RADTODEG; /* 5 */ + if (tjde < sip->t0) + dvpxe = -dvpxe; + for (i = 1; i <= ito; i++) /* 6, 7 */ + cusp[i] = swe_degnorm(cusp[i] - dvpxe - sip->ayan_t0); + for (i = 0; i <= SE_NASCMC; i++) + ascmc[i] = swe_degnorm(ascmc[i] - dvpxe - sip->ayan_t0); + return retc; +} + +/* + * Be t the birth date and t0 the epoch at which ayanamsa = 0. + * 1. Compute the angle between the solar system rotation plane and + * the true equator at t. + * The intersection point of these two circles we call the + * "auxiliary vernal point", and the angle between them the + * "auxiliary obliquity". + * 2. Compute the distance of the auxiliary vernal point from the + * zero point at t. (this is a section on the equator) + * 3. subtract this value from the armc of t = aux. armc. + * 4. Compute the axes and houses for this aux. armc and aux. obliquity. + * 5. Compute the distance between the auxiliary vernal point at t + * and the zero point of the solar system plane J2000 + * (a section measured on the solar system plane) + * 6. subtract this distance from all house cusps. + * 7. compute the ayanamsa of J2000 on the solar system plane, + * referred to t0 + * 8. subtract ayanamsa_t0 from all house cusps. + * 9. subtract ayanamsa_2000 from all house cusps. + */ +static int sidereal_houses_ssypl(double tjde, + double armc, + double eps, + double *nutlo, + double lat, + int hsys, + double *cusp, + double *ascmc) +{ + int i, j, retc = OK; + double x[6], x0[6], xvpx[6], x2[6], xnorm[6]; + double rxy, rxyz, c2, epsx, eps2000, sgn, fac, dvpx, dvpxe, x00; + double armcx; + struct sid_data *sip = &swed.sidd; + int ito; + if (toupper(hsys) == 'G') + ito = 36; + else + ito = 12; + eps2000 = swi_epsiln(J2000); + /* cartesian coordinates of the zero point on the + * the solar system rotation plane */ + x[0] = x[4] = 1; + x[1] = x[2] = x[3] = x[5] = 0; + /* to ecliptic 2000 */ + swi_coortrf(x, x, -SSY_PLANE_INCL); + swi_coortrf(x+3, x+3, -SSY_PLANE_INCL); + swi_cartpol_sp(x, x); + x[0] += SSY_PLANE_NODE_E2000; + swi_polcart_sp(x, x); + /* to equator 2000 */ + swi_coortrf(x, x, -eps2000); + swi_coortrf(x+3, x+3, -eps2000); + /* to mean equator of t */ + swi_precess(x, tjde, J2000_TO_J); + swi_precess(x+3, tjde, J2000_TO_J); + /* to true equator of t */ + swi_coortrf(x, x, (eps - nutlo[1]) * DEGTORAD); + swi_coortrf(x+3, x+3, (eps - nutlo[1]) * DEGTORAD); + swi_cartpol_sp(x, x); + x[0] += nutlo[0] * DEGTORAD; + swi_polcart_sp(x, x); + swi_coortrf(x, x, -eps * DEGTORAD); + swi_coortrf(x+3, x+3, -eps * DEGTORAD); + /* now, we have the moving point precessed to tjd_et. + * next, we compute the auxiliary epsilon: */ + swi_cross_prod(x, x+3, xnorm); + rxy = xnorm[0] * xnorm[0] + xnorm[1] * xnorm[1]; + c2 = (rxy + xnorm[2] * xnorm[2]); + rxyz = sqrt(c2); + rxy = sqrt(rxy); + epsx = asin(rxy / rxyz) * RADTODEG; /* 1a */ + /* auxiliary vernal point */ + if (fabs(x[5]) < 1e-15) + x[5] = 1e-15; + fac = x[2] / x[5]; + sgn = x[5] / fabs(x[5]); + for (j = 0; j <= 2; j++) + xvpx[j] = (x[j] - fac * x[j+3]) * sgn; /* 1b */ + /* distance of the auxiliary vernal point from + * mean vernal point at tjd_et (a section on the equator): */ + swi_cartpol(xvpx, x2); + dvpx = x2[0] * RADTODEG; /* 2 */ + /* auxiliary armc */ + armcx = swe_degnorm(armc - dvpx); /* 3 */ + /* compute axes and houses: */ + retc = swe_houses_armc(armcx, lat, epsx, hsys, cusp, ascmc); /* 4 */ + /* distance between the auxiliary vernal point at t and + * the sidereal zero point of 2000 at t + * (a section on the sidereal plane). + */ + dvpxe = acos(swi_dot_prod_unit(x, xvpx)) * RADTODEG; /* 5 */ + /* (always positive for dates after 5400 bc) */ + dvpxe -= SSY_PLANE_NODE * RADTODEG; + /* ayanamsa between t0 and J2000, measured on solar system plane: */ + /* position of zero point of t0 */ + x0[0] = 1; + x0[1] = x0[2] = 0; + /* zero point of t0 in J2000 system */ + if (sip->t0 != J2000) + swi_precess(x0, sip->t0, J_TO_J2000); + /* zero point to ecliptic 2000 */ + swi_coortrf(x0, x0, eps2000); + /* to solar system plane */ + swi_cartpol(x0, x0); + x0[0] -= SSY_PLANE_NODE_E2000; + swi_polcart(x0, x0); + swi_coortrf(x0, x0, SSY_PLANE_INCL); + swi_cartpol(x0, x0); + x0[0] += SSY_PLANE_NODE; + x00 = x0[0] * RADTODEG; /* 7 */ + for (i = 1; i <= ito; i++) /* 6, 8, 9 */ + cusp[i] = swe_degnorm(cusp[i] - dvpxe - sip->ayan_t0 - x00); + for (i = 0; i <= SE_NASCMC; i++) + ascmc[i] = swe_degnorm(ascmc[i] - dvpxe - sip->ayan_t0 - x00); + return retc; +} + +/* common simplified procedure */ +static int sidereal_houses_trad(double tjde, + double armc, + double eps, + double nutl, + double lat, + int hsys, + double *cusp, + double *ascmc) +{ + int i, retc = OK; + double ay; + int ito; + int ihs = toupper(hsys); + int ihs2 = ihs; + ay = swe_get_ayanamsa(tjde); + if (ihs == 'G') + ito = 36; + else + ito = 12; + if (ihs == 'W') /* whole sign houses: treat as 'E' and fix later */ + ihs2 = 'E'; + retc = swe_houses_armc(armc, lat, eps, ihs2, cusp, ascmc); + for (i = 1; i <= ito; i++) { + cusp[i] = swe_degnorm(cusp[i] - ay - nutl); + if (ihs == 'W') /* whole sign houses */ + cusp[i] -= fmod(cusp[i], 30); + } + for (i = 0; i < SE_NASCMC; i++) { + if (i == 2) /* armc */ + continue; + ascmc[i] = swe_degnorm(ascmc[i] - ay - nutl); + } + return retc; +} + +/* + * this function is required for very special computations + * where no date is given for house calculation, + * e.g. for composite charts or progressive charts. + * cusps are returned in double cusp[13], + * or cusp[37] with house system 'G'. + * cusp[1...12] houses 1 - 12 + * additional points are returned in ascmc[10]. + * ascmc[0] = ascendant + * ascmc[1] = mc + * ascmc[2] = armc + * ascmc[3] = vertex + * ascmc[4] = equasc * "equatorial ascendant" * + * ascmc[5] = coasc1 * "co-ascendant" (W. Koch) * + * ascmc[6] = coasc2 * "co-ascendant" (M. Munkasey) * + * ascmc[7] = polasc * "polar ascendant" (M. Munkasey) * + */ +int FAR PASCAL_CONV swe_houses_armc( + double armc, + double geolat, + double eps, + int hsys, + double *cusp, + double *ascmc) +{ + struct houses h; + int i, retc = 0; + int ito; + if (toupper(hsys) == 'G') + ito = 36; + else + ito = 12; + armc = swe_degnorm(armc); + retc = CalcH(armc, + geolat, + eps, + (char)hsys, 2, &h); + cusp[0] = 0; + for (i = 1; i <= ito; i++) { + cusp[i] = h.cusp[i]; + } + ascmc[0] = h.ac; /* Asc */ + ascmc[1] = h.mc; /* Mid */ + ascmc[2] = armc; + ascmc[3] = h.vertex; + ascmc[4] = h.equasc; + ascmc[5] = h.coasc1; /* "co-ascendant" (W. Koch) */ + ascmc[6] = h.coasc2; /* "co-ascendant" (M. Munkasey) */ + ascmc[7] = h.polasc; /* "polar ascendant" (M. Munkasey) */ + for (i = SE_NASCMC; i < 10; i++) + ascmc[i] = 0; +#ifdef TRACE + swi_open_trace(NULL); + if (swi_trace_count <= TRACE_COUNT_MAX) { + if (swi_fp_trace_c != NULL) { + fputs("\n/*SWE_HOUSES_ARMC*/\n", swi_fp_trace_c); + fprintf(swi_fp_trace_c, " armc = %.9f;", armc); + fprintf(swi_fp_trace_c, " geolat = %.9f;", geolat); + fprintf(swi_fp_trace_c, " eps = %.9f;", eps); + fprintf(swi_fp_trace_c, " hsys = %d;\n", hsys); + fprintf(swi_fp_trace_c, " retc = swe_houses_armc(armc, geolat, eps, hsys, cusp, ascmc);\n"); + fputs(" printf(\"swe_houses_armc: %f\\t%f\\t%f\\t%c\\t\\n\", ", swi_fp_trace_c); + fputs(" armc, geolat, eps, hsys);\n", swi_fp_trace_c); + fputs(" printf(\"retc = %d\\n\", retc);\n", swi_fp_trace_c); + fputs(" printf(\"cusp:\\n\");\n", swi_fp_trace_c); + fputs(" for (i = 0; i < 12; i++)\n", swi_fp_trace_c); + fputs(" printf(\" %d\\t%f\\n\", i, cusp[i]);\n", swi_fp_trace_c); + fputs(" printf(\"ascmc:\\n\");\n", swi_fp_trace_c); + fputs(" for (i = 0; i < 10; i++)\n", swi_fp_trace_c); + fputs(" printf(\" %d\\t%f\\n\", i, ascmc[i]);\n", swi_fp_trace_c); + fflush(swi_fp_trace_c); + } + if (swi_fp_trace_out != NULL) { + fprintf(swi_fp_trace_out, "swe_houses_armc: %f\t%f\t%f\t%c\t\n", armc, geolat, eps, hsys); + fprintf(swi_fp_trace_out, "retc = %d\n", retc); + fputs("cusp:\n", swi_fp_trace_out); + for (i = 0; i < 12; i++) + fprintf(swi_fp_trace_out, " %d\t%f\n", i, cusp[i]); + fputs("ascmc:\n", swi_fp_trace_out); + for (i = 0; i < 10; i++) + fprintf(swi_fp_trace_out, " %d\t%f\n", i, ascmc[i]); + fflush(swi_fp_trace_out); + } + } +#endif +#if 0 +/* for test of swe_house_pos(). + * 1st house will be 0, second 30, etc. */ +for (i = 1; i <=12; i++) { + double x[6]; + x[0] = cusp[i]; x[1] = 0; x[2] = 1; + cusp[i] = (swe_house_pos(armc, geolat, eps, hsys, x, NULL) - 1) * 30; +} +#endif + return retc; +} + +static int CalcH( + double th, double fi, double ekl, char hsy, + int iteration_count, struct houses *hsp ) +/* ********************************************************* + * Arguments: th = sidereal time (angle 0..360 degrees + * hsy = letter code for house system; + * A equal + * E equal + * B Alcabitius + * C Campanus + * G 36 Gauquelin sectors + * H horizon / azimut + * K Koch + * M Morinus + * O Porphyry + * P Placidus + * R Regiomontanus + * T Polich/Page ("topocentric") + * V equal Vehlow + * W equal, whole sign + * X axial rotation system/ Meridian houses + * U Krusinski-Pisa-Goelzer + * fi = geographic latitude + * ekl = obliquity of the ecliptic + * iteration_count = number of iterations in + * Placidus calculation; can be 1 or 2. + * ********************************************************* + * Koch and Placidus don't work in the polar circle. + * We swap MC/IC so that MC is always before AC in the zodiac + * We than divide the quadrants into 3 equal parts. + * ********************************************************* + * All angles are expressed in degrees. + * Special trigonometric functions sind, cosd etc. are + * implemented for arguments in degrees. + ***********************************************************/ +{ + double tane, tanfi, cosfi, tant, sina, cosa, th2; + double a, c, f, fh1, fh2, xh1, xh2, rectasc, ad3, acmc, vemc; + int i, ih, ih2, retc = OK; + double sine, cose; + double x[3], krHorizonLon; /* BK 14.02.2006 */ + cose = cosd(ekl); + sine = sind(ekl); + tane = tand(ekl); + /* north and south poles */ + if (fabs(fabs(fi) - 90) < VERY_SMALL) { + if (fi < 0) + fi = -90 + VERY_SMALL; + else + fi = 90 - VERY_SMALL; + } + tanfi = tand(fi); + /* mc */ + if (fabs(th - 90) > VERY_SMALL + && fabs(th - 270) > VERY_SMALL) { + tant = tand(th); + hsp->mc = atand(tant / cose); + if (th > 90 && th <= 270) + hsp->mc = swe_degnorm(hsp->mc + 180); + } else { + if (fabs(th - 90) <= VERY_SMALL) + hsp->mc = 90; + else + hsp->mc = 270; + } /* if */ + hsp->mc = swe_degnorm(hsp->mc); + /* ascendant */ + hsp->ac = Asc1 (th + 90, fi, sine, cose); + hsp->cusp[1] = hsp->ac; + hsp->cusp[10] = hsp->mc; + if (hsy > 95) hsy = (char) (hsy - 32);/* translate into capital letter */ + switch (hsy) { + case 'A': /* equal houses */ + case 'E': + /* + * within polar circle we swap AC/DC if AC is on wrong side + */ + acmc = swe_difdeg2n(hsp->ac, hsp->mc); + if (acmc < 0) { + hsp->ac = swe_degnorm(hsp->ac + 180); + hsp->cusp[1] = hsp->ac; + } + for (i = 2; i <=12; i++) + hsp->cusp [i] = swe_degnorm(hsp->cusp [1] + (i-1) * 30); + break; + case 'C': /* Campanus houses and Horizon or Azimut system */ + case 'H': + if (hsy == 'H') { + if (fi > 0) + fi = 90 - fi; + else + fi = -90 - fi; + /* equator */ + if (fabs(fabs(fi) - 90) < VERY_SMALL) { + if (fi < 0) + fi = -90 + VERY_SMALL; + else + fi = 90 - VERY_SMALL; + } + th = swe_degnorm(th + 180); + } + fh1 = asind(sind (fi) / 2); + fh2 = asind(sqrt (3.0) / 2 * sind(fi)); + cosfi = cosd(fi); + if (fabs(cosfi) == 0) { /* '==' should be save! */ + if (fi > 0) + xh1 = xh2 = 90; /* cosfi = VERY_SMALL; */ + else + xh1 = xh2 = 270; /* cosfi = -VERY_SMALL; */ + } else { + xh1 = atand(sqrt (3.0) / cosfi); + xh2 = atand(1 / sqrt (3.0) / cosfi); + } + hsp->cusp [11] = Asc1 (th + 90 - xh1, fh1, sine, cose); + hsp->cusp [12] = Asc1 (th + 90 - xh2, fh2, sine, cose); + if (hsy == 'H') + hsp->cusp [1] = Asc1 (th + 90, fi, sine, cose); + hsp->cusp [2] = Asc1 (th + 90 + xh2, fh2, sine, cose); + hsp->cusp [3] = Asc1 (th + 90 + xh1, fh1, sine, cose); + /* within polar circle, when mc sinks below horizon and + * ascendant changes to western hemisphere, all cusps + * must be added 180 degrees. + * houses will be in clockwise direction */ + if (fabs(fi) >= 90 - ekl) { /* within polar circle */ + acmc = swe_difdeg2n(hsp->ac, hsp->mc); + if (acmc < 0) { + hsp->ac = swe_degnorm(hsp->ac + 180); + hsp->mc = swe_degnorm(hsp->mc + 180); + for (i = 1; i <= 12; i++) + hsp->cusp[i] = swe_degnorm(hsp->cusp[i] + 180); + } + } + if (hsy == 'H') { + for (i = 1; i <= 3; i++) + hsp->cusp[i] = swe_degnorm(hsp->cusp[i] + 180); + for (i = 11; i <= 12; i++) + hsp->cusp[i] = swe_degnorm(hsp->cusp[i] + 180); + /* restore fi and th */ + if (fi > 0) + fi = 90 - fi; + else + fi = -90 - fi; + th = swe_degnorm(th + 180); + acmc = swe_difdeg2n(hsp->ac, hsp->mc); + if (acmc < 0) { + hsp->ac = swe_degnorm(hsp->ac + 180); + } + } + break; + case 'K': /* Koch houses */ + if (fabs(fi) >= 90 - ekl) { /* within polar circle */ + retc = ERR; + goto porphyry; + } + sina = sind(hsp->mc) * sine / cosd(fi); + if (sina > 1) sina = 1; + if (sina < -1) sina = -1; + cosa = sqrt(1 - sina * sina); /* always >> 0 */ + c = atand(tanfi / cosa); + ad3 = asind(sind(c) * sina) / 3.0; + hsp->cusp [11] = Asc1 (th + 30 - 2 * ad3, fi, sine, cose); + hsp->cusp [12] = Asc1 (th + 60 - ad3, fi, sine, cose); + hsp->cusp [2] = Asc1 (th + 120 + ad3, fi, sine, cose); + hsp->cusp [3] = Asc1 (th + 150 + 2 * ad3, fi, sine, cose); + break; + case 'O': /* Porphyry houses */ +porphyry: + /* + * within polar circle we swap AC/DC if AC is on wrong side + */ + acmc = swe_difdeg2n(hsp->ac, hsp->mc); + if (acmc < 0) { + hsp->ac = swe_degnorm(hsp->ac + 180); + hsp->cusp[1] = hsp->ac; + acmc = swe_difdeg2n(hsp->ac, hsp->mc); + } + hsp->cusp [2] = swe_degnorm(hsp->ac + (180 - acmc) / 3); + hsp->cusp [3] = swe_degnorm(hsp->ac + (180 - acmc) / 3 * 2); + hsp->cusp [11] = swe_degnorm(hsp->mc + acmc / 3); + hsp->cusp [12] = swe_degnorm(hsp->mc + acmc / 3 * 2); + break; + case 'R': /* Regiomontanus houses */ + fh1 = atand (tanfi * 0.5); + fh2 = atand (tanfi * cosd(30)); + hsp->cusp [11] = Asc1 (30 + th, fh1, sine, cose); + hsp->cusp [12] = Asc1 (60 + th, fh2, sine, cose); + hsp->cusp [2] = Asc1 (120 + th, fh2, sine, cose); + hsp->cusp [3] = Asc1 (150 + th, fh1, sine, cose); + /* within polar circle, when mc sinks below horizon and + * ascendant changes to western hemisphere, all cusps + * must be added 180 degrees. + * houses will be in clockwise direction */ + if (fabs(fi) >= 90 - ekl) { /* within polar circle */ + acmc = swe_difdeg2n(hsp->ac, hsp->mc); + if (acmc < 0) { + hsp->ac = swe_degnorm(hsp->ac + 180); + hsp->mc = swe_degnorm(hsp->mc + 180); + for (i = 1; i <= 12; i++) + hsp->cusp[i] = swe_degnorm(hsp->cusp[i] + 180); + } + } + break; + case 'T': /* 'topocentric' houses */ + fh1 = atand (tanfi / 3.0); + fh2 = atand (tanfi * 2.0 / 3.0); + hsp->cusp [11] = Asc1 (30 + th, fh1, sine, cose); + hsp->cusp [12] = Asc1 (60 + th, fh2, sine, cose); + hsp->cusp [2] = Asc1 (120 + th, fh2, sine, cose); + hsp->cusp [3] = Asc1 (150 + th, fh1, sine, cose); + /* within polar circle, when mc sinks below horizon and + * ascendant changes to western hemisphere, all cusps + * must be added 180 degrees. + * houses will be in clockwise direction */ + if (fabs(fi) >= 90 - ekl) { /* within polar circle */ + acmc = swe_difdeg2n(hsp->ac, hsp->mc); + if (acmc < 0) { + hsp->ac = swe_degnorm(hsp->ac + 180); + hsp->mc = swe_degnorm(hsp->mc + 180); + for (i = 1; i <= 12; i++) + hsp->cusp[i] = swe_degnorm(hsp->cusp[i] + 180); + } + } + break; + case 'V': /* equal houses after Vehlow */ + /* + * within polar circle we swap AC/DC if AC is on wrong side + */ + acmc = swe_difdeg2n(hsp->ac, hsp->mc); + if (acmc < 0) { + hsp->ac = swe_degnorm(hsp->ac + 180); + hsp->cusp[1] = hsp->ac; + } + hsp->cusp [1] = swe_degnorm(hsp->ac - 15); + for (i = 2; i <=12; i++) + hsp->cusp [i] = swe_degnorm(hsp->cusp [1] + (i-1) * 30); + break; + case 'W': /* equal, whole-sign houses */ + /* + * within polar circle we swap AC/DC if AC is on wrong side + */ + acmc = swe_difdeg2n(hsp->ac, hsp->mc); + if (acmc < 0) { + hsp->ac = swe_degnorm(hsp->ac + 180); + hsp->cusp[1] = hsp->ac; + } + hsp->cusp [1] = hsp->ac - fmod(hsp->ac, 30); + for (i = 2; i <=12; i++) + hsp->cusp [i] = swe_degnorm(hsp->cusp [1] + (i-1) * 30); + break; + case 'X': { + /* + * Meridian or axial rotation system: + * ecliptic points whose rectascensions + * are armc + n * 30 + */ + int j; + double a = th; + for (i = 1; i <= 12; i++) { + j = i + 10; + if (j > 12) j -= 12; + a = swe_degnorm(a + 30); + if (fabs(a - 90) > VERY_SMALL + && fabs(a - 270) > VERY_SMALL) { + tant = tand(a); + hsp->cusp[j] = atand(tant / cose); + if (a > 90 && a <= 270) + hsp->cusp[j] = swe_degnorm(hsp->cusp[j] + 180); + } else { + if (fabs(a - 90) <= VERY_SMALL) + hsp->cusp[j] = 90; + else + hsp->cusp[j] = 270; + } /* if */ + hsp->cusp[j] = swe_degnorm(hsp->cusp[j]); + } + acmc = swe_difdeg2n(hsp->ac, hsp->mc); + if (acmc < 0) { + hsp->ac = swe_degnorm(hsp->ac + 180); + } + break; } + case 'M': { + /* + * Morinus + * points of the equator (armc + n * 30) are transformed + * into the ecliptic coordinate system + */ + int j; + double a = th; + double x[3]; + for (i = 1; i <= 12; i++) { + j = i + 10; + if (j > 12) j -= 12; + a = swe_degnorm(a + 30); + x[0] = a; + x[1] = 0; + swe_cotrans(x, x, ekl); + hsp->cusp[j] = x[0]; + } + acmc = swe_difdeg2n(hsp->ac, hsp->mc); + if (acmc < 0) { + hsp->ac = swe_degnorm(hsp->ac + 180); + } + break; } + case 'B': { /* Alcabitius */ + /* created by Alois 17-sep-2000, followed example in Matrix + electrical library. The code reproduces the example! + See http://www.astro.com/cgi/adict.cgi query: alcabitius + in the resuotl page, see program code example. + I think the Alcabitius code in Walter Pullen's Astrolog 5.40 + is wrong, because he remains in RA and forgets the transform to + the ecliptic. */ + double dek, r, sna, sda, sn3, sd3; +#if FALSE + if (fabs(fi) >= 90 - ekl) { /* within polar circle */ + retc = ERR; + goto porphyry; + } +#endif + acmc = swe_difdeg2n(hsp->ac, hsp->mc); + if (acmc < 0) { + hsp->ac = swe_degnorm(hsp->ac + 180); + hsp->cusp[1] = hsp->ac; + acmc = swe_difdeg2n(hsp->ac, hsp->mc); + } + dek = asind(sind(hsp->ac) * sine); /* declination of Ascendant */ + /* must treat the case fi == 90 or -90 */ + r = -tanfi * tand(dek); + /* must treat the case of abs(r) > 1; probably does not happen + * because dek becomes smaller when fi is large, as ac is close to + * zero Aries/Libra in that case. + */ + sda = acos(r) * RADTODEG; /* semidiurnal arc, measured on equator */ + sna = 180 - sda; /* complement, seminocturnal arc */ + sd3 = sda / 3; + sn3 = sna / 3; + rectasc = swe_degnorm(th + sd3); /* cusp 11 */ + /* project rectasc onto eclipitic with pole height 0, i.e. along the + declination circle */ + hsp->cusp [11] = Asc1 (rectasc, 0, sine, cose); + rectasc = swe_degnorm(th + 2 * sd3); /* cusp 12 */ + hsp->cusp [12] = Asc1 (rectasc, 0, sine, cose); + rectasc = swe_degnorm(th + 180 - 2 * sn3); /* cusp 2 */ + hsp->cusp [2] = Asc1 (rectasc, 0, sine, cose); + rectasc = swe_degnorm(th + 180 - sn3); /* cusp 3 */ + hsp->cusp [3] = Asc1 (rectasc, 0, sine, cose); + } + break; + case 'G': /* 36 Gauquelin sectors */ + for (i = 1; i <= 36; i++) { + hsp->cusp[i] = 0; + } + if (fabs(fi) >= 90 - ekl) { /* within polar circle */ + retc = ERR; + goto porphyry; + } + /*************** forth/second quarter ***************/ + /* note: Gauquelin sectors are counted in clockwise direction */ + a = asind(tand(fi) * tane); + for (ih = 2; ih <= 9; ih++) { + ih2 = 10 - ih; + fh1 = atand(sind(a * ih2 / 9) / tane); + rectasc = swe_degnorm((90 / 9) * ih2 + th); + tant = tand(asind(sine * sind(Asc1 (rectasc, fh1, sine, cose)))); + if (fabs(tant) < VERY_SMALL) { + hsp->cusp[ih] = rectasc; + } else { + /* pole height */ + f = atand(sind(asind(tanfi * tant) * ih2 / 9) /tant); + hsp->cusp [ih] = Asc1 (rectasc, f, sine, cose); + for (i = 1; i <= iteration_count; i++) { + tant = tand(asind(sine * sind(hsp->cusp[ih]))); + if (fabs(tant) < VERY_SMALL) { + hsp->cusp[ih] = rectasc; + break; + } + /* pole height */ + f = atand(sind(asind(tanfi * tant) * ih2 / 9) / tant); + hsp->cusp[ih] = Asc1 (rectasc, f, sine, cose); + } + } + hsp->cusp[ih+18] = swe_degnorm(hsp->cusp[ih] + 180); + } + /*************** first/third quarter ***************/ + for (ih = 29; ih <= 36; ih++) { + ih2 = ih - 28; + fh1 = atand(sind(a * ih2 / 9) / tane); + rectasc = swe_degnorm(180 - ih2 * 90 / 9 + th); + tant = tand(asind(sine * sind(Asc1 (rectasc, fh1, sine, cose)))); + if (fabs(tant) < VERY_SMALL) { + hsp->cusp[ih] = rectasc; + } else { + f = atand(sind(asind(tanfi * tant) * ih2 / 9) / tant); + /* pole height */ + hsp->cusp[ih] = Asc1 (rectasc, f, sine, cose); + for (i = 1; i <= iteration_count; i++) { + tant = tand(asind(sine * sind(hsp->cusp[ih]))); + if (fabs(tant) < VERY_SMALL) { + hsp->cusp[ih] = rectasc; + break; + } + f = atand(sind(asind(tanfi * tant) * ih2 / 9) / tant); + /* pole height */ + hsp->cusp[ih] = Asc1 (rectasc, f, sine, cose); + } + } + hsp->cusp[ih-18] = swe_degnorm(hsp->cusp[ih] + 180); + } + hsp->cusp[1] = hsp->ac; + hsp->cusp[10] = hsp->mc; + hsp->cusp[19] = swe_degnorm(hsp->ac + 180); + hsp->cusp[28] = swe_degnorm(hsp->mc + 180); + break; + case 'U': /* Krusinski-Pisa */ + /* + * The following code was written by Bogdan Krusinski in 2006. + * bogdan@astrologia.pl + * + * Definition: + * "Krusinski - house system based on the great circle passing through + * ascendant and zenith. This circle is divided into 12 equal parts + * (1st cusp is ascendent, 10th cusp is zenith), then the resulting + * points are projected onto the ecliptic through meridian circles. + * The house cusps in space are half-circles perpendicular to the equator + * and running from the north to the south celestial pole through the + * resulting cusp points on the house circle. The points where they + * cross the ecliptic mark the ecliptic house cusps." + * + * Description of the algorithm: + * Transform into great circle running through Asc and zenit (where arc + * between Asc and zenith is always 90 deg), and then return with + * house cusps into ecliptic. Eg. solve trigonometrical triangle + * with three transformations and two rotations starting from ecliptic. + * House cusps in space are meridian circles. + * + * Notes: + * 1. In this definition we assume MC on ecliptic as point where + * half-meridian (from north to south pole) cuts ecliptic, + * so MC may be below horizon in arctic regions. + * 2. Houses could be calculated in all latitudes except the poles + * themselves (-90,90) and points on arctic circle in cases where + * ecliptic is equal to horizon and then ascendant is undefined. + * But ascendant when 'horizon=ecliptic' could be deduced as limes + * from both sides of that point and houses with that provision can + * be computed also there. + * + * Starting values for calculations: + * - Asc ecliptic longitude + * - right ascension of MC (RAMC) + * - geographic latitude. + */ + /* + * within polar circle we swap AC/DC if AC is on wrong side + */ + acmc = swe_difdeg2n(hsp->ac, hsp->mc); + if (acmc < 0) { + hsp->ac = swe_degnorm(hsp->ac + 180); + } + /* A0. Start point - ecliptic coords of ascendant */ + x[0] = hsp->ac; /* Asc longitude */ + x[1] = 0.0; /* Asc declination */ + x[2] = 1.0; /* Radius to test validity of subsequent transformations. */ + swe_cotrans(x, x, -ekl); /* A1. Transform into equatorial coords */ + x[0] = x[0] - (th-90); /* A2. Rotate */ + swe_cotrans(x, x, -(90-fi)); /* A3. Transform into horizontal coords */ + krHorizonLon = x[0]; /* ...save asc lon on horizon to get back later with house cusp */ + x[0] = x[0] - x[0]; /* A4. Rotate */ + swe_cotrans(x, x, -90); /* A5. Transform into this house system great circle (asc-zenith) */ + /* As it is house circle now, simple add 30 deg increments... */ + for(i = 0; i < 6; i++) { + /* B0. Set 'n-th' house cusp. + * Note that IC/MC are also calculated here to check + * if really this is the asc-zenith great circle. */ + x[0] = 30.0*i; + x[1] = 0.0; + swe_cotrans(x, x, 90); /* B1. Transform back into horizontal coords */ + x[0] = x[0] + krHorizonLon; /* B2. Rotate back. */ + swe_cotrans(x, x, 90-fi); /* B3. Transform back into equatorial coords */ + x[0] = swe_degnorm(x[0] + (th-90)); /* B4. Rotate back -> RA of house cusp as result. */ + /* B5. Where's this house cusp on ecliptic? */ + /* ... so last but not least - get ecliptic longitude of house cusp: */ + hsp->cusp[i+1] = atand(tand(x[0])/cosd(ekl)); + if (x[0] > 90 && x[0] <= 270) + hsp->cusp[i+1] = swe_degnorm(hsp->cusp[i+1] + 180); + hsp->cusp[i+1] = swe_degnorm(hsp->cusp[i+1]); + hsp->cusp[i+7] = swe_degnorm(hsp->cusp[i+1]+180); + } + break; + default: /* Placidus houses */ +#ifndef _WINDOWS + if (hsy != 'P') + fprintf (stderr, "swe_houses: make Placidus, unknown key %c\n", hsy); +#endif + if (fabs(fi) >= 90 - ekl) { /* within polar circle */ + retc = ERR; + goto porphyry; + } + a = asind(tand(fi) * tane); + fh1 = atand(sind(a / 3) / tane); + fh2 = atand(sind(a * 2 / 3) / tane); + /* ************ house 11 ******************** */ + rectasc = swe_degnorm(30 + th); + tant = tand(asind(sine * sind(Asc1 (rectasc, fh1, sine, cose)))); + if (fabs(tant) < VERY_SMALL) { + hsp->cusp [11] = rectasc; + } else { + /* pole height */ + f = atand(sind(asind(tanfi * tant) / 3) /tant); + hsp->cusp [11] = Asc1 (rectasc, f, sine, cose); + for (i = 1; i <= iteration_count; i++) { + tant = tand(asind(sine * sind(hsp->cusp [11]))); + if (fabs(tant) < VERY_SMALL) { + hsp->cusp [11] = rectasc; + break; + } + /* pole height */ + f = atand(sind(asind(tanfi * tant) / 3) / tant); + hsp->cusp [11] = Asc1 (rectasc, f, sine, cose); + } + } + /* ************ house 12 ******************** */ + rectasc = swe_degnorm(60 + th); + tant = tand(asind(sine*sind(Asc1 (rectasc, fh2, sine, cose)))); + if (fabs(tant) < VERY_SMALL) { + hsp->cusp [12] = rectasc; + } else { + f = atand(sind(asind(tanfi * tant) / 1.5) / tant); + /* pole height */ + hsp->cusp [12] = Asc1 (rectasc, f, sine, cose); + for (i = 1; i <= iteration_count; i++) { + tant = tand(asind(sine * sind(hsp->cusp [12]))); + if (fabs(tant) < VERY_SMALL) { + hsp->cusp [12] = rectasc; + break; + } + f = atand(sind(asind(tanfi * tant) / 1.5) / tant); + /* pole height */ + hsp->cusp [12] = Asc1 (rectasc, f, sine, cose); + } + } + /* ************ house 2 ******************** */ + rectasc = swe_degnorm(120 + th); + tant = tand(asind(sine * sind(Asc1 (rectasc, fh2, sine, cose)))); + if (fabs(tant) < VERY_SMALL) { + hsp->cusp [2] = rectasc; + } else { + f = atand(sind(asind(tanfi * tant) / 1.5) / tant); + /* pole height */ + hsp->cusp [2] = Asc1 (rectasc, f, sine, cose); + for (i = 1; i <= iteration_count; i++) { + tant = tand(asind(sine * sind(hsp->cusp [2]))); + if (fabs(tant) < VERY_SMALL) { + hsp->cusp [2] = rectasc; + break; + } + f = atand(sind(asind(tanfi * tant) / 1.5) / tant); + /* pole height */ + hsp->cusp [2] = Asc1 (rectasc, f, sine, cose); + } + } + /* ************ house 3 ******************** */ + rectasc = swe_degnorm(150 + th); + tant = tand(asind(sine * sind(Asc1 (rectasc, fh1, sine, cose)))); + if (fabs(tant) < VERY_SMALL) { + hsp->cusp [3] = rectasc; + } else { + f = atand(sind(asind(tanfi * tant) / 3) / tant); + /* pole height */ + hsp->cusp [3] = Asc1(rectasc, f, sine, cose); + for (i = 1; i <= iteration_count; i++) { + tant = tand(asind(sine * sind(hsp->cusp [3]))); + if (fabs(tant) < VERY_SMALL) { + hsp->cusp [3] = rectasc; + break; + } + f = atand(sind(asind(tanfi * tant) / 3) / tant); + /* pole height */ + hsp->cusp [3] = Asc1 (rectasc, f, sine, cose); + } + } + break; + } /* end switch */ + if (hsy != 'G') { + hsp->cusp [4] = swe_degnorm(hsp->cusp [10] + 180); + hsp->cusp [5] = swe_degnorm(hsp->cusp [11] + 180); + hsp->cusp [6] = swe_degnorm(hsp->cusp [12] + 180); + hsp->cusp [7] = swe_degnorm(hsp->cusp [1] + 180); + hsp->cusp [8] = swe_degnorm(hsp->cusp [2] + 180); + hsp->cusp [9] = swe_degnorm(hsp->cusp [3] + 180); + } + /* vertex */ + if (fi >= 0) + f = 90 - fi; + else + f = -90 - fi; + hsp->vertex = Asc1 (th - 90, f, sine, cose); + /* with tropical latitudes, the vertex behaves strange, + * in a similar way as the ascendant within the polar + * circle. we keep it always on the western hemisphere.*/ + if (fabs(fi) <= ekl) { + vemc = swe_difdeg2n(hsp->vertex, hsp->mc); + if (vemc > 0) + hsp->vertex = swe_degnorm(hsp->vertex + 180); + } + /* + * some strange points: + */ + /* equasc (equatorial ascendant) */ + th2 = swe_degnorm(th + 90); + if (fabs(th2 - 90) > VERY_SMALL + && fabs(th2 - 270) > VERY_SMALL) { + tant = tand(th2); + hsp->equasc = atand(tant / cose); + if (th2 > 90 && th2 <= 270) + hsp->equasc = swe_degnorm(hsp->equasc + 180); + } else { + if (fabs(th2 - 90) <= VERY_SMALL) + hsp->equasc = 90; + else + hsp->equasc = 270; + } /* if */ + hsp->equasc = swe_degnorm(hsp->equasc); + /* "co-ascendant" W. Koch */ + hsp->coasc1 = swe_degnorm(Asc1 (th - 90, fi, sine, cose) + 180); + /* "co-ascendant" M. Munkasey */ + if (fi >= 0) + hsp->coasc2 = Asc1 (th + 90, 90 - fi, sine, cose); + else /* southern hemisphere */ + hsp->coasc2 = Asc1 (th + 90, -90 - fi, sine, cose); + /* "polar ascendant" M. Munkasey */ + hsp->polasc = Asc1 (th - 90, fi, sine, cose); + return retc; +} /* procedure houses */ + +/******************************/ +static double Asc1 (double x1, double f, double sine, double cose) +{ + int n; + double ass; + x1 = swe_degnorm(x1); + n = (int) ((x1 / 90) + 1); + if (n == 1) + ass = ( Asc2 (x1, f, sine, cose)); + else if (n == 2) + ass = (180 - Asc2 (180 - x1, - f, sine, cose)); + else if (n == 3) + ass = (180 + Asc2 (x1 - 180, - f, sine, cose)); + else + ass = (360 - Asc2 (360- x1, f, sine, cose)); + ass = swe_degnorm(ass); + if (fabs(ass - 90) < VERY_SMALL) /* rounding, e.g.: if */ + ass = 90; /* fi = 0 & st = 0, ac = 89.999... */ + if (fabs(ass - 180) < VERY_SMALL) + ass = 180; + if (fabs(ass - 270) < VERY_SMALL) /* rounding, e.g.: if */ + ass = 270; /* fi = 0 & st = 0, ac = 89.999... */ + if (fabs(ass - 360) < VERY_SMALL) + ass = 0; + return ass; +} /* Asc1 */ + +static double Asc2 (double x, double f, double sine, double cose) +{ + double ass, sinx; + ass = - tand(f) * sine + cose * cosd(x); + if (fabs(ass) < VERY_SMALL) + ass = 0; + sinx = sind(x); + if (fabs(sinx) < VERY_SMALL) + sinx = 0; + if (sinx == 0) { + if (ass < 0) + ass = -VERY_SMALL; + else + ass = VERY_SMALL; + } else if (ass == 0) { + if (sinx < 0) + ass = -90; + else + ass = 90; + } else { + ass = atand(sinx / ass); + } + if (ass < 0) + ass = 180 + ass; + return (ass); +} /* Asc2 */ + + +/* Computes the house position of a planet or another point, + * in degrees: 0 - 30 = 1st house, 30 - 60 = 2nd house, etc. + * armc sidereal time in degrees + * geolat geographic latitude + * eps true ecliptic obliquity + * hsys house system character + * xpin array of 6 doubles: + * only the first two of them are used: ecl. long., lat. + * serr error message area + * + * House position is returned by function. + * + * IMPORTANT: This function should NOT be used for sidereal astrology. + * If you cannot avoid doing so, please note: + * - The input longitudes (xpin) MUST always be tropical, even if you + * are a siderealist. + * - Sidereal and tropical house positions are identical for most house + * systems, if a traditional definition of the sidereal zodiac is used + * (sid = trop - ayanamsa). + * - The function does NOT provide correct positions for Whole Sign houses. + * - The function does NOT provide correct positions, if you use a + * non-traditional sidereal method (where the sidereal plane is not + * identical to the ecliptic of date) with a house system whose definition + * is dependent on the ecliptic, such as: + * equal, Porphyry, Alcabitius, Koch, Krusinski (all others should work). + * The Swiss Ephemeris currently does not handle these cases. + */ +double FAR PASCAL_CONV swe_house_pos( + double armc, double geolat, double eps, int hsys, double *xpin, char *serr) +{ + double xp[6], xeq[6], ra, de, mdd, mdn, sad, san; + double hpos, sinad, ad, a, admc, adp, samc, demc, asc, mc, acmc, tant; + double fh, ra0, tanfi, fac, dfac; + double x[3], xasc[3], raep, raaz, oblaz, xtemp; /* BK 21.02.2006 */ + double sine = sind(eps); + double cose = cosd(eps); + AS_BOOL is_above_hor = FALSE; + AS_BOOL is_invalid = FALSE; + AS_BOOL is_circumpolar = FALSE; + if (serr != NULL) + *serr = '\0'; + hsys = toupper(hsys); + xeq[0] = xpin[0]; + xeq[1] = xpin[1]; + xeq[2] = 1; + swe_cotrans(xpin, xeq, -eps); + ra = xeq[0]; + de = xeq[1]; + mdd = swe_degnorm(ra - armc); + mdn = swe_degnorm(mdd + 180); + if (mdd >= 180) + mdd -= 360; + if (mdn >= 180) + mdn -= 360; + /* xp[0] will contain the house position, a value between 0 and 360 */ + switch(hsys) { + case 'A': + case 'E': + case 'V': + case 'W': + asc = Asc1 (swe_degnorm(armc + 90), geolat, sine, cose); + demc = atand(sind(armc) * tand(eps)); + if (geolat >= 0 && 90 - geolat + demc < 0) + asc = swe_degnorm(asc + 180); + if (geolat < 0 && -90 - geolat + demc > 0) + asc = swe_degnorm(asc + 180); + xp[0] = swe_degnorm(xpin[0] - asc); + if (hsys == 'V') + xp[0] = swe_degnorm(xp[0] + 15); + if (hsys == 'W') + xp[0] = swe_degnorm(xp[0] + fmod(asc, 30)); + /* to make sure that a call with a house cusp position returns + * a value within the house, 0.001" is added */ + xp[0] = swe_degnorm(xp[0] + MILLIARCSEC); + hpos = xp[0] / 30.0 + 1; + break; + case 'O': /* Porphyry */ + case 'B': /* Alcabitius */ + asc = Asc1 (swe_degnorm(armc + 90), geolat, sine, cose); + demc = atand(sind(armc) * tand(eps)); + /* mc */ + if (fabs(armc - 90) > VERY_SMALL + && fabs(armc - 270) > VERY_SMALL) { + tant = tand(armc); + mc = swe_degnorm(atand(tant / cose)); + if (armc > 90 && armc <= 270) + mc = swe_degnorm(mc + 180); + } else { + if (fabs(armc - 90) <= VERY_SMALL) + mc = 90; + else + mc = 270; + } + /* while MC is always south, + * Asc must always be in eastern hemisphere */ + if (geolat >= 0 && 90 - geolat + demc < 0) { + asc = swe_degnorm(asc + 180); + } + if (geolat < 0 && -90 - geolat + demc > 0) { + asc = swe_degnorm(asc + 180); + } + if (hsys == 'O') { + xp[0] = swe_degnorm(xpin[0] - asc); + /* to make sure that a call with a house cusp position returns + * a value within the house, 0.001" is added */ + xp[0] = swe_degnorm(xp[0] + MILLIARCSEC); + if (xp[0] < 180) + hpos = 1; + else { + hpos = 7; + xp[0] -= 180; + } + acmc = swe_difdeg2n(asc, mc); + if (xp[0] < 180 - acmc) + hpos += xp[0] * 3 / (180 - acmc); + else + hpos += 3 + (xp[0] - 180 + acmc) * 3 / acmc; + } else { /* Alcabitius */ + double dek, r, sna, sda; + dek = asind(sind(asc) * sine); /* declination of Ascendant */ + /* must treat the case fi == 90 or -90 */ + tanfi = tand(geolat); + r = -tanfi * tand(dek); + /* must treat the case of abs(r) > 1; probably does not happen + * because dek becomes smaller when fi is large, as ac is close to + * zero Aries/Libra in that case. + */ + sda = acos(r) * RADTODEG; /* semidiurnal arc, measured on equator */ + sna = 180 - sda; /* complement, seminocturnal arc */ + if (mdd > 0) { + if (mdd < sda) + hpos = mdd * 90 / sda; + else + hpos = 90 + (mdd - sda) * 90 / sna; + } else { + if (mdd > -sna) + hpos = 360 + mdd * 90 / sna; + else + hpos = 270 + (mdd + sna) * 90 / sda; + } + hpos = swe_degnorm(hpos - 90) / 30.0 + 1.0; + if (hpos >= 13.0) hpos -= 12; + } + break; + case 'X': /* Merdidian or axial rotation system */ + hpos = swe_degnorm(mdd - 90) / 30.0 + 1.0; + break; + case 'M': { /* Morinus */ + double a = xpin[0]; + if (fabs(a - 90) > VERY_SMALL + && fabs(a - 270) > VERY_SMALL) { + tant = tand(a); + hpos = atand(tant / cose); + if (a > 90 && a <= 270) + hpos = swe_degnorm(hpos + 180); + } else { + if (fabs(a - 90) <= VERY_SMALL) + hpos = 90; + else + hpos = 270; + } /* if */ + hpos = swe_degnorm(hpos - armc - 90); + hpos = hpos / 30.0 + 1; + } + break; +#if 0 + /* old version of Koch method */ + case 'K': + demc = atand(sind(armc) * tand(eps)); + /* if body is within circumpolar region, error */ + if (90 - fabs(geolat) <= fabs(de)) { + if (serr != NULL) + strcpy(serr, "no Koch house position, because planet is circumpolar."); + xp[0] = 0; + hpos = 0; /* Error */ + } else if (90 - fabs(geolat) <= fabs(demc)) { + if (serr != NULL) + strcpy(serr, "no Koch house position, because mc is circumpolar."); + xp[0] = 0; + hpos = 0; /* Error */ + } else { + admc = asind(tand(eps) * tand(geolat) * sind(armc)); + adp = asind(tand(geolat) * tand(de)); + samc = 90 + admc; + if (mdd >= 0) { /* east */ + xp[0] = swe_degnorm(((mdd - adp + admc) / samc - 1) * 90); + } else { + xp[0] = swe_degnorm(((mdd + 180 + adp + admc) / samc + 1) * 90); + } + /* to make sure that a call with a house cusp position returns + * a value within the house, 0.001" is added */ + xp[0] = swe_degnorm(xp[0] + MILLIARCSEC); + hpos = xp[0] / 30.0 + 1; + } + break; +#endif + /* version of Koch method: do calculations within circumpolar circle, + * if possible; make sure house positions 4 - 9 only appear on western + * hemisphere */ + case 'K': + demc = atand(sind(armc) * tand(eps)); + is_invalid = FALSE; + is_circumpolar = FALSE; + /* object is within a circumpolar circle */ + if (90 - geolat < de || -90 - geolat > de) { + adp = 90; + is_circumpolar = TRUE; + } + /* object is within a circumpolar circle, southern hemisphere */ + else if (geolat - 90 > de || geolat + 90 < de) { + adp = -90; + is_circumpolar = TRUE; + } + /* object does rise and set */ + else { + adp = asind(tand(geolat) * tand(de)); + } +#if 0 + if (fabs(adp) == 90) + is_invalid = TRUE; /* omit this to use the above values */ +#endif + admc = tand(eps) * tand(geolat) * sind(armc); + /* midheaven is circumpolar */ + if (fabs(admc) > 1) { +#if 0 + is_invalid = TRUE; /* omit this line to use the below values */ +#endif + if (admc > 1) + admc = 1; + else + admc = -1; + is_circumpolar = TRUE; + } + admc = asind(admc); + samc = 90 + admc; + if (samc == 0) + is_invalid = TRUE; + if (fabs(samc) > 0) { + if (mdd >= 0) { /* east */ + dfac = (mdd - adp + admc) / samc; + xp[0] = swe_degnorm((dfac - 1) * 90); + xp[0] = swe_degnorm(xp[0] + MILLIARCSEC); + /* eastern object has longer SA than midheaven */ + if (dfac > 2 || dfac < 0) + is_invalid = TRUE; /* if this is omitted, funny things happen */ + } else { + dfac = (mdd + 180 + adp + admc) / samc; + xp[0] = swe_degnorm((dfac + 1) * 90); + xp[0] = swe_degnorm(xp[0] + MILLIARCSEC); + /* western object has longer SA than midheaven */ + if (dfac > 2 || dfac < 0) + is_invalid = TRUE; /* if this is omitted, funny things happen */ + } + } + if (is_invalid) { + xp[0] = 0; + hpos = 0; + if (serr != NULL) + strcpy(serr, "Koch house position failed in circumpolar area"); + break; + } + if (is_circumpolar) { + if (serr != NULL) + strcpy(serr, "Koch house position, doubtful result in circumpolar area"); + } + /* to make sure that a call with a house cusp position returns + * a value within the house, 0.001" is added */ + hpos = xp[0] / 30.0 + 1; + break; + case 'C': + xeq[0] = swe_degnorm(mdd - 90); + swe_cotrans(xeq, xp, -geolat); + /* to make sure that a call with a house cusp position returns + * a value within the house, 0.001" is added */ + xp[0] = swe_degnorm(xp[0] + MILLIARCSEC); + hpos = xp[0] / 30.0 + 1; + break; + case 'U': /* Krusinski-Pisa-Goelzer */ + /* Purpose: find point where planet's house circle (meridian) + * cuts house plane, giving exact planet's house position. + * Input data: ramc, geolat, asc. + */ + asc = Asc1 (swe_degnorm(armc + 90), geolat, sine, cose); + demc = atand(sind(armc) * tand(eps)); + /* while MC is always south, + * Asc must always be in eastern hemisphere */ + if (geolat >= 0 && 90 - geolat + demc < 0) { + asc = swe_degnorm(asc + 180); + } + if (geolat < 0 && -90 - geolat + demc > 0) { + asc = swe_degnorm(asc + 180); + } + /* + * Descr: find the house plane 'asc-zenith' - where it intersects + * with equator and at what angle, and then simple find arc + * from asc on that plane to planet's meridian intersection + * with this plane. + */ + /* I. find plane of 'asc-zenith' great circle relative to equator: + * solve spherical triangle 'EP-asc-intersection of house circle with equator' */ + /* Ia. Find intersection of house plane with equator: */ + x[0] = asc; x[1] = 0.0; x[2] = 1.0; /* 1. Start with ascendent on ecliptic */ + swe_cotrans(x, x, -eps); /* 2. Transform asc into equatorial coords */ + raep = swe_degnorm(armc + 90); /* 3. RA of east point */ + x[0] = swe_degnorm(raep - x[0]); /* 4. Rotation - found arc raas-raep */ + swe_cotrans(x, x, -(90-geolat)); /* 5. Transform into horizontal coords - arc EP-asc on horizon */ + xtemp = atand(tand(x[0])/cosd((90-geolat))); /* 6. Rotation from horizon on circle perpendicular to equator */ + if (x[0] > 90 && x[0] <= 270) + xtemp = swe_degnorm(xtemp + 180); + x[0] = swe_degnorm(xtemp); + raaz = swe_degnorm(raep - x[0]); /* result: RA of intersection 'asc-zenith' great circle with equator */ + /* Ib. Find obliquity to equator of 'asc-zenith' house plane: */ + x[0] = raaz; x[1] = 0.0; + x[0] = swe_degnorm(raep - x[0]); /* 1. Rotate start point relative to EP */ + swe_cotrans(x, x, -(90-geolat)); /* 2. Transform into horizontal coords */ + x[1] = x[1] + 90; /* 3. Add 90 deg do decl - so get the point on house plane most distant from equ. */ + swe_cotrans(x, x, 90-geolat); /* 4. Rotate back to equator */ + oblaz = x[1]; /* 5. Obliquity of house plane to equator */ + /* II. Next find asc and planet position on house plane, + * so to find relative distance of planet from + * coords beginning. */ + /* IIa. Asc on house plane relative to intersection + * of equator with 'asc-zenith' plane. */ + xasc[0] = asc; xasc[1] = 0.0; xasc[2] = 1.0; + swe_cotrans(xasc, xasc, -eps); + xasc[0] = swe_degnorm(xasc[0] - raaz); + xtemp = atand(tand(xasc[0])/cosd(oblaz)); + if (xasc[0] > 90 && xasc[0] <= 270) + xtemp = swe_degnorm(xtemp + 180); + xasc[0] = swe_degnorm(xtemp); + /* IIb. Planet on house plane relative to intersection + * of equator with 'asc-zenith' plane */ + xp[0] = swe_degnorm(xeq[0] - raaz); /* Rotate on equator */ + xtemp = atand(tand(xp[0])/cosd(oblaz)); /* Find arc on house plane from equator */ + if (xp[0] > 90 && xp[0] <= 270) + xtemp = swe_degnorm(xtemp + 180); + xp[0] = swe_degnorm(xtemp); + xp[0] = swe_degnorm(xp[0]-xasc[0]); /* find arc between asc and planet, and get planet house position */ + /* IIc. Distance from planet to house plane on declination circle: */ + x[0] = xeq[0]; + x[1] = xeq[1]; + swe_cotrans(x, x, oblaz); + xp[1] = xeq[1] - x[1]; /* How many degrees is the point on declination circle from house circle */ + /* to make sure that a call with a house cusp position returns + * a value within the house, 0.001" is added */ + xp[0] = swe_degnorm(xp[0] + MILLIARCSEC); + hpos = xp[0] / 30.0 + 1; + break; + case 'H': + xeq[0] = swe_degnorm(mdd - 90); + swe_cotrans(xeq, xp, 90 - geolat); + /* to make sure that a call with a house cusp position returns + * a value within the house, 0.001" is added */ + xp[0] = swe_degnorm(xp[0] + MILLIARCSEC); + hpos = xp[0] / 30.0 + 1; + break; + case 'R': + if (fabs(mdd) < VERY_SMALL) + xp[0] = 270; + else if (180 - fabs(mdd) < VERY_SMALL) + xp[0] = 90; + else { + if (90 - fabs(geolat) < VERY_SMALL) { + if (geolat > 0) + geolat = 90 - VERY_SMALL; + else + geolat = -90 + VERY_SMALL; + } + if (90 - fabs(de) < VERY_SMALL) { + if (de > 0) + de = 90 - VERY_SMALL; + else + de = -90 + VERY_SMALL; + } + a = tand(geolat) * tand(de) + cosd(mdd); + xp[0] = swe_degnorm(atand(-a / sind(mdd))); + if (mdd < 0) + xp[0] += 180; + xp[0] = swe_degnorm(xp[0]); + /* to make sure that a call with a house cusp position returns + * a value within the house, 0.001" is added */ + xp[0] = swe_degnorm(xp[0] + MILLIARCSEC); + } + hpos = xp[0] / 30.0 + 1; + break; + case 'T': + mdd = swe_degnorm(mdd); + if (de > 90 - VERY_SMALL) + de = 90 - VERY_SMALL; + if (de < -90 + VERY_SMALL) + de = -90 + VERY_SMALL; + sinad = tand(de) * tand(geolat); + ad = asind(sinad); + a = sinad + cosd(mdd); + if (a >= 0) + is_above_hor = TRUE; + /* mirror everything below the horizon to the opposite point + * above the horizon */ + if (!is_above_hor) { + ra = swe_degnorm(ra + 180); + de = -de; + mdd = swe_degnorm(mdd + 180); + } + /* mirror everything on western hemisphere to eastern hemisphere */ + if (mdd > 180) { + ra = swe_degnorm(armc - mdd); + } + /* binary search for "topocentric" position line of body */ + tanfi = tand(geolat); + fh = geolat; + ra0 = swe_degnorm(armc + 90); + xp[1] = 1; + xeq[1] = de; + fac = 2; + while (fabs(xp[1]) > 0.000001) { + if (xp[1] > 0) { + fh = atand(tand(fh) - tanfi / fac); + ra0 -= 90 / fac; + } else { + fh = atand(tand(fh) + tanfi / fac); + ra0 += 90 / fac; + } + xeq[0] = swe_degnorm(ra - ra0); + swe_cotrans(xeq, xp, 90 - fh); + fac *= 2; + } + hpos = swe_degnorm(ra0 - armc); + /* mirror back to west */ + if (mdd > 180) + hpos = swe_degnorm(-hpos); + /* mirror back to below horizon */ + if (!is_above_hor) + hpos = swe_degnorm(hpos + 180); + hpos = swe_degnorm(hpos - 90) / 30 + 1; + break; + case 'P': + case 'G': + default: + /* circumpolar region */ + if (90 - fabs(de) <= fabs(geolat)) { + if (de * geolat < 0) + xp[0] = swe_degnorm(90 + mdn / 2); + else + xp[0] = swe_degnorm(270 + mdd / 2); + if (serr != NULL) + strcpy(serr, "Otto Ludwig procedure within circumpolar regions."); + } else { + sinad = tand(de) * tand(geolat); + ad = asind(sinad); + a = sinad + cosd(mdd); + if (a >= 0) + is_above_hor = TRUE; + sad = 90 + ad; + san = 90 - ad; + if (is_above_hor) + xp[0] = (mdd / sad + 3) * 90; + else + xp[0] = (mdn / san + 1) * 90; + /* to make sure that a call with a house cusp position returns + * a value within the house, 0.001" is added */ + xp[0] = swe_degnorm(xp[0] + MILLIARCSEC); + } + if (hsys == 'G') { + xp[0] = 360 - xp[0]; /* Gauquelin sectors are in clockwise direction */ + hpos = xp[0] / 10.0 + 1; + } else { + hpos = xp[0] / 30.0 + 1; + } + break; + } + return hpos; +} diff --git a/swe/src/swehouse.h b/swe/src/swehouse.h new file mode 100644 index 0000000..34d9361 --- /dev/null +++ b/swe/src/swehouse.h @@ -0,0 +1,85 @@ +/******************************************************* +$Header: /home/dieter/sweph/RCS/swehouse.h,v 1.74 2008/06/16 10:07:20 dieter Exp $ +module swehouse.h +house and (simple) aspect calculation + +*******************************************************/ + +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + +struct houses { + double cusp[37]; + double ac; + double mc; + double vertex; + double equasc; + double coasc1; + double coasc2; + double polasc; + }; + +#define HOUSES struct houses +#define VERY_SMALL 1E-10 + +#define degtocs(x) (d2l((x) * DEG)) +#define cstodeg(x) (double)((x) * CS2DEG) + +#define sind(x) sin(x * DEGTORAD) +#define cosd(x) cos(x * DEGTORAD) +#define tand(x) tan(x * DEGTORAD) +#define asind(x) (asin(x) * RADTODEG) +#define acosd(x) (acos(x) * RADTODEG) +#define atand(x) (atan(x) * RADTODEG) +#define atan2d(y, x) (atan2(y, x) * RADTODEG) diff --git a/swe/src/swejpl.c b/swe/src/swejpl.c new file mode 100644 index 0000000..d52e437 --- /dev/null +++ b/swe/src/swejpl.c @@ -0,0 +1,937 @@ + +/* + | $Header: /home/dieter/sweph/RCS/swejpl.c,v 1.76 2008/08/26 13:55:36 dieter Exp $ + | + | Subroutines for reading JPL ephemerides. + | derived from testeph.f as contained in DE403 distribution July 1995. + | works with DE200, DE102, DE403, DE404, DE405, DE406. + | (attention, DE102 has 1950 reference frame and also DE4* has slightly + | different reference frame from DE200. With DE4*, use routine + | IERS_FK5().) + + Authors: Dieter Koch and Alois Treindl, Astrodienst Zurich + +************************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + + +#include +#include "swephexp.h" +#include "sweph.h" +#include "swejpl.h" + +#define DEBUG_DO_SHOW FALSE + +#ifndef NO_JPL +/* + * local globals + */ +struct jpl_save { + char *jplfname; + char *jplfpath; + FILE *jplfptr; + short do_reorder; + double eh_cval[400]; + double eh_ss[3], eh_au, eh_emrat; + int32 eh_denum, eh_ncon, eh_ipt[39]; + char ch_cnam[6*400]; + double pv[78]; + double pvsun[6]; + double buf[1500]; + double pc[18], vc[18], ac[18], jc[18]; + short do_km; +}; + +static struct jpl_save *FAR js; + +static int state (double et, int32 *list, int do_bary, + double *pv, double *pvsun, double *nut, char *serr); +static int interp(double FAR *buf, double t, double intv, int32 ncfin, + int32 ncmin, int32 nain, int32 ifl, double *pv); +static int32 fsizer(char *serr); +static void reorder(char *x, int size, int number); +static int read_const_jpl(double *ss, char *serr); + +/* information about eh_ipt[] and buf[] +DE200 DE102 DE403 +3 3 ipt[0] 3 body 0 (mercury) starts at buf[2] +12 15 ipt[1] 14 body 0, ncf = coefficients per component +4 2 ipt[2] 4 na = nintervals, tot 14*4*3=168 +147 93 ipt[3] 171 body 1 (venus) starts at buf[170] +12 15 ipt[4] 10 ncf = coefficients per component +1 1 ipt[5] 2 total 10*2*3=60 +183 138 ipt[6] 231 body 2 (earth) starts at buf[230] +15 15 ipt[7] 13 ncf = coefficients per component +2 2 ipt[8] 2 total 13*2*3=78 +273 228 ipt[9] 309 body 3 (mars) starts at buf[308] +10 10 ipt[10] 11 ncf = coefficients per component +1 1 ipt[11] 1 total 11*1*3=33 +303 258 ipt[12] 342 body 4 (jupiter) at buf[341] +9 9 ipt[13] 8 total 8 * 1 * 3 = 24 +1 1 ipt[14] 1 +330 285 ipt[15] 366 body 5 (saturn) at buf[365] +8 8 ipt[16] 7 total 7 * 1 * 3 = 21 +1 1 ipt[17] 1 +354 309 ipt[18] 387 body 6 (uranus) at buf[386] +8 8 ipt[19] 6 total 6 * 1 * 3 = 18 +1 1 ipt[20] 1 +378 333 ipt[21] 405 body 7 (neptune) at buf[404] +6 6 ipt[22] 6 total 18 +1 1 ipt[23] 1 +396 351 ipt[24] 423 body 8 (pluto) at buf[422] +6 6 ipt[25] 6 total 18 +1 1 ipt[26] 1 +414 369 ipt[27] 441 body 9 (moon) at buf[440] +12 15 ipt[28] 13 total 13 * 8 * 3 = 312 +8 8 ipt[29] 8 +702 729 ipt[30] 753 SBARY SUN, starts at buf[752] +15 15 ipt[31] 11 SBARY SUN, ncf = coeff per component +1 1 ipt[32] 2 total 11*2*3=66 +747 774 ipt[33] 819 nutations, starts at buf[818] +10 0 ipt[34] 10 total 10 * 4 * 2 = 80 +4 0 ipt[35] 4 (nutation only two coordinates) +0 0 ipt[36] 899 librations, start at buf[898] +0 0 ipt[37] 10 total 10 * 4 * 3 = 120 +0 0 ipt[38] 4 + + last element of buf[1017] + buf[0] contains start jd and buf[1] end jd of segment; + each segment is 32 days in de403, 64 days in DE102, 32 days in DE200 + + Length of blocks: DE406 = 1456*4=5824 bytes = 728 double + DE405 = 2036*4=8144 bytes = 1018 double + DE404 = 1456*4=5824 bytes = 728 double + DE403 = 2036*4=8144 bytes = 1018 double + DE200 = 1652*4=6608 bytes = 826 double + DE102 = 1546*4=6184 bytes = 773 double + each DE102 record has 53*8=424 fill bytes so that + the records have the same length as DE200. +*/ + +/* + * This subroutine opens the file jplfname, with a phony record length, + * reads the first record, and uses the info to compute ksize, + * the number of single precision words in a record. + * RETURN: ksize (record size of ephemeris data) + * jplfptr is opened on return. + * note 26-aug-2008: now record size is computed by fsizer(), not + * set to a fixed value depending as in previous releases. The caller of + * fsizer() will verify by data comparison whether it computed correctly. + */ +static int32 fsizer(char *serr) +{ + /* Local variables */ + int32 ncon; + double emrat; + int32 numde; + double au, ss[3]; + int i, kmx, khi, nd; + int32 ksize, lpt[3]; + char ttl[6*14*3]; + if ((js->jplfptr = swi_fopen(SEI_FILE_PLANET, js->jplfname, js->jplfpath, serr)) == NULL) { + return NOT_AVAILABLE; + } + /* ttl = ephemeris title, e.g. + * "JPL Planetary Ephemeris DE404/LE404 + * Start Epoch: JED= 625296.5-3001 DEC 21 00:00:00 + * Final Epoch: JED= 2817168.5 3001 JAN 17 00:00:00c */ + fread((void *) &ttl[0], 1, 252, js->jplfptr); + /* cnam = names of constants */ + fread((void *) js->ch_cnam, 1, 6*400, js->jplfptr); + /* ss[0] = start epoch of ephemeris + * ss[1] = end epoch + * ss[2] = segment size in days */ + fread((void *) &ss[0], sizeof(double), 3, js->jplfptr); + /* reorder ? */ + if (ss[2] < 1 || ss[2] > 200) + js->do_reorder = TRUE; + else + js->do_reorder = 0; + for (i = 0; i < 3; i++) + js->eh_ss[i] = ss[i]; + if (js->do_reorder) + reorder((char *) &js->eh_ss[0], sizeof(double), 3); + /* plausibility test of these constants. Start and end date must be + * between -20000 and +20000, segment size >= 1 and <= 200 */ + if (js->eh_ss[0] < -5583942 || js->eh_ss[1] > 9025909 || js->eh_ss[2] < 1 || js->eh_ss[2] > 200) { + if (serr != NULL) + sprintf(serr, "alleged ephemeris file (%s) has invalid format.", js->jplfname); + return(NOT_AVAILABLE); + } + /* ncon = number of constants */ + fread((void *) &ncon, sizeof(int32), 1, js->jplfptr); + if (js->do_reorder) + reorder((char *) &ncon, sizeof(int32), 1); + /* au = astronomical unit */ + fread((void *) &au, sizeof(double), 1, js->jplfptr); + if (js->do_reorder) + reorder((char *) &au, sizeof(double), 1); + /* emrat = earth moon mass ratio */ + fread((void *) &emrat, sizeof(double), 1, js->jplfptr); + if (js->do_reorder) + reorder((char *) &emrat, sizeof(double), 1); + /* ipt[i+0]: coefficients of planet i start at buf[ipt[i+0]-1] + * ipt[i+1]: number of coefficients (interpolation order - 1) + * ipt[i+2]: number of intervals in segment */ + fread((void *) &js->eh_ipt[0], sizeof(int32), 36, js->jplfptr); + if (js->do_reorder) + reorder((char *) &js->eh_ipt[0], sizeof(int32), 36); + /* numde = number of jpl ephemeris "404" with de404 */ + fread((void *) &numde, sizeof(int32), 1, js->jplfptr); + if (js->do_reorder) + reorder((char *) &numde, sizeof(int32), 1); + /* read librations */ + fread(&lpt[0], sizeof(int32), 3, js->jplfptr); + if (js->do_reorder) + reorder((char *) &lpt[0], sizeof(int32), 3); + /* fill librations into eh_ipt[36]..[38] */ + for (i = 0; i < 3; ++i) + js->eh_ipt[i + 36] = lpt[i]; + rewind(js->jplfptr); + /* find the number of ephemeris coefficients from the pointers */ + /* re-activated this code on 26-aug-2008 */ + kmx = 0; + khi = 0; + for (i = 0; i < 13; i++) { + if (js->eh_ipt[i * 3] > kmx) { + kmx = js->eh_ipt[i * 3]; + khi = i + 1; + } + } + if (khi == 12) + nd = 2; + else + nd = 3; + ksize = (js->eh_ipt[khi * 3 - 3] + nd * js->eh_ipt[khi * 3 - 2] * js->eh_ipt[khi * 3 - 1] - 1L) * 2L; + /* + * de102 files give wrong ksize, because they contain 424 empty bytes + * per record. Fixed by hand! + */ + if (ksize == 1546) + ksize = 1652; +#if 0 /* we prefer to compute ksize to be comaptible + with new DE releases */ + switch (numde) { + case 403: + case 405: + case 410: + case 413: + case 414: + case 418: + case 421: + ksize = 2036; + break; + case 404: + case 406: + ksize = 1456; + break; + case 200: + ksize = 1652; + break; + case 102: + ksize = 1652; /* de102 is filled with blanks to length of de200 */ + break; + default: + if (serr != NULL) + sprintf(serr,"unknown numde value %d;", numde); + return ERR; + } +#endif + if (ksize < 1000 || ksize > 5000) { + if (serr != NULL) + sprintf(serr, "JPL ephemeris file does not provide valid ksize (%d)", ksize);/**/ + return NOT_AVAILABLE; + } + return ksize; +} + +/* + * This subroutine reads the jpl planetary ephemeris + * and gives the position and velocity of the point 'ntarg' + * with respect to 'ncent'. + * calling sequence parameters: + * et = d.p. julian ephemeris date at which interpolation + * is wanted. + * ** note the entry dpleph for a doubly-dimensioned time ** + * the reason for this option is discussed in the + * subroutine state + * ntarg = integer number of 'target' point. + * ncent = integer number of center point. + * the numbering convention for 'ntarg' and 'ncent' is: + * 0 = mercury 7 = neptune + * 1 = venus 8 = pluto + * 2 = earth 9 = moon + * 3 = mars 10 = sun + * 4 = jupiter 11 = solar-system barycenter + * 5 = saturn 12 = earth-moon barycenter + * 6 = uranus 13 = nutations (longitude and obliq) + * 14 = librations, if on eph file + * (if nutations are wanted, set ntarg = 13. for librations, + * set ntarg = 14. set ncent=0.) + * rrd = output 6-word d.p. array containing position and velocity + * of point 'ntarg' relative to 'ncent'. the units are au and + * au/day. for librations the units are radians and radians + * per day. in the case of nutations the first four words of + * rrd will be set to nutations and rates, having units of + * radians and radians/day. + * The option is available to have the units in km and km/sec. + * For this, set do_km=TRUE (default FALSE). + */ +int swi_pleph(double et, int ntarg, int ncent, double *rrd, char *serr) +{ + int i, retc; + int32 list[12]; + double FAR *pv = js->pv; + double FAR *pvsun = js->pvsun; + for (i = 0; i < 6; ++i) + rrd[i] = 0.0; + if (ntarg == ncent) + return 0; + for (i = 0; i < 12; ++i) + list[i] = 0; + /* check for nutation call */ + if (ntarg == J_NUT) { + if (js->eh_ipt[34] > 0) { + list[10] = 2; + return(state(et, list, FALSE, pv, pvsun, rrd, serr)); + } else { + if (serr != NULL) + sprintf(serr,"No nutations on the JPL ephemeris file;"); + return (NOT_AVAILABLE); + } + } + if (ntarg == J_LIB) { + if (js->eh_ipt[37] > 0) { + list[11] = 2; + if ((retc = state(et, list, FALSE, pv, pvsun, rrd, serr)) != OK) + return (retc); + for (i = 0; i < 6; ++i) + rrd[i] = pv[i + 60]; + return 0; + } else { + if (serr != NULL) + sprintf(serr,"No librations on the ephemeris file;"); + return (NOT_AVAILABLE); + } + } + /* set up proper entries in 'list' array for state call */ + if (ntarg < J_SUN) + list[ntarg] = 2; + if (ntarg == J_MOON) /* Mooon needs Earth */ + list[J_EARTH] = 2; + if (ntarg == J_EARTH) /* Earth needs Moon */ + list[J_MOON] = 2; + if (ntarg == J_EMB) /* EMB needs Earth */ + list[J_EARTH] = 2; + if (ncent < J_SUN) + list[ncent] = 2; + if (ncent == J_MOON) /* Mooon needs Earth */ + list[J_EARTH] = 2; + if (ncent == J_EARTH) /* Earth needs Moon */ + list[J_MOON] = 2; + if (ncent == J_EMB) /* EMB needs Earth */ + list[J_EARTH] = 2; + if ((retc = state(et, list, TRUE, pv, pvsun, rrd, serr)) != OK) + return (retc); + if (ntarg == J_SUN || ncent == J_SUN) { + for (i = 0; i < 6; ++i) + pv[i + 6*J_SUN] = pvsun[i]; + } + if (ntarg == J_SBARY || ncent == J_SBARY) { + for (i = 0; i < 6; ++i) { + pv[i + 6*J_SBARY] = 0.; + } + } + if (ntarg == J_EMB || ncent == J_EMB) { + for (i = 0; i < 6; ++i) + pv[i + 6*J_EMB] = pv[i + 6*J_EARTH]; + } + if ((ntarg==J_EARTH && ncent==J_MOON) || (ntarg == J_MOON && ncent==J_EARTH)){ + for (i = 0; i < 6; ++i) + pv[i + 6*J_EARTH] = 0.; + + } else { + if (list[J_EARTH] == 2) { + for (i = 0; i < 6; ++i) + pv[i + 6*J_EARTH] -= pv[i + 6*J_MOON] / (js->eh_emrat + 1.); + } + if (list[J_MOON] == 2) { + for (i = 0; i < 6; ++i) { + pv[i + 6*J_MOON] += pv[i + 6*J_EARTH]; + } + } + } + for (i = 0; i < 6; ++i) + rrd[i] = pv[i + ntarg * 6] - pv[i + ncent * 6]; + return OK; +} + +/* + * This subroutine differentiates and interpolates a + * set of chebyshev coefficients to give pos, vel, acc, and jerk + * calling sequence parameters: + * input: + * buf 1st location of array of d.p. chebyshev coefficients of position + * t is dp fractional time in interval covered by + * coefficients at which interpolation is wanted, 0 <= t <= 1 + * intv is dp length of whole interval in input time units. + * ncf number of coefficients per component + * ncm number of components per set of coefficients + * na number of sets of coefficients in full array + * (i.e., number of sub-intervals in full interval) + * ifl int flag: =1 for positions only + * =2 for pos and vel + * =3 for pos, vel, and acc + * =4 for pos, vel, acc, and jerk + * output: + * pv d.p. interpolated quantities requested. + * assumed dimension is pv(ncm,fl). + */ +static int interp(double FAR *buf, double t, double intv, int32 ncfin, + int32 ncmin, int32 nain, int32 ifl, double *pv) +{ + /* Initialized data */ + static int FAR np, nv; + static int FAR nac; + static int FAR njk; + static double FAR twot = 0.; + double FAR *pc = js->pc; + double FAR *vc = js->vc; + double FAR *ac = js->ac; + double FAR *jc = js->jc; + int ncf = (int) ncfin; + int ncm = (int) ncmin; + int na = (int) nain; + /* Local variables */ + double temp; + int i, j, ni; + double tc; + double dt1, bma; + double bma2, bma3; + /* + | get correct sub-interval number for this set of coefficients and then + | get normalized chebyshev time within that subinterval. + */ + if (t >= 0) + dt1 = floor(t); + else + dt1 = -floor(-t); + temp = na * t; + ni = (int) (temp - dt1); + /* tc is the normalized chebyshev time (-1 <= tc <= 1) */ + tc = (fmod(temp, 1.0) + dt1) * 2. - 1.; + /* + * check to see whether chebyshev time has changed, + * and compute new polynomial values if it has. + * (the element pc(2) is the value of t1(tc) and hence + * contains the value of tc on the previous call.) + */ + if (tc != pc[1]) { + np = 2; + nv = 3; + nac = 4; + njk = 5; + pc[1] = tc; + twot = tc + tc; + } + /* + * be sure that at least 'ncf' polynomials have been evaluated + * and are stored in the array 'pc'. + */ + if (np < ncf) { + for (i = np; i < ncf; ++i) + pc[i] = twot * pc[i - 1] - pc[i - 2]; + np = ncf; + } + /* interpolate to get position for each component */ + for (i = 0; i < ncm; ++i) { + pv[i] = 0.; + for (j = ncf-1; j >= 0; --j) + pv[i] += pc[j] * buf[j + (i + ni * ncm) * ncf]; + } + if (ifl <= 1) + return 0; + /* + * if velocity interpolation is wanted, be sure enough + * derivative polynomials have been generated and stored. + */ + bma = (na + na) / intv; + vc[2] = twot + twot; + if (nv < ncf) { + for (i = nv; i < ncf; ++i) + vc[i] = twot * vc[i - 1] + pc[i - 1] + pc[i - 1] - vc[i - 2]; + nv = ncf; + } + /* interpolate to get velocity for each component */ + for (i = 0; i < ncm; ++i) { + pv[i + ncm] = 0.; + for (j = ncf-1; j >= 1; --j) + pv[i + ncm] += vc[j] * buf[j + (i + ni * ncm) * ncf]; + pv[i + ncm] *= bma; + } + if (ifl == 2) + return 0; + /* check acceleration polynomial values, and */ + /* re-do if necessary */ + bma2 = bma * bma; + ac[3] = pc[1] * 24.; + if (nac < ncf) { + nac = ncf; + for (i = nac; i < ncf; ++i) + ac[i] = twot * ac[i - 1] + vc[i - 1] * 4. - ac[i - 2]; + } + /* get acceleration for each component */ + for (i = 0; i < ncm; ++i) { + pv[i + ncm * 2] = 0.; + for (j = ncf-1; j >= 2; --j) + pv[i + ncm * 2] += ac[j] * buf[j + (i + ni * ncm) * ncf]; + pv[i + ncm * 2] *= bma2; + } + if (ifl == 3) + return 0; + /* check jerk polynomial values, and */ + /* re-do if necessary */ + bma3 = bma * bma2; + jc[4] = pc[1] * 192.; + if (njk < ncf) { + njk = ncf; + for (i = njk; i < ncf; ++i) + jc[i] = twot * jc[i - 1] + ac[i - 1] * 6. - jc[i - 2]; + } + /* get jerk for each component */ + for (i = 0; i < ncm; ++i) { + pv[i + ncm * 3] = 0.; + for (j = ncf-1; j >= 3; --j) + pv[i + ncm * 3] += jc[j] * buf[j + (i + ni * ncm) * ncf]; + pv[i + ncm * 3] *= bma3; + } + return 0; +} + +/* + | ********** state ******************** + | this subroutine reads and interpolates the jpl planetary ephemeris file + | calling sequence parameters: + | input: + | et dp julian ephemeris epoch at which interpolation is wanted. + | list 12-word integer array specifying what interpolation + | is wanted for each of the bodies on the file. + | list(i)=0, no interpolation for body i + | =1, position only + | =2, position and velocity + | the designation of the astronomical bodies by i is: + | i = 0: mercury + | = 1: venus + | = 2: earth-moon barycenter, NOT earth! + | = 3: mars + | = 4: jupiter + | = 5: saturn + | = 6: uranus + | = 7: neptune + | = 8: pluto + | = 9: geocentric moon + | =10: nutations in longitude and obliquity + | =11: lunar librations (if on file) + | If called with list = NULL, only the header records are read and + | stored in the global areas. + | do_bary short, if true, barycentric, if false, heliocentric. + | only the 9 planets 0..8 are affected by it. + | output: + | pv dp 6 x 11 array that will contain requested interpolated + | quantities. the body specified by list(i) will have its + | state in the array starting at pv(1,i). (on any given + | call, only those words in 'pv' which are affected by the + | first 10 'list' entries (and by list(11) if librations are + | on the file) are set. the rest of the 'pv' array + | is untouched.) the order of components starting in + | pv is: x,y,z,dx,dy,dz. + | all output vectors are referenced to the earth mean + | equator and equinox of epoch. the moon state is always + | geocentric; the other nine states are either heliocentric + | or solar-system barycentric, depending on the setting of + | common flags (see below). + | lunar librations, if on file, are put into pv(k,10) if + | list(11) is 1 or 2. + | pvsun dp 6-word array containing the barycentric position and + | velocity of the sun. + | nut dp 4-word array that will contain nutations and rates, + | depending on the setting of list(10). the order of + | quantities in nut is: + | d psi (nutation in longitude) + | d epsilon (nutation in obliquity) + | d psi dot + | d epsilon dot + | globals used: + | do_km logical flag defining physical units of the output states. + | TRUE = return km and km/sec, FALSE = return au and au/day + | default value = FALSE (km determines time unit + | for nutations and librations. angle unit is always radians.) + */ +static int state(double et, int32 *list, int do_bary, + double *pv, double *pvsun, double *nut, char *serr) +{ + int i, j, k; + int32 flen, nseg, nb; + double FAR *buf = js->buf; + double aufac, s, t, intv, ts[4]; + int32 nrecl, ksize; + int32 nr; + double et_mn, et_fr; + int32 FAR *ipt = js->eh_ipt; + char ch_ttl[252]; + static int32 irecsz; + static int32 nrl, lpt[3], ncoeffs; + if (js->jplfptr == NULL) { + ksize = fsizer(serr); /* the number of single precision words in a record */ + nrecl = 4; + if (ksize == NOT_AVAILABLE) + return NOT_AVAILABLE; + irecsz = nrecl * ksize; /* record size in bytes */ + ncoeffs = ksize / 2; /* # of coefficients, doubles */ + /* ttl = ephemeris title, e.g. + * "JPL Planetary Ephemeris DE404/LE404 + * Start Epoch: JED= 625296.5-3001 DEC 21 00:00:00 + * Final Epoch: JED= 2817168.5 3001 JAN 17 00:00:00c */ + fread((void *) ch_ttl, 1, 252, js->jplfptr); + /* cnam = names of constants */ + fread((void *) js->ch_cnam, 1, 2400, js->jplfptr); + /* ss[0] = start epoch of ephemeris + * ss[1] = end epoch + * ss[2] = segment size in days */ + fread((void *) &js->eh_ss[0], sizeof(double), 3, js->jplfptr); + if (js->do_reorder) + reorder((char *) &js->eh_ss[0], sizeof(double), 3); + /* ncon = number of constants */ + fread((void *) &js->eh_ncon, sizeof(int32), 1, js->jplfptr); + if (js->do_reorder) + reorder((char *) &js->eh_ncon, sizeof(int32), 1); + /* au = astronomical unit */ + fread((void *) &js->eh_au, sizeof(double), 1, js->jplfptr); + if (js->do_reorder) + reorder((char *) &js->eh_au, sizeof(double), 1); + /* emrat = earth moon mass ratio */ + fread((void *) &js->eh_emrat, sizeof(double), 1, js->jplfptr); + if (js->do_reorder) + reorder((char *) &js->eh_emrat, sizeof(double), 1); + /* ipt[i+0]: coefficients of planet i start at buf[ipt[i+0]-1] + * ipt[i+1]: number of coefficients (interpolation order - 1) + * ipt[i+2]: number of intervals in segment */ + fread((void *) &ipt[0], sizeof(int32), 36, js->jplfptr); + if (js->do_reorder) + reorder((char *) &ipt[0], sizeof(int32), 36); + /* numde = number of jpl ephemeris "404" with de404 */ + fread((void *) &js->eh_denum, sizeof(int32), 1, js->jplfptr); + if (js->do_reorder) + reorder((char *) &js->eh_denum, sizeof(int32), 1); + fread((void *) &lpt[0], sizeof(int32), 3, js->jplfptr); + if (js->do_reorder) + reorder((char *) &lpt[0], sizeof(int32), 3); + /* cval[]: other constants in next record */ + fseek(js->jplfptr, 1L * irecsz, 0); + fread((void *) &js->eh_cval[0], sizeof(double), 400, js->jplfptr); + if (js->do_reorder) + reorder((char *) &js->eh_cval[0], sizeof(double), 400); + /* new 26-aug-2008: verify correct block size */ +#if 0 + sp = strstr(js->ch_cnam, "EMRAT "); + if (sp == NULL) { + if (serr != NULL) + sprintf(serr, "JPL ephemeris file strange, constant name 'EMRAT' missing"); + return ERR; + } + i = (sp - js->ch_cnam); + if (i % 6 != 0) { + if (serr != NULL) + sprintf(serr, "JPL ephemeris file strange, constant name 'EMRAT' not at multiple of 6"); + return ERR; + } + i = i / 6; /* position of EMRAT in constant array eh_cval */ + if (js->eh_cval[i] != js->eh_emrat) { + if (serr != NULL) + sprintf(serr, "JPL ephemeris file error, record size failed EMRAT check"); + return ERR; + } +#endif + for (i = 0; i < 3; ++i) + ipt[i + 36] = lpt[i]; + nrl = 0; + /* is file length correct? */ + /* file length */ + fseek(js->jplfptr, 0L, SEEK_END); + flen = ftell(js->jplfptr); + /* # of segments in file */ + nseg = (int32) ((js->eh_ss[1] - js->eh_ss[0]) / js->eh_ss[2]); + /* sum of all cheby coeffs of all planets and segments */ + for(i = 0, nb = 0; i < 13; i++) { + k = 3; + if (i == 11) + k = 2; + nb += (ipt[i*3+1] * ipt[i*3+2]) * k * nseg; + } + /* add start and end epochs of segments */ + nb += 2 * nseg; + /* doubles to bytes */ + nb *= 8; + /* add size of header and constants section */ + nb += 2 * ksize * nrecl; +#if 0 + printf("hallo %d %d\n", nb, flen); + printf("hallo %d %d\n", nb-flen, ksize); +#endif + if (flen != nb + /* some of our files are one record too long */ + && flen - nb != ksize * nrecl) { + if (serr != NULL) { + sprintf(serr, "JPL ephemeris file is mutilated; length = %d instead of %d.", flen, nb); + if (strlen(serr) + strlen(js->jplfname) < AS_MAXCH - 1) + sprintf(serr, "JPL ephemeris file %s is mutilated; length = %d instead of %d.", js->jplfname, flen, nb); + } + return(NOT_AVAILABLE); + } + /* check if start and end dates in segments are the same as in + * file header */ + fseek(js->jplfptr, 2L * irecsz, 0); + fread((void *) &ts[0], sizeof(double), 2, js->jplfptr); + if (js->do_reorder) + reorder((char *) &ts[0], sizeof(double), 2); + fseek(js->jplfptr, (nseg + 2 - 1) * irecsz, 0); + fread((void *) &ts[2], sizeof(double), 2, js->jplfptr); + if (js->do_reorder) + reorder((char *) &ts[2], sizeof(double), 2); + if (ts[0] != js->eh_ss[0] || ts[3] != js->eh_ss[1]) { + if (serr != NULL) + strcpy(serr, "JPL ephemeris file is corrupt; start/end date check failed."); + return NOT_AVAILABLE; + } + } + if (list == NULL) + return 0; + s = et - .5; + et_mn = floor(s); + et_fr = s - et_mn; /* fraction of days since previous midnight */ + et_mn += .5; /* midnight before epoch */ + /* error return for epoch out of range */ + if (et < js->eh_ss[0] || et > js->eh_ss[1]) { + if (serr != NULL) + sprintf(serr,"jd %f outside JPL eph. range %.2f .. %.2f;", et, js->eh_ss[0], js->eh_ss[1]); + return BEYOND_EPH_LIMITS; + } + /* calculate record # and relative time in interval */ + nr = (int32) ((et_mn - js->eh_ss[0]) / js->eh_ss[2]) + 2; + if (et_mn == js->eh_ss[1]) + --nr; /* end point of ephemeris, use last record */ + t = (et_mn - ((nr - 2) * js->eh_ss[2] + js->eh_ss[0]) + et_fr) / js->eh_ss[2]; + /* read correct record if not in core */ + if (nr != nrl) { + nrl = nr; + if (fseek(js->jplfptr, nr * irecsz, 0) != 0) { + if (serr != NULL) + sprintf(serr, "Read error in JPL eph. at %f\n", et); + return NOT_AVAILABLE; + } + for (k = 1; k <= ncoeffs; ++k) { + if ( fread((void *) &buf[k - 1], sizeof(double), 1, js->jplfptr) != 1) { + if (serr != NULL) + sprintf(serr, "Read error in JPL eph. at %f\n", et); + return NOT_AVAILABLE; + } + if (js->do_reorder) + reorder((char *) &buf[k-1], sizeof(double), 1); + } + } + if (js->do_km) { + intv = js->eh_ss[2] * 86400.; + aufac = 1.; + } else { + intv = js->eh_ss[2]; + aufac = 1. / js->eh_au; + } + /* interpolate ssbary sun */ + interp(&buf[(int) ipt[30] - 1], t, intv, ipt[31], 3L, ipt[32], 2L, pvsun); + for (i = 0; i < 6; ++i) { + pvsun[i] *= aufac; + } + /* check and interpolate whichever bodies are requested */ + for (i = 0; i < 10; ++i) { + if (list[i] > 0) { + interp(&buf[(int) ipt[i * 3] - 1], t, intv, ipt[i * 3 + 1], 3L, + ipt[i * 3 + 2], list[i], &pv[i * 6]); + for (j = 0; j < 6; ++j) { + if (i < 9 && ! do_bary) { + pv[j + i * 6] = pv[j + i * 6] * aufac - pvsun[j]; + } else { + pv[j + i * 6] *= aufac; + } + } + } + } + /* do nutations if requested (and if on file) */ + if (list[10] > 0 && ipt[34] > 0) { + interp(&buf[(int) ipt[33] - 1], t, intv, ipt[34], 2L, ipt[35], + list[10], nut); + } + /* get librations if requested (and if on file) */ + if (list[11] > 0 && ipt[37] > 0) { + interp(&buf[(int) ipt[36] - 1], t, intv, ipt[37], 3L, ipt[38], list[1], + &pv[60]); + } + return OK; +} + +/* + * this entry obtains the constants from the ephemeris file + * call state to initialize the ephemeris and read in the constants + */ +static int read_const_jpl(double *ss, char *serr) +{ + int i, retc; + retc = state(0.0, NULL, FALSE, NULL, NULL, NULL, serr); + if (retc != OK) + return (retc); + for (i = 0; i < 3; i++) + ss[i] = js->eh_ss[i]; +#if DEBUG_DO_SHOW + { + static char FAR *bname[] = { + "Mercury", "Venus", "EMB", "Mars", "Jupiter", "Saturn", + "Uranus", "Neptune", "Pluto", "Moon", "SunBary", "Nut", "Libr"}; + int j, k; + int32 nb, nc; + printf(" JPL TEST-EPHEMERIS program. Version October 1995.\n"); + for (i = 0; i < 13; i++) { + j = i * 3; + k = 3; + if (i == 11) k = 2; + nb = js->eh_ipt[j+1] * js->eh_ipt[j+2] * k; + nc = (int32) (nb * 36525L / js->eh_ss[2] * 8L); + printf("%s\t%d\tipt[%d]\t%3ld %2ld %2ld,\t", + bname[i], i, j, js->eh_ipt[j], js->eh_ipt[j+1], js->eh_ipt[j+2]); + printf("%3ld double, bytes per century = %6ld\n", nb, nc); + fflush(stdout); + } + printf("%16.2f %16.2f %16.2f\n", js->eh_ss[0], js->eh_ss[1], js->eh_ss[2]); + for (i = 0; i < js->eh_ncon; ++i) + printf("%.6s\t%24.16f\n", js->ch_cnam + i * 6, js->eh_cval[i]); + fflush(stdout); + } +#endif + return OK; +} + +static void reorder(char *x, int size, int number) +{ + int i, j; + char s[8]; + char *sp1 = x; + char *sp2 = &s[0]; + for (i = 0; i < number; i++) { + for (j = 0; j < size; j++) + *(sp2 + j) = *(sp1 + size - j - 1); + for (j = 0; j < size; j++) + *(sp1 + j) = *(sp2 + j); + sp1 += size; + } +} + +void swi_close_jpl_file(void) +{ + if (js != NULL) { + if (js->jplfptr != NULL) + fclose(js->jplfptr); + if (js->jplfname != NULL) + FREE((void *) js->jplfname); + if (js->jplfpath != NULL) + FREE((void *) js->jplfpath); + FREE((void *) js); + js = NULL; + } +} + +int swi_open_jpl_file(double *ss, char *fname, char *fpath, char *serr) +{ + int retc = OK; + /* if open, return */ + if (js != NULL && js->jplfptr != NULL) + return OK; + if ((js = (struct jpl_save *) CALLOC(1, sizeof(struct jpl_save))) == NULL + || (js->jplfname = MALLOC(strlen(fname)+1)) == NULL + || (js->jplfpath = MALLOC(strlen(fpath)+1)) == NULL + ) { + if (serr != NULL) + strcpy(serr, "error in malloc() with JPL ephemeris."); + return ERR; + } + strcpy(js->jplfname, fname); + strcpy(js->jplfpath, fpath); + retc = read_const_jpl(ss, serr); + if (retc != OK) + swi_close_jpl_file(); + else { + /* intializations for function interpol() */ + js->pc[0] = 1; + js->pc[1] = 2; + js->vc[1] = 1; + js->ac[2] = 4; + js->jc[3] = 24; + } + return retc; +} + +int32 swi_get_jpl_denum() +{ + return js->eh_denum; +} +#endif /* NO_JPL */ + diff --git a/swe/src/swejpl.h b/swe/src/swejpl.h new file mode 100644 index 0000000..59c3550 --- /dev/null +++ b/swe/src/swejpl.h @@ -0,0 +1,105 @@ +/* + | $Header: /home/dieter/sweph/RCS/swejpl.h,v 1.74 2008/06/16 10:07:20 dieter Exp $ + | + | Subroutines for reading JPL ephemerides. + | derived from testeph.f as contained in DE403 distribution July 1995. + | works with DE200, DE102, DE403, DE404, DE405, DE406 + | (attention, DE102 has 950 reference frame and also DE403 has slightly + | different reference frame from DE200). + + Authors: Dieter Koch and Alois Treindl, Astrodienst Zurich + +**************************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + + +#include "sweodef.h" + +#define J_MERCURY 0 /* jpl body indices, modified by Alois */ +#define J_VENUS 1 /* now they start at 0 and not at 1 */ +#define J_EARTH 2 +#define J_MARS 3 +#define J_JUPITER 4 +#define J_SATURN 5 +#define J_URANUS 6 +#define J_NEPTUNE 7 +#define J_PLUTO 8 +#define J_MOON 9 +#define J_SUN 10 +#define J_SBARY 11 +#define J_EMB 12 +#define J_NUT 13 +#define J_LIB 14 + +/* + * compute position and speed at time et, for body ntarg with center + * ncent. rrd must be double[6] to contain the return vectors. + * ntarg can be all of the above, ncent all except J_NUT and J_LIB. + * Librations and Nutations are not affected by ncent. + */ +extern int swi_pleph(double et, int ntarg, int ncent, double *rrd, char *serr); + +/* + * read the ephemeris constants. ss[0..2] returns start, end and granule size. + * If do_show is TRUE, a list of constants is printed to stdout. + */ +extern void swi_close_jpl_file(void); + +extern int swi_open_jpl_file(double *ss, char *fname, char *fpath, char *serr); + +extern int32 swi_get_jpl_denum(void); + +extern void swi_IERS_FK5(double *xin, double *xout, int dir); + diff --git a/swe/src/swemini.c b/swe/src/swemini.c new file mode 100644 index 0000000..14297b0 --- /dev/null +++ b/swe/src/swemini.c @@ -0,0 +1,131 @@ + +/* + $Header: /home/dieter/sweph/RCS/swemini.c,v 1.74 2008/06/16 10:07:20 dieter Exp $ + + swemini.c A minimal program to test the Swiss Ephemeris. + + Input: a date (in gregorian calendar, sequence day.month.year) + Output: Planet positions at midnight Universal time, ecliptic coordinates, + geocentric apparent positions relative to true equinox of date, as + usual in western astrology. + + + Authors: Dieter Koch and Alois Treindl, Astrodienst Zurich + +**************************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + + +#include "swephexp.h" /* this includes "sweodef.h" */ + +int main() +{ + char sdate[AS_MAXCH], snam[40], serr[AS_MAXCH]; + int jday = 1, jmon = 1, jyear = 2000; + double jut = 0.0; + double tjd, te, x2[6]; + int32 iflag, iflgret; + int p; + iflag = SEFLG_SPEED; + while (TRUE) { + printf("\nDate (d.m.y) ?"); + /*gets(sdate);*/ + if( !fgets(sdate, sizeof(sdate)-1, stdin) ) return OK; + /* + * stop if a period . is entered + */ + if (*sdate == '.') + return OK; + if (sscanf (sdate, "%d%*c%d%*c%d", &jday,&jmon,&jyear) < 1) exit(1); + /* + * we have day, month and year and convert to Julian day number + */ + tjd = swe_julday(jyear,jmon,jday,jut,SE_GREG_CAL); + /* + * compute Ephemeris time from Universal time by adding delta_t + */ + te = tjd + swe_deltat(tjd); + printf("date: %02d.%02d.%d at 0:00 Universal time\n", jday, jmon, jyear); + printf("planet \tlongitude\tlatitude\tdistance\tspeed long.\n"); + /* + * a loop over all planets + */ + for (p = SE_SUN; p <= SE_CHIRON; p++) { + if (p == SE_EARTH) continue; + /* + * do the coordinate calculation for this planet p + */ + iflgret = swe_calc(te, p, iflag, x2, serr); + /* + * if there is a problem, a negative value is returned and an + * errpr message is in serr. + */ + if (iflgret < 0) + printf("error: %s\n", serr); + else if (iflgret != iflag) + printf("warning: iflgret != iflag. %s\n", serr); + /* + * get the name of the planet p + */ + swe_get_planet_name(p, snam); + /* + * print the coordinates + */ + printf("%10s\t%11.7f\t%10.7f\t%10.7f\t%10.7f\n", + snam, x2[0], x2[1], x2[2], x2[3]); + } + } + return OK; +} diff --git a/swe/src/swemmoon.c b/swe/src/swemmoon.c new file mode 100644 index 0000000..dd4d9cf --- /dev/null +++ b/swe/src/swemmoon.c @@ -0,0 +1,1824 @@ +/* SWISSEPH + $Header: /home/dieter/sweph/RCS/swemmoon.c,v 1.74 2008/06/16 10:07:20 dieter Exp $ + * + * Steve Moshier's analytical lunar ephemeris + +**************************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + + + /* + * Expansions for the geocentric ecliptic longitude, + * latitude, and distance of the Moon referred to the mean equinox + * and ecliptic of date. + * + * This version of cmoon.c adjusts the ELP2000-85 analytical Lunar + * theory of Chapront-Touze and Chapront to fit the Jet Propulsion + * Laboratory's DE404 long ephemeris on the interval from 3000 B.C. + * to 3000 A.D. + * + * The fit is much better in the remote past and future if + * secular terms are included in the arguments of the oscillatory + * perturbations. Such adjustments cannot easily be incorporated + * into the 1991 lunar tables. In this program the traditional + * literal arguments are used instead, with mean elements adjusted + * for a best fit to the reference ephemeris. + * + * This program omits many oscillatory terms from the analytical + * theory which, if they were included, would yield a much higher + * accuracy for modern dates. Detailed statistics of the precision + * are given in the table below. Comparing at 64-day intervals + * over the period -3000 to +3000, the maximum discrepancies noted + * were 7" longitude, 5" latitude, and 5 x 10^-8 au radius. + * The expressions used for precession in this comparision were + * those of Simon et al (1994). + * + * The adjusted coefficients were found by an unweighted least squares + * fit to the numerical ephemeris in the mentioned test interval. + * The approximation error increases rapidly outside this interval. + * J. Chapront (1994) has described the basic fitting procedure. + * + * A major change from DE200 to DE404 is in the coefficient + * of tidal acceleration of the Moon, which causes the Moon's + * longitude to depart by about -0.9" per century squared + * from DE200. Uncertainty in this quantity continues to + * be the limiting factor in long term projections of the Moon's + * ephemeris. + * + * Since the Lunar theory is cast in the ecliptic of date, it makes + * some difference what formula you use for precession. The adjustment + * to DE404 was carried out relative to the mean equinox and ecliptic + * of date as defined in Williams (1994). An earlier version of this + * program used the precession given by Simon et al (1994). The difference + * between these two precession formulas amounts to about 12" in Lunar + * longitude at 3000 B.C. + * + * Maximum deviations between DE404 and this program + * in a set of 34274 samples spaced 64 days apart + * + * Interval Longitude Latitude Radius + * Julian Year arc sec arc sec 10^-8 au + * -3000 to -2500 5.66 4.66 4.93 + * -2500 to -2000 5.49 3.98 4.56 + * -2000 to -1500 6.98 4.17 4.81 + * -1500 to -1000 5.74 3.53 4.87 + * -1000 to -500 5.95 3.42 4.67 + * -500 to 0 4.94 3.07 4.04 + * 0 to 500 4.42 2.65 4.55 + * 500 to 1000 5.68 3.30 3.99 + * 1000 to 1500 4.32 3.21 3.83 + * 1500 to 2000 2.70 2.69 3.71 + * 2000 to 2500 3.35 2.32 3.85 + * 2500 to 3000 4.62 2.39 4.11 + * + * + * + * References: + * + * James G. Williams, "Contributions to the Earth's obliquity rate, + * precession, and nutation," Astron. J. 108, 711-724 (1994) + * + * DE403 and DE404 ephemerides by E. M. Standish, X. X. Newhall, and + * J. G. Williams are at the JPL computer site navigator.jpl.nasa.gov. + * + * J. L. Simon, P. Bretagnon, J. Chapront, M. Chapront-Touze', G. Francou, + * and J. Laskar, "Numerical Expressions for precession formulae and + * mean elements for the Moon and the planets," Astronomy and Astrophysics + * 282, 663-683 (1994) + * + * P. Bretagnon and Francou, G., "Planetary theories in rectangular + * and spherical variables. VSOP87 solutions," Astronomy and + * Astrophysics 202, 309-315 (1988) + * + * M. Chapront-Touze' and J. Chapront, "ELP2000-85: a semi-analytical + * lunar ephemeris adequate for historical times," Astronomy and + * Astrophysics 190, 342-352 (1988). + * + * M. Chapront-Touze' and J. Chapront, _Lunar Tables and + * Programs from 4000 B.C. to A.D. 8000_, Willmann-Bell (1991) + * + * J. Laskar, "Secular terms of classical planetary theories + * using the results of general theory," Astronomy and Astrophysics + * 157, 59070 (1986) + * + * S. L. Moshier, "Comparison of a 7000-year lunar ephemeris + * with analytical theory," Astronomy and Astrophysics 262, + * 613-616 (1992) + * + * J. Chapront, "Representation of planetary ephemerides by frequency + * analysis. Application to the five outer planets," Astronomy and + * Astrophysics Suppl. Ser. 109, 181-192 (1994) + * + * + * Entry swi_moshmoon2() returns the geometric position of the Moon + * relative to the Earth. Its calling procedure is as follows: + * + * double JD; input Julian Ephemeris Date + * double pol[3]; output ecliptic polar coordinatees in radians and au + * pol[0] longitude, pol[1] latitude, pol[2] radius + * swi_moshmoon2( JD, pol ); + * + * - S. L. Moshier, August, 1991 + * DE200 fit: July, 1992 + * DE404 fit: October, 1995 + * + * Dieter Koch: adaptation to SWISSEPH, April 1996 + * 18-feb-2006 replaced LP by SWELP because of name collision + */ + +#include +#include "swephexp.h" +#include "sweph.h" +#include "swephlib.h" + +static void mean_elements(void); +static void mean_elements_pl(void); +static double mods3600(double x); +static void ecldat_equ2000(double tjd, double *xpm); +static void chewm(short *pt, int nlines, int nangles, + int typflg, double *ans ); +static void sscc(int k, double arg, int n ); +static void moon1(void); +static void moon2(void); +static void moon3(void); +static void moon4(void); + + +#ifdef MOSH_MOON_200 +/* The following coefficients were calculated by a simultaneous least + * squares fit between the analytical theory and the continued DE200 + * numerically integrated ephemeris from 9000 BC to 13000 AD. + * See references to the array z[] later on in the program. + * The 71 coefficients were estimated from 42,529 Lunar positions. + */ +static double z[] = { +-1.225346551567e+001, /* F, t^2 */ +-1.096676093208e-003, /* F, t^3 */ +-2.165750777942e-006, /* F, t^4 */ +-2.790392351314e-009, /* F, t^5 */ + 4.189032191814e-011, /* F, t^6 */ + 4.474984866301e-013, /* F, t^7 */ + 3.239398410335e+001, /* l, t^2 */ + 5.185305877294e-002, /* l, t^3 */ +-2.536291235258e-004, /* l, t^4 */ +-2.506365935364e-008, /* l, t^5 */ + 3.452144225877e-011, /* l, t^6 */ +-1.755312760154e-012, /* l, t^7 */ +-5.870522364514e+000, /* D, t^2 */ + 6.493037519768e-003, /* D, t^3 */ +-3.702060118571e-005, /* D, t^4 */ + 2.560078201452e-009, /* D, t^5 */ + 2.555243317839e-011, /* D, t^6 */ +-3.207663637426e-013, /* D, t^7 */ +-4.776684245026e+000, /* L, t^2 */ + 6.580112707824e-003, /* L, t^3 */ +-6.073960534117e-005, /* L, t^4 */ +-1.024222633731e-008, /* L, t^5 */ + 2.235210987108e-010, /* L, t^6 */ + 7.200592540556e-014, /* L, t^7 */ +-8.552017636339e+001, /* t^2 cos(18V - 16E - l) */ +-2.055794304596e+002, /* t^2 sin(18V - 16E - l) */ +-1.097555241866e+000, /* t^3 cos(18V - 16E - l) */ + 5.219423171002e-001, /* t^3 sin(18V - 16E - l) */ + 2.088802640755e-003, /* t^4 cos(18V - 16E - l) */ + 4.616541527921e-003, /* t^4 sin(18V - 16E - l) */ + 4.794930645807e+000, /* t^2 cos(10V - 3E - l) */ +-4.595134364283e+001, /* t^2 sin(10V - 3E - l) */ +-6.659812174691e-002, /* t^3 cos(10V - 3E - l) */ +-2.570048828246e-001, /* t^3 sin(10V - 3E - l) */ + 6.229863046223e-004, /* t^4 cos(10V - 3E - l) */ + 5.504368344700e-003, /* t^4 sin(10V - 3E - l) */ +-3.084830597278e+000, /* t^2 cos(8V - 13E) */ +-1.000471012253e+001, /* t^2 sin(8V - 13E) */ + 6.590112074510e-002, /* t^3 cos(8V - 13E) */ +-3.212573348278e-003, /* t^3 sin(8V - 13E) */ + 5.409038312567e-004, /* t^4 cos(8V - 13E) */ + 1.293377988163e-003, /* t^4 sin(8V - 13E) */ + 2.311794636111e+001, /* t^2 cos(4E - 8M + 3J) */ +-3.157036220040e+000, /* t^2 sin(4E - 8M + 3J) */ +-3.019293162417e+000, /* t^2 cos(18V - 16E) */ +-9.211526858975e+000, /* t^2 sin(18V - 16E) */ +-4.993704215784e-002, /* t^3 cos(18V - 16E) */ + 2.991187525454e-002, /* t^3 sin(18V - 16E) */ +-3.827414182969e+000, /* t^2 cos(18V - 16E - 2l) */ +-9.891527703219e+000, /* t^2 sin(18V - 16E - 2l) */ +-5.322093802878e-002, /* t^3 cos(18V - 16E - 2l) */ + 3.164702647371e-002, /* t^3 sin(18V - 16E - 2l) */ + 7.713905234217e+000, /* t^2 cos(2J - 5S) */ +-6.077986950734e+000, /* t^3 sin(2J - 5S) */ +-1.278232501462e-001, /* t^2 cos(L - F) */ + 4.760967236383e-001, /* t^2 sin(L - F) */ +-6.759005756460e-001, /* t^3 sin(l') */ + 1.655727996357e-003, /* t^4 sin(l') */ + 1.646526117252e-001, /* t^3 sin(2D - l') */ +-4.167078100233e-004, /* t^4 sin(2D - l') */ + 2.067529538504e-001, /* t^3 sin(2D - l' - l) */ +-5.219127398748e-004, /* t^4 sin(2D - l' - l) */ +-1.526335222289e-001, /* t^3 sin(l' - l) */ +-1.120545131358e-001, /* t^3 sin(l' + l) */ + 4.619472391553e-002, /* t^3 sin(2D - 2l') */ + 4.863621236157e-004, /* t^4 sin(2D - 2l') */ +-4.280059182608e-002, /* t^3 sin(2l') */ +-4.328378207833e-004, /* t^4 sin(2l') */ +-8.371028286974e-003, /* t^3 sin(2D - l) */ + 4.089447328174e-002, /* t^3 sin(2D - 2l' - l) */ +-1.238363006354e-002, /* t^3 sin(2D + 2l' - l) */ +}; +#else +/* The following coefficients were calculated by a simultaneous least + * squares fit between the analytical theory and DE404 on the finite + * interval from -3000 to +3000. + * The coefficients were estimated from 34,247 Lunar positions. + */ +static double FAR z[] = { +/* The following are scaled in arc seconds, time in Julian centuries. + They replace the corresponding terms in the mean elements. */ +-1.312045233711e+01, /* F, t^2 */ +-1.138215912580e-03, /* F, t^3 */ +-9.646018347184e-06, /* F, t^4 */ + 3.146734198839e+01, /* l, t^2 */ + 4.768357585780e-02, /* l, t^3 */ +-3.421689790404e-04, /* l, t^4 */ +-6.847070905410e+00, /* D, t^2 */ +-5.834100476561e-03, /* D, t^3 */ +-2.905334122698e-04, /* D, t^4 */ +-5.663161722088e+00, /* L, t^2 */ + 5.722859298199e-03, /* L, t^3 */ +-8.466472828815e-05, /* L, t^4 */ +/* The following longitude terms are in arc seconds times 10^5. */ +-8.429817796435e+01, /* t^2 cos(18V - 16E - l) */ +-2.072552484689e+02, /* t^2 sin(18V - 16E - l) */ + 7.876842214863e+00, /* t^2 cos(10V - 3E - l) */ + 1.836463749022e+00, /* t^2 sin(10V - 3E - l) */ +-1.557471855361e+01, /* t^2 cos(8V - 13E) */ +-2.006969124724e+01, /* t^2 sin(8V - 13E) */ + 2.152670284757e+01, /* t^2 cos(4E - 8M + 3J) */ +-6.179946916139e+00, /* t^2 sin(4E - 8M + 3J) */ +-9.070028191196e-01, /* t^2 cos(18V - 16E) */ +-1.270848233038e+01, /* t^2 sin(18V - 16E) */ +-2.145589319058e+00, /* t^2 cos(2J - 5S) */ + 1.381936399935e+01, /* t^2 sin(2J - 5S) */ +-1.999840061168e+00, /* t^3 sin(l') */ +}; +#endif /* ! MOSH_MOON_200 */ + +/* Perturbation tables + */ +#define NLR 118 +static short FAR LR[8*NLR] = { +/* + Longitude Radius + D l' l F 1" .0001" 1km .0001km */ + + 0, 0, 1, 0, 22639, 5858,-20905,-3550, + 2, 0,-1, 0, 4586, 4383, -3699,-1109, + 2, 0, 0, 0, 2369, 9139, -2955,-9676, + 0, 0, 2, 0, 769, 257, -569,-9251, + 0, 1, 0, 0, -666,-4171, 48, 8883, + 0, 0, 0, 2, -411,-5957, -3,-1483, + 2, 0,-2, 0, 211, 6556, 246, 1585, + 2,-1,-1, 0, 205, 4358, -152,-1377, + 2, 0, 1, 0, 191, 9562, -170,-7331, + 2,-1, 0, 0, 164, 7285, -204,-5860, + 0, 1,-1, 0, -147,-3213, -129,-6201, + 1, 0, 0, 0, -124,-9881, 108, 7427, + 0, 1, 1, 0, -109,-3803, 104, 7552, + 2, 0, 0,-2, 55, 1771, 10, 3211, + 0, 0, 1, 2, -45, -996, 0, 0, + 0, 0, 1,-2, 39, 5333, 79, 6606, + 4, 0,-1, 0, 38, 4298, -34,-7825, + 0, 0, 3, 0, 36, 1238, -23,-2104, + 4, 0,-2, 0, 30, 7726, -21,-6363, + 2, 1,-1, 0, -28,-3971, 24, 2085, + 2, 1, 0, 0, -24,-3582, 30, 8238, + 1, 0,-1, 0, -18,-5847, -8,-3791, + 1, 1, 0, 0, 17, 9545, -16,-6747, + 2,-1, 1, 0, 14, 5303, -12,-8314, + 2, 0, 2, 0, 14, 3797, -10,-4448, + 4, 0, 0, 0, 13, 8991, -11,-6500, + 2, 0,-3, 0, 13, 1941, 14, 4027, + 0, 1,-2, 0, -9,-6791, -7, -27, + 2, 0,-1, 2, -9,-3659, 0, 7740, + 2,-1,-2, 0, 8, 6055, 10, 562, + 1, 0, 1, 0, -8,-4531, 6, 3220, + 2,-2, 0, 0, 8, 502, -9,-8845, + 0, 1, 2, 0, -7,-6302, 5, 7509, + 0, 2, 0, 0, -7,-4475, 1, 657, + 2,-2,-1, 0, 7, 3712, -4,-9501, + 2, 0, 1,-2, -6,-3832, 4, 1311, + 2, 0, 0, 2, -5,-7416, 0, 0, + 4,-1,-1, 0, 4, 3740, -3,-9580, + 0, 0, 2, 2, -3,-9976, 0, 0, + 3, 0,-1, 0, -3,-2097, 3, 2582, + 2, 1, 1, 0, -2,-9145, 2, 6164, + 4,-1,-2, 0, 2, 7319, -1,-8970, + 0, 2,-1, 0, -2,-5679, -2,-1171, + 2, 2,-1, 0, -2,-5212, 2, 3536, + 2, 1,-2, 0, 2, 4889, 0, 1437, + 2,-1, 0,-2, 2, 1461, 0, 6571, + 4, 0, 1, 0, 1, 9777, -1,-4226, + 0, 0, 4, 0, 1, 9337, -1,-1169, + 4,-1, 0, 0, 1, 8708, -1,-5714, + 1, 0,-2, 0, -1,-7530, -1,-7385, + 2, 1, 0,-2, -1,-4372, 0,-1357, + 0, 0, 2,-2, -1,-3726, -4,-4212, + 1, 1, 1, 0, 1, 2618, 0,-9333, + 3, 0,-2, 0, -1,-2241, 0, 8624, + 4, 0,-3, 0, 1, 1868, 0,-5142, + 2,-1, 2, 0, 1, 1770, 0,-8488, + 0, 2, 1, 0, -1,-1617, 1, 1655, + 1, 1,-1, 0, 1, 777, 0, 8512, + 2, 0, 3, 0, 1, 595, 0,-6697, + 2, 0, 1, 2, 0,-9902, 0, 0, + 2, 0,-4, 0, 0, 9483, 0, 7785, + 2,-2, 1, 0, 0, 7517, 0,-6575, + 0, 1,-3, 0, 0,-6694, 0,-4224, + 4, 1,-1, 0, 0,-6352, 0, 5788, + 1, 0, 2, 0, 0,-5840, 0, 3785, + 1, 0, 0,-2, 0,-5833, 0,-7956, + 6, 0,-2, 0, 0, 5716, 0,-4225, + 2, 0,-2,-2, 0,-5606, 0, 4726, + 1,-1, 0, 0, 0,-5569, 0, 4976, + 0, 1, 3, 0, 0,-5459, 0, 3551, + 2, 0,-2, 2, 0,-5357, 0, 7740, + 2, 0,-1,-2, 0, 1790, 8, 7516, + 3, 0, 0, 0, 0, 4042, -1,-4189, + 2,-1,-3, 0, 0, 4784, 0, 4950, + 2,-1, 3, 0, 0, 932, 0, -585, + 2, 0, 2,-2, 0,-4538, 0, 2840, + 2,-1,-1, 2, 0,-4262, 0, 373, + 0, 0, 0, 4, 0, 4203, 0, 0, + 0, 1, 0, 2, 0, 4134, 0,-1580, + 6, 0,-1, 0, 0, 3945, 0,-2866, + 2,-1, 0, 2, 0,-3821, 0, 0, + 2,-1, 1,-2, 0,-3745, 0, 2094, + 4, 1,-2, 0, 0,-3576, 0, 2370, + 1, 1,-2, 0, 0, 3497, 0, 3323, + 2,-3, 0, 0, 0, 3398, 0,-4107, + 0, 0, 3, 2, 0,-3286, 0, 0, + 4,-2,-1, 0, 0,-3087, 0,-2790, + 0, 1,-1,-2, 0, 3015, 0, 0, + 4, 0,-1,-2, 0, 3009, 0,-3218, + 2,-2,-2, 0, 0, 2942, 0, 3430, + 6, 0,-3, 0, 0, 2925, 0,-1832, + 2, 1, 2, 0, 0,-2902, 0, 2125, + 4, 1, 0, 0, 0,-2891, 0, 2445, + 4,-1, 1, 0, 0, 2825, 0,-2029, + 3, 1,-1, 0, 0, 2737, 0,-2126, + 0, 1, 1, 2, 0, 2634, 0, 0, + 1, 0, 0, 2, 0, 2543, 0, 0, + 3, 0, 0,-2, 0,-2530, 0, 2010, + 2, 2,-2, 0, 0,-2499, 0,-1089, + 2,-3,-1, 0, 0, 2469, 0,-1481, + 3,-1,-1, 0, 0,-2314, 0, 2556, + 4, 0, 2, 0, 0, 2185, 0,-1392, + 4, 0,-1, 2, 0,-2013, 0, 0, + 0, 2,-2, 0, 0,-1931, 0, 0, + 2, 2, 0, 0, 0,-1858, 0, 0, + 2, 1,-3, 0, 0, 1762, 0, 0, + 4, 0,-2, 2, 0,-1698, 0, 0, + 4,-2,-2, 0, 0, 1578, 0,-1083, + 4,-2, 0, 0, 0, 1522, 0,-1281, + 3, 1, 0, 0, 0, 1499, 0,-1077, + 1,-1,-1, 0, 0,-1364, 0, 1141, + 1,-3, 0, 0, 0,-1281, 0, 0, + 6, 0, 0, 0, 0, 1261, 0, -859, + 2, 0, 2, 2, 0,-1239, 0, 0, + 1,-1, 1, 0, 0,-1207, 0, 1100, + 0, 0, 5, 0, 0, 1110, 0, -589, + 0, 3, 0, 0, 0,-1013, 0, 213, + 4,-1,-3, 0, 0, 998, 0, 0, +}; + + +#ifdef MOSH_MOON_200 +#define NMB 56 +static short FAR MB[6*NMB] = { +/* + Latitude + D l' l F 1" .0001" */ + + 0, 0, 0, 1,18461, 2387, + 0, 0, 1, 1, 1010, 1671, + 0, 0, 1,-1, 999, 6936, + 2, 0, 0,-1, 623, 6524, + 2, 0,-1, 1, 199, 4837, + 2, 0,-1,-1, 166, 5741, + 2, 0, 0, 1, 117, 2607, + 0, 0, 2, 1, 61, 9120, + 2, 0, 1,-1, 33, 3572, + 0, 0, 2,-1, 31, 7597, + 2,-1, 0,-1, 29, 5766, + 2, 0,-2,-1, 15, 5663, + 2, 0, 1, 1, 15, 1216, + 2, 1, 0,-1, -12, -941, + 2,-1,-1, 1, 8, 8681, + 2,-1, 0, 1, 7, 9586, + 2,-1,-1,-1, 7, 4346, + 0, 1,-1,-1, -6,-7314, + 4, 0,-1,-1, 6, 5796, + 0, 1, 0, 1, -6,-4601, + 0, 0, 0, 3, -6,-2965, + 0, 1,-1, 1, -5,-6324, + 1, 0, 0, 1, -5,-3684, + 0, 1, 1, 1, -5,-3113, + 0, 1, 1,-1, -5, -759, + 0, 1, 0,-1, -4,-8396, + 1, 0, 0,-1, -4,-8057, + 0, 0, 3, 1, 3, 9841, + 4, 0, 0,-1, 3, 6745, + 4, 0,-1, 1, 2, 9985, + 0, 0, 1,-3, 2, 7986, + 4, 0,-2, 1, 2, 4139, + 2, 0, 0,-3, 2, 1863, + 2, 0, 2,-1, 2, 1462, + 2,-1, 1,-1, 1, 7660, + 2, 0,-2, 1, -1,-6244, + 0, 0, 3,-1, 1, 5813, + 2, 0, 2, 1, 1, 5198, + 2, 0,-3,-1, 1, 5156, + 2, 1,-1, 1, -1,-3178, + 2, 1, 0, 1, -1,-2643, + 4, 0, 0, 1, 1, 1919, + 2,-1, 1, 1, 1, 1346, + 2,-2, 0,-1, 1, 859, + 0, 0, 1, 3, -1, -194, + 2, 1, 1,-1, 0,-8227, + 1, 1, 0,-1, 0, 8042, + 1, 1, 0, 1, 0, 8026, + 0, 1,-2,-1, 0,-7932, + 2, 1,-1,-1, 0,-7910, + 1, 0, 1, 1, 0,-6674, + 2,-1,-2,-1, 0, 6502, + 0, 1, 2, 1, 0,-6388, + 4, 0,-2,-1, 0, 6337, + 4,-1,-1,-1, 0, 5958, + 1, 0, 1,-1, 0,-5889, +}; +#else +#define NMB 77 +static short FAR MB[6*NMB] = { +/* + Latitude + D l' l F 1" .0001" */ + + 0, 0, 0, 1,18461, 2387, + 0, 0, 1, 1, 1010, 1671, + 0, 0, 1,-1, 999, 6936, + 2, 0, 0,-1, 623, 6524, + 2, 0,-1, 1, 199, 4837, + 2, 0,-1,-1, 166, 5741, + 2, 0, 0, 1, 117, 2607, + 0, 0, 2, 1, 61, 9120, + 2, 0, 1,-1, 33, 3572, + 0, 0, 2,-1, 31, 7597, + 2,-1, 0,-1, 29, 5766, + 2, 0,-2,-1, 15, 5663, + 2, 0, 1, 1, 15, 1216, + 2, 1, 0,-1, -12, -941, + 2,-1,-1, 1, 8, 8681, + 2,-1, 0, 1, 7, 9586, + 2,-1,-1,-1, 7, 4346, + 0, 1,-1,-1, -6,-7314, + 4, 0,-1,-1, 6, 5796, + 0, 1, 0, 1, -6,-4601, + 0, 0, 0, 3, -6,-2965, + 0, 1,-1, 1, -5,-6324, + 1, 0, 0, 1, -5,-3684, + 0, 1, 1, 1, -5,-3113, + 0, 1, 1,-1, -5, -759, + 0, 1, 0,-1, -4,-8396, + 1, 0, 0,-1, -4,-8057, + 0, 0, 3, 1, 3, 9841, + 4, 0, 0,-1, 3, 6745, + 4, 0,-1, 1, 2, 9985, + 0, 0, 1,-3, 2, 7986, + 4, 0,-2, 1, 2, 4139, + 2, 0, 0,-3, 2, 1863, + 2, 0, 2,-1, 2, 1462, + 2,-1, 1,-1, 1, 7660, + 2, 0,-2, 1, -1,-6244, + 0, 0, 3,-1, 1, 5813, + 2, 0, 2, 1, 1, 5198, + 2, 0,-3,-1, 1, 5156, + 2, 1,-1, 1, -1,-3178, + 2, 1, 0, 1, -1,-2643, + 4, 0, 0, 1, 1, 1919, + 2,-1, 1, 1, 1, 1346, + 2,-2, 0,-1, 1, 859, + 0, 0, 1, 3, -1, -194, + 2, 1, 1,-1, 0,-8227, + 1, 1, 0,-1, 0, 8042, + 1, 1, 0, 1, 0, 8026, + 0, 1,-2,-1, 0,-7932, + 2, 1,-1,-1, 0,-7910, + 1, 0, 1, 1, 0,-6674, + 2,-1,-2,-1, 0, 6502, + 0, 1, 2, 1, 0,-6388, + 4, 0,-2,-1, 0, 6337, + 4,-1,-1,-1, 0, 5958, + 1, 0, 1,-1, 0,-5889, + 4, 0, 1,-1, 0, 4734, + 1, 0,-1,-1, 0,-4299, + 4,-1, 0,-1, 0, 4149, + 2,-2, 0, 1, 0, 3835, + 3, 0, 0,-1, 0,-3518, + 4,-1,-1, 1, 0, 3388, + 2, 0,-1,-3, 0, 3291, + 2,-2,-1, 1, 0, 3147, + 0, 1, 2,-1, 0,-3129, + 3, 0,-1,-1, 0,-3052, + 0, 1,-2, 1, 0,-3013, + 2, 0, 1,-3, 0,-2912, + 2,-2,-1,-1, 0, 2686, + 0, 0, 4, 1, 0, 2633, + 2, 0,-3, 1, 0, 2541, + 2, 0,-1, 3, 0,-2448, + 2, 1, 1, 1, 0,-2370, + 4,-1,-2, 1, 0, 2138, + 4, 0, 1, 1, 0, 2126, + 3, 0,-1, 1, 0,-2059, + 4, 1,-1,-1, 0,-1719, +}; +#endif /* ! MOSH_MOON_200 */ + +#define NLRT 38 +static short FAR LRT[8*NLRT] = { +/* +Multiply by T + Longitude Radius + D l' l F .1" .00001" .1km .00001km */ + + 0, 1, 0, 0, 16, 7680, -1,-2302, + 2,-1,-1, 0, -5,-1642, 3, 8245, + 2,-1, 0, 0, -4,-1383, 5, 1395, + 0, 1,-1, 0, 3, 7115, 3, 2654, + 0, 1, 1, 0, 2, 7560, -2,-6396, + 2, 1,-1, 0, 0, 7118, 0,-6068, + 2, 1, 0, 0, 0, 6128, 0,-7754, + 1, 1, 0, 0, 0,-4516, 0, 4194, + 2,-2, 0, 0, 0,-4048, 0, 4970, + 0, 2, 0, 0, 0, 3747, 0, -540, + 2,-2,-1, 0, 0,-3707, 0, 2490, + 2,-1, 1, 0, 0,-3649, 0, 3222, + 0, 1,-2, 0, 0, 2438, 0, 1760, + 2,-1,-2, 0, 0,-2165, 0,-2530, + 0, 1, 2, 0, 0, 1923, 0,-1450, + 0, 2,-1, 0, 0, 1292, 0, 1070, + 2, 2,-1, 0, 0, 1271, 0,-6070, + 4,-1,-1, 0, 0,-1098, 0, 990, + 2, 0, 0, 0, 0, 1073, 0,-1360, + 2, 0,-1, 0, 0, 839, 0, -630, + 2, 1, 1, 0, 0, 734, 0, -660, + 4,-1,-2, 0, 0, -688, 0, 480, + 2, 1,-2, 0, 0, -630, 0, 0, + 0, 2, 1, 0, 0, 587, 0, -590, + 2,-1, 0,-2, 0, -540, 0, -170, + 4,-1, 0, 0, 0, -468, 0, 390, + 2,-2, 1, 0, 0, -378, 0, 330, + 2, 1, 0,-2, 0, 364, 0, 0, + 1, 1, 1, 0, 0, -317, 0, 240, + 2,-1, 2, 0, 0, -295, 0, 210, + 1, 1,-1, 0, 0, -270, 0, -210, + 2,-3, 0, 0, 0, -256, 0, 310, + 2,-3,-1, 0, 0, -187, 0, 110, + 0, 1,-3, 0, 0, 169, 0, 110, + 4, 1,-1, 0, 0, 158, 0, -150, + 4,-2,-1, 0, 0, -155, 0, 140, + 0, 0, 1, 0, 0, 155, 0, -250, + 2,-2,-2, 0, 0, -148, 0, -170, +}; + +#define NBT 16 +static short FAR BT[5*NBT] = { +/* +Multiply by T + Latitude + D l' l F .00001" */ + + 2,-1, 0,-1, -7430, + 2, 1, 0,-1, 3043, + 2,-1,-1, 1, -2229, + 2,-1, 0, 1, -1999, + 2,-1,-1,-1, -1869, + 0, 1,-1,-1, 1696, + 0, 1, 0, 1, 1623, + 0, 1,-1, 1, 1418, + 0, 1, 1, 1, 1339, + 0, 1, 1,-1, 1278, + 0, 1, 0,-1, 1217, + 2,-2, 0,-1, -547, + 2,-1, 1,-1, -443, + 2, 1,-1, 1, 331, + 2, 1, 0, 1, 317, + 2, 0, 0,-1, 295, +}; + +#define NLRT2 25 +static short FAR LRT2[6*NLRT2] = { +/* +Multiply by T^2 + Longitude Radius + D l' l F .00001" .00001km */ + + 0, 1, 0, 0, 487, -36, + 2,-1,-1, 0, -150, 111, + 2,-1, 0, 0, -120, 149, + 0, 1,-1, 0, 108, 95, + 0, 1, 1, 0, 80, -77, + 2, 1,-1, 0, 21, -18, + 2, 1, 0, 0, 20, -23, + 1, 1, 0, 0, -13, 12, + 2,-2, 0, 0, -12, 14, + 2,-1, 1, 0, -11, 9, + 2,-2,-1, 0, -11, 7, + 0, 2, 0, 0, 11, 0, + 2,-1,-2, 0, -6, -7, + 0, 1,-2, 0, 7, 5, + 0, 1, 2, 0, 6, -4, + 2, 2,-1, 0, 5, -3, + 0, 2,-1, 0, 5, 3, + 4,-1,-1, 0, -3, 3, + 2, 0, 0, 0, 3, -4, + 4,-1,-2, 0, -2, 0, + 2, 1,-2, 0, -2, 0, + 2,-1, 0,-2, -2, 0, + 2, 1, 1, 0, 2, -2, + 2, 0,-1, 0, 2, 0, + 0, 2, 1, 0, 2, 0, +}; + +#define NBT2 12 +static short FAR BT2[5*NBT2] = { +/* +Multiply by T^2 + Latitiude + D l' l F .00001" */ + + 2,-1, 0,-1, -22, + 2, 1, 0,-1, 9, + 2,-1, 0, 1, -6, + 2,-1,-1, 1, -6, + 2,-1,-1,-1, -5, + 0, 1, 0, 1, 5, + 0, 1,-1,-1, 5, + 0, 1, 1, 1, 4, + 0, 1, 1,-1, 4, + 0, 1, 0,-1, 4, + 0, 1,-1, 1, 4, + 2,-2, 0,-1, -2, +}; + +/* The following times are set up by update() and refer + * to the same instant. The distinction between them + * is required by altaz(). + */ +static double FAR ss[5][8]; +static double FAR cc[5][8]; + +static double l; /* Moon's ecliptic longitude */ +static double B; /* Ecliptic latitude */ + +static double moonpol[3]; + +/* Orbit calculation begins. + */ +static double SWELP; +static double M; +static double MP; +static double D; +static double NF; +static double T; +static double T2; + +static double T3; +static double T4; +static double f; +static double g; +static double Ve; +static double Ea; +static double Ma; +static double Ju; +static double Sa; +static double cg; +static double sg; +static double l1; +static double l2; +static double l3; +static double l4; + +/* Calculate geometric coordinates of Moon + * without light time or nutation correction. + */ +int swi_moshmoon2(double J, double *pol) +{ +int i; +T = (J-J2000)/36525.0; +T2 = T*T; +mean_elements(); +mean_elements_pl(); +moon1(); +moon2(); +moon3(); +moon4(); +for( i=0; i<3; i++ ) + pol[i] = moonpol[i]; +return(0); +} + +/* Moshier's moom + * tjd julian day + * xpm array of 6 doubles for moon's position and speed vectors + * serr pointer to error string + */ +int swi_moshmoon(double tjd, AS_BOOL do_save, double *xpmret, char *serr) +{ + int i; + double a, b, x1[6], x2[6], t; + double xx[6], *xpm; + struct plan_data *pdp = &swed.pldat[SEI_MOON]; + char s[AS_MAXCH]; + if (do_save) + xpm = pdp->x; + else + xpm = xx; + /* allow 0.2 day tolerance so that true node interval fits in */ + if (tjd < MOSHLUEPH_START - 0.2 || tjd > MOSHLUEPH_END + 0.2) { + if (serr != NULL) { + sprintf(s, "jd %f outside Moshier's Moon range %.2f .. %.2f ", + tjd, MOSHLUEPH_START, MOSHLUEPH_END); + if (strlen(serr) + strlen(s) < AS_MAXCH) + strcat(serr, s); + } + return(ERR); + } + /* if moon has already been computed */ + if (tjd == pdp->teval && pdp->iephe == SEFLG_MOSEPH) { + if (xpmret != NULL) + for (i = 0; i <= 5; i++) + xpmret[i] = pdp->x[i]; + return(OK); + } + /* else compute moon */ + swi_moshmoon2(tjd, xpm); + if (do_save) { + pdp->teval = tjd; + pdp->xflgs = -1; + pdp->iephe = SEFLG_MOSEPH; + } + /* Moshier moon is referred to ecliptic of date. But we need + * equatorial positions for several reasons. + * e.g. computation of earth from emb and moon + * of heliocentric moon + * Besides, this helps to keep the program structure simpler + */ + ecldat_equ2000(tjd, xpm); + /* speed */ + /* from 2 other positions. */ + /* one would be good enough for computation of osculating node, + * but not for osculating apogee */ + t = tjd + MOON_SPEED_INTV; + swi_moshmoon2(t, x1); + ecldat_equ2000(t, x1); + t = tjd - MOON_SPEED_INTV; + swi_moshmoon2(t, x2); + ecldat_equ2000(t, x2); + for (i = 0; i <= 2; i++) { +#if 0 + xpm[i+3] = (x1[i] - x2[i]) / MOON_SPEED_INTV / 2; +#else + b = (x1[i] - x2[i]) / 2; + a = (x1[i] + x2[i]) / 2 - xpm[i]; + xpm[i+3] = (2 * a + b) / MOON_SPEED_INTV; +#endif + } + if (xpmret != NULL) + for (i = 0; i <= 5; i++) + xpmret[i] = xpm[i]; + return(OK); +} + +#ifdef MOSH_MOON_200 +static void moon1() +{ +double a; + +sscc( 0, STR*D, 6 ); +sscc( 1, STR*M, 4 ); +sscc( 2, STR*MP, 4 ); +sscc( 3, STR*NF, 4 ); + +moonpol[0] = 0.0; +moonpol[1] = 0.0; +moonpol[2] = 0.0; + +/* terms in T^2, scale 1.0 = 10^-5" */ +chewm( LRT2, NLRT2, 4, 2, moonpol ); +chewm( BT2, NBT2, 4, 4, moonpol ); + +f = 18 * Ve - 16 * Ea; + +g = STR*(f - MP ); /* 18V - 16E - l */ +cg = cos(g); +sg = sin(g); +l = 6.367278 * cg + 12.747036 * sg; /* t^0 */ +l1 = 23123.70 * cg - 10570.02 * sg; /* t^1 */ +l2 = z[24] * cg + z[25] * sg; /* t^2 */ +l3 = z[26] * cg + z[27] * sg; /* t^3 */ +l4 = z[28] * cg + z[29] * sg; /* t^4 */ +moonpol[2] += 5.01 * cg + 2.72 * sg; + +g = STR * (10.*Ve - 3.*Ea - MP); +cg = cos(g); +sg = sin(g); +l += -0.253102 * cg + 0.503359 * sg; +l1 += 1258.46 * cg + 707.29 * sg; +l2 += z[30] * cg + z[31] * sg; +l3 += z[32] * cg + z[33] * sg; +l4 += z[34] * cg + z[35] * sg; + +g = STR*(8.*Ve - 13.*Ea); +cg = cos(g); +sg = sin(g); +l += -0.187231 * cg - 0.127481 * sg; +l1 += -319.87 * cg - 18.34 * sg; +l2 += z[36] * cg + z[37] * sg; +l3 += z[38] * cg + z[39] * sg; +l4 += z[40] * cg + z[41] * sg; + +a = 4.0*Ea - 8.0*Ma + 3.0*Ju; +g = STR * a; +cg = cos(g); +sg = sin(g); +l += -0.866287 * cg + 0.248192 * sg; +l1 += 41.87 * cg + 1053.97 * sg; +l2 += z[42] * cg + z[43] * sg; + +g = STR*(a - MP); +cg = cos(g); +sg = sin(g); +l += -0.165009 * cg + 0.044176 * sg; +l1 += 4.67 * cg + 201.55 * sg; + + +g = STR*f; /* 18V - 16E */ +cg = cos(g); +sg = sin(g); +l += 0.330401 * cg + 0.661362 * sg; +l1 += 1202.67 * cg - 555.59 * sg; +l2 += z[44] * cg + z[45] * sg; +l3 += z[46] * cg + z[47] * sg; + +g = STR*(f - 2.0*MP ); /* 18V - 16E - 2l */ +cg = cos(g); +sg = sin(g); +l += 0.352185 * cg + 0.705041 * sg; +l1 += 1283.59 * cg - 586.43 * sg; +l2 += z[48] * cg + z[49] * sg; +l3 += z[50] * cg + z[51] * sg; + +g = STR * (2.0*Ju - 5.0*Sa); +cg = cos(g); +sg = sin(g); +l += -0.034700 * cg + 0.160041 * sg; +l2 += z[52] * cg + z[53] * sg; + +g = STR * (SWELP - NF); +cg = cos(g); +sg = sin(g); +l += 0.000116 * cg + 7.063040 * sg; +l1 += 298.8 * sg; +l2 += z[54] * cg + z[55] * sg; + + +/* T^3 terms */ +sg = sin( STR * M ); +l3 += z[56] * sg; +l4 += z[57] * sg; + +g = STR * (2.0*D - M); +sg = sin(g); +cg = cos(g); +l3 += z[58] * sg; +l4 += z[59] * sg; +moonpol[2] += -0.2655 * cg * T; + +g = g - STR * MP; +sg = sin(g); +l3 += z[60] * sg; +l4 += z[61] * sg; + +g = STR * (M - MP); +l3 += z[62] * sin( g ); +moonpol[2] += -0.1568 * cos( g ) * T; + +g = STR * (M + MP); +l3 += z[63] * sin( g ); +moonpol[2] += 0.1309 * cos( g ) * T; + +g = STR * 2.0 * (D - M); +sg = sin(g); +l3 += z[64] * sg; +l4 += z[65] * sg; + +g = STR * 2.0 * M; +sg = sin(g); +l3 += z[66] * sg; +l4 += z[67] * sg; + +g = STR * (2.0*D - MP); +sg = sin(g); +l3 += z[68] * sg; + +g = STR * (2.0*(D - M) - MP); +sg = sin(g); +l3 += z[69] * sg; + +g = STR * (2.0*(D + M) - MP); +sg = sin(g); +cg = cos(g); +l3 += z[70] * sg; +moonpol[2] += 0.5568 * cg * T; + +l2 += moonpol[0]; + +g = STR*(2.0*D - M - MP); +moonpol[2] += -0.1910 * cos( g ) * T; + + +moonpol[1] *= T; +moonpol[2] *= T; + +/* terms in T */ +moonpol[0] = 0.0; +chewm( BT, NBT, 4, 4, moonpol ); +chewm( LRT, NLRT, 4, 1, moonpol ); +g = STR*(f - MP - NF - 2355767.6); /* 18V - 16E - l - F */ +moonpol[1] += -1127. * sin(g); +g = STR*(f - MP + NF - 235353.6); /* 18V - 16E - l + F */ +moonpol[1] += -1123. * sin(g); +g = STR*(Ea + D + 51987.6); +moonpol[1] += 1303. * sin(g); +g = STR*SWELP; +moonpol[1] += 342. * sin(g); + + +g = STR*(2.*Ve - 3.*Ea); +cg = cos(g); +sg = sin(g); +l += -0.343550 * cg - 0.000276 * sg; +l1 += 105.90 * cg + 336.53 * sg; + +g = STR*(f - 2.*D); /* 18V - 16E - 2D */ +cg = cos(g); +sg = sin(g); +l += 0.074668 * cg + 0.149501 * sg; +l1 += 271.77 * cg - 124.20 * sg; + +g = STR*(f - 2.*D - MP); +cg = cos(g); +sg = sin(g); +l += 0.073444 * cg + 0.147094 * sg; +l1 += 265.24 * cg - 121.16 * sg; + +g = STR*(f + 2.*D - MP); +cg = cos(g); +sg = sin(g); +l += 0.072844 * cg + 0.145829 * sg; +l1 += 265.18 * cg - 121.29 * sg; + +g = STR*(f + 2.*(D - MP)); +cg = cos(g); +sg = sin(g); +l += 0.070201 * cg + 0.140542 * sg; +l1 += 255.36 * cg - 116.79 * sg; + +g = STR*(Ea + D - NF); +cg = cos(g); +sg = sin(g); +l += 0.288209 * cg - 0.025901 * sg; +l1 += -63.51 * cg - 240.14 * sg; + +g = STR*(2.*Ea - 3.*Ju + 2.*D - MP); +cg = cos(g); +sg = sin(g); +l += 0.077865 * cg + 0.438460 * sg; +l1 += 210.57 * cg + 124.84 * sg; + +g = STR*(Ea - 2.*Ma); +cg = cos(g); +sg = sin(g); +l += -0.216579 * cg + 0.241702 * sg; +l1 += 197.67 * cg + 125.23 * sg; + +g = STR*(a + MP); +cg = cos(g); +sg = sin(g); +l += -0.165009 * cg + 0.044176 * sg; +l1 += 4.67 * cg + 201.55 * sg; + +g = STR*(a + 2.*D - MP); +cg = cos(g); +sg = sin(g); +l += -0.133533 * cg + 0.041116 * sg; +l1 += 6.95 * cg + 187.07 * sg; + +g = STR*(a - 2.*D + MP); +cg = cos(g); +sg = sin(g); +l += -0.133430 * cg + 0.041079 * sg; +l1 += 6.28 * cg + 169.08 * sg; + +g = STR*(3.*Ve - 4.*Ea); +cg = cos(g); +sg = sin(g); +l += -0.175074 * cg + 0.003035 * sg; +l1 += 49.17 * cg + 150.57 * sg; + +g = STR*(2.*(Ea + D - MP) - 3.*Ju + 213534.); +l1 += 158.4 * sin(g); +l1 += moonpol[0]; + +a = 0.1 * T; /* set amplitude scale of 1.0 = 10^-4 arcsec */ +moonpol[1] *= a; +moonpol[2] *= a; +} +#else +static void moon1() +{ +double a; +/* This code added by Bhanu Pinnamaneni, 17-aug-2009 */ +/* Note by Dieter: Bhanu noted that ss and cc are not sufficiently + * initialised and random values are used for the calculation. + * However, this may be only part of the bug. + * The bug could be in sscc(). Or may be the bug is rather in + * the 116th line of NLR, where the value "5" may be wrong. + * Still, this will make a maximum difference of only 0.1", while the error + * of the Moshier lunar ephemeris can reach 7". */ +int i, j; +for (i = 0; i < 5; i++) { + for (j = 0; j < 8; j++) { + ss[i][j] = 0; + cc[i][j] = 0; + } +} +/* End of code addition */ +sscc( 0, STR*D, 6 ); +sscc( 1, STR*M, 4 ); +sscc( 2, STR*MP, 4 ); +sscc( 3, STR*NF, 4 ); +moonpol[0] = 0.0; +moonpol[1] = 0.0; +moonpol[2] = 0.0; +/* terms in T^2, scale 1.0 = 10^-5" */ +chewm( LRT2, NLRT2, 4, 2, moonpol ); +chewm( BT2, NBT2, 4, 4, moonpol ); +f = 18 * Ve - 16 * Ea; +g = STR*(f - MP ); /* 18V - 16E - l */ +cg = cos(g); +sg = sin(g); +l = 6.367278 * cg + 12.747036 * sg; /* t^0 */ +l1 = 23123.70 * cg - 10570.02 * sg; /* t^1 */ +l2 = z[12] * cg + z[13] * sg; /* t^2 */ +moonpol[2] += 5.01 * cg + 2.72 * sg; +g = STR * (10.*Ve - 3.*Ea - MP); +cg = cos(g); +sg = sin(g); +l += -0.253102 * cg + 0.503359 * sg; +l1 += 1258.46 * cg + 707.29 * sg; +l2 += z[14] * cg + z[15] * sg; +g = STR*(8.*Ve - 13.*Ea); +cg = cos(g); +sg = sin(g); +l += -0.187231 * cg - 0.127481 * sg; +l1 += -319.87 * cg - 18.34 * sg; +l2 += z[16] * cg + z[17] * sg; +a = 4.0*Ea - 8.0*Ma + 3.0*Ju; +g = STR * a; +cg = cos(g); +sg = sin(g); +l += -0.866287 * cg + 0.248192 * sg; +l1 += 41.87 * cg + 1053.97 * sg; +l2 += z[18] * cg + z[19] * sg; +g = STR*(a - MP); +cg = cos(g); +sg = sin(g); +l += -0.165009 * cg + 0.044176 * sg; +l1 += 4.67 * cg + 201.55 * sg; +g = STR*f; /* 18V - 16E */ +cg = cos(g); +sg = sin(g); +l += 0.330401 * cg + 0.661362 * sg; +l1 += 1202.67 * cg - 555.59 * sg; +l2 += z[20] * cg + z[21] * sg; +g = STR*(f - 2.0*MP ); /* 18V - 16E - 2l */ +cg = cos(g); +sg = sin(g); +l += 0.352185 * cg + 0.705041 * sg; +l1 += 1283.59 * cg - 586.43 * sg; +g = STR * (2.0*Ju - 5.0*Sa); +cg = cos(g); +sg = sin(g); +l += -0.034700 * cg + 0.160041 * sg; +l2 += z[22] * cg + z[23] * sg; +g = STR * (SWELP - NF); +cg = cos(g); +sg = sin(g); +l += 0.000116 * cg + 7.063040 * sg; +l1 += 298.8 * sg; +/* T^3 terms */ +sg = sin( STR * M ); +/* l3 += z[24] * sg; moshier! l3 not initialized! */ +l3 = z[24] * sg; +l4 = 0; +g = STR * (2.0*D - M); +sg = sin(g); +cg = cos(g); +moonpol[2] += -0.2655 * cg * T; +g = STR * (M - MP); +moonpol[2] += -0.1568 * cos( g ) * T; +g = STR * (M + MP); +moonpol[2] += 0.1309 * cos( g ) * T; +g = STR * (2.0*(D + M) - MP); +sg = sin(g); +cg = cos(g); +moonpol[2] += 0.5568 * cg * T; +l2 += moonpol[0]; +g = STR*(2.0*D - M - MP); +moonpol[2] += -0.1910 * cos( g ) * T; +moonpol[1] *= T; +moonpol[2] *= T; +/* terms in T */ +moonpol[0] = 0.0; +chewm( BT, NBT, 4, 4, moonpol ); +chewm( LRT, NLRT, 4, 1, moonpol ); +g = STR*(f - MP - NF - 2355767.6); /* 18V - 16E - l - F */ +moonpol[1] += -1127. * sin(g); +g = STR*(f - MP + NF - 235353.6); /* 18V - 16E - l + F */ +moonpol[1] += -1123. * sin(g); +g = STR*(Ea + D + 51987.6); +moonpol[1] += 1303. * sin(g); +g = STR*SWELP; +moonpol[1] += 342. * sin(g); +g = STR*(2.*Ve - 3.*Ea); +cg = cos(g); +sg = sin(g); +l += -0.343550 * cg - 0.000276 * sg; +l1 += 105.90 * cg + 336.53 * sg; +g = STR*(f - 2.*D); /* 18V - 16E - 2D */ +cg = cos(g); +sg = sin(g); +l += 0.074668 * cg + 0.149501 * sg; +l1 += 271.77 * cg - 124.20 * sg; +g = STR*(f - 2.*D - MP); +cg = cos(g); +sg = sin(g); +l += 0.073444 * cg + 0.147094 * sg; +l1 += 265.24 * cg - 121.16 * sg; +g = STR*(f + 2.*D - MP); +cg = cos(g); +sg = sin(g); +l += 0.072844 * cg + 0.145829 * sg; +l1 += 265.18 * cg - 121.29 * sg; +g = STR*(f + 2.*(D - MP)); +cg = cos(g); +sg = sin(g); +l += 0.070201 * cg + 0.140542 * sg; +l1 += 255.36 * cg - 116.79 * sg; +g = STR*(Ea + D - NF); +cg = cos(g); +sg = sin(g); +l += 0.288209 * cg - 0.025901 * sg; +l1 += -63.51 * cg - 240.14 * sg; +g = STR*(2.*Ea - 3.*Ju + 2.*D - MP); +cg = cos(g); +sg = sin(g); +l += 0.077865 * cg + 0.438460 * sg; +l1 += 210.57 * cg + 124.84 * sg; +g = STR*(Ea - 2.*Ma); +cg = cos(g); +sg = sin(g); +l += -0.216579 * cg + 0.241702 * sg; +l1 += 197.67 * cg + 125.23 * sg; +g = STR*(a + MP); +cg = cos(g); +sg = sin(g); +l += -0.165009 * cg + 0.044176 * sg; +l1 += 4.67 * cg + 201.55 * sg; +g = STR*(a + 2.*D - MP); +cg = cos(g); +sg = sin(g); +l += -0.133533 * cg + 0.041116 * sg; +l1 += 6.95 * cg + 187.07 * sg; +g = STR*(a - 2.*D + MP); +cg = cos(g); +sg = sin(g); +l += -0.133430 * cg + 0.041079 * sg; +l1 += 6.28 * cg + 169.08 * sg; +g = STR*(3.*Ve - 4.*Ea); +cg = cos(g); +sg = sin(g); +l += -0.175074 * cg + 0.003035 * sg; +l1 += 49.17 * cg + 150.57 * sg; +g = STR*(2.*(Ea + D - MP) - 3.*Ju + 213534.); +l1 += 158.4 * sin(g); +l1 += moonpol[0]; +a = 0.1 * T; /* set amplitude scale of 1.0 = 10^-4 arcsec */ +moonpol[1] *= a; +moonpol[2] *= a; +} +#endif /* MOSH_MOON_200 */ + +static void moon2() +{ +/* terms in T^0 */ +g = STR*(2*(Ea-Ju+D)-MP+648431.172); +l += 1.14307 * sin(g); +g = STR*(Ve-Ea+648035.568); +l += 0.82155 * sin(g); +g = STR*(3*(Ve-Ea)+2*D-MP+647933.184); +l += 0.64371 * sin(g); +g = STR*(Ea-Ju+4424.04); +l += 0.63880 * sin(g); +g = STR*(SWELP + MP - NF + 4.68); +l += 0.49331 * sin(g); +g = STR*(SWELP - MP - NF + 4.68); +l += 0.4914 * sin(g); +g = STR*(SWELP+NF+2.52); +l += 0.36061 * sin(g); +g = STR*(2.*Ve - 2.*Ea + 736.2); +l += 0.30154 * sin(g); +g = STR*(2.*Ea - 3.*Ju + 2.*D - 2.*MP + 36138.2); +l += 0.28282 * sin(g); +g = STR*(2.*Ea - 2.*Ju + 2.*D - 2.*MP + 311.0); +l += 0.24516 * sin(g); +g = STR*(Ea - Ju - 2.*D + MP + 6275.88); +l += 0.21117 * sin(g); +g = STR*(2.*(Ea - Ma) - 846.36); +l += 0.19444 * sin(g); +g = STR*(2.*(Ea - Ju) + 1569.96); +l -= 0.18457 * sin(g); +g = STR*(2.*(Ea - Ju) - MP - 55.8); +l += 0.18256 * sin(g); +g = STR*(Ea - Ju - 2.*D + 6490.08); +l += 0.16499 * sin(g); +g = STR*(Ea - 2.*Ju - 212378.4); +l += 0.16427 * sin(g); +g = STR*(2.*(Ve - Ea - D) + MP + 1122.48); +l += 0.16088 * sin(g); +g = STR*(Ve - Ea - MP + 32.04); +l -= 0.15350 * sin(g); +g = STR*(Ea - Ju - MP + 4488.88); +l += 0.14346 * sin(g); +g = STR*(2.*(Ve - Ea + D) - MP - 8.64); +l += 0.13594 * sin(g); +g = STR*(2.*(Ve - Ea - D) + 1319.76); +l += 0.13432 * sin(g); +g = STR*(Ve - Ea - 2.*D + MP - 56.16); +l -= 0.13122 * sin(g); +g = STR*(Ve - Ea + MP + 54.36); +l -= 0.12722 * sin(g); +g = STR*(3.*(Ve - Ea) - MP + 433.8); +l += 0.12539 * sin(g); +g = STR*(Ea - Ju + MP + 4002.12); +l += 0.10994 * sin(g); +g = STR*(20.*Ve - 21.*Ea - 2.*D + MP - 317511.72); +l += 0.10652 * sin(g); +g = STR*(26.*Ve - 29.*Ea - MP + 270002.52); +l += 0.10490 * sin(g); +g = STR*(3.*Ve - 4.*Ea + D - MP - 322765.56); +l += 0.10386 * sin(g); +g = STR*(SWELP+648002.556); +B = 8.04508 * sin(g); +g = STR*(Ea+D+996048.252); +B += 1.51021 * sin(g); +g = STR*(f - MP + NF + 95554.332); +B += 0.63037 * sin(g); +g = STR*(f - MP - NF + 95553.792); +B += 0.63014 * sin(g); +g = STR*(SWELP - MP + 2.9); +B += 0.45587 * sin(g); +g = STR*(SWELP + MP + 2.5); +B += -0.41573 * sin(g); +g = STR*(SWELP - 2.0*NF + 3.2); +B += 0.32623 * sin(g); +g = STR*(SWELP - 2.0*D + 2.5); +B += 0.29855 * sin(g); +} + +static void moon3() +{ +/* terms in T^0 */ +moonpol[0] = 0.0; +chewm( LR, NLR, 4, 1, moonpol ); +chewm( MB, NMB, 4, 3, moonpol ); +l += (((l4 * T + l3) * T + l2) * T + l1) * T * 1.0e-5; +moonpol[0] = SWELP + l + 1.0e-4 * moonpol[0]; +moonpol[1] = 1.0e-4 * moonpol[1] + B; +moonpol[2] = 1.0e-4 * moonpol[2] + 385000.52899; /* kilometers */ +} + +/* Compute final ecliptic polar coordinates + */ +static void moon4() +{ +moonpol[2] /= AUNIT / 1000; +moonpol[0] = STR * mods3600( moonpol[0] ); +moonpol[1] = STR * moonpol[1]; +B = moonpol[1]; +} + +/* mean lunar node + * J julian day + * pol return array for position and velocity + * (polar coordinates of ecliptic of date) + */ +int swi_mean_node(double J, double *pol, char *serr) +{ +#if 0 + double a, b, c; +#endif + char s[AS_MAXCH]; + T = (J-J2000)/36525.0; + T2 = T*T; + T3 = T*T2; + T4 = T2*T2; + /* with elements from swi_moshmoon2(), which are fitted to jpl-ephemeris */ + if (J < MOSHNDEPH_START || J > MOSHNDEPH_END) { + if (serr != NULL) { + sprintf(s, "jd %f outside mean node range %.2f .. %.2f ", + J, MOSHNDEPH_START, MOSHNDEPH_END); + if (strlen(serr) + strlen(s) < AS_MAXCH) + strcat(serr, s); + } + return ERR; + } + mean_elements(); + /* longitude */ + pol[0] = swi_mod2PI((SWELP - NF) * STR); + /* latitude */ + pol[1] = 0.0; + /* distance */ + pol[2] = MOON_MEAN_DIST / AUNIT; /* or should it be derived from mean + * orbital ellipse? */ +#if 0 + a = pol[0]; + /* Chapront, according to Meeus, German, p. 339 */ + pol[0] = 125.0445550 - 1934.1361849 * T + 0.0020762 * T2 + + T3 / 467410 - T4 / 60616000; + pol[0] = swi_mod2PI(pol[0] * DEGTORAD); + c = pol[0]; + printf ("mean node\n"); + printf ("moshier de404 - chapront %f\"\n", (a-c) * RADTODEG * 3600); +#endif + return OK; +} + +/* mean lunar apogee ('dark moon', 'lilith') + * J julian day + * pol return array for position + * (polar coordinates of ecliptic of date) + * serr error return string + */ +int swi_mean_apog(double J, double *pol, char *serr) +{ +#if 0 + int i; + double a, b; + double x[3]; +#endif + double node; + char s[AS_MAXCH]; + T = (J-J2000)/36525.0; + T2 = T*T; + T3 = T*T2; + T4 = T2*T2; + /* with elements from swi_moshmoon2(), which are fitted to jpl-ephemeris */ + if (J < MOSHNDEPH_START || J > MOSHNDEPH_END) { + if (serr != NULL) { + sprintf(s, "jd %f outside mean apogee range %.2f .. %.2f ", + J, MOSHNDEPH_START, MOSHNDEPH_END); + if (strlen(serr) + strlen(s) < AS_MAXCH) + strcat(serr, s); + } + return(ERR); + } + mean_elements(); + pol[0] = swi_mod2PI((SWELP - MP) * STR + PI); +#if 0 + a = pol[0]; + /* Chapront, according to Meeus, German, p. 339 */ + pol[0] = 83.3532430 + 4069.0137111 * T - 0.0103238 * T2 + - T3 / 80053 + T4 / 18999000; + pol[0] = swi_mod2PI(pol[0] * DEGTORAD + PI); + b = pol[0]; + printf ("mean apogee\n"); + printf ("moshier de404 - chapront %f\"\n", (a-b) * RADTODEG * 3600); +#endif + pol[1] = 0; + pol[2] = MOON_MEAN_DIST * (1 + MOON_MEAN_ECC) / AUNIT; /* apogee */ +#if 0 + pol[2] = 2 * MOON_MEAN_ECC * MOON_MEAN_DIST / AUNIT; /* 2nd focus */ +#endif + /* Lilith or Dark Moon is either the empty focal point of the mean + * lunar ellipse or, for some people, its apogee ("aphelion"). + * This is 180 degrees from the perigee. + * + * Since the lunar orbit is not in the ecliptic, the apogee must be + * projected onto the ecliptic. + * Joelle de Gravelaine has in her book "Lilith der schwarze Mond" + * (Astrodata, 1990) an ephemeris which gives noon (12.00) positions + * but does not project them onto the ecliptic. + * This results in a mistake of several arc minutes. + * + * There is also another problem. The other focal point doesn't + * coincide with the geocenter but with the barycenter of the + * earth-moon-system. The difference is about 4700 km. If one + * took this into account, it would result in an oscillation + * of the Black Moon. If defined as the apogee, this oscillation + * would be about +/- 40 arcmin. + * If defined as the second focus, the effect is very large: + * +/- 6 deg! + * We neglect this influence. + */ + /* apogee is now projected onto ecliptic */ + node = (SWELP - NF) * STR; + pol[0] = swi_mod2PI(pol[0] - node); + swi_polcart(pol, pol); + swi_coortrf(pol, pol, -MOON_MEAN_INCL * DEGTORAD); + swi_cartpol(pol, pol); + pol[0] = swi_mod2PI(pol[0] + node); +#if 0 + /* speed */ + mean_elements(T-PLAN_SPEED_INTV, &SWELP, &MP, &NF, &M, &D); + pol[3] = swi_mod2PI((SWELP - MP) * STR + PI); + pol[4] = 0; + pol[5] = MOON_MEAN_DIST * (1 + MOON_MEAN_ECC) / AUNIT; /* apogee */ +#if 0 + pol[2] = 2 * MOON_MEAN_ECC * MOON_MEAN_DIST / AUNIT; /* 2nd focus */ +#endif + node = (SWELP - NF) * STR; + pol[3] = swi_mod2PI(pol[3] - node); + swi_polcart(pol+3, pol+3); + swi_coortrf(pol+3, pol+3, -MOON_MEAN_INCL * DEGTORAD); + swi_cartpol(pol+3, pol+3); + pol[3] = swi_mod2PI(pol[3] + node); + for (i = 0; i <= 2; i++) + pol[3+i] = pol[i] - pol[3+i]; + pol[3] = swi_mod2PI(pol[3]); +#endif + return OK; +} + +/* Program to step through the perturbation table + */ +static void chewm(short *pt, int nlines, int nangles, int typflg, double *ans ) +{ + int i, j, k, k1, m; + double cu, su, cv, sv, ff; + for( i=0; i 0 */ + /* sin, cos (k*angle) from lookup table */ + su = ss[m][k-1]; + cu = cc[m][k-1]; + if( j < 0 ) su = -su; /* negative angle factor */ + if( k1 == 0 ) { + /* Set sin, cos of first angle. */ + sv = su; + cv = cu; + k1 = 1; + } + else { + /* Combine angles by trigonometry. */ + ff = su*cv + cu*sv; + cv = cu*cv - su*sv; + sv = ff; + } + } + } + /* Accumulate + */ + switch( typflg ) { + /* large longitude and radius */ + case 1: + j = *pt++; + k = *pt++; + ans[0] += (10000.0 * j + k) * sv; + j = *pt++; + k = *pt++; + if( k ) ans[2] += (10000.0 * j + k) * cv; + break; + /* longitude and radius */ + case 2: + j = *pt++; + k = *pt++; + ans[0] += j * sv; + ans[2] += k * cv; + break; + /* large latitude */ + case 3: + j = *pt++; + k = *pt++; + ans[1] += ( 10000.0*j + k)*sv; + break; + /* latitude */ + case 4: + j = *pt++; + ans[1] += j * sv; + break; + } + } +} + +/* Prepare lookup table of sin and cos ( i*Lj ) + * for required multiple angles + */ +static void sscc(int k, double arg, int n ) +{ + double cu, su, cv, sv, s; + int i; + su = sin(arg); + cu = cos(arg); + ss[k][0] = su; /* sin(L) */ + cc[k][0] = cu; /* cos(L) */ + sv = 2.0*su*cu; + cv = cu*cu - su*su; + ss[k][1] = sv; /* sin(2L) */ + cc[k][1] = cv; + for( i=2; i +#include "swephexp.h" +#include "sweph.h" +#include "swephlib.h" +#include "swemptab.c" + +#define TIMESCALE 3652500.0 + +#define mods3600(x) ((x) - 1.296e6 * floor ((x)/1.296e6)) + +#define FICT_GEO 1 +#define KGAUSS_GEO 0.0000298122353216 /* Earth only */ +/* #define KGAUSS_GEO 0.00002999502129737 Earth + Moon */ + +static void embofs_mosh(double J, double *xemb); +static int check_t_terms(double t, char *sinp, double *doutp); + +static int read_elements_file(int32 ipl, double tjd, + double *tjd0, double *tequ, + double *mano, double *sema, double *ecce, + double *parg, double *node, double *incl, + char *pname, int32 *fict_ifl, char *serr); + +static int pnoint2msh[] = {2, 2, 0, 1, 3, 4, 5, 6, 7, 8, }; + + +/* From Simon et al (1994) */ +static double freqs[] = +{ +/* Arc sec per 10000 Julian years. */ + 53810162868.8982, + 21066413643.3548, + 12959774228.3429, + 6890507749.3988, + 1092566037.7991, + 439960985.5372, + 154248119.3933, + 78655032.0744, + 52272245.1795 +}; + +static double phases[] = +{ +/* Arc sec. */ + 252.25090552 * 3600., + 181.97980085 * 3600., + 100.46645683 * 3600., + 355.43299958 * 3600., + 34.35151874 * 3600., + 50.07744430 * 3600., + 314.05500511 * 3600., + 304.34866548 * 3600., + 860492.1546, +}; + +static struct plantbl *planets[] = +{ + &mer404, + &ven404, + &ear404, + &mar404, + &jup404, + &sat404, + &ura404, + &nep404, + &plu404 +}; + +static double FAR ss[9][24]; +static double FAR cc[9][24]; + +static void sscc (int k, double arg, int n); + +int swi_moshplan2 (double J, int iplm, double *pobj) +{ + int i, j, k, m, k1, ip, np, nt; + signed char FAR *p; + double FAR *pl, *pb, *pr; + double su, cu, sv, cv, T; + double t, sl, sb, sr; + struct plantbl *plan = planets[iplm]; + + T = (J - J2000) / TIMESCALE; + /* Calculate sin( i*MM ), etc. for needed multiple angles. */ + for (i = 0; i < 9; i++) + { + if ((j = plan->max_harmonic[i]) > 0) + { + sr = (mods3600 (freqs[i] * T) + phases[i]) * STR; + sscc (i, sr, j); + } + } + + /* Point to start of table of arguments. */ + p = plan->arg_tbl; + /* Point to tabulated cosine and sine amplitudes. */ + pl = plan->lon_tbl; + pb = plan->lat_tbl; + pr = plan->rad_tbl; + sl = 0.0; + sb = 0.0; + sr = 0.0; + + for (;;) + { + /* argument of sine and cosine */ + /* Number of periodic arguments. */ + np = *p++; + if (np < 0) + break; + if (np == 0) + { /* It is a polynomial term. */ + nt = *p++; + /* Longitude polynomial. */ + cu = *pl++; + for (ip = 0; ip < nt; ip++) + { + cu = cu * T + *pl++; + } + sl += mods3600 (cu); + /* Latitude polynomial. */ + cu = *pb++; + for (ip = 0; ip < nt; ip++) + { + cu = cu * T + *pb++; + } + sb += cu; + /* Radius polynomial. */ + cu = *pr++; + for (ip = 0; ip < nt; ip++) + { + cu = cu * T + *pr++; + } + sr += cu; + continue; + } + k1 = 0; + cv = 0.0; + sv = 0.0; + for (ip = 0; ip < np; ip++) + { + /* What harmonic. */ + j = *p++; + /* Which planet. */ + m = *p++ - 1; + if (j) + { + k = j; + if (j < 0) + k = -k; + k -= 1; + su = ss[m][k]; /* sin(k*angle) */ + if (j < 0) + su = -su; + cu = cc[m][k]; + if (k1 == 0) + { /* set first angle */ + sv = su; + cv = cu; + k1 = 1; + } + else + { /* combine angles */ + t = su * cv + cu * sv; + cv = cu * cv - su * sv; + sv = t; + } + } + } + /* Highest power of T. */ + nt = *p++; + /* Longitude. */ + cu = *pl++; + su = *pl++; + for (ip = 0; ip < nt; ip++) + { + cu = cu * T + *pl++; + su = su * T + *pl++; + } + sl += cu * cv + su * sv; + /* Latitiude. */ + cu = *pb++; + su = *pb++; + for (ip = 0; ip < nt; ip++) + { + cu = cu * T + *pb++; + su = su * T + *pb++; + } + sb += cu * cv + su * sv; + /* Radius. */ + cu = *pr++; + su = *pr++; + for (ip = 0; ip < nt; ip++) + { + cu = cu * T + *pr++; + su = su * T + *pr++; + } + sr += cu * cv + su * sv; + } + pobj[0] = STR * sl; + pobj[1] = STR * sb; + pobj[2] = STR * plan->distance * sr + plan->distance; + return OK; +} + +/* Moshier ephemeris. + * computes heliocentric cartesian equatorial coordinates of + * equinox 2000 + * for earth and a planet + * tjd julian day + * ipli internal SWEPH planet number + * xp array of 6 doubles for planet's position and speed + * xe earth's + * serr error string + */ +int swi_moshplan(double tjd, int ipli, AS_BOOL do_save, double *xpret, double *xeret, char *serr) +{ + int i; + int do_earth = FALSE; + double dx[3], x2[3], xxe[6], xxp[6]; + double *xp, *xe; + double dt; + char s[AS_MAXCH]; + int iplm = pnoint2msh[ipli]; + struct plan_data *pdp = &swed.pldat[ipli]; + struct plan_data *pedp = &swed.pldat[SEI_EARTH]; + double seps2000 = swed.oec2000.seps; + double ceps2000 = swed.oec2000.ceps; + if (do_save) { + xp = pdp->x; + xe = pedp->x; + } else { + xp = xxp; + xe = xxe; + } + if (do_save || ipli == SEI_EARTH || xeret != NULL) + do_earth = TRUE; + /* tjd beyond ephemeris limits, give some margin for spped at edge */ + if (tjd < MOSHPLEPH_START - 0.3 || tjd > MOSHPLEPH_END + 0.3) { + if (serr != NULL) { + sprintf(s, "jd %f outside Moshier planet range %.2f .. %.2f ", + tjd, MOSHPLEPH_START, MOSHPLEPH_END); + if (strlen(serr) + strlen(s) < AS_MAXCH) + strcat(serr, s); + } + return(ERR); + } + /* earth, for geocentric position */ + if (do_earth) { + if (tjd == pedp->teval + && pedp->iephe == SEFLG_MOSEPH) { + xe = pedp->x; + } else { + /* emb */ + swi_moshplan2(tjd, pnoint2msh[SEI_EMB], xe); /* emb hel. ecl. 2000 polar */ + swi_polcart(xe, xe); /* to cartesian */ + swi_coortrf2(xe, xe, -seps2000, ceps2000);/* and equator 2000 */ + embofs_mosh(tjd, xe); /* emb -> earth */ + if (do_save) { + pedp->teval = tjd; + pedp->xflgs = -1; + pedp->iephe = SEFLG_MOSEPH; + } + /* one more position for speed. */ + swi_moshplan2(tjd - PLAN_SPEED_INTV, pnoint2msh[SEI_EMB], x2); + swi_polcart(x2, x2); + swi_coortrf2(x2, x2, -seps2000, ceps2000); + embofs_mosh(tjd - PLAN_SPEED_INTV, x2);/**/ + for (i = 0; i <= 2; i++) + dx[i] = (xe[i] - x2[i]) / PLAN_SPEED_INTV; + /* store speed */ + for (i = 0; i <= 2; i++) { + xe[i+3] = dx[i]; + } + } + if (xeret != NULL) + for (i = 0; i <= 5; i++) + xeret[i] = xe[i]; + } + /* earth is the planet wanted */ + if (ipli == SEI_EARTH) { + xp = xe; + } else { + /* other planet */ + /* if planet has already been computed, return */ + if (tjd == pdp->teval && pdp->iephe == SEFLG_MOSEPH) { + xp = pdp->x; + } else { + swi_moshplan2(tjd, iplm, xp); + swi_polcart(xp, xp); + swi_coortrf2(xp, xp, -seps2000, ceps2000); + if (do_save) { + pdp->teval = tjd;/**/ + pdp->xflgs = -1; + pdp->iephe = SEFLG_MOSEPH; + } + /* one more position for speed. + * the following dt gives good speed for light-time correction + */ + #if 0 + for (i = 0; i <= 2; i++) + dx[i] = xp[i] - pedp->x[i]; + dt = LIGHTTIME_AUNIT * sqrt(square_sum(dx)); + #endif + dt = PLAN_SPEED_INTV; + swi_moshplan2(tjd - dt, iplm, x2); + swi_polcart(x2, x2); + swi_coortrf2(x2, x2, -seps2000, ceps2000); + for (i = 0; i <= 2; i++) + dx[i] = (xp[i] - x2[i]) / dt; + /* store speed */ + for (i = 0; i <= 2; i++) { + xp[i+3] = dx[i]; + } + } + if (xpret != NULL) + for (i = 0; i <= 5; i++) + xpret[i] = xp[i]; + } + return(OK); +} + + +/* Prepare lookup table of sin and cos ( i*Lj ) + * for required multiple angles + */ +static void sscc (int k, double arg, int n) +{ + double cu, su, cv, sv, s; + int i; + + su = sin (arg); + cu = cos (arg); + ss[k][0] = su; /* sin(L) */ + cc[k][0] = cu; /* cos(L) */ + sv = 2.0 * su * cu; + cv = cu * cu - su * su; + ss[k][1] = sv; /* sin(2L) */ + cc[k][1] = cv; + for (i = 2; i < n; i++) + { + s = su * cv + cu * sv; + cv = cu * cv - su * sv; + sv = s; + ss[k][i] = sv; /* sin( i+1 L ) */ + cc[k][i] = cv; + } +} + + +/* Adjust position from Earth-Moon barycenter to Earth + * + * J = Julian day number + * xemb = rectangular equatorial coordinates of Earth + */ +static void embofs_mosh(double tjd, double *xemb) +{ + double T, M, a, L, B, p; + double smp, cmp, s2mp, c2mp, s2d, c2d, sf, cf; + double s2f, sx, cx, xyz[6]; + double seps = swed.oec.seps; + double ceps = swed.oec.ceps; + int i; + /* Short series for position of the Moon + */ + T = (tjd-J1900)/36525.0; + /* Mean anomaly of moon (MP) */ + a = swe_degnorm(((1.44e-5*T + 0.009192)*T + 477198.8491)*T + 296.104608); + a *= DEGTORAD; + smp = sin(a); + cmp = cos(a); + s2mp = 2.0*smp*cmp; /* sin(2MP) */ + c2mp = cmp*cmp - smp*smp; /* cos(2MP) */ + /* Mean elongation of moon (D) */ + a = swe_degnorm(((1.9e-6*T - 0.001436)*T + 445267.1142)*T + 350.737486); + a = 2.0 * DEGTORAD * a; + s2d = sin(a); + c2d = cos(a); + /* Mean distance of moon from its ascending node (F) */ + a = swe_degnorm((( -3.e-7*T - 0.003211)*T + 483202.0251)*T + 11.250889); + a *= DEGTORAD; + sf = sin(a); + cf = cos(a); + s2f = 2.0*sf*cf; /* sin(2F) */ + sx = s2d*cmp - c2d*smp; /* sin(2D - MP) */ + cx = c2d*cmp + s2d*smp; /* cos(2D - MP) */ + /* Mean longitude of moon (LP) */ + L = ((1.9e-6*T - 0.001133)*T + 481267.8831)*T + 270.434164; + /* Mean anomaly of sun (M) */ + M = swe_degnorm((( -3.3e-6*T - 1.50e-4)*T + 35999.0498)*T + 358.475833); + /* Ecliptic longitude of the moon */ + L = L + + 6.288750*smp + + 1.274018*sx + + 0.658309*s2d + + 0.213616*s2mp + - 0.185596*sin( DEGTORAD * M ) + - 0.114336*s2f; + /* Ecliptic latitude of the moon */ + a = smp*cf; + sx = cmp*sf; + B = 5.128189*sf + + 0.280606*(a+sx) /* sin(MP+F) */ + + 0.277693*(a-sx) /* sin(MP-F) */ + + 0.173238*(s2d*cf - c2d*sf); /* sin(2D-F) */ + B *= DEGTORAD; + /* Parallax of the moon */ + p = 0.950724 + +0.051818*cmp + +0.009531*cx + +0.007843*c2d + +0.002824*c2mp; + p *= DEGTORAD; + /* Elongation of Moon from Sun + */ + L = swe_degnorm(L); + L *= DEGTORAD; + /* Distance in au */ + a = 4.263523e-5/sin(p); + /* Convert to rectangular ecliptic coordinates */ + xyz[0] = L; + xyz[1] = B; + xyz[2] = a; + swi_polcart(xyz, xyz); + /* Convert to equatorial */ + swi_coortrf2(xyz, xyz, -seps, ceps); + /* Precess to equinox of J2000.0 */ + swi_precess(xyz, tjd, J_TO_J2000);/**/ + /* now emb -> earth */ + for (i = 0; i <= 2; i++) + xemb[i] -= xyz[i] / (EARTH_MOON_MRAT + 1.0); +} + +/* orbital elements of planets that are computed from osculating elements + * epoch + * equinox + * mean anomaly, + * semi axis, + * eccentricity, + * argument of perihelion, + * ascending node + * inclination + */ +#define SE_NEELY /* use James Neely's revised elements + * of Uranian planets*/ +static char *plan_fict_nam[SE_NFICT_ELEM] = + {"Cupido", "Hades", "Zeus", "Kronos", + "Apollon", "Admetos", "Vulkanus", "Poseidon", + "Isis-Transpluto", "Nibiru", "Harrington", + "Leverrier", "Adams", + "Lowell", "Pickering",}; + +char *swi_get_fict_name(int32 ipl, char *snam) +{ + if (read_elements_file(ipl, 0, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, + snam, NULL, NULL) == ERR) + strcpy(snam, "name not found"); + return snam; +} + +static double plan_oscu_elem[SE_NFICT_ELEM][8] = { +#ifdef SE_NEELY + {J1900, J1900, 163.7409, 40.99837, 0.00460, 171.4333, 129.8325, 1.0833},/* Cupido Neely */ + {J1900, J1900, 27.6496, 50.66744, 0.00245, 148.1796, 161.3339, 1.0500},/* Hades Neely */ + {J1900, J1900, 165.1232, 59.21436, 0.00120, 299.0440, 0.0000, 0.0000},/* Zeus Neely */ + {J1900, J1900, 169.0193, 64.81960, 0.00305, 208.8801, 0.0000, 0.0000},/* Kronos Neely */ + {J1900, J1900, 138.0533, 70.29949, 0.00000, 0.0000, 0.0000, 0.0000},/* Apollon Neely */ + {J1900, J1900, 351.3350, 73.62765, 0.00000, 0.0000, 0.0000, 0.0000},/* Admetos Neely */ + {J1900, J1900, 55.8983, 77.25568, 0.00000, 0.0000, 0.0000, 0.0000},/* Vulcanus Neely */ + {J1900, J1900, 165.5163, 83.66907, 0.00000, 0.0000, 0.0000, 0.0000},/* Poseidon Neely */ +#else + {J1900, J1900, 104.5959, 40.99837, 0, 0, 0, 0}, /* Cupido */ + {J1900, J1900, 337.4517, 50.667443, 0, 0, 0, 0}, /* Hades */ + {J1900, J1900, 104.0904, 59.214362, 0, 0, 0, 0}, /* Zeus */ + {J1900, J1900, 17.7346, 64.816896, 0, 0, 0, 0}, /* Kronos */ + {J1900, J1900, 138.0354, 70.361652, 0, 0, 0, 0}, /* Apollon */ + {J1900, J1900, -8.678, 73.736476, 0, 0, 0, 0}, /* Admetos */ + {J1900, J1900, 55.9826, 77.445895, 0, 0, 0, 0}, /* Vulkanus */ + {J1900, J1900, 165.3595, 83.493733, 0, 0, 0, 0}, /* Poseidon */ +#endif + /* Isis-Transpluto; elements from "Die Sterne" 3/1952, p. 70ff. + * Strubell does not give an equinox. 1945 is taken to best reproduce + * ASTRON ephemeris. (This is a strange choice, though.) + * The epoch is 1772.76. The year is understood to have 366 days. + * The fraction is counted from 1 Jan. 1772 */ + {2368547.66, 2431456.5, 0.0, 77.775, 0.3, 0.7, 0, 0}, + /* Nibiru, elements from Christian Woeltge, Hannover */ + {1856113.380954, 1856113.380954, 0.0, 234.8921, 0.981092, 103.966, -44.567, 158.708}, + /* Harrington, elements from Astronomical Journal 96(4), Oct. 1988 */ + {2374696.5, J2000, 0.0, 101.2, 0.411, 208.5, 275.4, 32.4}, + /* Leverrier's Neptune, + according to W.G. Hoyt, "Planets X and Pluto", Tucson 1980, p. 63 */ + {2395662.5, 2395662.5, 34.05, 36.15, 0.10761, 284.75, 0, 0}, + /* Adam's Neptune */ + {2395662.5, 2395662.5, 24.28, 37.25, 0.12062, 299.11, 0, 0}, + /* Lowell's Pluto */ + {2425977.5, 2425977.5, 281, 43.0, 0.202, 204.9, 0, 0}, + /* Pickering's Pluto */ + {2425977.5, 2425977.5, 48.95, 55.1, 0.31, 280.1, 100, 15}, /**/ +#if 0 /* Ceres JPL 1600, without perturbations from other minor planets, + * from following initial elements: + * 2450600.5 2000 0 1 164.7073602 73.0340746 80.5995101 + * 10.5840296 0.07652422 0.0 2.770176095 */ + {2305447.5, J2000, 0.5874558977449977e+02, 0.2766536058742327e+01, + 0.7870946565779195e-01, 0.5809199028919189e+02, + 0.8650119410725021e+02, 0.1066835622280712e+02}, + /* Chiron, Bowell database 18-mar-1997 */ + {2450500.5, J2000, 7.258191, 13.67387471, 0.38174778, 339.558345, 209.379239, 6.933360}, /**/ +#endif +}; + +/* computes a planet from osculating elements * + * tjd julian day + * ipl body number + * ipli body number in planetary data structure + * iflag flags + */ +int swi_osc_el_plan(double tjd, double *xp, int ipl, int ipli, double *xearth, double *xsun, char *serr) +{ + double pqr[9], x[6]; + double eps, K, fac, rho, cose, sine; + double alpha, beta, zeta, sigma, M2, Msgn, M_180_or_0; + double tjd0, tequ, mano, sema, ecce, parg, node, incl, dmot; + double cosnode, sinnode, cosincl, sinincl, cosparg, sinparg; + double M, E; + struct plan_data *pedp = &swed.pldat[SEI_EARTH]; + struct plan_data *pdp = &swed.pldat[ipli]; + int32 fict_ifl = 0; + int i; + /* orbital elements, either from file or, if file not found, + * from above built-in set + */ + if (read_elements_file(ipl, tjd, &tjd0, &tequ, + &mano, &sema, &ecce, &parg, &node, &incl, + NULL, &fict_ifl, serr) == ERR) + return ERR; + dmot = 0.9856076686 * DEGTORAD / sema / sqrt(sema); /* daily motion */ + if (fict_ifl & FICT_GEO) + dmot /= sqrt(SUN_EARTH_MRAT); + cosnode = cos(node); + sinnode = sin(node); + cosincl = cos(incl); + sinincl = sin(incl); + cosparg = cos(parg); + sinparg = sin(parg); + /* Gaussian vector */ + pqr[0] = cosparg * cosnode - sinparg * cosincl * sinnode; + pqr[1] = -sinparg * cosnode - cosparg * cosincl * sinnode; + pqr[2] = sinincl * sinnode; + pqr[3] = cosparg * sinnode + sinparg * cosincl * cosnode; + pqr[4] = -sinparg * sinnode + cosparg * cosincl * cosnode; + pqr[5] = -sinincl * cosnode; + pqr[6] = sinparg * sinincl; + pqr[7] = cosparg * sinincl; + pqr[8] = cosincl; + /* Kepler problem */ + E = M = swi_mod2PI(mano + (tjd - tjd0) * dmot); /* mean anomaly of date */ + /* better E for very high eccentricity and small M */ + if (ecce > 0.975) { + M2 = M * RADTODEG; + if (M2 > 150 && M2 < 210) { + M2 -= 180; + M_180_or_0 = 180; + } else + M_180_or_0 = 0; + if (M2 > 330) + M2 -= 360; + if (M2 < 0) { + M2 = -M2; + Msgn = -1; + } else + Msgn = 1; + if (M2 < 30) { + M2 *= DEGTORAD; + alpha = (1 - ecce) / (4 * ecce + 0.5); + beta = M2 / (8 * ecce + 1); + zeta = pow(beta + sqrt(beta * beta + alpha * alpha), 1/3); + sigma = zeta - alpha / 2; + sigma = sigma - 0.078 * sigma * sigma * sigma * sigma * sigma / (1 + ecce); + E = Msgn * (M2 + ecce * (3 * sigma - 4 * sigma * sigma * sigma)) + + M_180_or_0; + } + } + E = swi_kepler(E, M, ecce); + /* position and speed, referred to orbital plane */ + if (fict_ifl & FICT_GEO) + K = KGAUSS_GEO / sqrt(sema); + else + K = KGAUSS / sqrt(sema); + cose = cos(E); + sine = sin(E); + fac = sqrt((1 - ecce) * (1 + ecce)); + rho = 1 - ecce * cose; + x[0] = sema * (cose - ecce); + x[1] = sema * fac * sine; + x[3] = -K * sine / rho; + x[4] = K * fac * cose / rho; + /* transformation to ecliptic */ + xp[0] = pqr[0] * x[0] + pqr[1] * x[1]; + xp[1] = pqr[3] * x[0] + pqr[4] * x[1]; + xp[2] = pqr[6] * x[0] + pqr[7] * x[1]; + xp[3] = pqr[0] * x[3] + pqr[1] * x[4]; + xp[4] = pqr[3] * x[3] + pqr[4] * x[4]; + xp[5] = pqr[6] * x[3] + pqr[7] * x[4]; + /* transformation to equator */ + eps = swi_epsiln(tequ); + swi_coortrf(xp, xp, -eps); + swi_coortrf(xp+3, xp+3, -eps); + /* precess to J2000 */ + if (tequ != J2000) { + swi_precess(xp, tequ, J_TO_J2000); + swi_precess(xp+3, tequ, J_TO_J2000); + } + /* to solar system barycentre */ + if (fict_ifl & FICT_GEO) { + for (i = 0; i <= 5; i++) { + xp[i] += xearth[i]; + } + } else { + for (i = 0; i <= 5; i++) { + xp[i] += xsun[i]; + } + } + if (pdp->x == xp) { + pdp->teval = tjd; /* for precession! */ + pdp->iephe = pedp->iephe; + } + return OK; +} + +#if 1 +/* note: input parameter tjd is required for T terms in elements */ +static int read_elements_file(int32 ipl, double tjd, + double *tjd0, double *tequ, + double *mano, double *sema, double *ecce, + double *parg, double *node, double *incl, + char *pname, int32 *fict_ifl, char *serr) +{ + int i, iline, iplan, retc, ncpos; + FILE *fp = NULL; + char s[AS_MAXCH], *sp; + char *cpos[20], serri[AS_MAXCH]; + AS_BOOL elem_found = FALSE; + double tt = 0; + /* -1, because file information is not saved, file is always closed */ + if ((fp = swi_fopen(-1, SE_FICTFILE, swed.ephepath, serr)) == NULL) { + /* file does not exist, use built-in bodies */ + if (ipl >= SE_NFICT_ELEM) { + if (serr != NULL) + sprintf(serr, "error no elements for fictitious body no %7.0f", (double) ipl); + return ERR; + } + if (tjd0 != NULL) + *tjd0 = plan_oscu_elem[ipl][0]; /* epoch */ + if (tequ != NULL) + *tequ = plan_oscu_elem[ipl][1]; /* equinox */ + if (mano != NULL) + *mano = plan_oscu_elem[ipl][2] * DEGTORAD; /* mean anomaly */ + if (sema != NULL) + *sema = plan_oscu_elem[ipl][3]; /* semi-axis */ + if (ecce != NULL) + *ecce = plan_oscu_elem[ipl][4]; /* eccentricity */ + if (parg != NULL) + *parg = plan_oscu_elem[ipl][5] * DEGTORAD; /* arg. of peri. */ + if (node != NULL) + *node = plan_oscu_elem[ipl][6] * DEGTORAD; /* asc. node */ + if (incl != NULL) + *incl = plan_oscu_elem[ipl][7] * DEGTORAD; /* inclination */ + if (pname != NULL) + strcpy(pname, plan_fict_nam[ipl]); + return OK; + } + /* + * find elements in file + */ + iline = 0; + iplan = -1; + while (fgets(s, AS_MAXCH, fp) != NULL) { + iline++; + sp = s; + while(*sp == ' ' || *sp == '\t') + sp++; + swi_strcpy(s, sp); + if (*s == '#') + continue; + if (*s == '\r') + continue; + if (*s == '\n') + continue; + if (*s == '\0') + continue; + if ((sp = strchr(s, '#')) != NULL) + *sp = '\0'; + ncpos = swi_cutstr(s, ",", cpos, 20); + sprintf(serri, "error in file %s, line %7.0f:", + SE_FICTFILE, (double) iline); + if (ncpos < 9) { + if (serr != NULL) + sprintf(serr, "%s nine elements required", serri); + return ERR; + } + iplan++; + if (iplan != ipl) + continue; + elem_found = TRUE; + /* epoch of elements */ + if (tjd0 != NULL) { + sp = cpos[0]; + for (i = 0; i < 5; i++) + sp[i] = tolower(sp[i]); + if (strncmp(sp, "j2000", 5) == OK) + *tjd0 = J2000; + else if (strncmp(sp, "b1950", 5) == OK) + *tjd0 = B1950; + else if (strncmp(sp, "j1900", 5) == OK) + *tjd0 = J1900; + else if (*sp == 'j' || *sp == 'b') { + if (serr != NULL) + sprintf(serr, "%s invalid epoch", serri); + goto return_err; + } else + *tjd0 = atof(sp); + tt = tjd - *tjd0; + } + /* equinox */ + if (tequ != NULL) { + sp = cpos[1]; + while(*sp == ' ' || *sp == '\t') + sp++; + for (i = 0; i < 5; i++) + sp[i] = tolower(sp[i]); + if (strncmp(sp, "j2000", 5) == OK) + *tequ = J2000; + else if (strncmp(sp, "b1950", 5) == OK) + *tequ = B1950; + else if (strncmp(sp, "j1900", 5) == OK) + *tequ = J1900; + else if (strncmp(sp, "jdate", 5) == OK) + *tequ = tjd; + else if (*sp == 'j' || *sp == 'b') { + if (serr != NULL) + sprintf(serr, "%s invalid equinox", serri); + goto return_err; + } else + *tequ = atof(sp); + } + /* mean anomaly t0 */ + if (mano != NULL) { + retc = check_t_terms(tt, cpos[2], mano); + *mano = swe_degnorm(*mano); + if (retc == ERR) { + if (serr != NULL) + sprintf(serr, "%s mean anomaly value invalid", serri); + goto return_err; + } + /* if mean anomaly has t terms (which happens with fictitious + * planet Vulcan), we set + * epoch = tjd, so that no motion will be added anymore + * equinox = tjd */ + if (retc == 1) { + *tjd0 = tjd; + } + *mano *= DEGTORAD; + } + /* semi-axis */ + if (sema != NULL) { + retc = check_t_terms(tt, cpos[3], sema); + if (*sema <= 0 || retc == ERR) { + if (serr != NULL) + sprintf(serr, "%s semi-axis value invalid", serri); + goto return_err; + } + } + /* eccentricity */ + if (ecce != NULL) { + retc = check_t_terms(tt, cpos[4], ecce); + if (*ecce >= 1 || *ecce < 0 || retc == ERR) { + if (serr != NULL) + sprintf(serr, "%s eccentricity invalid (no parabolic or hyperbolic orbits allowed)", serri); + goto return_err; + } + } + /* perihelion argument */ + if (parg != NULL) { + retc = check_t_terms(tt, cpos[5], parg); + *parg = swe_degnorm(*parg); + if (retc == ERR) { + if (serr != NULL) + sprintf(serr, "%s perihelion argument value invalid", serri); + goto return_err; + } + *parg *= DEGTORAD; + } + /* node */ + if (node != NULL) { + retc = check_t_terms(tt, cpos[6], node); + *node = swe_degnorm(*node); + if (retc == ERR) { + if (serr != NULL) + sprintf(serr, "%s node value invalid", serri); + goto return_err; + } + *node *= DEGTORAD; + } + /* inclination */ + if (incl != NULL) { + retc = check_t_terms(tt, cpos[7], incl); + *incl = swe_degnorm(*incl); + if (retc == ERR) { + if (serr != NULL) + sprintf(serr, "%s inclination value invalid", serri); + goto return_err; + } + *incl *= DEGTORAD; + } + /* planet name */ + if (pname != NULL) { + sp = cpos[8]; + while(*sp == ' ' || *sp == '\t') + sp++; + swi_right_trim(sp); + strcpy(pname, sp); + } + /* geocentric */ + if (fict_ifl != NULL && ncpos > 9) { + for (sp = cpos[9]; *sp != '\0'; sp++) + *sp = tolower(*sp); + if (strstr(cpos[9], "geo") != NULL) + *fict_ifl |= FICT_GEO; + } + break; + } + if (!elem_found) { + if (serr != NULL) + sprintf(serr, "%s elements for planet %7.0f not found", serri, (double) ipl); + goto return_err; + } + fclose(fp); + return OK; +return_err: + fclose(fp); + return ERR; +} +#endif + +static int check_t_terms(double t, char *sinp, double *doutp) +{ + int i, isgn = 1, z; + int retc = 0; + char *sp; + double tt[5], fac; + tt[0] = t / 36525; + tt[1] = tt[0]; + tt[2] = tt[1] * tt[1]; + tt[3] = tt[2] * tt[1]; + tt[4] = tt[3] * tt[1]; + if ((sp = strpbrk(sinp, "+-")) != NULL) + retc = 1; /* with additional terms */ + sp = sinp; + *doutp = 0; + fac = 1; + z = 0; + while (1) { + while(*sp != '\0' && strchr(" \t", *sp) != NULL) + sp++; + if (strchr("+-", *sp) || *sp == '\0') { + if (z > 0) + *doutp += fac; + isgn = 1; + if (*sp == '-') + isgn = -1; + fac = 1 * isgn; + if (*sp == '\0') + return retc; + sp++; + } else { + while(*sp != '\0' && strchr("* \t", *sp) != NULL) + sp++; + if (*sp != '\0' && strchr("tT", *sp) != NULL) { + /* a T */ + sp++; + if (*sp != '\0' && strchr("+-", *sp)) + fac *= tt[0]; + else if ((i = atoi(sp)) <= 4 && i >= 0) + fac *= tt[i]; + } else { + /* a number */ + if (atof(sp) != 0 || *sp == '0') + fac *= atof(sp); + } + while (*sp != '\0' && strchr("0123456789.", *sp)) + sp++; + } + z++; + } + return retc; /* there have been additional terms */ +} diff --git a/swe/src/swemptab.c b/swe/src/swemptab.c new file mode 100644 index 0000000..bf77df6 --- /dev/null +++ b/swe/src/swemptab.c @@ -0,0 +1,10642 @@ +/* SWISSEPH + $Header: /home/dieter/sweph/RCS/swemptab.c,v 1.74 2008/06/16 10:07:20 dieter Exp $ + + ATTENTION: this source file is not to be compiled separately, + as it is #included by swemplan + +**************************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + + +/* +First date in file = 1228000.50 +Number of records = 397276.0 +Days per record = 4.0 + Julian Years Lon Lat Rad + -1349.9 to -1000.0: 0.42 0.18 0.16 + -1000.0 to -500.0: 0.37 0.19 0.13 + -500.0 to 0.0: 0.35 0.17 0.12 + 0.0 to 500.0: 0.34 0.15 0.10 + 500.0 to 1000.0: 0.28 0.14 0.09 + 1000.0 to 1500.0: 0.34 0.14 0.09 + 1500.0 to 2000.0: 0.35 0.13 0.09 + 2000.0 to 2500.0: 0.38 0.12 0.12 + 2500.0 to 3000.0: 0.42 0.13 0.16 + 3000.0 to 3000.8: 0.252 0.087 0.115 +*/ +static double FAR mertabl[] = { + 35.85255, -163.26379, 53810162857.56026, 908082.18475, + + 0.05214, -0.07712, + + 1.07258, 0.04008, 0.49259, 0.00230, + 0.02324, 0.05869, + + 0.24516, 0.22898, -0.06037, 0.13023, + + 0.00331, -0.03576, + + 0.06464, 0.00089, + + 0.03103, 0.05078, + + -0.01133, 0.01520, + + 0.14654, 0.07538, 0.25112, -0.24473, + -0.17928, -0.53366, + + -0.06367, 0.20458, -0.42985, 0.14848, + -0.35317, -0.61364, + + 0.00325, -0.08617, -0.23180, 0.08576, + 0.22995, 0.43569, + + 1.92114, 2.89319, -5.55637, 4.70329, + -4.91411, -5.45521, + + 0.02607, 0.04468, + + -0.05439, 0.13476, -0.07329, -0.00985, + + -0.00278, 0.05377, + + 0.07474, -0.09658, 0.29818, 0.20422, + -0.29074, 0.44962, + + -0.15411, -0.04287, 0.29907, -1.02948, + 3.62183, 0.84869, + + -0.08157, 0.02754, + + -0.03610, -0.12909, 0.09195, -0.04424, + + -0.08845, 0.09347, + + -0.27140, 0.08185, + + 0.24783, 0.19543, -0.25154, 0.41371, + + -0.00046, 0.01524, + + 0.04127, 0.06663, + + 0.43023, 0.11790, + + 0.04427, 0.05329, + + 0.00411, -0.71074, + + -0.07111, -0.09824, + + 0.01264, -0.02075, + + -0.00068, -0.01678, + + 0.01186, 0.00181, + + 0.00302, -0.21963, + + -0.06412, -0.10155, -0.36856, 0.20240, + 0.32282, 0.65133, + + -0.07178, -0.01876, 0.13399, -0.39522, + 1.28413, 0.33790, + + 0.05040, -0.01679, + + -0.00794, 0.01117, + + 0.02630, 0.00575, + + -0.07113, -0.11414, 0.16422, -0.23060, + 0.35198, 0.05409, + + 1.11486, -0.35833, 0.87313, 1.66304, + -1.28434, 0.72067, + + 0.01400, 0.00971, + + 0.21044, -0.87385, 3.20820, 0.67957, + + -0.01716, 0.00111, + + -0.13776, -0.02650, + + -0.06778, 0.00908, 0.00616, -0.04520, + + -0.31625, -0.61913, + + 0.36184, 0.09373, + + 0.00984, -0.03292, + + 0.01944, 0.00530, + + 0.00243, -0.00123, + + 0.01589, 0.02223, + + -0.02992, -0.01086, + + 4356.04809, -5859.86328, 2918.27323, -4796.67315, + 510.24783, -1220.02233, 127.48927, 250.10654, + 3250.43013, -904.27614, -5667.40042, -22634.00922, + -82471.79425, 18615.92342, + + 0.01941, 0.00372, + + 0.01830, -0.00652, + + -0.02548, -0.01157, + + 0.00635, 0.02343, + + -0.00980, 0.00961, + + 0.12137, 0.10068, 0.16676, -0.07257, + + -0.07267, -0.13761, 0.25305, -0.28112, + + -0.07974, 0.07866, + + -0.41726, 0.49991, -1.55187, -1.14150, + 1.54754, -2.35141, + + -0.00862, 0.00808, + + 0.00218, -0.03726, + + 0.06914, -0.08986, + + -0.00501, 2.09577, + + -0.01409, -0.01842, + + 0.04138, 0.05961, + + -0.12276, -0.04929, + + -0.03963, -0.06080, + + -0.27697, -0.09329, + + -0.01011, 0.00295, + + -0.01374, 0.01328, + + -0.00171, 0.25815, + + 0.01446, 0.00782, + + 0.17909, -0.04683, + + 0.03765, -0.04990, + + 0.00036, 0.00528, + + 0.05508, -0.01369, + + -0.11751, -0.10624, -0.14448, 0.10522, + + -0.00884, 0.43006, + + 0.01162, 0.01659, + + -0.00076, 0.10143, + + 0.55779, 0.05510, 0.12350, -0.34025, + + 0.01320, 0.92985, + + -0.00026, -0.03426, + + 0.01305, 0.00041, + + 0.13187, -0.11903, + + 0.00058, 0.09877, + + -33.10230, -41.96782, -268.28908, 174.29259, + 731.20089, 1508.07639, 5223.99114, -3008.08849, + -3909.34957, -9646.69156, + + 0.02988, 0.03182, + + 0.07149, 0.04513, + + -0.02356, -0.01641, + + -0.03188, -0.03711, 0.15084, -0.22436, + 0.61987, 0.25706, + + 0.02425, 0.01200, + + -0.05543, -0.14435, -0.53398, 0.10997, + + 0.00465, -0.01893, + + 0.01260, -0.01314, + + 0.00650, -0.05499, + + -0.06804, 0.01608, + + 0.02134, 0.04160, + + 0.00636, 0.01293, + + -0.03470, -0.02697, + + -0.11323, 0.02409, + + -0.02618, 0.00827, + + 0.01879, 0.16838, 0.08978, 0.01934, + + -0.23564, 0.05565, + + 0.03686, 0.02644, + + -0.02471, 0.00558, + + -140.22669, -120.40692, -501.88143, 434.05868, + 1044.54998, 1162.72084, 1527.78437, -882.37371, + + -0.00768, 0.02213, + + -0.04090, 0.16718, + + -0.05923, -0.12595, + + 0.01154, -0.00025, + + -0.00776, -0.01653, + + -0.01213, -0.02773, + + 0.00344, 0.02180, + + -0.02558, -0.05682, + + -0.00490, 0.01050, + + 38.75496, -78.17502, -189.90700, -136.33371, + -249.94062, 319.76423, 205.73478, 272.64549, + + -0.01132, -0.01071, -0.04607, -0.00390, + + 0.02903, -0.02070, + + 0.01326, -0.00901, + + 35.38435, 7.45358, 31.08987, -70.52685, + -92.13879, -51.58876, -51.80016, 48.98102, + + -0.00124, -0.01159, + + 0.47335, 13.71886, 23.71637, 5.55804, + 10.06850, -25.65292, -11.85300, -10.20802, + + -4.72861, 1.27151, -0.47322, 7.46754, + 6.99528, 1.79089, 2.05336, -2.90866, + + -1.97528, 0.72236, -0.25084, 1.90269, + 0.72127, 0.41354, + + -0.30286, -0.53125, -0.50883, -0.01200, + -0.08301, 0.18083, + + -0.04286, -0.10963, -0.04544, -0.01645, + + -0.00013, -0.00986, + +}; +static double FAR mertabb[] = { + 68.33369, 422.77623, -2057.26405, -2522.29068, + + -0.00030, -0.00009, + + 0.02400, -0.06471, 0.02074, -0.00904, + 0.00044, 0.00261, + + -0.00174, -0.00088, -0.00027, 0.00003, + + 0.00005, -0.00004, + + -0.00036, 0.00200, + + 0.01432, 0.01199, + + 0.00006, -0.00004, + + 0.00236, 0.00803, 0.01235, 0.00406, + -0.03253, 0.00179, + + -0.00243, 0.00132, -0.00352, 0.00011, + -0.00146, -0.01154, + + 0.00824, -0.01195, -0.01829, -0.00465, + 0.12540, 0.09997, + + 0.00400, 0.00288, -0.02848, 0.01094, + -0.02273, -0.07051, + + 0.01305, 0.01078, + + -0.00119, 0.00136, -0.00107, -0.00066, + + 0.00097, -0.00315, + + 0.00120, 0.00430, -0.00710, -0.00157, + 0.06052, -0.04777, + + 0.00192, -0.00229, -0.02077, 0.00647, + 0.06907, 0.07644, + + -0.00717, 0.00451, + + 0.00052, -0.00262, 0.00345, 0.00039, + + -0.00674, 0.00346, + + -0.02880, 0.00807, + + 0.00054, 0.00206, -0.01745, 0.00517, + + -0.00044, 0.00049, + + 0.01749, 0.01230, + + 0.01703, 0.01563, + + 0.00934, 0.02372, + + 0.01610, -0.01136, + + 0.00186, -0.00503, + + 0.00082, -0.00673, + + 0.00170, -0.00539, + + 0.00042, 0.00037, + + 0.00415, -0.00430, + + 0.00258, -0.00914, -0.01761, -0.00251, + 0.15909, 0.13276, + + 0.02436, -0.00791, 0.00491, 0.03890, + -0.02982, 0.05645, + + -0.00003, 0.00427, + + -0.00363, 0.00221, + + 0.00077, 0.00130, + + 0.00131, -0.00071, 0.00796, 0.00453, + 0.01186, 0.01631, + + 0.12949, -0.02546, 0.03613, 0.32854, + -0.43001, 0.01417, + + 0.00034, 0.00095, + + -0.03268, 0.04034, 0.11407, 0.15049, + + -0.00079, -0.00052, + + -0.04009, 0.00988, + + -0.00259, -0.00085, 0.00221, -0.00133, + + 0.00003, -0.01733, + + 0.01055, 0.01976, + + 0.00222, 0.00085, + + 0.00089, 0.00087, + + 0.00014, 0.00001, + + 0.00145, 0.00802, + + 0.00122, 0.00068, + + 947.79367, -1654.39690, 542.00864, -1281.09901, + 90.02068, -318.36115, -87.67090, 92.91960, + 376.98232, -419.10705, 5094.60412, 2476.97098, + -18160.57888, 16010.48165, + + 0.00621, -0.00128, + + 0.00186, -0.00153, + + -0.00790, 0.00011, + + -0.00032, 0.00165, + + -0.00277, 0.00539, + + 0.00552, 0.00682, 0.01086, -0.00978, + + -0.02292, -0.01300, 0.02940, -0.04427, + + -0.02051, 0.04860, + + -0.05020, 0.29089, -0.50763, -0.04900, + 0.11177, -0.41357, + + -0.00222, 0.00504, + + -0.00006, -0.00459, + + -0.00175, -0.02691, + + 0.05921, 0.18938, + + -0.00181, -0.00154, + + 0.00322, 0.00586, + + -0.01098, -0.00520, + + -0.00861, -0.01342, + + -0.02694, -0.00706, + + -0.00103, 0.00012, + + -0.00284, 0.00797, + + 0.00743, 0.02523, + + 0.00872, 0.00096, + + 0.03155, -0.01644, + + 0.00414, -0.00583, + + 0.00029, 0.00066, + + 0.00935, -0.00619, + + -0.02498, -0.01600, -0.03545, 0.07623, + + 0.01649, 0.06498, + + 0.00148, 0.00209, + + 0.00621, 0.02014, + + 0.17407, -0.05022, -0.03485, -0.17012, + + 0.06164, 0.20059, + + -0.00804, -0.01475, + + 0.00296, -0.00068, + + 0.01880, -0.03797, + + 0.00608, 0.02270, + + 5.89651, -6.62562, -37.41057, -10.51542, + -47.22373, 95.76862, 494.45951, -5.37252, + -3991.04809, -2886.97750, + + 0.01232, 0.00487, + + 0.03163, 0.00561, + + -0.01847, -0.00207, + + -0.10138, 0.01430, -0.04269, -0.22338, + 0.24955, -0.02066, + + 0.01119, -0.00186, + + 0.03416, 0.01805, -0.12498, 0.10385, + + -0.00210, -0.01011, + + 0.00346, -0.00682, + + -0.00683, -0.02227, + + -0.01649, 0.01259, + + 0.01392, 0.01174, + + 0.00440, 0.00351, + + -0.02871, -0.00375, + + -0.03170, 0.02246, + + -0.00833, 0.00596, + + 0.04081, 0.06666, 0.05400, -0.02387, + + -0.07852, 0.05781, + + 0.01881, 0.00324, + + -0.00868, 0.00606, + + -6.52157, -19.74446, -72.46009, 43.12366, + 321.78233, 215.45201, 452.61804, -1025.05619, + + 0.00119, 0.01169, + + 0.02239, 0.09003, + + -0.05329, -0.03974, + + 0.00688, -0.00421, + + -0.00676, -0.00515, + + -0.01171, -0.00952, + + 0.01337, 0.01270, + + -0.02791, -0.02184, + + 0.00058, 0.00679, + + 8.42102, -11.87757, -49.07247, -25.34584, + -43.54829, 161.26509, 261.70993, 56.25777, + + 0.00568, 0.00871, -0.02656, 0.01582, + + 0.00875, -0.02114, + + 0.00464, -0.01075, + + 9.08966, 1.37810, 3.44548, -27.44651, + -59.62749, -0.73611, -0.77613, 65.72607, + + -0.00664, -0.00723, + + 1.04214, 4.78920, 11.67397, -1.84524, + -4.16685, -19.14211, -16.14483, 3.02496, + + -1.98140, 1.16261, 1.81526, 4.21224, + 5.59020, -2.55741, -1.54151, -3.85817, + + -1.08723, 1.23372, 1.12378, 1.51554, + 0.88937, -0.57631, + + -0.50549, -0.25617, -0.37618, 0.42163, + 0.18902, 0.19575, + + -0.15402, -0.04062, -0.04017, 0.05717, + + -0.01665, -0.00199, + +}; +static double FAR mertabr[] = { + -8.30490, -11.68232, 86.54880, 4361.05018, + + 0.00002, -0.00001, + + -0.01102, 0.00410, 0.00007, -0.00276, + 0.00117, 0.00082, + + 0.00049, 0.00007, 0.00003, -0.00001, + + 0.00012, 0.00005, + + -0.00186, -0.00534, + + -0.03301, 0.01808, + + 0.00008, 0.00005, + + -0.00394, 0.00202, 0.02362, -0.00359, + 0.00638, -0.06767, + + 0.00422, -0.00493, 0.00660, 0.00513, + -0.00417, 0.00708, + + 0.05849, -0.00213, -0.07647, -0.16162, + -0.30551, 0.13856, + + -0.02789, 0.01811, -0.04155, -0.06229, + 0.05729, -0.03694, + + -0.03087, 0.01610, + + -0.00297, -0.00167, 0.00041, -0.00157, + + -0.00115, 0.00058, + + 0.00796, 0.00436, -0.01393, 0.02921, + -0.05902, -0.02363, + + 0.00459, -0.01512, 0.10038, 0.02964, + -0.08369, 0.34570, + + -0.00749, -0.02653, + + 0.01361, -0.00326, 0.00406, 0.00952, + + -0.00594, -0.00829, + + -0.02763, -0.09933, + + -0.04143, 0.05152, -0.08436, -0.05294, + + -0.00329, -0.00016, + + -0.04340, 0.02566, + + -0.03027, 0.10904, + + 0.03665, -0.03070, + + 0.23525, 0.00182, + + 0.03092, -0.02212, + + 0.01255, 0.00777, + + -0.01025, 0.00042, + + -0.00065, 0.00440, + + 0.08688, 0.00136, + + 0.05700, -0.03616, -0.11272, -0.20838, + -0.37048, 0.18314, + + 0.00717, -0.02911, 0.15848, 0.05266, + -0.13451, 0.51639, + + 0.00688, 0.02029, + + 0.00596, 0.00423, + + -0.00253, 0.01196, + + 0.05264, -0.03301, 0.10669, 0.07558, + -0.02461, 0.16282, + + -0.18481, -0.57118, 0.85303, -0.44876, + 0.37090, 0.65915, + + -0.00458, 0.00660, + + 0.41186, 0.09829, -0.31999, 1.51149, + + -0.00052, -0.00809, + + 0.01384, -0.07114, + + -0.00435, -0.03237, 0.02162, 0.00294, + + 0.29742, -0.15430, + + -0.04508, 0.17436, + + 0.01577, 0.00485, + + -0.00258, 0.00946, + + 0.00061, 0.00119, + + 0.01095, -0.00788, + + 0.00530, -0.01478, + + 2885.06380, 2152.76256, 2361.91098, 1442.28586, + 602.45147, 251.18991, -121.68155, 71.20167, + 404.94753, 1607.37580, 11211.04090, -2905.37340, + -9066.27933, -40747.62807, + + -0.00189, 0.00957, + + 0.00332, 0.00907, + + 0.00574, -0.01255, + + -0.01134, 0.00291, + + -0.00666, -0.00615, + + -0.04947, 0.06182, 0.03965, 0.08091, + + 0.06846, -0.03612, 0.13966, 0.12543, + + -0.05494, -0.05043, + + -0.24454, -0.20507, 0.56201, -0.75997, + 1.15728, 0.76203, + + -0.00559, -0.00536, + + 0.01872, 0.00104, + + 0.03044, 0.02504, + + -1.07241, -0.00288, + + 0.00950, -0.00760, + + -0.03211, 0.02261, + + 0.02678, -0.06868, + + 0.03008, -0.02062, + + 0.04997, -0.15164, + + -0.00176, -0.00580, + + -0.00730, -0.00676, + + -0.13906, -0.00089, + + -0.00362, 0.00817, + + 0.02021, 0.07719, + + 0.02788, 0.02061, + + -0.00274, 0.00016, + + 0.00566, 0.02293, + + 0.04691, -0.05005, -0.05095, -0.06225, + + -0.19770, -0.00456, + + -0.00848, 0.00595, + + -0.04506, -0.00172, + + -0.01960, 0.22971, 0.14459, 0.04362, + + -0.40199, 0.00386, + + 0.01442, -0.00088, + + -0.00020, 0.00544, + + 0.04768, 0.05222, + + -0.04069, -0.00003, + + 15.71084, -12.28846, -66.23443, -109.83758, + -586.31996, 311.09606, 1070.75040, 2094.34080, + 3839.04103, -1797.34193, + + -0.01216, 0.01244, + + -0.01666, 0.02627, + + 0.00687, -0.01291, + + 0.00939, -0.01905, 0.09401, 0.05027, + -0.09398, 0.23942, + + -0.00379, 0.00834, + + 0.05632, -0.01907, -0.04654, -0.21243, + + 0.00255, 0.00179, + + 0.00540, 0.00497, + + 0.01427, 0.00243, + + -0.00697, -0.02792, + + -0.01524, 0.00810, + + -0.00461, 0.00238, + + 0.00899, -0.01515, + + -0.01011, -0.04390, + + -0.00447, -0.00992, + + -0.06110, 0.00975, -0.00261, 0.03415, + + -0.02336, -0.08776, + + -0.00883, 0.01346, + + -0.00229, -0.00895, + + 42.18049, -48.21316, -148.61588, -171.57236, + -414.27195, 343.09118, 394.59044, 511.79914, + + -0.00911, -0.00220, + + -0.06315, -0.00988, + + 0.04357, -0.02389, + + 0.00004, 0.00232, + + 0.00581, -0.00317, + + 0.00948, -0.00497, + + -0.00734, 0.00300, + + 0.01883, -0.01055, + + -0.00365, -0.00126, + + 24.18074, 12.28004, 43.18187, -58.69806, + -102.40566, -79.48349, -74.81060, 89.71332, + + 0.00241, -0.00135, -0.00136, -0.01617, + + 0.00818, 0.00873, + + 0.00368, 0.00383, + + -2.25893, 10.18542, 20.73104, 9.07389, + 13.73458, -29.10491, -20.62071, -10.63404, + + 0.00382, -0.00143, + + -3.77385, 0.12725, -1.30842, 6.75795, + 7.94463, 1.79092, 1.24458, -4.73211, + + -0.36978, -1.25710, -2.06373, 0.06194, + -0.00509, 2.08851, 1.07491, 0.04112, + + -0.28582, -0.51413, -0.53312, 0.11936, + 0.04447, 0.23945, + + 0.12450, -0.11821, -0.06100, -0.12924, + -0.05193, 0.02219, + + 0.01977, -0.02933, -0.00771, -0.01077, + + 0.00109, -0.00273, + +}; + +static signed char FAR merargs[] = { + 0, 3, + 3, 1, 1,-10, 3, 11, 4, 0, + 2, 2, 5, -5, 6, 2, + 3, 5, 1,-14, 2, 2, 3, 1, + 3, 1, 1, -5, 2, 4, 3, 0, + 1, 1, 6, 0, + 1, 2, 6, 0, + 3, 2, 1, -7, 2, 3, 3, 0, + 1, 1, 5, 2, + 2, 1, 1, -4, 3, 2, + 1, 2, 5, 2, + 2, 2, 1, -5, 2, 2, + 1, 3, 5, 0, + 2, 4, 1,-10, 2, 1, + 2, 3, 1, -8, 2, 0, + 2, 1, 1, -3, 2, 2, + 2, 1, 1, -2, 2, 2, + 1, 1, 3, 0, + 2, 3, 1, -7, 2, 1, + 2, 1, 1, -3, 3, 0, + 1, 1, 2, 0, + 2, 2, 1, -4, 2, 1, + 2, 4, 1, -9, 2, 0, + 1, 2, 3, 0, + 2, 1, 1, -2, 3, 0, + 2, 1, 1, -4, 2, 0, + 2, 1, 1, -1, 2, 0, + 2, 3, 1, -6, 2, 0, + 1, 3, 3, 0, + 2, 2, 1, -7, 2, 0, + 2, 1, 1, -2, 4, 0, + 2, 1, 1, -1, 3, 0, + 1, 2, 2, 2, + 2, 2, 1, -3, 2, 2, + 2, 4, 1, -8, 2, 0, + 2, 3, 1,-10, 2, 0, + 2, 1, 1, -4, 5, 0, + 2, 1, 1, -3, 5, 2, + 2, 1, 1, -5, 2, 2, + 2, 1, 1, -5, 6, 0, + 2, 1, 1, -2, 5, 1, + 3, 1, 1, -4, 5, 5, 6, 0, + 1, 4, 3, 0, + 2, 1, 1, -3, 6, 1, + 2, 1, 1, -1, 5, 0, + 2, 1, 1, -2, 6, 0, + 2, 1, 1, -1, 6, 0, + 2, 1, 1, -2, 7, 0, + 2, 1, 1, -1, 7, 0, + 3, 4, 1,-14, 2, 2, 3, 0, + 3, 1, 1, 2, 5, -5, 6, 0, + 1, 1, 1, 6, + 3, 2, 1,-10, 3, 11, 4, 0, + 3, 1, 1, -2, 5, 5, 6, 0, + 3, 6, 1,-14, 2, 2, 3, 0, + 2, 1, 1, 1, 6, 0, + 2, 1, 1, 2, 6, 0, + 2, 1, 1, 1, 5, 1, + 2, 2, 1, -4, 3, 1, + 2, 1, 1, 2, 5, 0, + 2, 3, 1, -5, 2, 2, + 2, 1, 1, 3, 5, 0, + 2, 5, 1,-10, 2, 0, + 1, 3, 2, 0, + 2, 2, 1, -2, 2, 0, + 2, 1, 1, 1, 3, 0, + 2, 4, 1, -7, 2, 0, + 2, 2, 1, -3, 3, 0, + 2, 1, 1, 1, 2, 0, + 2, 3, 1, -4, 2, 0, + 2, 5, 1, -9, 2, 0, + 2, 1, 1, 2, 3, 0, + 2, 2, 1, -2, 3, 0, + 1, 4, 2, 0, + 2, 2, 1, -1, 2, 0, + 2, 4, 1, -6, 2, 0, + 2, 2, 1, -2, 4, 0, + 2, 2, 1, -1, 3, 0, + 2, 1, 1, 2, 2, 1, + 2, 3, 1, -3, 2, 0, + 2, 5, 1, -8, 2, 0, + 2, 2, 1, -3, 5, 0, + 1, 5, 2, 1, + 2, 2, 1, -2, 5, 0, + 2, 1, 1, 4, 3, 0, + 2, 2, 1, -3, 6, 0, + 2, 2, 1, -1, 5, 0, + 2, 2, 1, -2, 6, 0, + 1, 2, 1, 4, + 2, 2, 1, 1, 5, 0, + 2, 3, 1, -4, 3, 0, + 2, 2, 1, 2, 5, 0, + 2, 4, 1, -5, 2, 2, + 2, 1, 1, 3, 2, 0, + 2, 3, 1, -2, 2, 1, + 2, 3, 1, -3, 3, 0, + 2, 2, 1, 1, 2, 0, + 2, 4, 1, -4, 2, 0, + 2, 3, 1, -2, 3, 0, + 2, 3, 1, -1, 2, 0, + 2, 3, 1, -1, 3, 0, + 2, 2, 1, 2, 2, 0, + 2, 4, 1, -3, 2, 0, + 2, 3, 1, -3, 5, 0, + 2, 1, 1, 5, 2, 1, + 2, 3, 1, -2, 5, 0, + 2, 3, 1, -1, 5, 0, + 2, 3, 1, -2, 6, 0, + 1, 3, 1, 3, + 2, 4, 1, -4, 3, 0, + 2, 5, 1, -5, 2, 0, + 2, 4, 1, -2, 2, 0, + 2, 5, 1, -4, 2, 0, + 2, 4, 1, -2, 3, 0, + 2, 5, 1, -3, 2, 0, + 2, 2, 1, 5, 2, 0, + 2, 4, 1, -2, 5, 0, + 2, 4, 1, -1, 5, 0, + 1, 4, 1, 3, + 2, 6, 1, -5, 2, 1, + 2, 5, 1, -2, 2, 0, + 2, 5, 1, -2, 5, 0, + 1, 5, 1, 3, + 2, 7, 1, -5, 2, 0, + 1, 6, 1, 3, + 1, 7, 1, 3, + 1, 8, 1, 2, + 1, 9, 1, 2, + 1, 10, 1, 1, + 1, 11, 1, 0, + -1 +}; +/* Total terms = 130, small = 128 */ +static struct plantbl FAR mer404 = { + { 11, 14, 10, 11, 4, 5, 2, 0, 0,}, + 6, + merargs, + mertabl, + mertabb, + mertabr, + 3.8709830979999998e-01, +}; + + + +/* +First date in file = 1228000.50 +Number of records = 397276.0 +Days per record = 4.0 + Julian Years Lon Lat Rad + -1349.9 to -1000.0: 0.23 0.15 0.10 + -1000.0 to -500.0: 0.25 0.15 0.10 + -500.0 to 0.0: 0.20 0.13 0.09 + 0.0 to 500.0: 0.16 0.11 0.08 + 500.0 to 1000.0: 0.19 0.09 0.08 + 1000.0 to 1500.0: 0.16 0.09 0.08 + 1500.0 to 2000.0: 0.21 0.12 0.08 + 2000.0 to 2500.0: 0.28 0.14 0.09 + 2500.0 to 3000.0: 0.30 0.15 0.10 + 3000.0 to 3000.8: 0.116 0.062 0.058 +*/ +static double FAR ventabl[] = { + 9.08078, 55.42416, 21066413644.98911, 655127.20186, + + 0.00329, 0.10408, + + 0.00268, -0.01908, + + 0.00653, 0.00183, + + 0.15083, -0.21997, + + 6.08596, 2.34841, 3.70668, -0.22740, + -2.29376, -1.46741, + + -0.03840, 0.01242, + + 0.00176, 0.00913, + + 0.00121, -0.01222, + + -1.22624, 0.65264, -1.15974, -1.28172, + 1.00656, -0.66266, + + 0.01560, -0.00654, 0.00896, 0.00069, + + 0.21649, -0.01786, + + 0.01239, 0.00255, + + 0.00084, -0.06086, + + -0.00041, 0.00887, + + 0.13453, -0.20013, 0.08234, 0.01575, + + 0.00658, -0.00214, + + 0.00254, 0.00857, + + -0.01047, -0.00519, + + 0.63215, -0.40914, 0.34271, -1.53258, + + 0.00038, -0.01437, + + -0.02599, -2.27805, -0.36873, -1.01799, + -0.36798, 1.41356, + + -0.08167, 0.01368, 0.20676, 0.06807, + + 0.02282, -0.04691, + + 0.30308, -0.20218, 0.24785, 0.27522, + + 0.00197, -0.00499, + + 1.43909, -0.46154, 0.93459, 2.99583, + -3.43274, 0.05672, + + -0.06586, 0.12467, 0.02505, -0.08433, + + 0.00743, 0.00174, + + -0.04013, 0.17715, + + -0.00603, -0.01024, + + 0.01542, -0.02378, + + 0.00676, 0.00002, + + -0.00168, -4.89487, + + 0.02393, -0.03064, + + 0.00090, 0.00977, + + 0.01223, 0.00381, + + 0.28135, -0.09158, 0.18550, 0.58372, + -0.67437, 0.01409, + + -0.25404, -0.06863, + + 0.06763, -0.02939, + + -0.00009, -0.04888, + + 0.01718, -0.00978, + + -0.01945, 0.08847, + + -0.00135, -11.29920, + + 0.01689, -0.04756, + + 0.02075, -0.01667, + + 0.01397, 0.00443, + + -0.28437, 0.07600, 0.17996, -0.44326, + + 0.29356, 1.41869, -1.58617, 0.03206, + + 0.00229, -0.00753, + + -0.03076, -2.96766, + + 0.00245, 0.00697, + + 0.01063, -0.02468, + + -0.00351, -0.18179, + + -0.01088, 0.00380, + + 0.00496, 0.02072, + + -0.12890, 0.16719, -0.06820, -0.03234, + + -60.36135, -11.74485, -11.03752, -3.80145, + -21.33955, -284.54495, -763.43839, 248.50823, + 1493.02775, 1288.79621, -2091.10921, -1851.15420, + + -0.00922, 0.06233, + + 0.00004, 0.00785, + + 0.10363, -0.16770, 0.45497, 0.24051, + -0.28057, 0.61126, + + -0.02057, 0.00010, + + 0.00561, 0.01994, + + 0.01416, -0.00442, + + 0.03073, -0.14961, + + -0.06272, 0.08301, + + 0.02040, 7.12824, + + -0.00453, -0.01815, + + 0.00004, -0.00013, + + -0.03593, -0.18147, 0.20353, -0.00683, + + 0.00003, 0.06226, + + -0.00443, 0.00257, + + 0.03194, 0.03254, + + 0.00282, -0.01401, + + 0.00422, 1.03169, + + -0.00169, -0.00591, + + -0.00307, 0.00540, + + 0.05511, 0.00347, + + 0.07896, 0.06583, + + 0.00783, 0.01926, + + 0.03109, 0.15967, + + 0.00343, 0.88734, + + 0.01047, 0.32054, + + 0.00814, 0.00051, + + 0.02474, 0.00047, + + 0.00052, 0.03763, + + -57.06618, 20.34614, -45.06541, -115.20465, + 136.46887, -84.67046, 92.93308, 160.44644, + + -0.00020, -0.00082, + + 0.02496, 0.00279, + + 0.00849, 0.00195, + + -0.05013, -0.04331, + + -0.00136, 0.14491, + + -0.00183, -0.00406, + + 0.01163, 0.00093, + + -0.00604, -0.00680, + + -0.00036, 0.06861, + + -0.00450, -0.00969, + + 0.00171, 0.00979, + + -0.00152, 0.03929, + + 0.00631, 0.00048, + + -0.00709, -0.00864, + + 1.51002, -0.24657, 1.27338, 2.64699, + -2.40990, -0.57413, + + -0.00023, 0.03528, + + 0.00268, 0.00522, + + -0.00010, 0.01933, + + -0.00006, 0.01100, + + 0.06313, -0.09939, 0.08571, 0.03206, + + -0.00004, 0.00645, + +}; +static double FAR ventabb[] = { + -23.91858, 31.44154, 25.93273, -67.68643, + + -0.00171, 0.00123, + + 0.00001, -0.00018, + + -0.00005, 0.00018, + + -0.00001, 0.00019, + + 0.00733, 0.00030, -0.00038, 0.00011, + 0.00181, 0.00120, + + 0.00010, 0.00002, + + -0.00012, 0.00002, + + 0.00021, 0.00004, + + -0.00403, 0.00101, 0.00342, -0.00328, + 0.01564, 0.01212, + + 0.00011, 0.00010, -0.00002, -0.00004, + + -0.00524, 0.00079, + + 0.00011, 0.00002, + + -0.00001, 0.00003, + + 0.00001, 0.00000, + + 0.00108, 0.00035, 0.00003, 0.00064, + + -0.00000, -0.00002, + + -0.00069, 0.00031, + + 0.00020, 0.00003, + + 0.00768, 0.03697, -0.07906, 0.01673, + + -0.00003, -0.00001, + + -0.00198, -0.01045, 0.01761, -0.00803, + -0.00751, 0.04199, + + 0.00280, -0.00213, -0.00482, -0.00209, + + -0.01077, 0.00715, + + 0.00048, -0.00004, 0.00199, 0.00237, + + 0.00017, -0.00032, + + -0.07513, -0.00658, -0.04213, 0.16065, + 0.27661, 0.06515, + + 0.02156, -0.08144, -0.23994, -0.05674, + + 0.00167, 0.00069, + + 0.00244, -0.01247, + + -0.00100, 0.00036, + + 0.00240, 0.00012, + + 0.00010, 0.00018, + + 0.00208, -0.00098, + + -0.00217, 0.00707, + + -0.00338, 0.01260, + + -0.00127, -0.00039, + + -0.03516, -0.00544, -0.01746, 0.08258, + 0.10633, 0.02523, + + 0.00077, -0.00214, + + -0.02335, 0.00976, + + -0.00019, 0.00003, + + 0.00041, 0.00039, + + 0.00199, -0.01098, + + 0.00813, -0.00853, + + 0.02230, 0.00349, + + -0.02250, 0.08119, + + -0.00214, -0.00052, + + -0.00220, 0.15216, 0.17152, 0.08051, + + -0.01561, 0.27727, 0.25837, 0.07021, + + -0.00005, -0.00000, + + -0.02692, -0.00047, + + -0.00007, -0.00016, + + 0.01072, 0.01418, + + -0.00076, 0.00379, + + -0.00807, 0.03463, + + -0.05199, 0.06680, + + -0.00622, 0.00787, 0.00672, 0.00453, + + -10.69951, -67.43445, -183.55956, -37.87932, + -102.30497, -780.40465, 2572.21990, -446.97798, + 1665.42632, 5698.61327, -11889.66501, 2814.93799, + + 0.03204, -0.09479, + + 0.00014, -0.00001, + + -0.04118, -0.04562, 0.03435, -0.05878, + 0.01700, 0.02566, + + -0.00121, 0.00170, + + 0.02390, 0.00403, + + 0.04629, 0.01896, + + -0.00521, 0.03215, + + -0.01051, 0.00696, + + -0.01332, -0.08937, + + -0.00469, -0.00751, + + 0.00016, -0.00035, + + 0.00492, -0.03930, -0.04742, -0.01013, + + 0.00065, 0.00021, + + -0.00006, 0.00017, + + 0.06768, -0.01558, + + -0.00055, 0.00322, + + -0.00287, -0.01656, + + 0.00061, -0.00041, + + 0.00030, 0.00047, + + -0.01436, -0.00148, + + 0.30302, -0.05511, + + -0.00020, -0.00005, + + 0.00042, -0.00025, + + 0.01270, 0.00458, + + -0.00593, -0.04480, + + 0.00005, -0.00008, + + 0.08457, -0.01569, + + 0.00062, 0.00018, + + 9.79942, -2.48836, 4.17423, 6.72044, + -63.33456, 34.63597, 39.11878, -72.89581, + + -0.00066, 0.00036, + + -0.00045, -0.00062, + + -0.00287, -0.00118, + + -0.21879, 0.03947, + + 0.00086, 0.00671, + + -0.00113, 0.00122, + + -0.00193, -0.00029, + + -0.03612, 0.00635, + + 0.00024, 0.00207, + + -0.00273, 0.00443, + + -0.00055, 0.00030, + + -0.00451, 0.00175, + + -0.00110, -0.00015, + + -0.02608, 0.00480, + + 2.16555, -0.70419, 1.74648, 0.97514, + -1.15360, 1.73688, + + 0.00004, 0.00105, + + 0.00187, -0.00311, + + 0.00005, 0.00055, + + 0.00004, 0.00032, + + -0.04629, 0.02292, -0.00363, -0.03807, + + 0.00002, 0.00020, + +}; +static double FAR ventabr[] = { + -0.24459, 3.72698, -6.67281, 5.24378, + + 0.00030, 0.00003, + + -0.00002, -0.00000, + + -0.00000, 0.00001, + + 0.00032, 0.00021, + + -0.00326, 0.01002, 0.00067, 0.00653, + 0.00243, -0.00417, + + -0.00004, -0.00010, + + -0.00002, -0.00001, + + 0.00004, -0.00002, + + -0.00638, -0.01453, 0.01458, -0.01235, + 0.00755, 0.01030, + + 0.00006, 0.00014, 0.00000, 0.00009, + + 0.00063, 0.00176, + + 0.00003, -0.00022, + + 0.00112, 0.00001, + + -0.00014, -0.00001, + + 0.00485, 0.00322, -0.00035, 0.00198, + + 0.00004, 0.00013, + + -0.00015, -0.00003, + + 0.00011, -0.00025, + + 0.00634, 0.02207, 0.04620, 0.00160, + + 0.00045, 0.00001, + + -0.11563, 0.00643, -0.05947, 0.02018, + 0.07704, 0.01574, + + -0.00090, -0.00471, -0.00322, 0.01104, + + 0.00265, -0.00038, + + 0.01395, 0.02165, -0.01948, 0.01713, + + -0.00057, -0.00019, + + 0.04889, 0.13403, -0.28327, 0.10597, + -0.02325, -0.35829, + + 0.01171, -0.00904, 0.00747, 0.02546, + + 0.00029, -0.00190, + + -0.03408, -0.00703, + + 0.00176, -0.00109, + + 0.00463, 0.00293, + + 0.00000, 0.00148, + + 1.06691, -0.00054, + + -0.00935, -0.00790, + + 0.00552, -0.00084, + + -0.00100, 0.00336, + + 0.02874, 0.08604, -0.17876, 0.05973, + -0.00720, -0.21195, + + 0.02134, -0.07980, + + 0.01500, 0.01398, + + 0.01758, -0.00004, + + 0.00371, 0.00650, + + -0.03375, -0.00723, + + 4.65465, -0.00040, + + 0.02040, 0.00707, + + -0.00727, -0.01144, + + -0.00196, 0.00620, + + -0.03396, -0.12904, 0.20160, 0.08092, + + -0.67045, 0.14014, -0.01571, -0.75141, + + 0.00361, 0.00110, + + 1.42165, -0.01499, + + -0.00334, 0.00117, + + 0.01187, 0.00507, + + 0.08935, -0.00174, + + -0.00211, -0.00525, + + 0.01035, -0.00252, + + -0.08355, -0.06442, 0.01616, -0.03409, + + 5.55241, -30.62428, 2.03824, -6.26978, + 143.07279, -10.24734, -125.25411, -380.85360, + -644.78411, 745.02852, 926.70000, -1045.09820, + + -0.03124, -0.00465, + + -0.00396, 0.00002, + + 0.08518, 0.05248, -0.12178, 0.23023, + -0.30943, -0.14208, + + -0.00005, -0.01054, + + -0.00894, 0.00233, + + -0.00173, -0.00768, + + 0.07881, 0.01633, + + -0.04463, -0.03347, + + -3.92991, 0.00945, + + 0.01524, -0.00422, + + -0.00011, -0.00005, + + 0.10842, -0.02126, 0.00349, 0.12097, + + -0.03752, 0.00001, + + -0.00156, -0.00270, + + -0.01520, 0.01349, + + 0.00895, 0.00186, + + -0.67751, 0.00180, + + 0.00516, -0.00151, + + -0.00365, -0.00210, + + -0.00276, 0.03793, + + -0.02637, 0.03235, + + -0.01343, 0.00541, + + -0.11270, 0.02169, + + -0.63365, 0.00122, + + -0.24329, 0.00428, + + -0.00040, 0.00586, + + 0.00581, 0.01112, + + -0.02731, 0.00008, + + -2.69091, 0.42729, 2.78805, 3.43849, + -0.87998, -6.62373, 0.56882, 4.69370, + + 0.00005, -0.00008, + + -0.00181, 0.01767, + + -0.00168, 0.00660, + + 0.01802, -0.01836, + + -0.11245, -0.00061, + + 0.00199, -0.00070, + + -0.00076, 0.00919, + + 0.00311, -0.00165, + + -0.05650, -0.00018, + + 0.00121, -0.00069, + + -0.00803, 0.00146, + + -0.03260, -0.00072, + + -0.00042, 0.00524, + + 0.00464, -0.00339, + + -0.06203, -0.00278, 0.04145, 0.02871, + -0.01962, -0.01362, + + -0.03040, -0.00010, + + 0.00085, -0.00001, + + -0.01712, -0.00006, + + -0.00996, -0.00003, + + -0.00029, 0.00026, 0.00016, -0.00005, + + -0.00594, -0.00003, + +}; + +static signed char FAR venargs[] = { + 0, 3, + 2, 2, 5, -5, 6, 0, + 3, 2, 2, 1, 3, -8, 4, 0, + 3, 5, 1,-14, 2, 2, 3, 0, + 3, 3, 2, -7, 3, 4, 4, 0, + 2, 8, 2,-13, 3, 2, + 3, 6, 2,-10, 3, 3, 5, 0, + 1, 1, 7, 0, + 2, 1, 5, -2, 6, 0, + 2, 1, 2, -3, 4, 2, + 2, 2, 5, -4, 6, 1, + 1, 1, 6, 0, + 3, 3, 2, -5, 3, 1, 5, 0, + 3, 3, 2, -5, 3, 2, 5, 0, + 2, 1, 5, -1, 6, 0, + 2, 2, 2, -6, 4, 1, + 2, 2, 5, -3, 6, 0, + 1, 2, 6, 0, + 2, 3, 5, -5, 6, 0, + 1, 1, 5, 1, + 2, 2, 5, -2, 6, 0, + 2, 3, 2, -5, 3, 2, + 2, 5, 2, -8, 3, 1, + 1, 2, 5, 0, + 2, 2, 1, -5, 2, 1, + 2, 6, 2,-10, 3, 0, + 2, 2, 2, -3, 3, 2, + 2, 1, 2, -2, 3, 1, + 2, 4, 2, -7, 3, 0, + 2, 4, 2, -6, 3, 0, + 1, 1, 4, 0, + 2, 1, 2, -2, 4, 0, + 2, 2, 2, -5, 4, 0, + 2, 1, 2, -1, 3, 0, + 2, 1, 1, -3, 2, 0, + 2, 2, 2, -4, 3, 0, + 2, 6, 2, -9, 3, 0, + 2, 3, 2, -4, 3, 2, + 2, 1, 1, -2, 2, 0, + 1, 1, 3, 0, + 2, 1, 2, -1, 4, 0, + 2, 2, 2, -4, 4, 0, + 2, 5, 2, -7, 3, 0, + 2, 2, 2, -2, 3, 0, + 2, 1, 2, -3, 5, 0, + 2, 1, 2, -3, 3, 0, + 2, 7, 2,-10, 3, 0, + 2, 1, 2, -2, 5, 1, + 2, 4, 2, -5, 3, 1, + 3, 1, 2, 1, 5, -5, 6, 0, + 2, 1, 2, -1, 5, 0, + 3, 1, 2, -3, 5, 5, 6, 0, + 2, 1, 2, -2, 6, 0, + 2, 1, 2, -1, 6, 0, + 1, 3, 4, 0, + 2, 7, 2,-13, 3, 0, + 3, 1, 2, 2, 5, -5, 6, 1, + 1, 1, 2, 5, + 2, 9, 2,-13, 3, 0, + 3, 1, 2, 1, 5, -2, 6, 0, + 2, 2, 2, -3, 4, 2, + 2, 3, 2, -6, 4, 0, + 2, 1, 2, 1, 5, 0, + 2, 2, 2, -5, 3, 0, + 2, 6, 2, -8, 3, 0, + 2, 2, 1, -4, 2, 0, + 2, 3, 2, -3, 3, 0, + 1, 2, 3, 0, + 2, 3, 2, -7, 3, 0, + 2, 5, 2, -6, 3, 1, + 2, 2, 2, -2, 4, 0, + 2, 3, 2, -5, 4, 0, + 2, 2, 2, -1, 3, 0, + 2, 7, 2, -9, 3, 0, + 2, 4, 2, -4, 3, 0, + 2, 1, 2, 1, 3, 0, + 2, 3, 2, -4, 4, 0, + 2, 6, 2, -7, 3, 0, + 2, 3, 2, -2, 3, 0, + 2, 2, 2, -4, 5, 0, + 2, 2, 2, -3, 5, 0, + 2, 2, 2, -2, 5, 0, + 2, 5, 2, -5, 3, 0, + 2, 2, 2, -3, 6, 0, + 2, 2, 2, -1, 5, 0, + 2, 2, 2, -2, 6, 0, + 1, 2, 2, 3, + 2, 2, 2, 1, 5, 0, + 2, 7, 2, -8, 3, 0, + 2, 2, 1, -3, 2, 0, + 2, 4, 2, -3, 3, 0, + 2, 6, 2, -6, 3, 0, + 2, 3, 2, -1, 3, 0, + 2, 8, 2, -9, 3, 0, + 2, 5, 2, -4, 3, 0, + 2, 7, 2, -7, 3, 0, + 2, 4, 2, -2, 3, 0, + 2, 3, 2, -4, 5, 0, + 2, 3, 2, -3, 5, 0, + 2, 9, 2,-10, 3, 0, + 2, 3, 2, -2, 5, 0, + 1, 3, 2, 2, + 2, 8, 2, -8, 3, 0, + 2, 5, 2, -3, 3, 0, + 2, 9, 2, -9, 3, 0, + 2, 10, 2,-10, 3, 0, + 1, 4, 2, 1, + 2, 11, 2,-11, 3, 0, + -1 +}; +/* Total terms = 108, small = 107 */ +static struct plantbl FAR ven404 = { + { 5, 14, 13, 8, 4, 5, 1, 0, 0,}, + 5, + venargs, + ventabl, + ventabb, + ventabr, + 7.2332982000000001e-01, +}; + +/* +First date in file = 1228000.50 +Number of records = 264850.0 +Days per record = 6.0 + Julian Years Lon Lat Rad + -1349.9 to -1000.0: 0.13 0.06 0.07 + -1000.0 to -500.0: 0.12 0.06 0.06 + -500.0 to 0.0: 0.12 0.06 0.08 + 0.0 to 500.0: 0.12 0.05 0.06 + 500.0 to 1000.0: 0.12 0.05 0.07 + 1000.0 to 1500.0: 0.11 0.05 0.07 + 1500.0 to 2000.0: 0.11 0.05 0.06 + 2000.0 to 2500.0: 0.11 0.05 0.06 + 2500.0 to 3000.0: 0.14 0.06 0.07 + 3000.0 to 3000.8: 0.074 0.048 0.044 +*/ + +static double FAR eartabl[] = { + -65.54655, -232.74963, 12959774227.57587, 361678.59587, + + 2.52679, -4.93511, 2.46852, -8.88928, + 6.66257, -1.94502, + + 0.66887, -0.06141, 0.08893, 0.18971, + + 0.00068, -0.00307, + + 0.03092, 0.03214, -0.14321, 0.22548, + + 0.00314, -0.00221, + + 8.98017, 7.25747, -1.06655, 1.19671, + -2.42276, 0.29621, 1.55635, 0.99167, + + -0.00026, 0.00187, + + 0.00189, 0.02742, + + 0.00158, 0.01475, + + 0.00353, -0.02048, + + -0.01775, -0.01023, 0.01927, -0.03122, + + -1.55440, -4.97423, 2.14765, -2.77045, + 1.02707, 0.55507, -0.08066, 0.18479, + + 0.00750, 0.00583, + + -0.16977, 0.35555, 0.32036, 0.01309, + + 0.54625, 0.08167, 0.10681, 0.17231, + -0.02287, 0.01631, + + -0.00866, -0.00190, + + 0.00016, -0.01514, + + -0.00073, 0.04205, + + -0.00072, 0.01490, + + -0.38831, 0.41043, -1.11857, -0.84329, + 1.15123, -1.34167, + + 0.01026, -0.00432, + + -0.02833, -0.00705, -0.00285, 0.01645, + + -0.01234, 0.05609, -0.01893, -0.00171, + + -0.30527, 0.45390, 0.56713, 0.70030, + 1.27125, -0.76481, 0.34857, -2.60318, + + -0.00160, 0.00643, + + 0.28492, -0.37998, 0.23347, 0.00540, + 0.00342, 0.04406, + + 0.00037, -0.02449, + + 0.01469, 1.59358, 0.24956, 0.71066, + 0.25477, -0.98371, + + -0.69412, 0.19687, -0.44423, -0.83331, + 0.49647, -0.31021, + + 0.05696, -0.00802, -0.14423, -0.04719, + + 0.16762, -0.01234, 0.02481, 0.03465, + + 0.01091, 0.02123, + + 0.08212, -0.07375, 0.01524, -0.07388, + + 0.06673, -0.22486, 0.10026, -0.00559, + + 0.14711, -0.11680, 0.05460, 0.02749, + + -1.04467, 0.34273, -0.67582, -2.15117, + 2.47372, -0.04332, + + 0.05016, -0.03991, 0.01908, 0.00943, + + 0.07321, -0.23637, 0.10564, -0.00446, + + -0.09523, -0.30710, 0.17400, -0.10681, + + 0.05104, -0.14078, 0.01390, 0.07288, + + -0.26308, -0.20717, 0.20773, -0.37096, + + -0.00205, -0.27274, + + -0.00792, -0.00183, + + 0.02985, 0.04895, 0.03785, -0.14731, + + 0.02976, -0.02495, -0.02644, -0.04085, + + -0.00843, 0.00027, + + 0.00090, 0.00611, + + 0.00040, 4.83425, + + 0.01692, -0.01335, + + 0.04482, -0.03602, 0.01672, 0.00838, + + 0.03682, -0.11206, 0.05163, -0.00219, + + -0.08381, -0.20911, 0.16400, -0.13325, + + -0.05945, 0.02114, -0.00710, -0.04695, + + -0.01657, -0.00513, + + -0.06999, -0.23054, 0.13128, -0.07975, + + 0.00054, -0.00699, + + -0.01253, -0.04007, 0.00658, -0.00607, + + -0.48696, 0.31859, -0.84292, -0.87950, + 1.30507, -0.94042, + + -0.00234, 0.00339, + + -0.30647, -0.24605, 0.24948, -0.43369, + + -0.64033, 0.20754, -0.43829, -1.31801, + 1.55412, -0.02893, + + -0.02323, 0.02181, -0.00398, -0.01548, + + -0.08005, -0.01537, -0.00362, -0.02033, + + 0.00028, -0.03732, -0.14083, -7.21175, + + -0.07430, 0.01886, -0.00223, 0.01915, + + -0.02270, -0.03702, 0.10167, -0.02917, + + 0.00879, -2.04198, + + -0.00433, -0.41764, + + 0.00671, -0.00030, + + 0.00070, -0.01066, + + 0.01144, -0.03190, + + -0.29653, 0.38638, -0.16611, -0.07661, + + 0.22071, 0.14665, 0.02487, 0.13524, + + -275.60942, -335.52251, -413.89009, 359.65390, + 1396.49813, 1118.56095, 2559.41622, -3393.39088, + -6717.66079, -1543.17403, + + -1.90405, -0.22958, -0.57989, -0.36584, + -0.04547, -0.14164, + + 0.00749, -0.03973, + + 0.00033, 0.01842, + + -0.08301, -0.03523, -0.00408, -0.02008, + + 0.00008, 0.00778, + + -0.00046, 0.02760, + + -0.03135, 0.07710, 0.06130, 0.04003, + + -0.04703, 0.00671, -0.00754, -0.01000, + + -0.01902, -0.00125, + + -0.00264, -0.00903, + + -0.02672, 0.12765, + + -0.03872, 0.03532, -0.01534, -0.00710, + + -0.01087, 0.01124, + + -0.01664, 0.06304, -0.02779, 0.00214, + + -0.01279, -5.51814, + + 0.05847, -0.02093, 0.03950, 0.06696, + -0.04064, 0.02687, + + 0.01478, -0.02169, 0.05821, 0.03301, + -0.03861, 0.07535, + + 0.00290, -0.00644, + + 0.00631, 0.12905, + + 0.02400, 0.13194, -0.14339, 0.00529, + + 0.00343, 0.00819, + + 0.02692, -0.03332, -0.07284, -0.02064, + + 0.07038, 0.03999, 0.02759, 0.07599, + + 0.00033, 0.00641, + + 0.00128, 0.02032, -0.00852, 0.00680, + + 0.23019, 0.17100, 0.09861, 0.55013, + + -0.00192, 0.00953, + + -0.00943, 0.01783, + + 0.05975, 0.01486, 0.00160, 0.01558, + + -0.01629, -0.02035, 0.01533, 2.73176, + + 0.05858, -0.01327, 0.00209, -0.01506, + + 0.00755, 0.03300, + + -0.00796, -0.65270, + + 0.02305, 0.00165, + + -0.02512, 0.06560, 0.16108, -0.02087, + + 0.00016, 0.10729, + + 0.04175, 0.00559, + + 0.01176, 0.00110, + + 15.15730, -0.52460, -37.16535, -25.85564, + -60.94577, 4.29961, 57.11617, 67.96463, + 31.41414, -64.75731, + + 0.00848, 0.02971, -0.03690, -0.00010, + + -0.03568, 0.06325, 0.11311, 0.02431, + + -0.00383, 0.00421, + + -0.00140, 0.00680, + + 0.00069, -0.21036, + + 0.00386, 0.04210, + + -0.01324, 0.16454, + + -0.01398, -0.00109, + + 0.02548, -0.03842, -0.06504, -0.02204, + + 0.01359, 0.00232, + + 0.07634, -1.64648, -1.73103, 0.89176, + 0.81398, 0.65209, + + 0.00021, -0.08441, + + -0.00012, 0.01262, + + -0.00666, -0.00050, + + -0.00130, 0.01596, + + -0.00485, -0.00213, + + 0.00009, -0.03941, + + -0.02266, -0.04421, -0.01341, 0.01083, + + -0.00011, 0.00004, 0.00003, -0.02017, + + 0.00003, -0.01096, + + 0.00002, -0.00623, + +}; +static double FAR eartabb[] = { + -41.97860, -48.43539, 74.72897, 0.00075, + + -0.12774, -0.10188, -0.00943, -0.04574, + 0.00265, -0.00217, + + 0.00254, 0.00168, 0.00008, 0.00026, + + -0.00000, -0.00000, + + 0.00004, -0.00003, 0.00001, -0.00003, + + -0.00002, -0.00006, + + 0.03351, -0.02699, 0.00896, -0.01315, + -0.00019, -0.00054, -0.00020, -0.00003, + + 0.00002, 0.00001, + + -0.00000, 0.00000, + + -0.00002, -0.00001, + + -0.00001, 0.00003, + + 0.00017, -0.00008, 0.00000, -0.00003, + + 0.00501, -0.00083, 0.00414, 0.00202, + 0.00051, 0.00060, 0.00002, 0.00000, + + -0.00002, 0.00002, + + -0.00016, -0.00443, -0.00083, -0.00031, + + -0.00394, 0.00148, -0.00035, 0.00099, + 0.00005, 0.00009, + + 0.00004, -0.00002, + + -0.00001, -0.00002, + + 0.00012, -0.00005, + + 0.00001, 0.00001, + + -0.00577, -0.00631, -0.00017, 0.01993, + -0.00234, -0.00218, + + -0.00001, 0.00002, + + -0.00101, -0.00044, -0.00036, 0.00041, + + 0.00294, -0.00109, 0.00043, -0.00006, + + 0.09650, 0.15003, 0.01087, 0.04905, + 0.00093, -0.06986, -0.01471, -0.00221, + + -0.00002, -0.00003, + + 0.00440, -0.00083, 0.00102, -0.00024, + 0.00005, -0.00002, + + -0.00004, 0.00001, + + 0.00505, 0.00930, -0.01609, -0.00183, + -0.00113, 0.00214, + + 0.00439, -0.00295, -0.00280, 0.00402, + -0.00047, -0.00145, + + -0.00114, -0.00178, 0.00097, 0.00022, + + 0.00019, 0.00002, 0.00009, -0.00005, + + -0.00002, 0.00006, + + -0.01618, -0.01033, -0.00372, 0.00301, + + -0.00199, 0.00003, 0.00012, -0.00068, + + -0.00027, -0.00011, 0.00009, -0.00020, + + -0.00618, 0.00129, 0.00452, 0.00620, + -0.06411, -0.01524, + + -0.00207, -0.00140, 0.00005, -0.00036, + + -0.00009, 0.00005, 0.00012, -0.00053, + + 0.00050, -0.00068, -0.00059, -0.00132, + + 0.00719, -0.13368, -0.08789, -0.02072, + + 0.00031, -0.00360, -0.00241, -0.00182, + + 0.00284, 0.00196, + + 0.00083, 0.00008, + + 0.00203, -0.00097, -0.00120, 0.00748, + + 0.00326, -0.00145, -0.00276, 0.00236, + + -0.00048, -0.00258, + + 0.00011, 0.00001, + + -0.00284, 0.00795, + + -0.00156, 0.00106, + + -0.00040, -0.00069, 0.00026, -0.00039, + + -0.00102, -0.00098, 0.00017, -0.00125, + + -0.00180, -0.01103, -0.01854, 0.00742, + + -0.02751, -0.00773, -0.00263, 0.01059, + + 0.00152, 0.00047, + + -0.00106, -0.00034, -0.00126, -0.00291, + + -0.00014, 0.00006, + + 0.00069, 0.00316, -0.00087, 0.00022, + + 0.05381, 0.03791, 0.05011, -0.15168, + -0.16315, 0.03037, + + 0.00068, -0.00067, + + -0.00457, -0.00146, -0.00643, -0.00451, + + 0.07806, 0.00729, 0.03356, -0.16465, + -0.20388, -0.04854, + + -0.00163, -0.00178, 0.00185, 0.00405, + + -0.00009, 0.00068, -0.00003, 0.00005, + + -0.01186, 0.00347, -0.01776, 0.00258, + + 0.00081, -0.00014, 0.00003, -0.00021, + + -0.01218, -0.03048, -0.03109, 0.01387, + + -0.00740, -0.00113, + + -0.00155, 0.00679, + + -0.00053, -0.00007, + + -0.00004, -0.00002, + + 0.00248, 0.00127, + + -0.00386, 0.00394, 0.01213, 0.00748, + + -0.04669, -0.00319, 0.00315, 0.00010, + + 85.02966, -55.85765, 215.62111, 519.00334, + -1941.10461, 508.68393, -419.80123, -4679.60117, + -0.00916, 0.00204, + + -0.13900, -0.08473, -0.07614, -0.03445, + 0.00359, -0.00136, + + -0.00111, 0.01028, + + 0.00021, -0.00002, + + 0.00039, 0.00246, -0.00084, -0.00007, + + -0.00191, 0.00491, + + 0.00474, -0.00676, + + -0.00549, 0.02234, 0.02087, 0.00575, + + -0.00011, 0.00079, -0.00060, 0.00029, + + -0.00239, -0.00257, + + 0.00020, 0.00163, + + 0.00301, -0.01723, + + 0.00049, 0.00086, -0.00046, 0.00057, + + -0.00049, 0.00024, + + 0.00103, -0.00072, -0.00005, 0.00095, + + 0.00598, -0.01127, + + -0.00538, 0.00317, -0.00178, -0.00010, + 0.00061, 0.00132, + + -0.00001, 0.00318, -0.00206, 0.00113, + 0.00153, 0.00097, + + 0.00161, -0.00363, + + 0.00142, -0.00047, + + -0.00281, 0.03085, 0.02895, 0.00688, + + 0.00025, -0.00016, + + -0.00197, -0.08112, 0.02859, -0.00683, + + 0.00004, 0.00016, 0.00158, -0.00065, + + 0.00004, -0.00001, + + 0.00002, -0.00008, 0.00019, 0.00039, + + -0.00344, 0.00364, 0.00579, -0.00144, + + 0.00031, -0.00190, + + 0.00066, 0.00025, + + 0.00011, -0.00069, 0.00001, -0.00011, + + -0.01202, 0.00842, 0.00067, -0.00297, + + -0.00000, 0.00008, 0.00005, 0.00000, + + 0.00086, -0.00057, + + 0.00354, -0.00548, + + 0.00009, -0.00003, + + 0.00179, 0.07922, 0.00490, 0.00065, + + -0.00005, -0.00059, + + 0.00061, -0.00319, + + 0.00007, -0.00048, + + 3.49661, -1.52414, -6.26431, -1.76193, + -26.45666, 7.62583, 77.77395, 10.67040, + 0.00032, 0.00090, + + -0.00026, 0.00680, 0.00827, 0.00199, + + -0.00271, 0.04278, 0.02257, -0.00532, + + 0.00006, 0.00011, + + 0.00006, 0.00010, + + -0.00017, -0.00081, + + 0.00050, 0.00001, + + 0.00012, 0.00082, + + 0.00326, 0.00040, + + -0.00003, -0.03209, 0.00042, 0.00008, + + 0.01059, -0.00218, + + -0.87557, -1.06369, -0.52928, 1.38498, + 0.00082, -0.00040, + + 0.00009, -0.00047, + + 0.00007, 0.00007, + + 0.00155, 0.00019, + + 0.00002, 0.00008, + + 0.00001, 0.00023, + + 0.00010, -0.00029, + + -0.03336, -0.00987, 0.00012, -0.00006, + + -0.00198, 0.00333, -0.00004, 0.00026, + + 0.00042, 0.00006, + + 0.00025, 0.00021, + +}; +static double FAR eartabr[] = { + 0.64577, -2.90183, -14.50280, 28.85196, + + 0.08672, -0.05643, 0.02353, -0.00404, + 0.00019, -0.00137, + + 0.00128, -0.00310, 0.00143, 0.00050, + + 0.00000, 0.00000, + + -0.00023, -0.00003, -0.00057, -0.00032, + + -0.00002, 0.00009, + + -0.09716, 0.04111, -0.03108, 0.00633, + -0.00220, -0.00595, -0.00279, 0.00491, + + -0.00004, -0.00003, + + -0.00010, -0.00004, + + -0.00013, -0.00010, + + 0.00017, -0.00010, + + -0.00075, 0.00002, -0.00054, -0.00025, + + 0.12572, 0.00948, 0.05937, 0.04900, + -0.00785, 0.01815, -0.00303, -0.00120, + + -0.00010, 0.00010, + + -0.00317, -0.00143, 0.00068, 0.00213, + + -0.00043, -0.00420, 0.00406, -0.00041, + 0.00048, 0.00062, + + -0.00005, 0.00029, + + 0.00043, -0.00002, + + -0.00126, -0.00009, + + -0.00040, 0.00000, + + 0.03557, 0.02143, -0.02196, 0.04671, + -0.05571, -0.03425, + + 0.00016, 0.00031, + + 0.00020, -0.00153, -0.00142, -0.00051, + + -0.00214, 0.00001, 0.00002, -0.00061, + + -0.06824, 0.00030, -0.05717, 0.04196, + 0.05887, 0.07531, 0.12313, -0.04113, + + 0.00025, 0.00021, + + 0.02218, 0.01747, 0.00011, 0.01367, + -0.00247, 0.00029, + + 0.00120, -0.00003, + + 0.13373, -0.02072, 0.06706, -0.01009, + -0.09515, -0.01901, + + 0.01767, 0.06939, -0.06702, 0.04159, + -0.02809, -0.03968, + + 0.00257, 0.00553, 0.00411, -0.01309, + + 0.00139, 0.01591, -0.00322, 0.00245, + + -0.00202, 0.00093, + + 0.01845, -0.00018, -0.00247, -0.00771, + + -0.02834, -0.00691, -0.00154, -0.01244, + + 0.01512, 0.01884, -0.00359, 0.00731, + + -0.05395, -0.18108, 0.36303, -0.12751, + 0.01877, 0.43653, + + -0.00725, -0.00692, 0.00115, -0.00327, + + 0.04030, 0.01171, 0.00107, 0.01793, + + 0.06335, -0.02171, 0.02229, 0.03533, + + -0.06038, -0.00356, 0.01325, -0.03798, + + 0.04963, -0.06258, 0.08931, 0.04904, + + 0.07115, -0.00073, + + -0.00104, 0.00354, + + -0.01549, 0.00647, 0.04418, 0.01061, + + 0.00568, 0.00957, 0.01102, -0.00819, + + -0.00089, 0.00368, + + -0.00214, 0.00031, + + -1.11935, -0.00029, + + 0.00457, 0.00550, + + 0.01409, 0.01664, -0.00306, 0.00629, + + 0.04531, 0.01460, 0.00092, 0.02074, + + 0.07900, -0.03241, 0.05122, 0.06151, + + 0.01319, 0.03075, -0.02814, 0.00329, + + 0.00208, -0.00681, + + 0.09887, -0.02956, 0.03410, 0.05617, + + 0.00295, 0.00022, + + 0.01727, -0.00666, 0.00255, 0.00256, + + -0.14161, -0.20656, 0.36936, -0.35793, + 0.40122, 0.54675, + + -0.00109, -0.00135, + + 0.11179, -0.13803, 0.19591, 0.11327, + + -0.08785, -0.29929, 0.60319, -0.20484, + 0.01418, 0.71392, + + -0.01039, -0.01041, 0.00694, -0.00183, + + 0.00707, -0.03745, 0.00943, -0.00174, + + 0.01781, 0.00069, 3.35806, -0.06731, + + -0.01015, -0.03402, -0.00913, -0.00094, + + 0.01682, -0.01066, 0.01361, 0.04752, + + 0.97349, 0.00504, + + 0.20303, -0.00206, + + 0.00012, 0.00327, + + 0.00504, 0.00040, + + -0.01599, -0.00570, + + -0.19375, -0.14714, 0.03820, -0.08283, + + -0.07716, 0.10543, -0.06772, 0.01131, + + 163.23023, -126.90743, -183.43441, -201.49515, + -559.82622, 698.28238, 1696.58461, 1279.45831, + 771.51923, -3358.57619, + + -0.05911, 0.89279, -0.15861, 0.28577, + -0.06958, 0.02406, + + 0.01999, 0.00382, + + -0.00934, 0.00014, + + 0.01792, -0.04249, 0.01019, -0.00210, + + -0.00386, 0.00009, + + -0.01353, 0.00101, + + -0.03828, -0.01677, -0.02026, 0.03079, + + -0.00285, -0.02484, 0.00537, -0.00397, + + -0.00064, 0.00906, + + -0.00411, 0.00100, + + -0.06940, -0.01482, + + -0.01966, -0.02171, 0.00388, -0.00840, + + -0.00621, -0.00597, + + -0.03690, -0.00959, -0.00115, -0.01557, + + 3.24906, -0.00580, + + 0.00745, 0.03347, -0.04023, 0.02174, + -0.01544, -0.02389, + + 0.00935, -0.00141, -0.02018, 0.03258, + -0.04479, -0.02360, + + -0.00542, -0.00194, + + -0.07906, 0.00273, + + -0.08439, 0.01534, -0.00264, -0.09205, + + -0.00539, 0.00220, + + 0.01263, 0.01593, 0.01103, -0.03324, + + -0.02720, 0.04749, -0.05099, 0.01807, + + -0.00443, 0.00024, + + -0.01386, 0.00029, -0.00443, -0.00591, + + -0.11899, 0.15817, -0.37728, 0.06552, + + -0.00669, -0.00140, + + -0.01168, -0.00690, + + -0.01032, 0.04315, -0.01082, 0.00123, + + 0.01192, -0.01071, -1.90746, 0.00700, + + 0.00779, 0.04261, 0.01052, 0.00173, + + -0.02138, 0.00307, + + 0.50118, -0.00330, + + -0.00111, 0.01624, + + -0.02601, 0.00305, 0.02348, 0.07058, + + -0.07622, 0.00006, + + -0.00183, 0.01636, + + -0.00037, 0.00564, + + 4.72127, 3.53639, 13.37363, -6.68745, + -12.29946, -22.51893, -27.18616, 22.85033, + 25.89912, 12.56594, + + -0.02566, 0.00307, -0.00064, -0.02727, + + -0.02634, -0.01101, -0.01029, 0.04755, + + -0.00372, -0.00292, + + -0.00582, -0.00053, + + 0.17840, 0.00027, + + -0.03400, 0.00357, + + -0.13428, -0.00611, + + 0.00099, -0.01169, + + 0.01909, 0.01338, 0.01302, -0.03071, + + -0.00051, 0.00577, + + 0.61945, -0.32627, -0.30811, -0.60197, + -0.22597, 0.28183, + + 0.07739, 0.00011, + + 0.01336, -0.00010, + + 0.00049, -0.00592, + + -0.01407, -0.00081, + + 0.00146, -0.00280, + + 0.03795, 0.00003, + + 0.01173, -0.00655, -0.00344, -0.00403, + + 0.00036, -0.00047, 0.02000, 0.00001, + + 0.01105, 0.00002, + + 0.00620, -0.00052, + +}; + +static signed char FAR earargs[] = { + 0, 3, + 3, 4, 3, -8, 4, 3, 5, 2, + 2, 2, 5, -5, 6, 1, + 3, 2, 2, 1, 3, -8, 4, 0, + 3, 3, 2, -7, 3, 4, 4, 1, + 3, 7, 3,-13, 4, -1, 5, 0, + 2, 8, 2,-13, 3, 3, + 3, 1, 2, -8, 3, 12, 4, 0, + 1, 1, 8, 0, + 1, 1, 7, 0, + 2, 1, 5, -2, 6, 0, + 3, 3, 3, -6, 4, 2, 5, 1, + 2, 8, 3,-15, 4, 3, + 2, 2, 5, -4, 6, 0, + 1, 1, 6, 1, + 2, 9, 3,-17, 4, 2, + 3, 3, 2, -5, 3, 1, 5, 0, + 3, 2, 3, -4, 4, 2, 5, 0, + 3, 3, 2, -5, 3, 2, 5, 0, + 2, 1, 5, -1, 6, 0, + 2, 1, 3, -2, 4, 2, + 2, 2, 5, -3, 6, 0, + 1, 2, 6, 1, + 2, 3, 5, -5, 6, 1, + 1, 1, 5, 3, + 2, 1, 5, -5, 6, 0, + 2, 7, 3,-13, 4, 2, + 2, 2, 5, -2, 6, 0, + 2, 3, 2, -5, 3, 2, + 2, 2, 3, -4, 4, 2, + 2, 5, 2, -8, 3, 1, + 2, 6, 3,-11, 4, 1, + 2, 1, 1, -4, 3, 0, + 1, 2, 5, 1, + 2, 3, 3, -6, 4, 1, + 2, 5, 3, -9, 4, 1, + 2, 2, 2, -3, 3, 2, + 2, 4, 3, -8, 4, 1, + 2, 4, 3, -7, 4, 1, + 2, 3, 3, -5, 4, 1, + 2, 1, 2, -2, 3, 1, + 2, 2, 3, -3, 4, 1, + 2, 1, 3, -1, 4, 0, + 2, 4, 2, -7, 3, 0, + 2, 4, 2, -6, 3, 1, + 1, 1, 4, 1, + 2, 1, 3, -3, 4, 0, + 2, 7, 3,-12, 4, 0, + 2, 1, 2, -1, 3, 0, + 2, 1, 3, -4, 5, 0, + 2, 6, 3,-10, 4, 1, + 2, 5, 3, -8, 4, 1, + 2, 1, 3, -3, 5, 1, + 2, 2, 2, -4, 3, 1, + 2, 6, 2, -9, 3, 0, + 2, 4, 3, -6, 4, 1, + 3, 1, 3, -3, 5, 2, 6, 0, + 2, 1, 3, -5, 6, 1, + 2, 1, 3, -2, 5, 2, + 3, 1, 3, -4, 5, 5, 6, 0, + 2, 3, 3, -4, 4, 1, + 2, 3, 2, -4, 3, 2, + 2, 1, 3, -3, 6, 1, + 3, 1, 3, 1, 5, -5, 6, 1, + 2, 1, 3, -1, 5, 1, + 3, 1, 3, -3, 5, 5, 6, 1, + 2, 1, 3, -2, 6, 1, + 2, 2, 3, -2, 4, 0, + 2, 1, 3, -1, 6, 0, + 2, 1, 3, -2, 7, 0, + 2, 1, 3, -1, 7, 0, + 2, 8, 2,-14, 3, 0, + 3, 1, 3, 2, 5, -5, 6, 1, + 3, 5, 3, -8, 4, 3, 5, 1, + 1, 1, 3, 4, + 3, 3, 3, -8, 4, 3, 5, 2, + 2, 8, 2,-12, 3, 0, + 3, 1, 3, 1, 5, -2, 6, 0, + 2, 9, 3,-15, 4, 1, + 2, 1, 3, 1, 6, 0, + 1, 2, 4, 0, + 2, 1, 3, 1, 5, 1, + 2, 8, 3,-13, 4, 1, + 2, 3, 2, -6, 3, 0, + 2, 1, 3, -4, 4, 0, + 2, 5, 2, -7, 3, 0, + 2, 7, 3,-11, 4, 1, + 2, 1, 1, -3, 3, 0, + 2, 6, 3, -9, 4, 1, + 2, 2, 2, -2, 3, 0, + 2, 5, 3, -7, 4, 2, + 2, 4, 3, -5, 4, 2, + 2, 1, 2, -3, 3, 0, + 2, 3, 3, -3, 4, 0, + 2, 4, 2, -5, 3, 1, + 2, 2, 3, -5, 5, 0, + 1, 1, 2, 1, + 2, 2, 3, -4, 5, 1, + 3, 2, 3, -4, 5, 2, 6, 0, + 2, 6, 3, -8, 4, 1, + 2, 2, 3, -3, 5, 1, + 2, 6, 2, -8, 3, 0, + 2, 5, 3, -6, 4, 0, + 2, 2, 3, -5, 6, 1, + 2, 2, 3, -2, 5, 1, + 3, 2, 3, -4, 5, 5, 6, 1, + 2, 4, 3, -4, 4, 0, + 2, 3, 2, -3, 3, 0, + 2, 2, 3, -3, 6, 0, + 2, 2, 3, -1, 5, 1, + 2, 2, 3, -2, 6, 0, + 2, 3, 3, -2, 4, 0, + 2, 2, 3, -1, 6, 0, + 1, 2, 3, 4, + 2, 5, 2, -6, 3, 1, + 2, 2, 2, -1, 3, 1, + 2, 6, 3, -7, 4, 0, + 2, 5, 3, -5, 4, 0, + 2, 4, 2, -4, 3, 0, + 2, 3, 3, -4, 5, 0, + 2, 3, 3, -3, 5, 0, + 2, 6, 2, -7, 3, 0, + 2, 3, 3, -2, 5, 1, + 2, 3, 2, -2, 3, 0, + 1, 3, 3, 2, + 2, 5, 2, -5, 3, 0, + 2, 1, 1, -1, 3, 0, + 2, 7, 2, -8, 3, 0, + 2, 4, 3, -4, 5, 0, + 2, 4, 3, -3, 5, 0, + 2, 6, 2, -6, 3, 0, + 1, 4, 3, 1, + 2, 7, 2, -7, 3, 1, + 2, 8, 2, -8, 3, 0, + 2, 9, 2, -9, 3, 0, + -1 +}; +/* Total terms = 135, small = 134 */ +static struct plantbl FAR ear404 = { + { 1, 9, 14, 17, 5, 5, 2, 1, 0,}, + 4, + earargs, + eartabl, + eartabb, + eartabr, + 1.0, +}; + +/* +First date in file = 1228000.50 +Number of records = 397276.0 +Days per record = 4.0 + Julian Years Lon Lat Rad + -1349.9 to -1000.0: 0.42 0.18 0.25 + -1000.0 to -500.0: 0.45 0.14 0.21 + -500.0 to 0.0: 0.37 0.10 0.20 + 0.0 to 500.0: 0.33 0.09 0.22 + 500.0 to 1000.0: 0.48 0.07 0.22 + 1000.0 to 1500.0: 0.40 0.07 0.19 + 1500.0 to 2000.0: 0.36 0.11 0.19 + 2000.0 to 2500.0: 0.38 0.14 0.20 + 2500.0 to 3000.0: 0.45 0.15 0.24 + 3000.0 to 3000.8: 0.182 0.125 0.087 +*/ + +static double FAR martabl[] = { + 43471.66140, 21291.11063, 2033.37848, 6890507597.78366, + 1279543.73631, + + 317.74183, 730.69258, -15.26502, 277.56960, + -62.96711, 20.96285, + + 1.01857, -2.19395, + + 3.75708, 3.65854, 0.01049, 1.09183, + + -0.00605, -0.04769, + + 0.41839, 0.10091, 0.03887, 0.11666, + + -0.03301, 0.02664, + + 0.38777, -0.56974, + + 0.02974, -0.15041, 0.02179, -0.00808, + + 0.08594, 0.09773, + + -0.00902, -0.04597, 0.00762, -0.03858, + + -0.00139, 0.01562, + + 0.02019, 0.01878, + + -0.01244, 0.00795, + + 0.00815, 0.03501, + + -0.00335, -0.02970, + + -0.00518, -0.01763, + + 0.17257, 0.14698, -0.14417, 0.26028, + + 0.00062, -0.00180, + + 13.35262, 39.38771, -15.49558, 22.00150, + -7.71321, -4.20035, 0.62074, -1.42376, + + 0.07043, -0.06670, 0.16960, -0.06859, + 0.07787, 0.01845, + + -0.01608, -0.00914, + + 5.60438, -3.44436, 5.88876, 6.77238, + -5.29704, 3.48944, + + 0.01291, 0.01280, + + -0.53532, 0.86584, 0.79604, 0.31635, + + -3.92977, -0.94829, -0.74254, -1.37947, + 0.17871, -0.12477, + + 0.00171, 0.11537, + + 0.02281, -0.03922, + + -0.00165, 0.02965, + + 1.59773, 1.24565, -0.35802, 1.37272, + -0.44811, -0.08611, + + 3.04184, -3.39729, 8.86270, 6.65967, + -9.10580, 10.66103, + + 0.02015, -0.00902, + + -0.01166, -0.23957, -0.12128, -0.04640, + + -0.07114, 0.14053, -0.04966, -0.01665, + + 0.28411, -0.37754, -1.26265, 1.01377, + 3.70433, -0.21025, + + -0.00972, 0.00350, + + 0.00997, 0.00450, + + -2.15305, 3.18147, -1.81957, -0.02321, + -0.02560, -0.35188, + + 0.00003, -0.01110, + + 0.00244, -0.05083, + + -0.00216, -0.02026, + + 0.05179, 0.04188, + + 5.92031, -1.61316, 3.72001, 6.98783, + -4.17690, 2.61250, + + 0.04157, 2.76453, -1.34043, 0.74586, + -0.20258, -0.30467, + + 0.00733, 0.00376, + + 1.72800, 0.76593, 1.26577, -2.02682, + -1.14637, -0.91894, + + -0.00002, 0.00036, + + 2.54213, 0.89533, -0.04166, 2.36838, + -0.97069, 0.05486, + + 0.46927, 0.04500, 0.23388, 0.35005, + + 1.61402, 2.30209, -0.99859, 1.63349, + -0.51490, -0.26112, + + 0.27848, -0.26100, -0.07645, -0.22001, + + 0.92901, 1.12627, -0.39829, 0.77120, + -0.23716, -0.11245, + + -0.02387, 0.03960, + + -0.00802, 0.02179, + + 2.86448, 1.00246, -0.14647, 2.80278, + -1.14143, 0.05177, + + 1.68671, -1.23451, 3.16285, 0.70070, + 0.25817, 3.17416, + + 0.07447, -0.08116, -0.03029, -0.02795, + + 0.00816, 0.01023, + + 0.00685, -0.01075, + + -0.34268, 0.03680, -0.05488, -0.07430, + + -0.00041, -0.02968, + + 3.13228, -0.83209, 1.95765, 3.78394, + -2.26196, 1.38520, + + -0.00401, -0.01397, + + 1.01604, -0.99485, 0.62465, 0.22431, + -0.05076, 0.12025, + + 4.35229, -5.04483, 14.87533, 9.00826, + -10.37595, 19.26596, + + 0.40352, 0.19895, 0.09463, -0.10774, + + -0.17809, -0.08979, -0.00796, -0.04313, + + 0.01520, -0.03538, + + 1.53301, -1.75553, 4.87236, 3.23662, + -3.62305, 6.42351, + + -0.00439, -0.01305, + + 0.17194, -0.64003, 0.26609, 0.06600, + + 0.01767, -0.00251, + + -0.08871, -0.15523, 0.01201, -0.03408, + + -0.29126, -0.07093, -0.00998, -0.07876, + + 1.05932, -25.38650, + + -0.29354, 0.04179, -0.01726, 0.07473, + + -0.07607, -0.08859, 0.00842, -0.02359, + + 0.47858, -0.39809, 1.25061, 0.87017, + -0.82453, 1.56864, + + -0.00463, 0.02385, + + -0.29070, 8.56535, + + -0.12495, 0.06580, -0.03395, -0.02465, + + -1.06759, 0.47004, -0.40281, -0.23957, + 0.03572, -0.07012, + + 0.00571, -0.00731, + + 0.18601, -1.34068, + + 0.03798, -0.00532, 0.00448, -0.01147, + + 1.41208, -0.00668, 0.25883, 1.23788, + -0.57774, 0.09166, + + -2.49664, -0.25235, -0.53582, -0.80126, + 0.10827, -0.08861, + + -0.03577, 0.06825, + + -0.00143, 0.04633, + + 0.01586, -0.01056, + + -0.02106, 0.03804, + + -0.00088, -0.03458, + + -0.00033, -0.01079, + + 0.05821, -0.02445, + + 0.00602, 0.00721, + + -0.00315, -0.01021, + + -0.65454, 1.08478, -0.44593, -0.21492, + + -1.35004, 4.47299, -4.19170, 3.51236, + + 1946.04629, 13960.88247, 576.24572, 8023.81797, + 2402.48512, -753.87007, -6376.99217, -10278.88014, + -25743.89874, 15506.87748, 15609.59853, 35173.63133, + + -3.70370, 6.29538, -4.84183, -0.76942, + + -0.02465, -0.03840, + + 0.00565, -0.06071, + + 0.01174, 0.00253, + + -0.00230, 0.05252, + + -0.02813, 0.01359, + + 0.23208, 0.03393, 0.01734, 0.04838, + + -0.46340, -0.18941, 0.25428, -0.56925, + + 0.05213, 0.24704, 0.12922, -0.01531, + + 0.06885, -0.08510, 0.01853, -0.00390, + + 0.01196, -0.30530, 0.13117, -0.03533, + + 1.79597, -0.42743, 0.98545, 2.13503, + -1.32942, 0.68005, + + -0.01226, 0.00571, + + 0.31081, 0.34932, 0.34531, -0.32947, + + -0.00548, 0.00186, -0.00157, -0.00065, + + 0.30877, -0.03864, 0.04921, 0.06693, + + 0.01761, -0.04119, + + 1.28318, 0.38546, 0.06462, 1.18337, + -0.48698, 0.07086, + + 0.26031, -0.22813, 0.10272, 0.04737, + + -0.04506, -0.38581, -0.16624, -0.04588, + + 0.00992, 0.00722, + + -0.21041, 0.20560, -0.09267, -0.03438, + + 0.32264, -0.07383, + + 0.09553, -0.38730, 0.17109, -0.01342, + + -0.02336, -0.01286, + + 0.00230, 0.04626, + + 0.01176, 0.01868, + + -0.15411, -0.32799, 0.22083, -0.14077, + + 1.98392, 1.68058, + + -0.02526, -0.13164, -0.04447, -0.00153, + + 0.01277, 0.00553, + + -0.26035, -0.11362, 0.14672, -0.32242, + + 0.16686, -0.69957, 0.40091, -0.06721, + 0.00837, 0.09635, + + -0.08545, 0.25178, -0.22486, 16.03256, + + 0.34130, -0.06313, 0.01469, -0.09012, + + -0.00744, -0.02510, + + -0.08492, -0.13733, + + -0.07620, -0.15329, 0.13716, -0.03769, + + 2.01176, -1.35991, -1.04319, -2.97226, + + -0.01433, 0.61219, + + -0.55522, 0.38579, 0.31831, 0.81843, + + -0.04583, -0.14585, + + -0.10218, 0.16039, -0.06552, -0.01802, + + 0.06480, -0.06641, 0.01672, -0.00287, + + 0.00308, 0.09982, -0.05679, -0.00249, + + -0.36034, 0.52385, -0.29759, 0.59539, + + -3.59641, -1.02499, + + -547.53774, 734.11470, 441.86760, -626.68255, + -2255.81376, -1309.01028, -2025.69590, 2774.69901, + 1711.21478, 1509.99797, + + -0.99274, 0.61858, -0.47634, -0.33034, + + 0.00261, 0.01183, + + -0.00038, 0.11687, + + 0.00994, -0.01122, + + 0.03482, -0.01942, + + -0.11557, 0.38237, -0.17826, 0.00830, + + 0.01193, -0.05469, + + 0.01557, 0.01747, + + 0.02730, -0.01182, + + -0.11284, 0.12939, -0.05621, -0.01615, + + 0.04258, 0.01058, + + -0.01723, 0.00963, + + 0.20666, 0.11742, + + 0.07830, -0.02922, + + -0.10659, -0.05407, 0.07254, -0.13005, + + -0.02365, 0.24583, 0.31915, 1.27060, + + 0.00009, -0.21541, + + -0.55324, -0.45999, -1.45885, 0.86530, + 0.85932, 1.92999, + + -0.00755, -0.00715, + + -0.02004, -0.00788, + + 0.01539, 0.00837, + + 0.27652, -0.50297, -0.26703, -0.28159, + + 0.03950, 0.07182, + + -0.07177, 0.14140, 0.07693, 0.07564, + + -0.01316, -0.01259, + + 0.01529, 0.07773, + + -90.74225, -378.15784, -510.30190, -52.35396, + -89.15267, 415.56828, 181.52119, 54.01570, + + -0.01093, -0.05931, + + -0.01344, -0.02390, + + 0.01432, -0.02470, + + -0.01509, -0.01346, + + 0.03352, 0.02248, + + 0.02588, -0.00948, + + 0.03610, 0.17238, + + 0.02909, -0.04065, + + 0.00155, -0.07025, + + -0.09508, 0.14487, 0.12441, 0.16451, + + 0.00001, -0.00005, + + -0.00982, -0.01895, + + -0.16968, 0.36565, 0.20234, 0.17789, + + -0.04519, -0.00588, + + 0.01268, 0.00107, + + -56.32137, -58.22145, -80.55270, 28.14532, + 11.43301, 52.05752, 17.79480, -2.61997, + + -0.00005, -0.02629, + + 0.01080, -0.00390, + + 0.00744, 0.03132, + + 0.01156, -0.01621, + + 0.02162, 0.02552, + + 0.00075, -0.02497, + + 0.02495, 0.00830, + + 0.03230, 0.00103, + + -14.84965, -4.50200, -9.73043, 9.40426, + 4.08054, 5.38571, 1.53731, -1.01288, + + 0.21076, 1.74227, 0.79760, 0.39583, + 0.09879, -0.16736, + + -0.00723, -0.01536, + +}; +static double FAR martabb[] = { + -364.49380, -47.17612, -554.97858, -430.63121, + 596.44312, + + -3.94434, -7.43169, -0.06665, -2.23987, + 0.10366, -0.05567, + + -0.01463, 0.01908, + + -0.02611, -0.00350, -0.01057, -0.00610, + + -0.00015, 0.00002, + + 0.00010, 0.00033, 0.00007, -0.00000, + + -0.00010, -0.00004, + + 0.00012, 0.00002, + + -0.00014, -0.00048, -0.00003, -0.00007, + + 0.00008, -0.00005, + + -0.00043, -0.00003, -0.00010, -0.00004, + + 0.00001, 0.00001, + + -0.00003, -0.00003, + + 0.00004, 0.00007, + + -0.00041, 0.00031, + + 0.00076, 0.00062, + + 0.00001, -0.00002, + + 0.00035, 0.00053, 0.00026, 0.00019, + + 0.00020, 0.00010, + + 0.02936, 0.09624, -0.01153, 0.01386, + 0.00551, -0.00690, 0.00196, 0.00148, + + -0.00408, -0.00673, -0.00067, -0.00152, + -0.00014, -0.00005, + + 0.00000, 0.00005, + + -0.00116, 0.00276, -0.00391, 0.00983, + -0.01327, -0.01986, + + -0.00003, 0.00001, + + 0.01104, 0.00631, -0.01364, 0.01152, + + -0.00439, 0.01103, -0.00546, 0.00181, + -0.00039, -0.00083, + + 0.00007, 0.00002, + + -0.00010, -0.00008, + + 0.00005, 0.00002, + + -0.00584, 0.00512, -0.00722, -0.00174, + 0.00101, -0.00316, + + -0.02229, -0.02797, -0.10718, 0.05741, + 0.11403, 0.10033, + + 0.00036, -0.00022, + + 0.00787, 0.01191, 0.01756, -0.02121, + + -0.00169, -0.00364, 0.00070, -0.00051, + + 0.01850, -0.06836, 0.21471, 0.00162, + -0.29165, 0.16799, + + -0.00002, 0.00011, + + -0.00075, -0.00077, + + -0.00675, -0.00814, 0.00029, -0.00599, + 0.00107, 0.00013, + + 0.00010, -0.00002, + + 0.00005, 0.00020, + + 0.00355, 0.00306, + + -0.00013, -0.00061, + + -0.02950, -0.00847, 0.01037, -0.04783, + 0.04237, 0.11662, + + -0.00331, 0.00207, -0.00107, -0.00264, + 0.00072, -0.00023, + + -0.00151, 0.00146, + + -0.12847, 0.02294, 0.03611, 0.19705, + 0.16855, -0.28279, + + -0.00000, -0.00002, + + -0.00525, -0.03619, 0.05048, -0.00481, + -0.00745, 0.04618, + + 0.00286, 0.00443, 0.00521, -0.00351, + + 0.00200, 0.00474, -0.00149, 0.00031, + -0.00003, 0.00029, + + 0.00686, 0.02467, 0.04275, -0.02223, + + 0.02282, -0.04228, 0.03312, 0.01847, + -0.01253, 0.01601, + + 0.00076, 0.00091, + + 0.00045, 0.00035, + + 0.00658, 0.01586, -0.00310, 0.00628, + -0.00045, 0.00316, + + -0.01602, -0.00340, -0.01744, 0.04907, + 0.06426, 0.02275, + + -0.00217, -0.00377, -0.00091, 0.00037, + + 0.00040, -0.00003, + + -0.00017, -0.00027, + + 0.00366, 0.02693, -0.00934, 0.00386, + + 0.00616, -0.00037, + + 0.02028, 0.02120, -0.01768, 0.02421, + 0.00102, 0.00877, + + 0.00012, 0.00030, + + -0.00019, -0.02165, 0.01245, -0.00742, + 0.00172, 0.00320, + + -0.17117, -0.12908, -0.43134, 0.15617, + 0.21216, 0.56432, + + 0.01139, -0.00937, -0.00058, -0.00337, + + -0.00999, 0.01862, -0.00621, -0.00080, + + -0.00025, -0.00140, + + 0.09250, 0.01173, -0.03549, 0.14651, + -0.01784, 0.00945, + + 0.00000, -0.00006, + + -0.00500, 0.00086, 0.01079, -0.00002, + + -0.00012, -0.00029, + + -0.02661, 0.00140, -0.00524, -0.00460, + + -0.00352, -0.00563, -0.00277, -0.00052, + + -0.10171, -0.02001, + + 0.00045, 0.00265, -0.00082, 0.00160, + + -0.00302, -0.00434, -0.00022, -0.00134, + + 0.03285, 0.02964, -0.05612, -0.00668, + -0.01821, 0.06590, + + 0.00039, 0.00061, + + -0.13531, -0.03831, + + 0.02553, 0.02130, -0.00336, 0.00468, + + -0.04522, -0.05540, 0.00129, -0.01767, + 0.00181, 0.00031, + + -0.00011, -0.00034, + + -0.00146, 0.01101, + + -0.00030, 0.00240, -0.00039, 0.00072, + + -0.01954, -0.03822, 0.09682, -0.04541, + -0.01567, 0.09617, + + -0.03371, 0.33028, -0.12102, 0.05874, + -0.00990, -0.02236, + + 0.00109, 0.00158, + + -0.00482, 0.00019, + + -0.00036, 0.00004, + + 0.00024, 0.00201, + + 0.00017, 0.00011, + + -0.00012, 0.00002, + + -0.00323, -0.01062, + + -0.00130, 0.00091, + + 0.00056, -0.00017, + + 0.00774, 0.00601, 0.02550, 0.01700, + + -0.84327, 0.77533, -0.71414, -0.50643, + + -473.30877, -1504.79179, -458.52274, -865.82237, + -417.34994, -681.03976, 765.50697, -1653.67165, + 4427.33176, 710.53895, -5016.39367, 4280.60361, + + 0.33957, 0.38390, -0.38631, 0.81193, + + 0.00154, -0.00043, + + 0.01103, -0.00017, + + -0.00046, 0.00221, + + 0.00059, 0.00014, + + 0.00160, 0.00475, + + 0.06191, -0.13289, 0.02884, -0.00566, + + -0.01572, 0.23780, -0.05140, -0.03228, + + -0.00716, -0.00978, -0.01048, 0.01317, + + -0.01267, -0.01198, 0.00037, -0.00330, + + -0.02305, 0.00355, -0.00121, -0.00496, + + -0.04369, -0.01343, 0.05347, -0.12433, + 0.02090, 0.17683, + + 0.00028, -0.00490, + + -0.02778, -0.05587, -0.01658, 0.05655, + + 0.00204, -0.00092, 0.00020, 0.00014, + + -0.00603, -0.03829, 0.00778, -0.00588, + + -0.00266, 0.00097, + + -0.02158, -0.07742, 0.09306, -0.01827, + -0.01048, 0.07885, + + -0.02485, -0.02505, 0.00471, -0.01026, + + 0.06663, 0.01110, 0.00469, -0.05347, + + -0.00016, -0.00013, + + 0.02622, 0.02273, -0.01009, 0.01391, + + -0.01042, -0.00444, + + -0.04293, -0.00767, -0.00154, -0.01739, + + 0.00353, -0.00763, + + -0.00060, 0.00010, + + -0.00053, -0.00146, + + -0.05317, 0.05760, -0.01801, -0.02099, + + -0.02611, -0.01836, + + -0.00256, 0.00812, -0.00145, 0.00054, + + -0.00008, 0.00015, + + -0.04087, 0.08860, -0.05385, -0.02134, + + 0.02771, 0.02441, -0.00234, 0.01571, + -0.00260, 0.00097, + + 0.10151, 0.49378, -0.28555, 0.11428, + + -0.00286, 0.01224, 0.00160, 0.00069, + + 0.00000, -0.00040, + + -0.13286, 0.00448, + + 0.01225, -0.00568, 0.00341, 0.00224, + + -0.23483, -0.07859, 0.30733, -0.21548, + + -0.02608, 0.00756, + + 0.09789, 0.02878, -0.11968, 0.08981, + + 0.02046, -0.00888, + + 0.02955, 0.01486, -0.00981, 0.01542, + + -0.01674, -0.01540, 0.00019, -0.00449, + + -0.02140, 0.00638, 0.00112, -0.00730, + + -0.08571, 0.13811, -0.16951, -0.02917, + + -0.03931, -0.32643, + + -68.64541, -81.00521, -47.97737, 15.75290, + 181.76392, -36.00647, -48.32098, -259.02226, + -265.57466, 554.05904, + + 0.09017, 0.18803, -0.12459, 0.10852, + + 0.00211, 0.00002, + + 0.00304, -0.00370, + + 0.00174, 0.00279, + + 0.00139, 0.00095, + + 0.04881, 0.00262, -0.01020, 0.03762, + + 0.00987, 0.00612, + + 0.00054, -0.00036, + + 0.00009, -0.00094, + + 0.02279, 0.01785, -0.00778, 0.01263, + + 0.00040, -0.00112, + + -0.00452, -0.00662, + + 0.00483, -0.00030, + + -0.00054, -0.00205, + + -0.00052, -0.00362, -0.00215, -0.00247, + + 0.02893, -0.01965, -0.00004, 0.04114, + + -0.00284, -0.00103, + + 0.01827, -0.07822, 0.18010, 0.04805, + -0.21702, 0.18808, + + 0.00095, -0.00132, + + -0.01488, 0.00746, + + 0.00198, 0.00190, + + 0.01032, 0.03392, 0.04318, -0.07332, + + -0.01004, 0.00787, + + -0.00308, -0.01177, -0.01431, 0.02659, + + 0.00273, -0.00374, + + -0.02545, 0.00644, + + 28.68376, 13.74978, 29.60401, -47.98255, + -65.91944, -18.48404, -1.73580, 64.67487, + + -0.02492, 0.00104, + + -0.00829, -0.00134, + + 0.00077, 0.00005, + + -0.00513, 0.00403, + + 0.00071, -0.00047, + + -0.00023, -0.00063, + + 0.00120, 0.00370, + + -0.00038, -0.00037, + + 0.00080, -0.00018, + + 0.00866, 0.00156, -0.01064, 0.02131, + + 0.00000, -0.00001, + + 0.00038, -0.00068, + + -0.00909, -0.02187, -0.02599, 0.05507, + + -0.00022, -0.01468, + + 0.00032, 0.00500, + + 9.86233, -2.85314, -2.25791, -13.83444, + -12.38794, 3.79861, 2.76343, 6.63505, + + 0.00066, 0.00007, + + -0.00016, -0.00039, + + 0.00014, 0.00059, + + -0.00031, -0.00024, + + -0.00168, 0.00259, + + 0.00007, -0.00005, + + -0.00052, 0.00558, + + 0.00110, 0.01037, + + 1.59224, -2.37284, -2.00023, -2.28280, + -1.49571, 1.48293, 0.60041, 0.56376, + + -0.54386, 0.03568, -0.10392, 0.31005, + 0.09104, 0.03015, + + 0.00826, -0.00524, + +}; +static double FAR martabr[] = { + -816.07287, -381.41365, -33.69436, 177.22955, + 0.18630, + + -8.29605, -11.15519, -0.57407, -3.53642, + 0.16663, -0.06334, + + -0.03056, 0.02767, + + -0.04161, 0.03917, -0.02425, 0.00204, + + -0.00034, 0.00023, + + 0.00058, -0.00111, 0.00039, -0.00015, + + 0.00006, -0.00023, + + 0.00237, 0.00191, + + 0.00154, -0.00029, 0.00009, 0.00011, + + -0.00041, 0.00037, + + -0.00010, -0.00064, 0.00015, -0.00005, + + 0.00012, -0.00003, + + -0.00034, 0.00026, + + 0.00011, -0.00007, + + -0.00158, 0.00087, + + 0.00278, 0.00137, + + 0.00024, -0.00020, + + 0.00530, -0.00448, 0.00780, 0.00408, + + 0.00062, 0.00035, + + -1.35261, 0.79891, -0.81597, -0.43774, + 0.14713, -0.27415, 0.05298, 0.02230, + + -0.02089, -0.01070, -0.00374, 0.00342, + -0.00142, 0.00270, + + -0.00039, 0.00063, + + 0.16024, 0.27088, -0.32127, 0.27467, + -0.16615, -0.24460, + + -0.00073, 0.00032, + + -0.05710, -0.05265, -0.06025, 0.05120, + + -0.05295, 0.23477, -0.08211, 0.04575, + -0.00769, -0.01067, + + -0.00570, 0.00015, + + -0.00251, -0.00140, + + -0.00131, -0.00018, + + -0.12246, 0.15836, -0.13065, -0.03222, + 0.00795, -0.04232, + + -0.36585, -0.31154, 0.68504, -0.96006, + 1.19304, 0.88631, + + 0.00132, 0.00046, + + 0.13105, 0.04252, 0.05164, -0.06837, + + -0.01351, -0.01458, 0.00376, -0.00557, + + 0.28532, -0.17290, -0.53946, -0.79365, + -0.95246, 0.74984, + + 0.00019, 0.00132, + + -0.00163, -0.00295, + + -0.40106, -0.26573, -0.00155, -0.22655, + 0.04349, -0.00376, + + 0.00149, -0.00001, + + 0.00523, 0.00078, + + 0.01203, 0.00558, + + -0.00708, 0.00520, + + -0.36428, -1.28827, 1.50845, -0.83063, + 0.58802, 0.89998, + + -0.55256, 0.01255, -0.15169, -0.26715, + 0.06061, -0.04122, + + -0.00397, 0.00534, + + -0.52576, 1.22031, 1.44098, 0.92406, + 0.67214, -0.85486, + + -0.00010, 0.00001, + + 0.28820, -0.84198, 0.78291, 0.00251, + 0.02398, 0.32093, + + -0.02331, 0.10109, -0.07555, 0.03557, + + -0.61580, 0.43399, -0.43779, -0.26390, + 0.06885, -0.13803, + + 0.17694, 0.19245, 0.15119, -0.05100, + + 0.49469, -0.45028, 0.33590, 0.15677, + -0.04702, 0.10265, + + -0.00942, -0.00580, + + -0.00555, -0.00252, + + -0.32933, 0.92539, -0.91004, -0.04490, + -0.01812, -0.37121, + + 0.34695, 0.50855, -0.24721, 0.86063, + -0.84747, 0.01983, + + 0.01948, 0.02039, 0.00748, -0.00727, + + -0.00271, 0.00220, + + 0.00309, 0.00196, + + 0.02030, 0.17201, -0.03716, 0.02801, + + 0.01871, 0.00002, + + 0.31736, 1.17319, -1.42245, 0.73416, + -0.52302, -0.85056, + + 0.00522, -0.00126, + + 0.33571, 0.34594, -0.07709, 0.21114, + -0.04066, -0.01742, + + 1.72228, 1.46934, -3.06437, 5.06723, + -6.53800, -3.55839, + + -0.06933, 0.13815, 0.03684, 0.03284, + + -0.04841, 0.09571, -0.02350, 0.00418, + + 0.01302, 0.00579, + + 0.73408, 0.64718, -1.37437, 2.04816, + -2.70756, -1.52808, + + 0.00523, -0.00166, + + 0.25915, 0.06900, -0.02758, 0.10707, + + 0.00062, 0.00744, + + -0.08117, 0.04840, -0.01806, -0.00637, + + 0.03034, -0.12414, 0.03419, -0.00388, + + 10.92603, 0.48169, + + -0.01753, -0.12853, -0.03207, -0.00801, + + 0.03904, -0.03326, 0.01033, 0.00366, + + 0.17249, 0.20846, -0.38157, 0.54639, + -0.68518, -0.36121, + + -0.01043, -0.00186, + + -3.33843, -0.16353, + + 0.03462, 0.06669, -0.01305, 0.01803, + + -0.22703, -0.52219, 0.11709, -0.19628, + 0.03410, 0.01741, + + 0.00338, 0.00265, + + 0.63213, 0.08944, + + 0.00236, 0.01829, 0.00546, 0.00218, + + 0.00073, -0.72570, 0.63698, -0.13340, + 0.04698, 0.29716, + + -0.13126, 1.27705, -0.40980, 0.27400, + -0.04525, -0.05529, + + -0.03249, -0.01696, + + -0.02314, -0.00076, + + 0.00510, 0.00764, + + -0.01847, -0.01021, + + 0.01688, -0.00044, + + 0.00531, -0.00016, + + -0.01219, -0.02903, + + -0.00361, 0.00299, + + 0.00504, -0.00153, + + -0.53625, -0.32460, 0.10642, -0.22070, + + -2.21651, -0.66036, -1.74652, -2.08198, + + -6810.78679, 967.02869, -3915.97140, 291.65905, + 372.99563, 1196.01966, 5108.01033, -3172.64698, + -7685.78246, -12789.43898, -17474.50562, 7757.84703, + + 3.13224, 1.84743, -0.38257, 2.40590, + + 0.01860, -0.01217, + + 0.03004, 0.00278, + + -0.00125, 0.00579, + + -0.02673, -0.00112, + + 0.00662, 0.01374, + + -0.02729, 0.13109, -0.02836, 0.00877, + + 0.12171, -0.27475, 0.34765, 0.15882, + + -0.12548, 0.02603, 0.00710, 0.06538, + + -0.04039, -0.03257, -0.00186, -0.00880, + + 0.16643, 0.00707, 0.01918, 0.07156, + + -0.20459, -0.85107, 1.01832, -0.47158, + 0.32582, 0.63002, + + -0.00282, -0.00711, + + -0.19695, 0.15053, 0.15676, 0.17847, + + 0.00071, 0.00286, -0.00039, 0.00083, + + 0.02009, 0.17859, -0.03894, 0.02805, + + 0.02379, 0.00752, + + 0.17529, -0.57783, 0.53257, -0.02829, + 0.03211, 0.21777, + + 0.13813, 0.16305, -0.02996, 0.06303, + + 0.21058, -0.02659, 0.02596, -0.08808, + + -0.00389, 0.00586, + + 0.08986, 0.09204, -0.01480, 0.04031, + + 0.06115, 0.18366, + + 0.25636, 0.06905, 0.00719, 0.11391, + + 0.00636, -0.01113, + + -0.02808, 0.00150, + + -0.01219, 0.00832, + + 0.28626, -0.09573, 0.10481, 0.16559, + + -0.94578, 1.26394, + + 0.08846, -0.01623, 0.00082, -0.02640, + + -0.00347, 0.00798, + + 0.12873, -0.21248, 0.27999, 0.14348, + + 0.44082, 0.10453, 0.04362, 0.25332, + -0.06077, 0.00555, + + -0.06947, -0.05511, -10.08703, -0.10614, + + 0.04059, 0.21355, 0.05632, 0.00871, + + 0.01599, -0.00531, + + 0.36835, -0.03530, + + 0.09519, -0.04961, 0.02568, 0.08613, + + 0.57033, 0.84599, 1.27123, -0.41266, + + -0.36937, -0.00655, + + -0.16547, -0.24000, -0.35213, 0.13345, + + 0.05870, -0.01524, + + 0.06419, 0.04136, -0.00681, 0.02606, + + -0.02519, -0.02732, -0.00105, -0.00677, + + -0.03891, 0.00106, 0.00087, -0.02256, + + -0.20834, -0.14624, -0.23178, -0.11786, + + 0.32479, -1.41222, + + -303.74549, -202.79324, 260.20290, 184.84320, + 536.68016, -881.56427, -1125.64824, -791.09928, + -596.61162, 659.35664, + + 0.24561, 0.39519, -0.12601, 0.18709, + + -0.00700, 0.00136, + + 0.30750, 0.00009, + + 0.00443, 0.00384, + + 0.01170, 0.02078, + + 0.15043, 0.04802, 0.00386, 0.06942, + + 0.02107, 0.00495, + + -0.01067, 0.00951, + + 0.00937, 0.01996, + + 0.04922, 0.04337, -0.00583, 0.02110, + + -0.00691, 0.02793, + + -0.00364, -0.00682, + + -0.09143, 0.15369, + + 0.02043, 0.05451, + + 0.04053, -0.08179, 0.09645, 0.05330, + + -0.10149, -0.01594, -0.96773, 0.13660, + + 0.17326, 0.00013, + + 0.20990, -0.23184, -0.38407, -0.64733, + -0.84754, 0.38889, + + 0.00310, -0.00340, + + 0.00970, -0.00788, + + -0.01111, 0.00677, + + 0.18147, 0.09968, 0.10170, -0.09233, + + -0.03165, 0.01790, + + -0.04727, -0.02364, -0.02546, 0.02451, + + 0.00442, -0.00426, + + -0.02540, 0.00471, + + 130.42585, -31.30051, 17.99957, -174.75585, + -142.96798, -27.89752, -19.42122, 59.14872, + + -0.01899, 0.00388, + + -0.01265, 0.00694, + + 0.01966, 0.01140, + + -0.00439, 0.00503, + + -0.01867, 0.02826, + + 0.00752, 0.02012, + + -0.14734, 0.01909, + + 0.03312, 0.02327, + + 0.05843, 0.00061, + + -0.06958, -0.05798, -0.09174, 0.06242, + + 0.00003, 0.00001, + + 0.00670, -0.00305, + + -0.13637, -0.06058, -0.06372, 0.07257, + + 0.00209, -0.01369, + + -0.00044, 0.00355, + + 17.90079, -17.48270, -8.77915, -24.54483, + -15.67123, 3.62668, 0.52038, 5.13220, + + 0.02574, 0.00003, + + 0.00339, 0.00919, + + -0.02778, 0.00464, + + 0.01429, 0.01003, + + -0.01661, 0.01327, + + 0.02216, 0.00034, + + -0.00389, 0.01076, + + -0.00035, 0.00983, + + 1.23731, -4.18017, -2.61932, -2.66346, + -1.45540, 1.10310, 0.23322, 0.40775, + + -0.43623, 0.06212, -0.09900, 0.19456, + 0.03639, 0.02566, + + 0.00309, -0.00116, + +}; + +static signed char FAR marargs[] = { + 0, 4, + 3, 4, 3, -8, 4, 3, 5, 2, + 3, 5, 2, -6, 3, -4, 4, 0, + 2, 2, 5, -5, 6, 1, + 3, 12, 3,-24, 4, 9, 5, 0, + 3, 2, 2, 1, 3, -8, 4, 1, + 3, 11, 3,-21, 4, 2, 5, 0, + 3, 3, 2, -7, 3, 4, 4, 0, + 3, 7, 3,-13, 4, -1, 5, 1, + 3, 1, 3, -2, 4, 2, 6, 0, + 3, 1, 2, -8, 3, 12, 4, 1, + 3, 1, 4, -8, 5, 4, 6, 0, + 3, 1, 4, -7, 5, 2, 6, 0, + 3, 1, 4, -9, 5, 7, 6, 0, + 1, 1, 7, 0, + 2, 1, 5, -2, 6, 0, + 3, 1, 3, -2, 4, 1, 5, 0, + 3, 3, 3, -6, 4, 2, 5, 1, + 3, 12, 3,-23, 4, 3, 5, 0, + 2, 8, 3,-15, 4, 3, + 2, 1, 4, -6, 5, 2, + 3, 2, 2, -7, 3, 7, 4, 0, + 2, 1, 2, -3, 4, 2, + 2, 2, 5, -4, 6, 0, + 1, 1, 6, 1, + 2, 9, 3,-17, 4, 2, + 3, 2, 3, -4, 4, 2, 5, 0, + 3, 2, 3, -4, 4, 1, 5, 0, + 2, 1, 5, -1, 6, 0, + 2, 2, 2, -6, 4, 2, + 2, 1, 3, -2, 4, 2, + 2, 2, 5, -3, 6, 0, + 1, 2, 6, 1, + 2, 3, 5, -5, 6, 1, + 1, 1, 5, 2, + 3, 4, 3, -8, 4, 2, 5, 0, + 2, 1, 5, -5, 6, 0, + 2, 7, 3,-13, 4, 2, + 2, 3, 2, -9, 4, 0, + 2, 2, 5, -2, 6, 0, + 1, 3, 6, 0, + 2, 1, 4, -5, 5, 0, + 2, 2, 3, -4, 4, 2, + 2, 6, 3,-11, 4, 2, + 2, 4, 5, -5, 6, 0, + 1, 2, 5, 2, + 3, 1, 4, -3, 5, -3, 6, 0, + 2, 3, 3, -6, 4, 2, + 2, 1, 4, -4, 5, 1, + 2, 5, 3, -9, 4, 2, + 1, 3, 5, 1, + 2, 4, 3, -8, 4, 2, + 3, 1, 4, -4, 5, 2, 6, 0, + 3, 1, 4, -1, 5, -5, 6, 0, + 2, 4, 3, -7, 4, 2, + 2, 1, 4, -3, 5, 2, + 3, 1, 4, -5, 5, 5, 6, 1, + 3, 1, 4, -4, 5, 3, 6, 0, + 3, 1, 4, -3, 5, 1, 6, 0, + 2, 5, 3,-10, 4, 1, + 1, 4, 5, 0, + 2, 3, 3, -5, 4, 2, + 3, 1, 4, -3, 5, 2, 6, 0, + 2, 1, 4, -5, 6, 2, + 2, 1, 4, -2, 5, 2, + 3, 1, 4, -4, 5, 5, 6, 1, + 2, 6, 3,-12, 4, 1, + 2, 1, 4, -4, 6, 0, + 2, 2, 3, -3, 4, 2, + 2, 10, 3,-18, 4, 0, + 2, 1, 4, -3, 6, 1, + 3, 1, 4, -2, 5, 2, 6, 0, + 2, 7, 3,-14, 4, 1, + 3, 1, 4, 1, 5, -5, 6, 1, + 2, 1, 4, -1, 5, 0, + 3, 1, 4, -3, 5, 5, 6, 1, + 3, 1, 4, 2, 5, -7, 6, 1, + 2, 1, 4, -2, 6, 2, + 3, 1, 4, -2, 5, 3, 6, 0, + 2, 1, 3, -1, 4, 0, + 2, 2, 2, -7, 4, 1, + 2, 9, 3,-16, 4, 2, + 2, 1, 4, -3, 7, 0, + 2, 1, 4, -1, 6, 0, + 3, 1, 4, -2, 5, 4, 6, 1, + 2, 1, 2, -4, 4, 2, + 2, 8, 3,-16, 4, 2, + 2, 1, 4, -2, 7, 0, + 3, 3, 3, -5, 4, 2, 5, 0, + 3, 1, 4, 1, 5, -3, 6, 0, + 2, 1, 4, -2, 8, 0, + 2, 1, 4, -1, 7, 0, + 2, 1, 4, -1, 8, 0, + 3, 3, 2, -7, 3, 3, 4, 0, + 3, 2, 2, 1, 3, -7, 4, 0, + 3, 1, 4, 1, 6, -3, 7, 0, + 3, 1, 4, 2, 5, -5, 6, 1, + 3, 4, 3, -7, 4, 3, 5, 1, + 1, 1, 4, 5, + 3, 4, 3, -9, 4, 3, 5, 1, + 3, 1, 4, -2, 5, 5, 6, 0, + 3, 3, 2, -7, 3, 5, 4, 0, + 3, 1, 3, -1, 4, 2, 6, 0, + 3, 1, 4, 1, 5, -2, 6, 0, + 3, 3, 3, -7, 4, 2, 5, 0, + 2, 8, 3,-14, 4, 1, + 2, 1, 2, -2, 4, 1, + 2, 1, 4, 1, 6, 1, + 2, 9, 3,-18, 4, 1, + 2, 2, 2, -5, 4, 1, + 2, 1, 3, -3, 4, 2, + 2, 1, 4, 2, 6, 0, + 2, 1, 4, 1, 5, 1, + 3, 4, 3, -9, 4, 2, 5, 1, + 2, 7, 3,-12, 4, 1, + 2, 2, 4, -5, 5, 0, + 2, 2, 3, -5, 4, 2, + 2, 6, 3,-10, 4, 1, + 2, 1, 4, 2, 5, 1, + 3, 2, 4, -5, 5, 2, 6, 0, + 2, 3, 3, -7, 4, 1, + 2, 2, 4, -4, 5, 0, + 2, 5, 3, -8, 4, 1, + 2, 1, 4, 3, 5, 0, + 3, 2, 4, -4, 5, 2, 6, 0, + 3, 2, 4, -1, 5, -5, 6, 0, + 2, 4, 3, -6, 4, 1, + 2, 2, 4, -3, 5, 0, + 3, 2, 4, -5, 5, 5, 6, 1, + 3, 2, 4, -4, 5, 3, 6, 0, + 2, 3, 3, -4, 4, 1, + 2, 2, 4, -5, 6, 2, + 2, 2, 4, -2, 5, 1, + 3, 2, 4, -4, 5, 5, 6, 1, + 2, 2, 4, -4, 6, 0, + 2, 2, 3, -2, 4, 0, + 2, 2, 4, -3, 6, 1, + 2, 2, 4, -1, 5, 1, + 2, 2, 4, -2, 6, 0, + 1, 1, 3, 1, + 2, 2, 4, -1, 6, 0, + 2, 1, 2, -5, 4, 1, + 2, 8, 3,-17, 4, 1, + 3, 2, 4, 2, 5, -5, 6, 1, + 3, 4, 3, -6, 4, 3, 5, 1, + 3, 10, 3,-17, 4, 3, 6, 0, + 1, 2, 4, 4, + 3, 4, 3,-10, 4, 3, 5, 1, + 2, 8, 3,-13, 4, 0, + 2, 1, 2, -1, 4, 0, + 2, 2, 4, 1, 6, 0, + 2, 2, 2, -4, 4, 0, + 2, 1, 3, -4, 4, 1, + 2, 2, 4, 1, 5, 0, + 2, 7, 3,-11, 4, 0, + 2, 3, 4, -5, 5, 0, + 2, 2, 3, -6, 4, 1, + 2, 6, 3, -9, 4, 0, + 2, 2, 4, 2, 5, 0, + 2, 3, 4, -4, 5, 0, + 2, 5, 3, -7, 4, 0, + 2, 4, 3, -5, 4, 1, + 2, 3, 4, -3, 5, 1, + 2, 3, 3, -3, 4, 0, + 2, 3, 4, -2, 5, 2, + 3, 3, 4, -4, 5, 5, 6, 0, + 2, 2, 3, -1, 4, 0, + 2, 3, 4, -3, 6, 0, + 2, 3, 4, -1, 5, 1, + 2, 3, 4, -2, 6, 0, + 2, 1, 3, 1, 4, 1, + 2, 3, 4, -1, 6, 0, + 3, 4, 3, -5, 4, 3, 5, 0, + 1, 3, 4, 3, + 3, 4, 3,-11, 4, 3, 5, 0, + 1, 1, 2, 0, + 2, 2, 2, -3, 4, 0, + 2, 1, 3, -5, 4, 0, + 2, 4, 4, -5, 5, 0, + 2, 6, 3, -8, 4, 0, + 2, 4, 4, -4, 5, 0, + 2, 5, 3, -6, 4, 0, + 2, 4, 3, -4, 4, 0, + 2, 4, 4, -3, 5, 1, + 3, 6, 3, -8, 4, 2, 5, 0, + 2, 3, 3, -2, 4, 0, + 2, 4, 4, -2, 5, 1, + 2, 4, 4, -1, 5, 0, + 2, 1, 3, 2, 4, 0, + 1, 4, 4, 3, + 2, 2, 2, -2, 4, 0, + 2, 7, 3, -9, 4, 0, + 2, 5, 4, -5, 5, 0, + 2, 6, 3, -7, 4, 0, + 2, 5, 4, -4, 5, 0, + 2, 5, 3, -5, 4, 0, + 2, 5, 4, -3, 5, 0, + 2, 5, 4, -2, 5, 0, + 1, 5, 4, 3, + 1, 6, 4, 2, + 1, 7, 4, 0, + -1 +}; +/* Total terms = 201, small = 199 */ +static struct plantbl FAR mar404 = { + { 0, 5, 12, 24, 9, 7, 3, 2, 0,}, + 5, + marargs, + martabl, + martabb, + martabr, + 1.5303348827100001e+00, +}; + +/* +First date in file = 625296.50 +Number of records = 16731.0 +Days per record = 131.0 + Julian Years Lon Lat Rad + -3000.0 to -2499.7: 0.64 0.09 0.40 + -2499.7 to -1999.7: 0.70 0.09 0.45 + -1999.7 to -1499.7: 0.44 0.08 0.32 + -1499.7 to -999.8: 0.42 0.07 0.32 + -999.8 to -499.8: 0.55 0.06 0.34 + -499.8 to 0.2: 0.43 0.06 0.31 + 0.2 to 500.2: 0.56 0.07 0.32 + 500.2 to 1000.1: 0.49 0.06 0.41 + 1000.1 to 1500.1: 0.48 0.06 0.38 + 1500.1 to 2000.1: 0.56 0.06 0.38 + 2000.1 to 2500.0: 0.63 0.08 0.33 + 2500.0 to 3000.0: 0.70 0.09 0.36 + 3000.0 to 3000.4: 0.526 0.023 0.190 +*/ +static double FAR juptabl[] = { + 153429.13855, 130818.16897, 18120.42948, -8463.12663, + -5058.91447, 1092566021.02148, 123671.25097, + + -5.43364, 12.06012, + + 30428.31077, -74667.61443, 46848.16236, -66373.44474, + 24312.54264, -26045.64766, 18353.92564, -4022.13679, + 4037.97936, 10059.82468, -4622.55896, 1383.21617, + -187.25468, -1171.66028, + + -0.00062, -0.21713, + + -1198.83945, 1178.62445, -1492.07393, 153.07155, + -245.57966, -391.94010, 82.26400, -40.92104, + 3.72520, 10.57242, + + -0.04720, -0.04448, -0.04329, -0.06043, + + -0.03905, 0.15712, + + -0.05644, -0.00129, + + -0.00342, 0.02473, + + 0.00434, -0.01862, + + 0.00431, -0.03993, + + -0.03159, -0.15982, + + -0.09928, 0.04430, -0.00357, 0.31312, + + -0.01346, -0.00180, + + -0.09107, 0.01215, + + 0.02485, 0.01024, + + 27.29869, 2.70896, 12.91956, 19.21726, + -6.91384, 5.12954, -1.07533, -1.71691, + + -0.01423, 0.03121, + + -32.48652, -26.13483, 46.78162, -62.02701, + 94.96809, 81.73791, -20.13673, 131.05065, + + -0.00798, 0.01786, + + 13.99591, 16.87756, -8.51726, 21.59490, + -14.28833, -9.45530, 7.73954, -6.53078, + + 0.03175, -0.04295, + + 3.06742, -0.11838, 1.03630, 0.94004, + -0.14085, 0.14434, + + -0.03363, 0.00993, + + -0.00007, -0.02748, + + 26.01507, -7.37178, 16.96955, 6.24203, + -0.40481, 3.72456, -0.53597, -0.14938, + + 37.82081, 26.15887, -2.82115, 78.26478, + -63.39155, -5.52419, 13.11482, -43.54977, + 15.64940, 6.67505, + + -10.25616, -7.39672, -12.37441, 12.24417, + 8.54922, 9.68451, + + -0.03658, -0.00963, + + 1.65523, 0.43093, 0.32023, 0.71365, + -0.12226, 0.03759, + + 0.10388, 0.47212, -0.02791, 0.09929, + + -0.04116, -0.03125, + + -0.10240, -0.23199, -0.03524, -0.13625, + + 7.52726, 6.86314, 0.01239, 13.46530, + -5.22256, 1.56116, -0.15925, -1.19571, + + 3.26302, 0.06097, -0.14444, -0.20301, + 1.93822, -80.12566, + + 0.98665, -7.52986, 3.86703, -2.43028, + 0.64180, 0.78351, + + 0.00190, -0.00633, + + -0.00321, -0.04403, + + 0.19018, 0.14335, 0.10315, 0.53154, + + -0.00062, -0.00464, + + -0.00109, 0.02150, + + 1.19993, 47.21638, -24.56067, 25.06332, + -7.50751, -6.36250, 1.39443, -1.23806, + + 0.04951, 0.02176, + + 0.02802, -0.01665, + + -0.10698, -0.13635, + + 73.54797, -52.34968, 74.98754, 86.56283, + -69.01463, 44.56866, + + 0.04387, -0.05925, + + -0.03732, -0.03264, + + 0.00967, 0.02143, + + 10.59429, 26.48226, 34.03470, 3.96160, + 4.15919, -20.22616, -5.25903, -3.40177, + + 0.05111, -0.06788, + + 0.06497, 1.21024, -0.29607, 0.49991, + -0.06055, -0.03464, + + 0.02950, 0.16429, + + 0.00722, -0.90806, + + -0.02161, 0.00902, + + -0.00261, 0.00077, + + 0.00434, -0.29231, + + 0.00456, 0.04781, + + 1.33214, -2.62015, 0.79761, -0.81850, + 0.06371, 0.00119, + + 0.03049, -0.03553, 0.02373, -0.01411, + + -189.06132, -169.17940, 5.27464, -227.72664, + 83.72511, -12.04794, 0.23965, 23.75496, + -3.43532, -0.34276, + + -1.35880, 0.45053, -0.34298, -0.11441, + + -0.16328, 0.07423, + + 481.48150, 79.82461, 453.82764, 941.94205, + -635.83924, 397.29087, -81.54066, -417.22420, + 149.91822, 10.53490, + + -0.13210, 0.36740, + + 0.33777, 0.15893, + + -2562.04968, 2442.77844, -2602.66709, 2838.87348, + 723.50715, -1284.58208, -4557.23362, -4514.61100, + -8960.81693, 4663.55087, -4947.61530, 19377.42027, + + -0.16786, -0.19514, + + 0.32100, 0.91502, + + 4.96600, -1.11836, + + 307.38057, 175.14618, 16.02093, 444.42376, + -219.80047, 62.39286, -18.14266, -52.23698, + + 0.02111, 0.00469, + + -20.97409, -34.48296, -2.03906, -27.07560, + 3.73818, -3.00599, 0.24112, 0.41430, + + -0.03552, 0.00394, + + -0.00217, 0.02307, + + 0.03686, 0.00510, + + 34.46537, 10.23293, 9.99520, 28.88781, + -11.31210, 3.52646, -0.48062, -2.93641, + + -0.00987, -0.05310, + + -38.39539, 0.04568, -31.73684, -1.83151, + -24.97332, -1.71244, 0.33498, 7.03899, + -4.15247, 200.43434, + + -0.00800, 0.04462, + + 37.83113, -13.40661, 9.49434, -35.41588, + -14.72767, -3.84674, -0.31412, 3.97734, + + 0.02908, -0.00353, + + 1.89935, -14.31774, 7.77051, -7.08945, + 1.90915, 1.78908, -0.41445, 0.30506, + + -14.43121, 7.30707, -11.97842, -17.64121, + 13.38962, -7.20982, + + -5.23362, 2.11364, -0.45605, 4.08835, + 1.42683, 0.24838, + + -0.00605, 0.03199, + + -0.17609, -1.43091, 0.32444, -0.51371, + 0.06182, 0.03733, + + 0.00696, -0.13438, + + 4.67581, 4.42379, -1.52602, 4.20659, + -1.31757, -0.72910, + + 1.29012, 0.97780, 2.25895, -0.85306, + 1.74120, -5.09507, + + 0.28107, -0.05040, 0.05508, -0.06349, + + -0.00061, 0.48249, + + -2.37749, 1.78180, -1.67423, -0.35618, + 0.05789, -0.35287, + + 0.56252, -0.66584, 0.61979, 4.84016, + -4.64462, 17.48002, + + 0.40982, -4.19214, -1.55252, -1.87505, + -0.31070, 0.15554, + + -0.00034, 0.11102, + + 0.01116, -0.04166, + + 9.27689, -4.32090, 6.84888, 1.78741, + -0.09306, 1.68391, -0.27482, -0.04197, + + -7.83068, 37.71086, -37.53346, 7.18559, + 0.74427, -24.29751, 10.87837, 1.35503, + + 0.00998, -0.03395, + + -133.52206, -150.11329, 4.27494, -173.79469, + 150.87961, -356.29181, -330.17873, -426.29809, + -607.98186, 126.35464, -299.69623, 556.41055, + + -0.00342, 0.04411, + + 44.65946, 42.07312, 85.71397, 5.95130, + 24.98064, -41.20026, -14.05970, -10.46101, + -2.24038, 2.89211, + + 0.06175, 0.08128, 0.00705, 0.01939, + + -1.08361, -0.08213, -0.20868, -0.36268, + + -4.96489, -2.05966, -6.16586, 3.65514, + -3.12555, 12.20821, + + -1.11236, -1.73772, -1.34045, -0.22774, + -0.08639, 0.27355, + + -0.07700, 1.06260, -0.46013, 0.31916, + -0.04969, -0.09488, + + -1.54000, 0.04949, -0.07616, -0.95933, + 0.93303, 3.43183, + + -0.82917, -0.82042, -0.68158, 0.17083, + 0.06942, 0.17491, + + -0.02699, -0.01051, + + 0.00657, 0.03063, + + -0.52595, 0.84035, -0.88323, -0.70188, + 0.60928, -0.48179, + + 0.38290, 0.04482, 0.26456, -0.32369, + + -0.00615, 0.03218, + + -0.32943, 0.14675, -0.10782, -0.09036, + + -0.58003, 0.72888, -0.46654, 1.17977, + + 0.00222, 0.01541, + + -0.19226, -0.07770, -0.01829, -0.05070, + + -1.75385, -1.32969, 0.52361, -1.36036, + 0.67222, 1.34612, + + 6.96841, -29.24025, -23.76900, -39.91647, + -41.01215, -2.23638, -18.81024, 20.77095, + + -0.68592, -2.26212, -1.14065, -0.76493, + -0.18044, 0.15193, + + -0.20669, -0.44387, 0.25697, -0.17880, + + -0.53097, 0.43181, -0.35187, 0.71934, + + -0.14962, 0.09220, -0.05031, -0.03924, + + 0.06571, 0.29487, + + 0.05170, 0.36847, + + 0.02754, -0.00411, + + -0.08313, -0.16907, 0.10273, -0.07315, + + -0.02312, 0.04912, + + -0.01062, -0.02713, + + 0.03806, 0.13401, + + -1.79865, -2.04540, -2.69965, -0.65706, + -1.17916, 0.79292, + + 0.02415, 0.14001, + + -0.01767, 0.04209, + + 0.05212, -0.01795, + + 0.01285, 0.04028, + + 0.01075, 0.05533, + + 0.02323, -0.00864, + + -0.04691, 0.03128, + + 0.00548, 0.02254, + + 0.00011, 0.12033, + +}; +static double FAR juptabb[] = { + 548.59659, 594.29629, 219.97664, 59.71822, + 23.62157, 40.77732, 227.07380, + + 0.00293, -0.00745, + + -307.33226, -347.92807, -309.49383, -428.18929, + -96.59506, -191.36254, 2.11014, -34.44145, + 2.23085, 6.77110, -5.43468, -0.28391, + 0.28355, -1.81690, + + 0.00036, 0.00078, + + -1.83259, 1.17464, -2.66976, -0.92339, + -0.23645, -1.20623, 0.25248, -0.04958, + 0.00064, 0.03599, + + -0.00079, 0.00004, -0.00005, -0.00010, + + -0.00024, 0.00051, + + 0.00001, 0.00005, + + 0.00015, 0.00010, + + 0.00017, -0.00004, + + 0.00113, -0.00011, + + 0.00021, 0.00087, + + 0.00120, -0.00114, -0.00881, -0.00020, + + -0.00005, 0.00009, + + 0.00005, 0.00007, + + 0.00002, -0.00033, + + -0.00554, -0.32274, 0.23695, -0.11184, + 0.04050, 0.09929, -0.02189, 0.00305, + + -0.00142, -0.00055, + + 0.66623, 0.34590, 0.74913, -0.23202, + -1.08316, -1.40407, 1.72287, -0.07604, + + 0.00024, 0.00004, + + 0.03592, 0.91143, -1.11848, -0.17473, + 0.91500, -1.34912, 0.85229, 0.69029, + + -0.00019, 0.00075, + + 0.03615, 0.30768, -0.08733, 0.12016, + -0.01716, -0.01138, + + 0.00021, 0.00004, + + 0.00531, 0.00098, + + -0.14354, -0.02364, -0.05559, -0.07561, + 0.01419, -0.01141, 0.00014, 0.00218, + + -0.36564, 0.13498, -0.13283, -0.11462, + 0.23741, 0.14960, -0.23173, 0.25148, + 0.00763, -0.05987, + + -0.00857, 0.20312, -0.29399, 0.34831, + -1.33166, -0.46808, + + -0.00027, 0.00046, + + 0.15729, 0.01367, 0.04093, 0.07447, + -0.01598, 0.00785, + + 0.00583, 0.00324, 0.00053, 0.00160, + + -0.00030, 0.00043, + + -0.00208, 0.00334, -0.00316, 0.00136, + + 0.23086, 0.05711, 0.19558, 0.05897, + 0.01070, 0.05021, -0.00818, -0.02242, + + 0.06301, -0.26483, 0.66177, 0.02125, + 0.13477, 0.19376, + + -0.36520, 0.83588, -0.69848, -0.00877, + 0.01626, -0.23878, + + -0.00373, 0.00044, + + 0.00008, -0.00004, + + -0.00374, -0.00283, 0.01104, -0.00619, + + 0.00004, 0.00015, + + 0.00026, 0.00013, + + 0.04630, -0.11815, 0.00773, 0.03796, + -0.05172, 0.00149, 0.00444, -0.01493, + + -0.00064, -0.00044, + + -0.00033, 0.00002, + + -0.00012, 0.00284, + + -0.15622, -0.92158, -0.82690, -1.52101, + -0.55934, 0.69375, + + -0.00171, 0.00031, + + 0.00129, -0.00013, + + -0.00024, -0.00083, + + 0.66101, -0.21764, -0.43967, 0.30157, + 0.53389, 1.59141, 1.94286, 0.14146, + + -0.00064, -0.00006, + + 0.21850, -0.02912, 0.08594, 0.08734, + -0.01678, 0.01629, + + 0.00133, 0.00562, + + 0.00128, -0.00025, + + -0.00005, 0.00027, + + 0.00032, 0.00001, + + 0.00037, 0.00042, + + 0.00070, 0.00003, + + 0.00275, -0.13096, 0.02329, -0.05582, + 0.00405, -0.00251, + + 0.01316, -0.01165, 0.00279, -0.00374, + + -39.62783, 20.91467, -28.97236, 3.77560, + -3.30029, 0.11472, -0.48216, 1.05814, + -0.21607, -0.03055, + + -0.64162, -0.57355, -0.05861, -0.18592, + + -0.12207, -0.06279, + + -38.55325, -125.74207, -47.22357, 41.75842, + -119.38841, 18.88515, -11.04830, -50.98851, + 16.64895, 1.76553, + + 0.09474, 0.03714, + + 0.02593, 0.07967, + + -1187.61854, -1094.91786, -1011.21939, -1102.25998, + -575.88672, -107.84860, -890.58889, -807.06589, + 971.78461, -1287.24560, -4601.44669, -849.54329, + + -0.00904, 0.06233, + + -0.19456, -0.05521, + + -0.36915, 1.15363, + + 32.64763, -85.19705, 114.34437, -13.37747, + 15.92865, 55.84857, -13.10538, 3.07629, + + -0.00327, 0.00104, + + -7.81035, 6.19960, -6.36096, 1.00493, + -0.66971, -0.84572, 0.09943, -0.04583, + + 0.00200, -0.00032, + + -0.00265, 0.00047, + + -0.00053, 0.00046, + + -0.24396, 0.20664, -0.30820, -0.04917, + 0.06184, -0.12642, 0.03053, 0.05054, + + 0.00035, 0.00012, + + 0.42063, -0.58254, 0.90517, -0.66276, + 0.64765, 0.39338, -1.40645, 0.33017, + -1.43377, -0.67089, + + -0.00045, -0.00036, + + 0.23690, 0.07185, 0.28386, -0.04397, + 0.02836, -0.13082, -0.00978, 0.00108, + + 0.00046, 0.00083, + + -0.01665, 0.32499, -0.09980, 0.18611, + -0.02561, 0.00239, -0.00084, -0.00110, + + 0.46854, -0.35113, 0.69908, 0.53244, + 0.12875, 0.01115, + + 0.13930, 0.02747, -0.10587, -0.17759, + -0.26850, 0.04400, + + 0.00010, -0.00015, + + 0.00164, -0.01308, 0.00488, -0.01046, + 0.00170, 0.00024, + + 0.00084, 0.00014, + + -0.08481, -0.02547, -0.02290, -0.02281, + -0.03946, -0.02810, + + 0.01298, 0.08658, 0.05575, -0.01081, + 1.09695, 0.35441, + + -0.03127, 0.07946, 0.01245, 0.02578, + + -0.00524, -0.00027, + + 0.08217, -0.31742, 0.15273, -0.07804, + 0.01197, 0.03053, + + 0.81596, 0.38640, -0.89777, 0.59499, + -0.39581, -0.87375, + + 0.02096, 0.49772, 0.29986, 0.24210, + 0.14038, -0.03016, + + -0.00208, 0.00045, + + 0.01024, 0.00114, + + 1.23010, 1.75663, -0.12741, 1.44996, + -0.31607, 0.03151, 0.00259, -0.04741, + + -11.57091, 8.00331, -9.24028, -6.36906, + 4.71248, -2.43695, 0.38630, 1.90625, + + 0.01401, 0.00114, + + 33.56690, -55.17784, 33.21425, -52.57002, + 27.04138, 13.78610, 69.60307, -81.16312, + 27.53960, -158.28336, -205.94418, -95.08051, + + -0.01407, -0.00364, + + -18.56128, 6.02270, -10.11059, 24.69471, + 12.31878, 9.94393, 3.81994, -4.84109, + -1.08440, -0.72136, + + 0.03731, -0.02094, 0.00789, -0.00176, + + 0.09673, -0.11181, 0.03112, -0.00065, + + -0.29167, -0.82083, 0.40866, -0.77487, + -2.23349, -0.46973, + + 0.41024, -0.14274, 0.07755, -0.24895, + -0.04965, -0.01197, + + -0.02264, 0.05917, -0.02817, 0.01242, + -0.00250, -0.00247, + + -0.14414, -0.03739, 0.14708, -0.07908, + 0.05843, 0.15173, + + -0.01601, -0.07844, -0.05957, -0.03143, + -0.01830, 0.01257, + + -0.00109, -0.00000, + + 0.00174, 0.00050, + + -0.02119, 0.06918, -0.02470, 0.00185, + 0.02372, -0.02417, + + 0.01081, 0.05222, 0.09820, 0.05931, + + -0.00588, -0.00086, + + 0.01688, -0.00133, -0.00073, 0.00041, + + -0.02280, -0.05706, -0.17694, -0.12027, + + 0.00196, -0.00060, + + 0.00051, -0.02426, 0.00314, -0.00302, + + 0.17923, -0.78343, 0.52073, -0.02398, + -0.03978, 0.20841, + + 6.51325, 3.37139, 12.88844, -6.72098, + 3.40949, -14.34313, -9.68278, -7.85143, + + 1.06886, -0.21727, 0.36675, -0.49815, + -0.07289, -0.07537, + + 0.01107, -0.00644, 0.01013, -0.00306, + + -0.00708, -0.13488, -0.23041, -0.10698, + + -0.00049, -0.00692, -0.00142, -0.00211, + + -0.04021, 0.01805, + + 0.00479, 0.00620, + + 0.00739, 0.00566, + + -0.00101, -0.00022, 0.00261, -0.00188, + + -0.01812, -0.01205, + + -0.00061, -0.00061, + + -0.02479, 0.01157, + + 0.91642, -0.65781, 0.39969, -1.13699, + -0.43337, -0.57828, + + 0.00145, 0.00281, + + -0.01675, -0.00975, + + 0.00119, -0.00074, + + -0.00343, 0.00139, + + 0.00061, 0.00086, + + 0.00054, -0.00046, + + -0.01996, -0.02689, + + 0.00034, 0.00037, + + -0.00006, 0.00001, + +}; +static double FAR juptabr[] = { + -734.58857, -1081.04460, -551.65750, -148.79782, + -25.23171, 164.64781, 248.64813, + + -0.05163, -0.02413, + + -1306.61004, 560.02437, -1622.58047, 589.92513, + -812.39674, 166.85340, -157.92826, -107.14755, + 68.98900, -18.95875, -0.16183, 36.24345, + -9.19972, -2.29315, + + -0.00316, 0.00222, + + 10.95234, 21.37177, -6.29550, 21.83656, + -7.70755, 1.38228, -0.21770, -1.49525, + 0.17951, 0.01043, + + 0.00062, 0.00208, -0.00066, 0.00050, + + 0.00313, 0.00187, + + 0.00010, 0.00131, + + 0.00102, 0.00047, + + 0.00102, 0.00012, + + 0.00012, -0.00037, + + 0.00808, 0.00027, + + -0.01219, -0.00961, -0.04166, -0.00327, + + -0.00001, -0.00146, + + -0.00092, -0.00989, + + -0.00135, 0.00196, + + 0.19216, 2.48442, -1.43599, 1.39651, + -0.48549, -0.53272, 0.14066, -0.10352, + + 0.00141, 0.00066, + + 2.96838, -3.09575, 6.27741, 5.24306, + -8.77080, 9.03247, -10.98350, -3.58579, + + -0.00168, -0.00100, + + 0.20234, -0.75737, 0.36838, -0.58241, + 0.41430, -0.35784, 0.47038, -0.10586, + + 0.00539, 0.00490, + + -0.01375, -0.01950, 0.00145, 0.00723, + -0.00391, 0.00391, + + -0.00131, -0.00568, + + 0.01317, 0.00319, + + 1.31006, 5.89394, -1.61753, 3.68814, + -0.80644, -0.14747, 0.04481, -0.11361, + + -4.36130, 7.92488, -16.29047, -1.52163, + 2.14492, -14.38028, 9.65573, 3.56881, + -1.87208, 3.36213, + + 1.84499, -2.41575, -2.77076, -3.23915, + -3.34573, 1.40979, + + 0.00217, -0.00841, + + 0.29313, -0.36246, 0.22043, 0.02328, + -0.01182, 0.04074, + + -0.15728, 0.02468, -0.03185, -0.01099, + + 0.01059, -0.01274, + + 0.07362, -0.02642, 0.04035, -0.00968, + + -2.14457, 2.53297, -4.34196, -0.11421, + -0.38757, -1.73872, 0.39784, -0.01397, + + -0.03311, 0.97723, 0.16060, -0.07486, + 25.96413, 0.75088, + + -3.04736, 0.30340, -1.43451, -1.35136, + 0.26526, -0.40247, + + -0.00460, -0.00056, + + 0.01633, -0.00128, + + -0.05197, 0.07002, -0.19450, 0.03737, + + 0.00188, -0.00037, + + -0.00903, -0.00059, + + -19.73809, 0.58424, -10.42034, -10.14579, + 2.65990, -3.07889, 0.50884, 0.58508, + + -0.00970, 0.02099, + + 0.00716, 0.01161, + + 0.05751, -0.04515, + + 22.08042, 30.82415, -36.27430, 31.40265, + -18.30150, -29.16403, + + 0.02454, 0.01834, + + -0.01312, 0.01576, + + -0.00928, 0.00330, + + -11.78094, 4.06738, -2.51590, 15.05277, + 9.12747, 2.88088, 2.32916, -2.08271, + + 0.02872, 0.02194, + + 0.60494, -0.04597, 0.24749, 0.15971, + -0.02185, 0.03384, + + -0.07075, 0.01287, + + 0.40201, 0.00347, + + -0.00410, -0.00998, + + -0.00005, -0.00121, + + 0.13770, 0.00186, + + -0.02268, 0.00210, + + 1.26291, 0.65546, 0.38885, 0.38880, + -0.00184, 0.03067, + + 0.01273, 0.01136, 0.00557, 0.01117, + + 94.13171, -88.37882, 120.53292, 8.32903, + 7.77313, 43.46523, -11.66698, 0.44639, + 0.15092, -1.68367, + + -0.30833, -0.49030, 0.01971, -0.14144, + + -0.04019, -0.05110, + + -39.70024, 272.91667, -468.46263, 256.77696, + -200.63130, -307.98554, 206.56301, -41.76039, + -4.74242, 74.19909, + + 0.18474, 0.05547, + + -0.06732, 0.16515, + + -1156.31285, -1102.97666, -1346.99288, -1121.01090, + 666.84550, 421.92305, 2259.49740, -2268.69758, + -2325.87639, -4476.46256, -9683.77583, -2472.92565, + + -0.10400, 0.08075, + + -0.45225, 0.16621, + + 0.57789, 2.43804, + + 85.21675, -154.17208, 219.91042, -9.71116, + 31.13240, 108.60117, -25.85622, 8.98402, + + -0.00233, 0.01030, + + -17.01324, 10.41588, -13.34449, 1.08782, + -1.48199, -1.81734, 0.20334, -0.11734, + + -0.00230, -0.01869, + + -0.01182, -0.00129, + + -0.00281, 0.02021, + + -5.75973, 19.13309, -16.13690, 5.53382, + -1.96585, -6.29211, 1.63105, -0.26089, + + 0.02935, -0.00555, + + 0.30700, -19.96182, 0.99825, -16.32664, + 0.83052, -13.76201, -3.15609, 0.17360, + -111.81423, -2.05419, + + -0.02455, -0.00478, + + 7.45114, 21.53296, 19.90263, 5.69420, + 2.31253, -8.15116, -2.17440, -0.23014, + + 0.00168, 0.01590, + + 8.78005, 0.71418, 4.48561, 4.50680, + -1.05713, 1.17880, -0.19327, -0.24877, + + -5.00870, -8.66354, 10.51902, -7.71011, + 4.65486, 8.05673, + + -1.39635, -3.07669, -2.40347, -0.11167, + -0.04064, 0.83512, + + -0.02041, -0.00351, + + 0.97375, -0.15795, 0.36361, 0.19913, + -0.02142, 0.04193, + + 0.08801, 0.00475, + + -2.81010, 3.11341, -2.79191, -0.93313, + 0.44570, -0.88287, + + -0.51815, 0.54776, 0.29736, 0.99779, + 2.28957, 0.82183, + + 0.03386, 0.12855, 0.03124, 0.02454, + + -0.31958, 0.00070, + + -1.48184, -1.28195, 0.03965, -1.12026, + 0.23910, 0.01293, + + 0.36146, -0.64483, -1.88470, 0.21469, + -11.79819, -1.87287, + + 2.65699, -0.36287, 0.88148, -1.26883, + -0.19657, -0.14279, + + -0.07536, -0.00004, + + 0.01496, 0.00537, + + 2.48352, 3.75581, -0.34909, 3.26696, + -0.82105, 0.11287, -0.00755, -0.13764, + + -15.34429, -2.79957, -3.22976, -15.46084, + 10.66793, -0.26054, -0.12188, 5.06211, + + 0.01313, 0.00424, + + 84.34332, -57.05646, 92.68150, -0.02024, + 149.62698, 59.14407, 174.04569, -129.26785, + -55.99789, -238.01484, -212.51618, -115.94914, + + -0.01720, -0.00158, + + -13.65602, 17.47396, 0.16714, 32.66367, + 16.30095, 9.18345, 3.98555, -5.39985, + -1.09958, -0.86072, + + 0.02752, -0.02474, 0.00671, -0.00278, + + -0.21030, -0.73658, 0.20708, -0.21378, + + 0.78462, -2.14051, -1.60070, -2.60915, + -5.02441, -1.19246, + + 0.67622, -0.41889, 0.07430, -0.53204, + -0.11214, -0.03417, + + -0.72636, -0.15535, -0.16815, -0.35603, + 0.07530, -0.02521, + + -0.01261, -0.94883, 0.39930, -0.05370, + -2.77309, 0.38431, + + 0.72127, -0.52030, -0.01804, -0.51188, + -0.11993, 0.02189, + + 0.00928, -0.02129, + + -0.02760, 0.00441, + + -0.56832, -0.48114, 0.64192, -0.65656, + 0.37483, 0.51883, + + -0.08474, 0.20324, 0.12783, 0.13041, + + -0.01545, -0.00282, + + -0.16196, -0.26980, 0.06584, -0.09987, + + -0.36305, -0.27610, -0.57074, -0.13607, + + -0.00824, 0.00369, + + 0.06094, -0.12214, 0.03581, -0.00876, + + 0.49346, -0.74596, 0.47814, 0.18201, + -1.00640, 0.24465, + + 10.09808, 2.30496, 13.63359, -7.94007, + 0.29792, -13.55724, -6.48556, -5.99581, + + 0.69686, -0.22434, 0.23198, -0.35579, + -0.04736, -0.05683, + + 0.36710, -0.16571, 0.14876, 0.21824, + + -0.18940, -0.15063, -0.23692, -0.09990, + + -0.08923, -0.12222, 0.02998, -0.04560, + + -0.16229, 0.04552, + + -0.33051, 0.02585, + + -0.00622, 0.01583, + + 0.15436, -0.07109, 0.06429, 0.09218, + + -0.01277, -0.00019, + + 0.02345, -0.01057, + + -0.07294, 0.02506, + + 0.62063, -0.52533, 0.16814, -0.77168, + -0.20614, -0.31828, + + -0.12856, 0.01316, + + -0.01522, -0.00126, + + 0.01558, 0.04765, + + -0.02776, 0.01166, + + -0.05185, 0.00674, + + 0.00754, 0.02183, + + -0.00645, -0.01050, + + -0.02155, 0.00375, + + 0.12040, -0.00004, + +}; + +static signed char FAR jupargs[] = { + 0, 6, + 3, 2, 5, -6, 6, 3, 7, 0, + 2, 2, 5, -5, 6, 6, + 3, 1, 5, -2, 6, -3, 8, 0, + 2, 4, 5,-10, 6, 4, + 3, 2, 5, -4, 6, -3, 7, 1, + 3, 3, 5,-10, 6, 7, 7, 0, + 2, 6, 5,-15, 6, 0, + 3, 1, 5, -4, 6, 4, 7, 0, + 3, 3, 5, -8, 6, 2, 7, 0, + 3, 1, 5, -3, 6, 1, 7, 0, + 3, 1, 5, -3, 6, 2, 7, 0, + 1, 1, 7, 1, + 2, 5, 5,-12, 6, 0, + 3, 2, 5, -7, 6, 7, 7, 0, + 3, 1, 5, -1, 6, -3, 7, 0, + 2, 3, 5, -7, 6, 3, + 3, 1, 5, -4, 6, 3, 7, 0, + 2, 1, 5, -2, 6, 3, + 3, 3, 5, -8, 6, 3, 7, 0, + 2, 1, 5, -3, 6, 3, + 3, 1, 5, -3, 6, 3, 7, 0, + 2, 3, 5, -8, 6, 2, + 3, 2, 5, -5, 6, 2, 7, 0, + 1, 2, 7, 0, + 2, 4, 5, -9, 6, 3, + 2, 2, 5, -4, 6, 4, + 1, 1, 6, 2, + 3, 2, 5, -5, 6, 3, 7, 0, + 2, 2, 5, -6, 6, 2, + 2, 5, 5,-11, 6, 1, + 3, 1, 5, -2, 7, -2, 8, 0, + 2, 1, 5, -3, 7, 1, + 2, 3, 5, -6, 6, 3, + 2, 1, 5, -1, 6, 2, + 2, 1, 5, -4, 6, 2, + 2, 3, 5, -9, 6, 0, + 3, 2, 5, -4, 6, 2, 7, 0, + 2, 1, 5, -2, 7, 1, + 2, 6, 5,-13, 6, 0, + 3, 2, 5, -2, 6, -3, 7, 0, + 2, 4, 5, -8, 6, 3, + 2, 3, 6, -3, 7, 0, + 3, 6, 5,-14, 6, 3, 7, 0, + 3, 1, 5, -2, 7, 1, 8, 0, + 2, 2, 5, -3, 6, 2, + 3, 1, 5, -4, 7, 5, 8, 0, + 3, 2, 5, -8, 6, 3, 7, 0, + 3, 4, 5, -9, 6, 3, 7, 0, + 1, 2, 6, 3, + 3, 2, 5, -4, 6, 3, 7, 0, + 2, 2, 5, -7, 6, 2, + 2, 1, 5, -2, 8, 0, + 2, 1, 5, -1, 7, 0, + 3, 3, 5, -6, 6, 2, 7, 0, + 3, 4, 5, -8, 6, 2, 8, 0, + 2, 1, 5, -1, 8, 0, + 3, 2, 5, -3, 6, 1, 7, 0, + 2, 7, 5,-15, 6, 2, + 3, 3, 5, -4, 6, -3, 7, 1, + 2, 5, 5,-10, 6, 4, + 3, 1, 5, 1, 6, -3, 7, 1, + 3, 7, 5,-16, 6, 3, 7, 0, + 2, 3, 5, -5, 6, 4, + 3, 1, 5, -6, 6, 3, 7, 0, + 3, 5, 5,-11, 6, 3, 7, 0, + 1, 1, 5, 5, + 3, 3, 5,-11, 6, 3, 7, 0, + 3, 3, 5, -6, 6, 3, 7, 0, + 2, 2, 5, -7, 7, 0, + 2, 1, 5, -5, 6, 3, + 3, 1, 5, -1, 6, 3, 7, 0, + 2, 3, 5,-10, 6, 3, + 3, 2, 5, -3, 6, 2, 7, 0, + 2, 1, 5, 1, 7, 0, + 3, 2, 5, -1, 6, -3, 7, 0, + 2, 4, 5, -7, 6, 3, + 2, 4, 6, -3, 7, 0, + 2, 2, 5, -2, 6, 4, + 3, 4, 5, -8, 6, 3, 7, 0, + 1, 3, 6, 3, + 3, 2, 5, -3, 6, 3, 7, 0, + 2, 5, 5, -9, 6, 3, + 2, 3, 5, -4, 6, 2, + 2, 1, 5, 1, 6, 2, + 2, 2, 5, -4, 7, 0, + 2, 6, 5,-11, 6, 2, + 2, 2, 5, -3, 7, 0, + 2, 4, 5, -6, 6, 2, + 2, 2, 5, -1, 6, 2, + 1, 4, 6, 1, + 2, 2, 5, -2, 7, 0, + 2, 5, 5, -8, 6, 2, + 2, 3, 5, -3, 6, 2, + 2, 1, 5, 2, 6, 2, + 2, 2, 5, -2, 8, 0, + 2, 2, 5, -1, 7, 0, + 2, 6, 5,-10, 6, 3, + 2, 4, 5, -5, 6, 3, + 2, 6, 6, -3, 7, 0, + 1, 2, 5, 5, + 3, 4, 5, -6, 6, 3, 7, 0, + 1, 5, 6, 4, + 2, 2, 5,-10, 6, 1, + 2, 5, 5, -7, 6, 1, + 2, 3, 5, -2, 6, 2, + 2, 1, 5, 3, 6, 2, + 2, 6, 5, -9, 6, 2, + 2, 4, 5, -4, 6, 2, + 2, 2, 5, 1, 6, 2, + 2, 7, 5,-11, 6, 0, + 2, 3, 5, -3, 7, 0, + 2, 5, 5, -6, 6, 2, + 2, 3, 5, -1, 6, 1, + 2, 3, 5, -2, 7, 0, + 2, 6, 5, -8, 6, 1, + 2, 4, 5, -3, 6, 1, + 2, 2, 5, 2, 6, 0, + 2, 7, 5,-10, 6, 1, + 2, 5, 5, -5, 6, 2, + 1, 3, 5, 3, + 2, 1, 5, 5, 6, 2, + 2, 6, 5, -7, 6, 1, + 2, 4, 5, -2, 6, 1, + 2, 7, 5, -9, 6, 1, + 2, 5, 5, -4, 6, 0, + 2, 6, 5, -6, 6, 0, + 2, 4, 5, -1, 6, 0, + 2, 7, 5, -8, 6, 1, + 2, 5, 5, -3, 6, 0, + 2, 8, 5,-10, 6, 0, + 2, 6, 5, -5, 6, 0, + 1, 4, 5, 2, + 2, 7, 5, -7, 6, 0, + 2, 5, 5, -2, 6, 0, + 2, 8, 5, -9, 6, 0, + 2, 7, 5, -6, 6, 0, + 2, 8, 5, -8, 6, 0, + 2, 9, 5,-10, 6, 0, + 1, 5, 5, 0, + 2, 9, 5, -9, 6, 0, + 2, 1, 3, -1, 5, 0, + -1 +}; +/* Total terms = 142, small = 140 */ +static struct plantbl FAR jup404 = { + { 0, 0, 1, 0, 9, 16, 7, 5, 0,}, + 6, + jupargs, + juptabl, + juptabb, + juptabr, + 5.2026032092000003e+00, +}; + +/* +First date in file = 625296.50 +Number of records = 16731.0 +Days per record = 131.0 + Julian Years Lon Lat Rad + -3000.0 to -2499.7: 0.78 0.26 0.55 + -2499.7 to -1999.7: 0.66 0.19 0.57 + -1999.7 to -1499.7: 0.62 0.19 0.53 + -1499.7 to -999.8: 0.79 0.17 0.61 + -999.8 to -499.8: 0.78 0.15 0.42 + -499.8 to 0.2: 0.75 0.19 0.52 + 0.2 to 500.2: 0.62 0.18 0.41 + 500.2 to 1000.1: 0.56 0.13 0.54 + 1000.1 to 1500.1: 0.53 0.15 0.41 + 1500.1 to 2000.1: 0.51 0.15 0.49 + 2000.1 to 2500.0: 0.52 0.13 0.41 + 2500.0 to 3000.0: 0.63 0.22 0.53 + 3000.0 to 3000.4: 0.047 0.073 0.086 +*/ +static double FAR sattabl[] = { + 1788381.26240, 2460423.68044, 1370113.15868, 415406.99187, + 72040.39885, 12669.58806, 439960754.85333, 180256.80433, + + 18.71177, -40.37092, + + 66531.01889, -195702.70142, 57188.02694, -179110.60982, + -19803.06520, -58084.15705, -9055.13344, -31146.10779, + 11245.43286, -3247.59575, 459.48670, 2912.82402, + + -4.06749, -13.53763, + + -30.55598, -4.51172, + + 1.48832, 0.37139, + + 597.35433, 1193.44545, -297.50957, 976.38608, + -263.26842, 34.84354, -6.77785, -29.92106, + + -0.16325, -0.18346, + + -0.15364, -0.08227, + + 0.20180, 0.02244, + + 0.04672, -0.29867, + + -0.04143, -0.00760, + + -0.17046, -0.00778, + + 0.04200, 0.23937, -0.00098, -0.05236, + + -0.02749, -0.01813, + + 0.00637, 0.01256, + + -0.04506, 0.04448, + + -0.00105, 0.06224, + + 0.01157, 0.17057, -0.03214, 0.18178, + + -0.22059, -0.01472, + + -0.24213, 0.04309, 0.03436, 0.44873, + + 0.01350, -0.01931, + + -0.80618, -0.56864, 0.29223, -0.03101, + + 0.04171, 0.02264, + + -0.01264, -0.01645, + + 0.01774, 0.06374, + + -0.01925, -0.03552, + + 0.10473, -0.04119, + + 0.08045, 0.04635, + + -3.01112, -9.26158, 8.13745, 1.88838, + + -0.15184, 0.16898, + + -0.22091, 0.29070, -0.03259, 0.06938, + + -0.08499, -0.21688, 0.01848, -0.05594, + + 0.50100, -0.00027, 0.13300, 0.12055, + + 0.03039, 0.03854, + + -1.55287, 2.55618, -0.45497, -0.29895, + -0.93268, 0.83518, + + -0.32785, 7.03878, -1.66649, 2.75564, + -0.29459, 0.01050, + + 0.08293, -0.03161, + + -0.12750, -0.04359, + + 0.04217, 0.07480, + + -114.43467, 49.47867, -66.52340, -26.27841, + 15.48190, -13.06589, 3.28365, 5.02286, + + -0.17155, -0.07404, + + 0.00924, -0.07407, + + -0.02922, 0.06184, + + 108.04882, 86.09791, -155.12793, 208.10044, + -311.72810, -268.92703, 74.57561, -420.03057, + + -0.07893, 0.09246, + + -0.66033, -0.39026, -0.13816, -0.08490, + + -36.79241, -78.88254, 71.88167, -68.05297, + 51.71616, 65.77970, -43.59328, 23.51076, + + -0.02029, -0.32943, + + -8.82754, 1.48646, -3.12794, 2.12866, + -0.06926, 0.44979, + + 0.00621, -0.51720, + + -3.82964, -1.48596, -0.11277, -3.21677, + 0.81705, -0.19487, + + -0.06195, 0.10005, -0.02208, 0.00108, + + 0.00455, -0.03825, + + 0.01217, -0.00599, + + -0.17479, -0.47290, 0.85469, 1.12548, + -0.80648, -0.44134, + + -0.01559, -0.07061, + + 0.01268, -0.01773, + + 0.01308, -0.03461, + + -0.71114, 1.97680, -0.78306, -0.23052, + 0.94475, -0.10743, + + 0.18252, -8.03174, + + 0.00734, 0.04779, + + 0.12334, -0.03513, + + 0.01341, 0.02461, + + 0.02047, -0.03454, + + 0.02169, -0.01921, + + -1.12789, 0.09304, 0.14585, 0.36365, + + 0.03702, 0.10661, -0.00464, -1.72706, + + -0.00769, -0.04635, + + -0.01157, 0.00099, + + 10.92646, 1.96174, 2.91142, 4.74585, + -0.29832, 0.75543, + + 0.05411, 1.05850, + + 0.38846, -0.16265, + + 1.52209, 0.12185, 0.18650, 0.35535, + + -278.33587, -82.58648, -160.00093, -225.55776, + 35.17458, -77.56672, 10.61975, 3.33907, + + 0.06090, 2.17429, + + -4.32981, -5.84246, 11.43116, 20.61395, + + -0.65772, 1.28796, + + 1224.46687, -3113.15508, 3798.33409, -137.28735, + -256.89302, 2227.35649, -779.78215, -260.37372, + + 11.73617, -13.25050, -0.75248, -2.87527, + + -8.38102, 17.21321, + + -61784.69616, 39475.02257, -54086.68308, 54550.85490, + -16403.69351, 29602.70098, 14672.06363, 16234.17489, + 15702.37109, -22086.30300, -22889.89844, -1245.88352, + + 1.48864, 19.75000, 0.78646, 3.29343, + + -1058.13125, 4095.02368, -2793.78506, 1381.93282, + -409.19381, -772.54270, 161.67509, -34.15910, + + -514.27437, 27.34222, -311.04046, 48.01030, + -43.36486, 16.19535, -0.73816, -0.81422, + + 287.32231, -110.44135, 200.43610, 37.98170, + 17.73719, 34.40023, -2.46337, 1.48125, + + 0.09042, -0.11788, + + 0.37284, 0.51725, 0.00597, 0.14590, + + -0.01536, 0.00980, + + 0.00721, 0.02023, + + 0.00027, 0.02451, + + -0.72448, -0.71371, 0.29322, 0.18359, + + 0.72719, -0.37154, 0.14854, -0.02530, + + 0.23052, 0.04258, + + 4.82082, 0.01885, 3.11279, -0.63338, + 0.10559, -0.02146, + + -0.01672, 0.03412, + + 0.00605, 0.06415, + + -0.89085, 1.51929, -0.36571, 0.39317, + + 12.05250, -3.79392, 3.96557, -3.51272, + -0.17953, 12.30669, + + -0.05083, -0.11442, + + 0.02013, -0.02837, + + -0.02087, -0.01599, + + 0.49190, 0.30360, 0.01316, 0.17649, + + 0.21193, -0.09149, -0.07173, -0.05707, + + 4.24196, -1.25155, 1.81336, 0.68887, + -0.01675, 0.20772, + + -0.04117, -0.03531, + + -0.02690, -0.02766, + + 37.54264, 10.95327, 8.05610, 30.58210, + -12.68257, 1.72831, 0.13466, -3.27007, + + 0.01864, -0.00595, + + 0.03676, 0.14857, -0.07223, 0.06179, + + 0.44878, -1.64901, -20.06001, 0.63384, + -4.97849, 4.78627, 29.87370, 7.29899, + + 0.00047, -0.00155, + + 0.00314, 0.01425, + + -0.17842, -0.08461, + + -1.61020, -8.47710, 6.85048, -4.38196, + 1.05809, 2.68088, + + -0.01027, -0.00833, + + 0.06834, -0.04205, + + 0.03330, -0.01271, + + 0.01301, -0.01358, + + 0.03537, 0.03612, 0.02962, 0.62471, + -0.30400, -0.64857, + + 0.01773, 0.01890, + + 0.01426, -0.00226, + + -0.50957, -0.01955, -0.09702, 1.09983, + + 0.64387, -0.02755, + + 0.26604, 0.30684, 0.06354, 0.05114, + + -0.00058, -0.04672, + + -0.00828, 0.00712, + + -0.00440, 0.00029, + + -0.01601, 0.03566, + + 0.13398, -0.02666, + + -0.06752, -0.43044, 0.07172, -0.01999, + + -0.01761, -0.05357, + + 0.06104, 0.29742, -0.08785, 0.05241, + + -6.57162, -4.20103, 0.03199, -6.46187, + 1.32846, -0.51137, + + 0.06358, 0.37309, + + -1.46946, 2.34981, + + -0.18712, 0.11618, + + 240.62965, -107.21962, 219.81977, 84.04246, + -62.22931, 68.35902, -9.48460, -32.62906, + + 5.57483, -1.82396, 1.00095, -0.39774, + + 7.87054, 11.45449, + + -432.67155, 55064.72398, 12444.62359, 54215.28871, + 8486.03749, 12297.48243, -333.27968, 1147.93192, + 1403.73797, 990.40885, -3.84938, -722.43963, + + 16.83276, 96.48787, 7.04834, 38.22208, + 0.63843, 2.61007, + + 230.73221, 171.64166, 1.96751, 287.80846, + -85.21762, 31.33649, -2.25739, -11.28441, + + 0.04699, 0.06555, + + -0.08887, 1.70919, 0.09477, 0.26291, + + -0.15490, 0.16009, + + 1.93274, 1.01953, 0.36380, 1.29582, + -0.13911, 0.14169, + + -0.00491, -0.00030, + + -0.08908, -0.10216, + + -0.03265, -0.03889, + + 0.40413, -1.12715, -0.94687, -0.04514, + + 0.02487, -0.01048, + + 0.39729, 2.82305, -0.61100, 1.11728, + -0.13083, -0.04965, + + -0.00602, -0.02952, + + -6.13507, 13.73998, -15.70559, -1.28059, + 2.64422, -9.33798, 3.26470, 1.56984, + + -0.00572, 0.09992, + + -8.80458, -8.23890, -11.51628, 9.47904, + 11.31646, 4.29587, + + -2.41367, -0.05883, -0.80022, -1.02706, + 0.21461, -0.06864, + + 0.01882, 0.01798, + + 0.27614, -0.01007, 0.04362, 0.07560, + 0.05519, 0.23435, + + -0.09389, 0.01613, + + 0.01298, 0.04691, + + -0.02665, -0.03582, + + 0.60080, -4.28673, 1.87316, -1.05840, + 0.13248, 0.40887, + + -0.67657, 0.67732, 0.05522, 0.07812, + -0.17707, -0.07510, + + 0.24885, 10.63974, -7.40226, -2.33827, + 2.75463, -32.51518, + + 0.05140, 0.01555, + + 180.43808, 263.28252, 384.50646, -76.53434, + -93.50706, -220.50123, -81.91610, 103.92061, + 30.90305, -2.89292, + + -0.06634, -0.37717, -0.01945, -0.05936, + + 29.27877, -59.73705, 35.86569, -18.36556, + 3.88812, 4.82090, -0.70903, 0.06615, + + 0.01558, -0.01854, + + 0.16209, 0.12682, 0.02508, 0.02406, + + -0.03078, -0.01737, -0.00033, -0.00020, + + 0.01023, 0.05972, + + -0.03373, -0.07289, + + -2.08162, -0.14717, -0.64233, -0.75397, + 0.11752, -0.09202, + + 4.42981, -4.19241, 5.02542, 5.03467, + -4.22983, 2.80794, + + 3.03016, -2.74373, -1.11490, -2.72378, + -0.63131, 0.74864, + + -0.00759, -0.00675, + + 0.03615, -0.01806, + + -2.71920, -1.50954, 0.54479, -1.92088, + 0.66427, 0.32228, + + -2.55188, -0.65332, -2.73798, 2.10182, + 1.54407, 3.01357, + + 38.76777, 23.54578, 27.29884, -14.93005, + -7.50931, -5.66773, 0.30142, 1.52416, + + 0.00634, 0.09697, -0.00748, 0.01433, + + 0.02936, 0.53228, -0.03603, 0.06345, + + 0.30816, -1.07925, 0.46709, -0.21568, + 0.01663, 0.10810, + + -0.42511, 0.35872, -0.19662, -6.74031, + + 1.05776, 1.86205, 1.08919, 0.10483, + -0.03368, -0.21535, + + 0.07556, -0.27104, 0.05142, -0.03812, + + 1.20189, -1.36782, 1.35764, 1.39387, + -1.19124, 0.77347, + + -0.54760, -0.26295, -0.07473, 0.23043, + + 2.82621, -0.23524, 0.47352, -0.81672, + -0.08515, 0.04700, + + 0.55355, -0.40138, 0.22255, 0.12236, + + -0.09110, 0.31982, 0.39404, -0.17898, + + -0.00056, 0.00014, + + -0.02012, 0.03102, + + 0.43236, -0.10037, -0.00961, 0.07440, + -0.07076, -1.97272, + + 0.25555, -0.21832, -0.00837, -0.08393, + + 0.01531, 0.00627, + + 0.33193, 0.70765, -0.43556, 0.28542, + + -0.23190, -0.04293, -0.08062, 0.13427, + + 0.23763, -0.17092, 0.09259, 0.05155, + + 0.08065, -0.11943, + + -0.02174, -0.68899, + + -0.01875, -0.01746, + + 0.13604, 0.29280, -0.17871, 0.11799, + + 0.02003, 0.04065, + + 0.01343, -0.06060, + + -0.01290, -0.26068, + + -0.09033, 0.02649, + + -0.00092, -0.03094, + + -0.00770, -0.10447, + + -0.04113, 0.01259, + + -0.00469, -0.04346, + + -0.00010, 0.06547, + +}; +static double FAR sattabb[] = { + -567865.62548, -796277.29029, -410804.00791, -91793.12562, + -6268.13975, 398.64391, -710.67442, 175.29456, + + -0.87260, 0.18444, + + -1314.88121, 20709.97394, -1850.41481, 20670.34255, + -896.96283, 6597.16433, -179.80702, 613.45468, + 17.37823, -13.62177, -0.36348, 12.34740, + + 0.47532, 0.48189, + + 0.27162, -0.20655, + + -0.23268, 0.05992, + + 46.94511, 15.78836, 21.57439, 23.11342, + -0.25862, 5.21410, -0.22612, -0.05822, + + -0.00439, -0.01641, + + -0.01108, -0.00608, + + 0.00957, 0.00272, + + -0.00217, 0.00001, + + -0.00534, -0.00545, + + 0.00277, -0.00843, + + 0.00167, -0.00794, 0.00032, -0.00242, + + -0.00002, -0.00041, + + -0.00025, 0.00031, + + 0.00062, -0.00060, + + 0.00083, 0.00032, + + 0.00527, -0.00211, 0.00054, 0.00004, + + -0.02769, -0.01777, + + 0.00247, 0.00097, 0.00020, -0.00232, + + 0.00044, -0.00035, + + -0.00072, 0.01341, 0.00325, -0.01159, + + 0.00079, -0.00078, + + -0.00009, 0.00066, + + 0.00222, 0.00002, + + 0.00013, -0.00161, + + 0.01374, -0.05305, + + 0.00478, -0.00283, + + 0.16033, 0.13859, 0.33288, -0.16932, + + -0.00316, 0.00625, + + -0.00309, 0.01687, 0.00001, 0.00486, + + 0.00401, -0.01805, -0.00048, -0.00407, + + -0.01329, 0.01311, -0.00591, 0.00166, + + 0.00830, 0.00665, + + -0.80207, 0.22994, -0.34687, 0.08460, + -0.11499, -0.01449, + + -0.01574, 0.78813, -0.03063, 0.28872, + -0.00337, 0.01801, + + -0.01703, -0.00929, + + -0.00738, 0.03938, + + 0.05616, -0.00516, + + -3.09497, 30.13091, -3.14968, 17.62201, + -0.73728, 2.46962, -0.11233, 0.03450, + + -0.07837, -0.01573, + + -0.01595, 0.00394, + + 0.00174, 0.01470, + + 6.83560, -2.37594, 4.95125, 3.24711, + 2.44781, 5.17159, 1.99820, -2.38419, + + 0.00840, 0.03614, + + -0.00209, -0.30407, -0.02681, -0.06128, + + 1.50134, 11.82856, 4.39644, 6.98850, + -4.17679, 5.73436, -9.66087, 1.98221, + + -0.29755, 0.08019, + + -0.24766, -8.54956, -1.74494, -3.36794, + -0.32661, -0.00722, + + 0.14141, 0.01023, + + -1.21541, -2.58470, 0.38983, -1.70307, + 0.31209, -0.10345, + + 0.02593, 0.02178, 0.00289, 0.00393, + + -0.00236, -0.00373, + + -0.00270, -0.00049, + + -0.06282, -0.00443, -0.02439, -0.02254, + -0.02220, 0.03532, + + -0.00072, 0.00010, + + -0.00049, -0.00112, + + 0.00086, 0.00112, + + 0.10135, -0.10972, 0.08357, 0.00155, + 0.04363, -0.00201, + + -0.01996, -0.01341, + + -0.00039, -0.00042, + + -0.00294, 0.00070, + + 0.00005, -0.00027, + + 0.00070, -0.00076, + + 0.00234, -0.00239, + + -0.08365, -0.08531, -0.03531, 0.15012, + + -0.01995, -0.01731, -0.00370, -0.00745, + + -0.00315, -0.00079, + + -0.00120, -0.00145, + + -0.99404, -1.31859, 0.03584, -0.83421, + 0.10720, -0.05768, + + 0.06664, -0.09338, + + -0.01814, -0.00003, + + -0.05371, -0.06458, -0.00100, -0.01298, + + -7.08710, -23.13374, 4.18669, -19.94756, + 4.85584, -3.37187, 0.58851, 0.31363, + + 0.01994, 0.27494, + + -1.37112, 2.61742, 0.52477, -0.46520, + + -0.13183, 0.26777, + + 836.90400, -484.65861, 815.99098, 236.54649, + -32.38814, 288.95705, -68.17178, -18.87875, + + -1.79782, -3.68662, -1.27310, -0.65697, + + -3.67530, 2.10471, + + -13758.97795, 4807.62301, -14582.14552, 9019.73021, + -3202.60105, 4570.16895, 2078.68911, 2892.62326, + -2399.35382, 3253.16198, -8182.38152, -3588.77680, + + -0.16505, 1.08603, 0.53388, 0.87152, + + 61.53677, 538.43813, -407.32927, 322.27446, + -148.71585, -179.37765, 54.07268, -34.12281, + + -14.76569, -17.95681, -10.82061, -6.39954, + -2.10954, 0.67063, 0.22607, -0.43648, + + 20.90476, -45.48667, 30.39436, -14.20077, + 5.17385, 5.12726, -0.66319, 0.55668, + + 0.02269, -0.00016, + + 0.07811, 0.00111, 0.01603, 0.01020, + + -0.00107, 0.00494, + + -0.00077, -0.00084, + + -0.00196, 0.00081, + + -0.03776, 0.01286, -0.00652, -0.01450, + + 0.05942, -0.08612, 0.01093, -0.01644, + + 0.02147, -0.00592, + + 0.36350, -0.00201, 0.14419, -0.10070, + -0.00491, -0.01771, + + -0.00053, -0.00033, + + 0.00146, 0.00048, + + 0.00582, 0.04423, -0.00549, 0.00983, + + 0.27355, -0.38057, 0.24001, -0.05441, + -0.07706, 0.14269, + + -0.00059, -0.00154, + + -0.00013, -0.00088, + + -0.00046, 0.00029, + + -0.00276, -0.00507, 0.00075, -0.00076, + + 0.01806, 0.00862, -0.00510, -0.01364, + + -0.00029, -0.12664, 0.03899, -0.03562, + 0.00318, 0.00514, + + 0.00057, 0.00201, + + 0.00028, 0.00014, + + -0.47022, -0.74561, 0.40155, -0.16471, + -0.18445, 0.34425, -0.07464, -0.13709, + + -0.01018, -0.00748, + + -0.01210, -0.04274, -0.00579, -0.00692, + + -11.09188, -1.67755, -6.62063, -13.84023, + 12.75563, -6.73501, 8.31662, 5.40196, + + 0.00052, 0.00034, + + 0.00128, 0.00085, + + -0.02202, -0.00599, + + -0.33458, -1.65852, 1.47003, -1.02434, + 0.87885, 1.15334, + + -0.00241, -0.00721, + + 0.03154, 0.00612, + + 0.00318, -0.02521, + + 0.00042, 0.00213, + + -0.01094, 0.05417, -0.03989, -0.00567, + 0.00123, -0.00244, + + 0.00108, 0.00242, + + -0.00138, -0.00099, + + 0.04967, 0.01643, -0.00133, 0.02296, + + 0.12207, 0.05584, + + 0.00437, -0.04432, -0.00176, -0.00922, + + -0.00252, 0.00326, + + -0.00020, -0.00050, + + -0.00263, -0.00084, + + -0.01971, 0.00297, + + 0.03076, 0.01736, + + -0.01331, 0.01121, -0.00675, 0.00340, + + -0.00256, 0.00327, + + -0.00946, 0.03377, -0.00770, 0.00337, + + 0.61383, 0.71128, -0.02018, 0.62097, + -0.07247, 0.04418, + + -0.02886, -0.03848, + + -0.44062, 0.03973, + + -0.00999, -0.04382, + + 57.94459, 117.45112, -71.22893, 126.39415, + -62.33152, -31.90754, 12.17738, -16.46809, + + -1.13298, 0.08962, -0.20532, 0.16320, + + -1.55110, -1.44757, + + -3102.08749, -7452.61957, -5009.53858, -7216.29165, + -2476.87148, -1880.58197, -574.49433, 227.45615, + 144.50228, 379.15791, 225.36130, -443.47371, + + -8.51989, -3.75208, -4.25415, -1.59741, + -0.43946, -0.06595, + + 150.42986, 6.54937, 87.67736, 92.32332, + -21.97187, 29.87097, -4.21636, -5.72955, + + -0.03879, -0.01071, + + -0.45985, 0.02679, -0.02448, 0.02397, + + -0.06551, -0.01154, + + 1.97905, -0.82292, 1.10140, 0.30924, + 0.03389, 0.14230, + + 0.00003, 0.00119, + + -0.01117, 0.00665, + + -0.00132, -0.00576, + + -0.08356, 0.08556, -0.26362, -0.12450, + + 0.00509, 0.00165, + + 0.02591, 0.16200, -0.03318, 0.06463, + -0.00899, -0.00462, + + 0.00102, 0.00004, + + -0.73102, 0.08299, -0.52957, -0.35744, + 0.14119, -0.24903, 0.20843, 0.14143, + + 0.00031, -0.00234, + + -0.42643, -2.02084, 1.58848, -1.57963, + 0.68418, 2.07749, + + -0.45888, 0.19859, -0.30277, -0.22591, + 0.11607, -0.09705, + + 0.00040, 0.00431, + + -0.02683, 0.03158, -0.01302, -0.00541, + 0.01742, -0.00006, + + -0.02231, -0.01128, + + -0.00800, 0.02055, + + -0.00346, 0.00151, + + 0.56732, -0.68995, 0.27701, -0.16748, + 0.01002, 0.00043, + + 0.26916, -0.57751, 0.15547, -0.15825, + -0.02074, -0.07722, + + -8.23483, -4.02022, 0.69327, -5.91543, + 1.72440, 1.02090, + + 0.00024, -0.00053, + + 20.03959, 14.79136, 76.43531, -14.42019, + -7.82608, -69.96121, -54.94229, 23.55140, + 26.60767, 14.68275, + + 0.05118, -0.10401, -0.00075, -0.01942, + + -3.84266, -26.23442, 10.20395, -14.77139, + 3.40853, 2.07297, -0.53348, 0.40635, + + 0.00716, -0.00189, + + 0.12472, -0.02903, 0.02254, -0.00183, + + -0.00175, -0.01522, 0.00003, -0.00339, + + 0.00383, -0.00168, + + 0.01327, -0.03657, + + -0.08458, -0.00115, -0.03991, -0.02629, + 0.00243, -0.00505, + + 0.33875, -0.16744, 0.05183, 0.01744, + -0.24427, 0.15271, + + 0.37550, -0.17378, 0.09198, -0.27966, + -0.22160, 0.16426, + + 0.00032, -0.00310, + + -0.00022, -0.00144, + + -0.06170, -0.01195, -0.00918, 0.02538, + 0.03602, 0.03414, + + -0.14998, -0.44351, 0.45512, -0.11766, + 0.35638, 0.27539, + + 5.93405, 10.55777, 12.42596, -1.82530, + -2.36124, -6.04176, -0.98609, 1.67652, + + -0.09271, 0.03448, -0.01951, 0.00108, + + 0.33862, 0.21461, 0.02564, 0.06924, + + 0.01126, -0.01168, -0.00829, -0.00740, + 0.00106, -0.00854, + + -0.08404, 0.02508, -0.02722, -0.06537, + + 0.01662, 0.11454, 0.06747, 0.00742, + -0.01975, -0.02597, + + -0.00097, -0.01154, 0.00164, -0.00274, + + 0.02954, -0.05161, -0.02162, -0.02069, + -0.06369, 0.03846, + + 0.00219, -0.01634, -0.04518, 0.06696, + + 1.21537, 0.99500, 0.68376, -0.28709, + -0.11397, -0.06468, + + 0.00607, -0.00744, 0.01531, 0.00975, + + -0.03983, 0.02405, 0.07563, 0.00356, + + -0.00018, -0.00009, + + 0.00172, -0.00331, + + 0.01565, -0.03466, -0.00230, 0.00142, + -0.00788, -0.01019, + + 0.01411, -0.01456, -0.00672, -0.00543, + + 0.00059, -0.00011, + + -0.00661, -0.00496, -0.01986, 0.01271, + + -0.01323, -0.00764, 0.00041, 0.01145, + + 0.00378, -0.00137, 0.00652, 0.00412, + + 0.01946, -0.00573, + + -0.00326, -0.00257, + + -0.00225, 0.00090, + + -0.00292, -0.00317, -0.00719, 0.00468, + + 0.00245, 0.00189, + + 0.00565, -0.00330, + + -0.00168, -0.00047, + + -0.00256, 0.00220, + + 0.00180, -0.00162, + + -0.00085, -0.00003, + + -0.00100, 0.00098, + + -0.00043, 0.00007, + + -0.00003, -0.00013, + +}; +static double FAR sattabr[] = { + -38127.94034, -48221.08524, -20986.93487, -3422.75861, + -8.97362, 53.34259, -404.15708, -0.05434, + + 0.46327, 0.16968, + + -387.16771, -146.07622, 103.77956, 19.11054, + -40.21762, 996.16803, -702.22737, 246.36496, + -63.89626, -304.82756, 78.23653, -2.58314, + + -0.11368, -0.06541, + + -0.34321, 0.33039, + + 0.05652, -0.16493, + + 67.44536, -29.43578, 50.85074, 18.68861, + 0.39742, 13.64587, -1.61284, 0.11482, + + 0.01668, -0.01182, + + -0.00386, 0.01025, + + 0.00234, -0.01530, + + -0.02569, -0.00799, + + -0.00429, -0.00217, + + -0.00672, 0.00650, + + 0.01154, 0.00120, -0.00515, 0.00125, + + 0.00236, -0.00216, + + -0.00098, 0.00009, + + -0.00460, -0.00518, + + 0.00600, 0.00003, + + 0.00834, 0.00095, 0.01967, 0.00637, + + -0.00558, -0.06911, + + -0.01344, -0.06589, -0.05425, -0.00607, + + -0.00247, -0.00266, + + 0.08790, -0.08537, -0.00647, 0.04028, + + -0.00325, 0.00488, + + 0.00111, -0.00044, + + -0.00731, 0.00127, + + -0.00417, 0.00303, + + 0.05261, 0.01858, + + -0.00807, 0.01195, + + 1.26352, -0.38591, -0.34825, 1.10733, + + -0.02815, -0.02148, + + -0.05083, -0.04377, -0.01206, -0.00586, + + 0.03158, -0.01117, 0.00643, 0.00306, + + -0.01186, -0.05161, 0.01136, -0.00976, + + -0.00536, 0.01949, + + -1.41680, -0.81290, -0.09254, -0.24347, + -0.14831, -0.34381, + + -2.44464, 0.41202, -0.99240, -0.33707, + -0.01930, -0.08473, + + 0.00830, 0.01165, + + -0.01604, -0.02439, + + 0.00227, 0.04493, + + -42.75310, -22.65155, -9.93679, -18.36179, + 2.73773, 3.24126, -1.20698, 1.07731, + + 0.00434, -0.10360, + + -0.02359, 0.00054, + + -0.02664, -0.00122, + + -19.79520, 33.11770, -53.56452, -35.41902, + 67.95039, -82.46551, 117.31843, 14.08609, + + 0.06447, 0.03289, + + 0.40365, -0.33397, 0.07079, -0.09504, + + -30.36873, 6.23538, -14.25988, -44.91408, + 38.53146, -16.31919, 6.99584, 22.47169, + + -0.13313, 0.28016, + + 6.83715, -6.01384, 1.68531, -3.62443, + -0.22469, -0.29718, + + 0.25169, 0.13780, + + -3.64824, 1.22420, -2.48963, -1.12515, + -0.01510, -0.56180, + + -0.03306, 0.01848, -0.00103, -0.00077, + + -0.01681, -0.00227, + + -0.00402, -0.00287, + + 0.04965, -0.16190, -0.40025, 0.20734, + 0.15819, -0.25451, + + 0.02467, -0.00495, + + 0.00597, 0.00490, + + -0.01085, -0.00460, + + -0.71564, -0.26624, 0.03797, -0.28263, + 0.03510, 0.30014, + + 2.79810, 0.07258, + + -0.01618, 0.00337, + + 0.00876, 0.04438, + + 0.00742, -0.00455, + + -0.01163, -0.00683, + + 0.00950, 0.01275, + + -0.02124, -0.67527, -0.23635, 0.06298, + + -0.03844, 0.01010, 0.73588, -0.00271, + + 0.01742, -0.00467, + + 0.00017, -0.00505, + + -0.27482, 5.00521, -1.92099, 1.55295, + -0.35919, -0.09314, + + -0.47002, 0.06826, + + 0.07924, 0.16838, + + -0.04221, 0.71510, -0.16482, 0.08809, + + 41.76829, -125.79427, 106.65271, -71.30642, + 36.18112, 17.36143, -1.63846, 5.02215, + + -1.08404, 0.00061, + + 2.45567, -2.42818, -9.88756, 5.36587, + + -0.61253, -0.35003, + + 1523.54790, 602.82184, 68.66902, 1878.26100, + -1098.78095, -120.72600, 127.30918, -383.96064, + + -7.00838, -6.09942, -1.54187, 0.34883, + + -9.47561, -4.35408, + + -21541.63676, -32542.09807, -29720.82604, -28072.21231, + -15755.56255, -8084.58657, -8148.87315, 7434.89857, + 11033.30133, 7827.94658, 610.18256, -11411.93624, + + -9.87426, 0.94865, -1.63656, 0.41275, + + 1996.57150, 511.48468, 669.78228, 1363.67610, + -379.72037, 198.84438, -16.63126, -79.37624, + + -2.30776, -246.07820, -16.85846, -148.18168, + -6.89632, -20.49587, 0.39892, -0.34627, + + -57.81309, -136.96971, 15.25671, -96.61153, + 16.09785, -8.79091, 0.70515, 1.16197, + + 0.05647, 0.04684, + + 0.25032, -0.19951, 0.07282, -0.00696, + + 0.00493, 0.00733, + + -0.01085, 0.00422, + + -0.01309, 0.00262, + + 0.37616, -0.36203, -0.11154, 0.18213, + + 0.15691, 0.29343, 0.00485, 0.06106, + + -0.01492, 0.09954, + + 0.28486, 2.27190, 0.33102, 1.50696, + -0.01926, 0.04901, + + 0.01827, 0.00863, + + -0.03315, 0.00178, + + -0.77600, -0.48576, -0.21111, -0.19485, + + 1.90295, 6.44856, 1.71638, 2.12980, + -7.19585, -0.08043, + + 0.07004, -0.02764, + + 0.01604, 0.01158, + + 0.00936, -0.01199, + + 0.18396, -0.29234, 0.10422, -0.00720, + + 0.05196, 0.10753, 0.02859, -0.03602, + + 0.63828, 1.96280, -0.31919, 0.85859, + -0.10218, -0.00673, + + 0.01748, -0.02190, + + 0.01266, -0.02729, + + -4.80220, 8.90557, -5.94059, 2.28577, + -0.19687, -1.28666, 0.32398, 0.14879, + + -0.02619, -0.02056, + + -0.04872, -0.07011, -0.04082, -0.04740, + + 0.60167, -2.20365, -0.27919, -0.45957, + -1.31664, -2.22682, 176.89871, 13.03918, + + 0.00568, 0.00560, + + 0.01093, 0.00486, + + -0.00948, -0.31272, + + -11.87638, -3.68471, -1.74977, -9.60468, + 2.94988, -0.57118, + + 0.00307, -0.01636, + + 0.02624, 0.03032, + + -0.00464, -0.01338, + + 0.00935, 0.00530, + + -0.11822, 0.03328, -0.41854, 0.04331, + 0.41340, -0.21657, + + -0.00865, 0.00849, + + -0.00374, -0.00899, + + 0.01227, -0.23462, -0.71894, -0.04515, + + 0.00047, 0.28112, + + -0.12788, 0.11698, -0.02030, 0.02759, + + 0.02967, -0.00092, + + 0.00454, 0.00565, + + -0.00026, 0.00164, + + -0.01405, -0.00862, + + 0.01088, 0.05589, + + 0.18248, -0.06931, -0.00011, 0.03713, + + 0.01932, -0.00982, + + -0.13861, 0.09853, -0.03441, -0.02492, + + 2.26163, -5.94453, 4.14361, -0.94105, + 0.39561, 0.75414, + + -0.17642, 0.03724, + + -1.32978, -0.56610, + + -0.03259, -0.06752, + + 39.07495, 80.25429, -28.15558, 82.69851, + -37.53894, -17.88963, 6.98299, -13.04691, + + -0.48675, -1.84530, -0.07985, -0.33004, + + -3.39292, 2.73153, + + -17268.46134, 1144.22336, -16658.48585, 5252.94094, + -3461.47865, 2910.56452, -433.49442, -305.74268, + -383.45023, 545.16136, 313.83376, 27.00533, + + -31.41075, 7.90570, -12.40592, 3.01833, + -0.83334, 0.23404, + + 59.26487, -112.74279, 113.29402, -15.37579, + 14.03282, 32.74482, -4.73299, 1.30224, + + -0.00866, 0.01232, + + -0.53797, 0.00238, -0.07979, 0.04443, + + -0.05617, -0.05396, + + 0.10185, -1.05476, 0.43791, -0.32302, + 0.06465, 0.03815, + + 0.00028, -0.00446, + + 0.09289, -0.06389, + + 0.01701, -0.01409, + + 0.47101, 0.16158, 0.01036, -0.39836, + + 0.00477, 0.01101, + + -2.06535, 0.33197, -0.82468, -0.41414, + 0.03209, -0.09348, + + 0.00843, -0.00030, + + -9.49517, -3.82206, 0.66899, -10.28786, + 6.33435, 1.73684, -0.98164, 2.25164, + + -0.07577, -0.00277, + + 1.02122, 0.75747, 1.79155, -0.77789, + -2.56780, -2.07807, + + 0.19528, 0.77118, -0.28083, 0.32130, + -0.04350, -0.07428, + + -0.01161, 0.01387, + + 0.02074, 0.19802, -0.03600, 0.04922, + -0.19837, 0.02572, + + -0.00682, -0.04277, + + -0.01805, 0.00299, + + 0.03283, -0.02099, + + 3.57307, 1.17468, 0.65769, 1.88181, + -0.39215, 0.08415, + + -0.53635, -0.19087, -0.12456, 0.02176, + 0.01182, -0.07941, + + -2.43731, 2.44464, 1.03961, -1.81936, + 30.33140, 0.92645, + + 0.00508, -0.01771, + + -81.06338, 66.43957, 33.16729, 131.44697, + 76.63344, -34.34324, -35.33012, -28.04413, + -1.47440, 13.09015, + + 0.13253, -0.01629, 0.02187, -0.00963, + + -21.47470, -9.44332, -7.21711, -12.59472, + 1.76195, -1.63911, 0.09060, 0.28656, + + 0.00635, 0.00536, + + 0.03470, -0.06493, 0.00666, -0.01084, + + 0.01116, -0.01612, -0.00102, 0.00208, + + -0.05568, 0.00628, + + 0.02665, -0.01032, + + 0.21261, -1.90651, 0.72728, -0.57788, + 0.08662, 0.10918, + + 3.39133, 3.97302, -4.63381, 4.26670, + -2.50873, -3.76064, + + 1.28114, 1.81919, 1.48064, -0.37578, + -0.26209, -0.47187, + + 0.00282, -0.00499, + + 0.01749, 0.03222, + + 1.60521, -1.79705, 1.61453, 0.68886, + -0.29909, 0.55025, + + -0.07894, 0.19880, -0.15635, 0.46159, + 2.09769, 1.52742, + + -7.60312, 11.34886, 4.35640, 8.61048, + 2.15001, -2.15303, -0.61587, -0.11950, + + -0.03289, -0.00520, -0.00501, -0.00445, + + 0.15294, -0.05277, 0.02455, 0.00408, + + 1.19601, 0.43479, 0.20422, 0.57125, + -0.12790, 0.01318, + + -0.15275, -0.43856, 6.99144, -0.08794, + + -1.69865, 0.82589, -0.20235, 0.97040, + 0.20903, 0.00675, + + 0.26943, 0.08281, 0.03686, 0.05311, + + 1.28468, 1.21735, -1.38174, 1.29570, + -0.75899, -1.17168, + + 0.44696, -0.32341, -0.06378, -0.27573, + + -0.06406, 0.87186, 0.21069, 0.19724, + 0.00119, -0.04147, + + 0.39279, 0.51437, -0.11035, 0.21450, + + -0.04309, 0.02359, 0.20490, 0.14210, + + 0.00007, -0.00017, + + -0.03529, -0.02644, + + 0.10710, 0.44476, -0.02632, -0.01817, + 2.11335, -0.04432, + + 0.18206, 0.27335, 0.08867, 0.00313, + + -0.00692, 0.01595, + + -0.72957, 0.32080, -0.29291, -0.44764, + + 0.12767, -0.05778, 0.04797, -0.00223, + + 0.17661, 0.22427, -0.04914, 0.09114, + + 0.12236, 0.00708, + + 0.74315, -0.01346, + + 0.02245, -0.02555, + + -0.30446, 0.13947, -0.12340, -0.18498, + + -0.04099, 0.02103, + + 0.06337, -0.01224, + + 0.28181, -0.01019, + + -0.02794, -0.09412, + + 0.03272, -0.01095, + + 0.11247, -0.00650, + + -0.01319, -0.04296, + + 0.04653, -0.00423, + + 0.06535, 0.00014, + +}; + +static signed char FAR satargs[] = { + 0, 7, + 3, 2, 5, -6, 6, 3, 7, 0, + 2, 2, 5, -5, 6, 5, + 3, 1, 6, -4, 7, 2, 8, 0, + 2, 1, 6, -3, 7, 0, + 3, 1, 6, -2, 7, -2, 8, 0, + 2, 4, 5,-10, 6, 3, + 3, 1, 5, -1, 6, -4, 7, 0, + 3, 2, 5, -4, 6, -3, 7, 0, + 3, 2, 6, -8, 7, 4, 8, 0, + 3, 3, 5,-10, 6, 7, 7, 0, + 2, 6, 5,-15, 6, 0, + 2, 2, 6, -6, 7, 0, + 3, 1, 5, -4, 6, 4, 7, 1, + 3, 1, 5, -2, 6, -1, 7, 0, + 3, 2, 5, -5, 6, 1, 8, 0, + 3, 3, 5, -8, 6, 2, 7, 0, + 3, 1, 5, -3, 6, 2, 8, 0, + 3, 1, 5, -3, 6, 1, 7, 1, + 1, 1, 8, 0, + 3, 1, 5, -3, 6, 2, 7, 1, + 3, 1, 5, -2, 6, -2, 7, 0, + 2, 2, 6, -5, 7, 1, + 3, 2, 6, -6, 7, 2, 8, 0, + 3, 2, 6, -7, 7, 4, 8, 0, + 3, 2, 5, -4, 6, -2, 7, 0, + 3, 1, 5, -1, 6, -5, 7, 0, + 3, 2, 6, -7, 7, 5, 8, 0, + 3, 1, 6, -1, 7, -2, 8, 0, + 2, 1, 6, -2, 7, 1, + 3, 1, 6, -3, 7, 2, 8, 0, + 3, 1, 6, -4, 7, 4, 8, 1, + 3, 2, 5, -5, 6, 2, 8, 1, + 3, 2, 5, -6, 6, 2, 7, 1, + 2, 2, 7, -2, 8, 0, + 1, 1, 7, 2, + 2, 5, 5,-12, 6, 2, + 3, 2, 6, -5, 7, 1, 8, 0, + 3, 1, 5, -1, 6, -3, 7, 0, + 3, 7, 5,-18, 6, 3, 7, 0, + 2, 3, 5, -7, 6, 3, + 3, 1, 6, 1, 7, -5, 8, 0, + 3, 1, 5, -4, 6, 3, 7, 0, + 3, 5, 5,-13, 6, 3, 7, 0, + 2, 1, 5, -2, 6, 3, + 3, 3, 5, -9, 6, 3, 7, 0, + 3, 3, 5, -8, 6, 3, 7, 1, + 2, 1, 5, -3, 6, 3, + 3, 5, 5,-14, 6, 3, 7, 0, + 3, 1, 5, -3, 6, 3, 7, 2, + 2, 3, 6, -7, 7, 0, + 2, 3, 5, -8, 6, 2, + 3, 2, 5, -3, 6, -4, 7, 1, + 3, 2, 5, -8, 6, 7, 7, 0, + 2, 5, 5,-13, 6, 0, + 2, 2, 6, -4, 7, 2, + 3, 2, 6, -5, 7, 2, 8, 0, + 3, 2, 5, -4, 6, -1, 7, 0, + 3, 2, 5, -7, 6, 4, 7, 0, + 2, 1, 6, -2, 8, 2, + 2, 1, 6, -1, 7, 0, + 3, 1, 6, -2, 7, 2, 8, 0, + 3, 2, 5, -5, 6, 2, 7, 0, + 3, 2, 5, -6, 6, 2, 8, 0, + 3, 2, 5, -6, 6, 1, 7, 0, + 2, 3, 7, -2, 8, 0, + 1, 2, 7, 1, + 2, 1, 6, -1, 8, 1, + 3, 1, 5, -2, 6, 1, 7, 0, + 3, 1, 5, -2, 6, 2, 8, 0, + 2, 3, 6, -6, 7, 2, + 2, 6, 5,-14, 6, 0, + 3, 3, 6, -7, 7, 2, 8, 0, + 3, 2, 5, -3, 6, -3, 7, 1, + 2, 4, 5, -9, 6, 3, + 3, 2, 6, -2, 7, -2, 8, 0, + 2, 2, 6, -3, 7, 1, + 3, 2, 6, -4, 7, 2, 8, 0, + 2, 2, 5, -4, 6, 3, + 3, 2, 5, -7, 6, 3, 7, 1, + 3, 1, 6, 1, 7, -2, 8, 0, + 1, 1, 6, 5, + 3, 2, 5, -5, 6, 3, 7, 1, + 2, 2, 5, -6, 6, 3, + 1, 3, 7, 3, + 2, 4, 5,-11, 6, 3, + 2, 1, 5, -4, 7, 0, + 3, 2, 5, -5, 6, -3, 7, 1, + 2, 6, 5,-16, 6, 0, + 3, 3, 5, -7, 6, 2, 7, 0, + 3, 3, 6, -4, 7, -2, 8, 0, + 2, 3, 6, -5, 7, 1, + 3, 3, 6, -6, 7, 2, 8, 1, + 3, 3, 6, -7, 7, 4, 8, 0, + 3, 2, 5, -3, 6, -2, 7, 2, + 3, 2, 5, -8, 6, 5, 7, 0, + 2, 2, 6, -4, 8, 0, + 3, 2, 6, -1, 7, -2, 8, 1, + 2, 2, 6, -2, 7, 2, + 3, 2, 6, -3, 7, 2, 8, 0, + 3, 2, 5, -4, 6, 1, 7, 0, + 3, 2, 5, -4, 6, 2, 8, 0, + 3, 2, 5, -7, 6, 2, 7, 1, + 2, 1, 6, 1, 7, 1, + 2, 5, 5,-11, 6, 2, + 3, 1, 5, -2, 7, -2, 8, 0, + 2, 1, 5, -3, 7, 0, + 2, 3, 5, -6, 6, 3, + 3, 2, 6, 1, 7, -5, 8, 0, + 2, 2, 6, -3, 8, 1, + 2, 1, 5, -1, 6, 3, + 3, 2, 5, -7, 6, 3, 8, 0, + 3, 3, 5, -7, 6, 3, 7, 0, + 3, 2, 5, -1, 6, -7, 7, 0, + 2, 1, 5, -4, 6, 2, + 3, 1, 5, -2, 6, 3, 7, 0, + 2, 4, 6, -7, 7, 0, + 2, 3, 5, -9, 6, 0, + 3, 2, 5, -2, 6, -4, 7, 0, + 2, 3, 6, -4, 7, 2, + 3, 2, 5, -3, 6, -1, 7, 0, + 3, 2, 5, -8, 6, 4, 7, 0, + 2, 2, 6, -2, 8, 1, + 2, 2, 6, -1, 7, 0, + 3, 2, 6, -2, 7, 2, 8, 1, + 3, 2, 5, -4, 6, 2, 7, 0, + 3, 2, 5, -7, 6, 2, 8, 0, + 3, 2, 5, -7, 6, 1, 7, 0, + 2, 1, 6, 2, 7, 0, + 2, 2, 6, -1, 8, 0, + 2, 4, 6, -6, 7, 1, + 2, 6, 5,-13, 6, 0, + 3, 2, 5, -2, 6, -3, 7, 1, + 2, 4, 5, -8, 6, 2, + 3, 3, 6, -2, 7, -2, 8, 0, + 2, 3, 6, -3, 7, 0, + 3, 3, 6, -4, 7, 2, 8, 0, + 2, 2, 5, -3, 6, 3, + 3, 2, 5, -8, 6, 3, 7, 1, + 3, 2, 6, 1, 7, -2, 8, 0, + 1, 2, 6, 5, + 3, 2, 5, -4, 6, 3, 7, 2, + 2, 2, 5, -7, 6, 3, + 3, 1, 6, 4, 7, -2, 8, 0, + 2, 1, 6, 3, 7, 1, + 3, 1, 6, 2, 7, 2, 8, 0, + 2, 4, 5,-12, 6, 2, + 2, 5, 6, -8, 7, 0, + 2, 4, 6, -5, 7, 0, + 3, 2, 5, -2, 6, -2, 7, 0, + 2, 3, 6, -2, 7, 1, + 3, 3, 6, -3, 7, 2, 8, 0, + 2, 5, 5,-10, 6, 2, + 3, 1, 5, 1, 6, -3, 7, 0, + 2, 3, 5, -5, 6, 3, + 2, 3, 6, -3, 8, 0, + 1, 1, 5, 2, + 2, 1, 5, -5, 6, 2, + 2, 5, 6, -7, 7, 0, + 2, 4, 6, -4, 7, 2, + 2, 3, 6, -2, 8, 0, + 2, 3, 6, -1, 7, 0, + 2, 5, 6, -6, 7, 0, + 2, 4, 5, -7, 6, 2, + 2, 4, 6, -3, 7, 2, + 2, 2, 5, -2, 6, 2, + 3, 2, 6, -9, 7, 3, 8, 0, + 1, 3, 6, 4, + 3, 2, 5, -3, 6, 3, 7, 1, + 2, 2, 5, -8, 6, 3, + 3, 2, 6, 4, 7, -2, 8, 0, + 2, 4, 5,-13, 6, 1, + 2, 6, 6, -8, 7, 1, + 2, 5, 6, -5, 7, 0, + 2, 4, 6, -2, 7, 0, + 2, 5, 5, -9, 6, 2, + 2, 3, 5, -4, 6, 2, + 2, 1, 5, 1, 6, 2, + 2, 6, 5,-11, 6, 0, + 3, 6, 6, -7, 7, 2, 8, 0, + 2, 4, 5, -6, 6, 2, + 2, 2, 5, -1, 6, 2, + 1, 4, 6, 3, + 3, 2, 5, -2, 6, 3, 7, 1, + 2, 2, 5, -9, 6, 1, + 2, 5, 5, -8, 6, 2, + 2, 3, 5, -3, 6, 1, + 2, 1, 5, 2, 6, 2, + 2, 6, 5,-10, 6, 1, + 2, 4, 5, -5, 6, 2, + 1, 2, 5, 1, + 1, 5, 6, 2, + 2, 5, 5, -7, 6, 1, + 2, 3, 5, -2, 6, 1, + 3, 1, 5, 2, 6, 3, 7, 0, + 2, 6, 5, -9, 6, 0, + 2, 4, 5, -4, 6, 2, + 2, 2, 5, 1, 6, 1, + 2, 7, 5,-11, 6, 0, + 2, 5, 5, -6, 6, 1, + 2, 3, 5, -1, 6, 1, + 2, 6, 5, -8, 6, 1, + 2, 4, 5, -3, 6, 0, + 2, 5, 5, -5, 6, 0, + 1, 3, 5, 0, + 2, 6, 5, -7, 6, 1, + 2, 7, 5, -9, 6, 0, + 2, 5, 5, -4, 6, 0, + 2, 6, 5, -6, 6, 0, + 2, 7, 5, -8, 6, 0, + 2, 6, 5, -5, 6, 0, + 2, 7, 5, -7, 6, 0, + 2, 8, 5, -9, 6, 0, + 2, 8, 5, -8, 6, 0, + 2, 1, 3, -1, 6, 0, + -1 +}; +/* Total terms = 215, small = 211 */ +static struct plantbl FAR sat404 = { + { 0, 0, 1, 0, 8, 18, 9, 5, 0,}, + 7, + satargs, + sattabl, + sattabb, + sattabr, + 9.5575813548599999e+00, +}; + +/* +First date in file = 625296.50 +Number of records = 16731.0 +Days per record = 131.0 + Julian Years Lon Lat Rad + -3000.0 to -2499.7: 0.35 0.06 0.42 + -2499.7 to -1999.7: 0.50 0.06 0.38 + -1999.7 to -1499.7: 0.39 0.07 0.34 + -1499.7 to -999.8: 0.34 0.06 0.30 + -999.8 to -499.8: 0.35 0.05 0.32 + -499.8 to 0.2: 0.32 0.05 0.27 + 0.2 to 500.2: 0.26 0.04 0.25 + 500.2 to 1000.1: 0.28 0.04 0.25 + 1000.1 to 1500.1: 0.26 0.06 0.31 + 1500.1 to 2000.1: 0.33 0.05 0.24 + 2000.1 to 2500.0: 0.32 0.06 0.26 + 2500.0 to 3000.0: 0.34 0.06 0.32 + 3000.0 to 3000.4: 0.406 0.035 0.172 +*/ +static double FAR uratabl[] = { + 21.56000, -4652.06828, 154246324.90417, 1130486.05080, + + 330.11531, -3020.20235, + + -8.03769, -122.02019, + + 212.45130, 254.23866, 25.39758, 60.08296, + + 6949.85053, 51951.42606, -1834.66531, 44481.91144, + -3267.45825, 10776.65972, -628.05388, 532.83011, + -16.80583, -30.05544, + + 1420.33767, 2007.21040, 592.32842, 1541.61732, + -163.55984, 121.14134, 114.74969, -16.04944, + + 0.06069, 0.00725, + + -0.16861, 0.28785, + + 0.07399, -0.09680, + + 0.19936, -0.41620, + + 0.02922, 0.07398, + + 0.17272, 0.05602, + + 1.65461, -0.68278, -2.18745, -0.85327, + 0.52467, -0.30863, + + 0.01598, 0.30017, + + -0.04190, -0.03288, + + -0.02013, 0.02257, + + -0.54883, -0.22701, -0.09257, -0.03921, + + 0.02644, 0.04667, + + 0.24773, -0.16562, + + 44242.85814, -223163.54065, 123776.84417, -206375.74884, + 70472.73820, -27456.55173, 4065.74401, 13202.39154, + -3260.72648, 802.50579, -153.13236, -503.81026, + 30.17812, -31.91893, + + -65.14719, 77.78417, -37.38185, 19.13337, + -3.14043, -0.21147, + + 0.27143, 0.17424, + + 0.04458, 0.10976, + + -0.41841, -0.21887, -0.09194, -0.02303, + + 0.02896, 0.10044, + + 0.01385, 0.01723, + + -0.01126, -0.09318, + + -57.95890, 29.69059, -46.41390, 3.07177, + 0.42494, 2.33678, -3.09621, 0.05256, + + -0.02134, -0.35202, + + -0.44475, -0.83135, + + 1318.18265, 25605.86848, -9168.38371, 18917.31507, + -5145.74480, 2130.77612, -485.25920, -438.44867, + 19.97802, -33.14800, + + -23383.91826, -45133.19122, -18520.80729, -26549.95198, + -2276.70124, -2974.01604, 603.23665, 306.87616, + -87.73070, -32.49134, + + 549975.14525, 261920.31896, 526261.09735, 362619.26839, + 150616.68873, 164643.90808, 9550.02662, 27381.83042, + -1065.89047, 1024.20231, -66.63822, -44.75169, + + -92.10532, -20.26930, + + -313205.95341, 1462242.64616, 112982.53079, 1865690.41965, + 308844.30901, 639864.93227, 89716.32843, 10378.80773, + 4395.08428, -14565.35913, -3016.07754, -19348.64612, + + 3838.36899, -9813.42713, 6883.58821, -6064.92588, + 2740.47455, -176.29547, 241.91895, 268.44181, + -6.13397, 17.92503, + + -0.01377, -0.08742, + + 387.51915, 257.03872, 152.81792, 221.56197, + -22.94836, 29.56640, -2.27801, 4.72805, + -6.03420, -0.36763, + + 0.00667, 0.00443, + + -0.01405, 0.04658, + + -0.06533, -0.01966, + + 0.10738, 0.00443, + + 0.02889, 0.01056, + + 0.00900, -0.02206, + + 0.00013, 0.05281, + + 0.03035, 0.34793, + + 0.19460, 2.47360, + + 0.18189, -0.83895, 0.24983, 15.32050, + + 0.46010, 2.79643, + + -0.45793, 0.96707, -0.31226, 0.51911, + 0.04071, 0.39399, + + 0.00038, 0.03854, + + 0.22446, 0.13630, -0.04357, 0.03635, + + 0.00202, -0.04502, + + -0.00458, -0.03884, + + 1.32597, 3.40849, -1.67839, -0.95411, + + -1.00116, -0.72744, -0.22484, -0.27682, + + -0.18069, 0.00405, + + -0.01000, 0.27523, + + -0.07038, -0.01051, + + -0.09064, 0.08518, + + 0.02083, -0.25406, + + 0.17745, -0.00944, + + 0.21326, 0.20454, + + 18.84894, -7.64400, 0.62670, -11.02728, + 8.91329, 20.67190, + + 0.17757, -0.15471, + + -0.11385, -0.46057, + + 6.23014, -14.46025, 2.30012, -2.22677, + + 5.16823, -1.64235, + + -274.58413, 833.33247, -191.26241, 269.90157, + -17.25965, 9.11368, + + -261.65136, -18274.45858, -2553.83872, -10039.10490, + -508.52567, 336.18172, 14.88587, 421.35954, + 162.43462, 544.92580, + + -0.44246, 0.23216, + + -0.29024, -0.13057, + + -1.58438, 0.34032, -0.31604, -0.01166, + + -0.07112, 0.05721, + + -0.10813, 0.01064, + + -0.05413, 0.06705, + + -0.41582, -0.47725, 0.31031, 0.08605, + + 0.00409, 0.02373, + + 0.08092, 0.06247, -0.01026, 0.05863, + + -0.00238, 0.02948, + + 0.00117, 0.02714, + + 0.01720, 0.18261, + + -0.04067, 0.88639, + + -0.15502, -0.96383, + + -0.05307, -0.17319, + + -0.00486, -0.02373, + + -0.14748, -0.11884, 0.07798, -0.00358, + + 0.01104, 0.00805, + + 0.15099, -0.03453, 0.01846, 0.03459, + + 0.02197, 0.07012, + + -0.43677, -1.87445, 1.35202, 2.28294, + + -0.03592, 0.07679, + + 0.16427, 0.03014, 0.02472, 0.05549, + + -0.04985, 0.05874, + + 0.35361, 0.01144, -0.57400, 1.34898, + + 0.00265, 0.01540, + + 0.00951, 0.08159, + + -0.00435, 0.34759, + + -0.12413, -0.49848, + + -0.77075, -2.73810, + + -31.77702, 12.16042, -14.87605, 11.98287, + 12.69358, 1.31307, -8.22911, -21.47437, + + -0.24051, -0.38332, + + -0.01162, -0.03175, + + 0.00556, 0.02454, + + -0.02297, -0.01654, + + 0.00707, 0.04828, + + -0.00309, 0.17381, + + -0.00500, -0.07579, + + 0.02008, 0.05356, + + 0.00702, 0.01133, + + -0.00237, -0.00612, + + 0.18551, 0.22799, -0.14194, -0.08593, + + 0.00002, -0.01049, + + -0.17363, -0.13986, 0.00078, -0.06993, + + -0.00430, -0.07795, + + -0.03232, -4.13170, + + 0.00311, 0.05356, + + -0.17324, -0.15505, -0.00590, -0.06608, + + 0.04257, -0.04571, + + 0.00501, 0.02141, + + -0.00037, 0.07845, + + -0.00381, -0.03417, + + 0.01834, 0.03349, + + 0.07994, 0.15297, + + -0.82299, 0.24672, 0.51764, 0.96379, + + 0.01729, 0.02489, + + -0.08581, 0.13252, + + 0.00538, 0.01995, + + -0.00148, -0.02261, + + 0.00534, 0.01565, + + -0.07518, -0.28114, 0.22386, 0.39023, + + -0.00864, 0.00964, + + -0.01923, -0.02426, + + -0.00112, 0.00923, + + -0.00685, 0.02450, + + 0.26733, -0.99972, -0.82005, 0.13725, + + 0.01520, -0.00790, + + 0.00358, 0.00751, + + -0.00648, -0.00605, + + -0.04966, -0.04633, + + 0.06394, -0.01965, + + 0.50185, 0.40553, -0.25809, 0.28853, + 0.52545, -3.41675, + + -0.00347, -0.11848, + + 0.02945, -0.01061, + + -0.04160, -0.03519, + + -0.03234, -0.81852, + + -0.02156, -0.00841, + + 0.00029, 0.00020, + + -0.02281, -0.00364, + + 0.04738, -0.04504, + + -0.19161, 0.37225, 0.05765, 0.11987, + + 0.00050, 0.02012, + + -0.03806, 0.39498, + + 0.29982, 0.00886, 0.01671, 53.04042, + + -0.04160, -0.38856, + + -0.00174, -0.01773, + + -0.47661, -0.32010, -0.01088, -0.16231, + + -0.01584, -0.00144, + + 0.06659, 0.12734, + + 0.04884, 0.02236, + + 0.00146, 0.06030, + + -0.20660, -0.03982, 0.15091, 1.24562, + + -0.01303, -0.22426, + + -0.01518, -0.03922, + + -0.00043, -0.00047, + + 0.02451, 0.04437, + + 0.02380, -0.00189, + + -0.00640, -0.07114, + + -0.00320, -0.02491, + + -0.00829, 0.07284, + + 0.02846, -0.28034, + + -0.00268, 0.00256, + + -0.43420, 0.39645, -0.31053, 1.25916, + + -0.00371, -0.00651, + + -0.00096, 0.02762, + + -0.00067, -0.02503, + + -0.01517, 0.03748, + +}; +static double FAR uratabb[] = { + 0.00000, 107.91527, 83.39404, -124.29804, + + -7.73277, -3.99442, + + -0.08328, -1.74251, + + -9.05659, -22.88559, -2.30655, -4.40259, + + -470.94604, -3648.43408, 326.28960, -2972.91303, + 337.37285, -650.33570, 57.18479, -18.29130, + 1.13897, 2.70158, + + -13.64388, -71.88619, 7.36408, -43.79994, + 6.57463, -5.81111, -0.06451, 0.73379, + + 0.00574, -0.01635, + + 0.00074, -0.01496, + + -0.00418, 0.00647, + + -0.00407, 0.00548, + + 0.00002, 0.00187, + + -0.00591, 0.00557, + + 0.32568, -0.01574, 0.19347, -0.01705, + 0.00173, 0.02384, + + -0.00248, -0.00103, + + 0.00227, 0.00146, + + 0.00307, -0.00040, + + 0.03886, 0.01987, 0.00546, 0.00345, + + 0.00134, -0.00609, + + -0.01502, -0.01569, + + -10080.59325, 10806.67752, -14013.76861, 9928.38683, + -6540.83480, 2084.91597, -1093.05006, -305.34266, + -9.04558, -110.32310, 9.26094, -3.93195, + 0.25552, 0.50327, + + -13.12170, -4.19317, -4.50857, -3.37626, + -0.26850, -0.36028, + + -0.00357, 0.05862, + + -0.00828, 0.00926, + + -0.01515, -0.03687, -0.00224, -0.00802, + + -0.00225, -0.00158, + + -0.00022, -0.00044, + + -0.00281, 0.00371, + + 2.28259, -4.29888, 1.74622, -2.13604, + 0.37023, -0.37022, 0.00886, 0.07081, + + 0.01669, 0.00056, + + -0.02020, 0.01586, + + -4255.31929, 5978.03267, -7264.48027, 1884.12585, + -2353.93882, -1593.23001, 17.57205, -498.54139, + 33.28704, -13.79498, + + -38416.64883, -13774.09664, -32822.03952, -3983.42726, + -7538.09822, 1906.66915, -221.24439, 512.77046, + 32.26101, 12.46483, + + 142710.47871, -96584.83892, 145395.05981, -86630.96423, + 48202.96749, -23596.77676, 5286.16967, -1626.44031, + -16.53568, 95.15428, -15.19472, 5.69207, + + -6.72181, 7.28683, + + 9515.16142, -166495.49381, 5588.84271, -146260.29445, + 2023.55881, -30687.22422, 243.64741, 971.58076, + 390.73247, -236.13754, -2684.56349, 739.81087, + + -597.39429, 474.89313, -631.69166, 213.04947, + -204.89515, -33.09139, -17.78004, -22.21866, + 0.61083, -1.41177, + + -0.00070, -0.00501, + + -58.24552, 25.27978, -36.39386, 0.36376, + -2.21030, -6.46685, -0.58473, -0.09357, + 0.12829, -0.94855, + + 0.00042, 0.00048, + + 0.00411, 0.00101, + + 0.00249, -0.00865, + + 0.00223, 0.00293, + + 0.00041, -0.00042, + + 0.00104, -0.00086, + + 0.00126, -0.00380, + + 0.00906, -0.02253, + + 0.05998, -0.10318, + + 0.00004, -0.03225, 0.14303, -0.05273, + + 0.32683, 0.09386, + + -0.17053, 0.60847, -0.06190, 0.28166, + 0.06411, 0.05289, + + 0.01138, 0.00128, + + -0.00930, 0.00272, 0.00037, 0.00215, + + 0.00004, 0.00050, + + 0.00114, -0.00217, + + 0.05358, -0.06413, -0.00124, 0.03842, + + 0.01006, 0.22479, 0.00412, 0.04040, + + 0.01708, 0.02164, + + 0.02484, -0.02463, + + -0.00103, 0.02633, + + -0.01303, -0.03214, + + 0.03613, 0.02205, + + -0.02677, -0.02522, + + -0.00293, 0.03130, + + -1.87255, -2.50308, -1.53715, 0.36859, + -0.17829, -1.12095, + + -0.05652, -0.00786, + + -0.06992, 0.07279, + + -2.95896, 0.55138, -0.61498, -0.11008, + + -0.87790, -0.50965, + + 119.73553, -35.18217, 44.78683, -4.22438, + 1.95723, 0.58033, + + -4077.02379, -353.39110, -2781.63273, -75.23318, + -312.50478, -23.86495, 24.59887, 32.56837, + 120.09593, -51.00495, + + 0.09737, 0.09111, + + 0.04799, -0.05029, + + 0.08351, -0.33726, 0.03158, -0.06435, + + -0.00523, -0.01736, + + 0.00751, -0.01757, + + -0.00406, -0.01198, + + 0.16402, -0.10986, -0.02024, 0.07205, + + -0.00440, -0.00072, + + -0.00465, 0.00310, -0.00121, -0.00121, + + 0.00083, 0.00020, + + 0.00140, -0.00176, + + 0.00381, -0.00731, + + -0.01618, 0.01570, + + -0.10201, 0.05809, + + -0.03359, 0.01024, + + -0.00535, 0.00018, + + 0.00024, 0.00509, -0.00158, -0.00466, + + 0.00009, -0.00083, + + -0.00700, -0.00090, -0.00011, -0.00079, + + 0.00133, -0.00126, + + 0.01416, 0.05553, 0.04283, -0.06719, + + 0.00119, 0.00291, + + -0.00263, 0.01282, -0.00040, 0.00188, + + -0.00237, 0.00973, + + -0.39533, 0.18773, -0.79821, -0.40168, + + 0.00151, -0.00161, + + 0.00123, -0.00516, + + -0.01432, -0.00293, + + -0.05477, 0.04130, + + -0.48837, 0.18944, + + -0.12552, 9.37098, 1.02045, 5.11382, + 0.72098, -3.70049, -5.80982, 3.30105, + + -0.09682, 0.09696, + + -0.00876, 0.00504, + + 0.00318, 0.00245, + + 0.00563, -0.00665, + + 0.00108, -0.00233, + + -0.00117, 0.00177, + + -0.00343, 0.00503, + + 0.01044, -0.00651, + + 0.00296, -0.00162, + + 0.00037, 0.00028, + + -0.00020, -0.00786, 0.00029, 0.00836, + + 0.00004, 0.00033, + + -0.00309, -0.00086, -0.00157, -0.00086, + + -0.00058, 0.00105, + + -0.04557, 0.01794, + + -0.00122, -0.00086, + + 0.00420, -0.00285, 0.00118, -0.00020, + + 0.00743, -0.01217, + + 0.00053, -0.00084, + + -0.00075, 0.00097, + + -0.00107, 0.00314, + + 0.00576, -0.00505, + + 0.03624, -0.02546, + + 0.05379, 0.30081, 0.29870, -0.22106, + + 0.00696, -0.00801, + + -0.03995, -0.01808, + + -0.00139, 0.00102, + + -0.00059, 0.00138, + + 0.00019, -0.00037, + + 0.00274, 0.00658, 0.00672, -0.01132, + + 0.00023, 0.00051, + + 0.00031, 0.00090, + + -0.00017, -0.00001, + + 0.00085, 0.00004, + + 0.02221, -0.01977, 0.07498, 0.03025, + + -0.00082, -0.00022, + + -0.00073, -0.00028, + + -0.00253, 0.00259, + + -0.01329, 0.01805, + + 0.00096, 0.00833, + + -0.11836, 0.04277, -0.10820, -0.03018, + 0.34504, 0.09834, + + -0.00538, -0.00231, + + 0.00036, 0.00042, + + -0.00023, 0.00260, + + -0.01137, 0.00036, + + 0.01081, -0.03271, + + -0.00029, -0.00028, + + 0.00018, -0.00003, + + 0.00009, 0.00012, + + 0.00127, 0.00343, 0.00100, -0.00064, + + 0.00014, 0.00004, + + 0.00150, 0.00069, + + -0.01484, 0.00135, 0.03930, 0.01405, + + 0.00064, 0.00029, + + 0.00009, 0.00009, + + 0.00054, -0.00048, 0.00019, 0.00005, + + -0.00009, 0.00018, + + 0.00192, -0.00333, + + 0.01824, 0.01071, + + 0.00107, -0.00341, + + 0.25530, -0.18414, -0.84151, -0.31475, + + -0.00400, -0.00010, + + -0.00174, 0.00019, + + 0.00006, -0.00079, + + 0.00066, -0.00070, + + 0.00599, 0.00330, + + -0.00160, -0.00013, + + -0.00067, -0.00006, + + -0.00176, -0.00111, + + 0.00652, 0.00368, + + 0.00004, 0.00001, + + -0.00081, 0.00089, 0.00366, 0.00139, + + 0.00002, 0.00001, + + -0.01870, -0.00998, + + -0.00020, -0.00007, + + 0.00005, 0.00003, + +}; +static double FAR uratabr[] = { + 0.00000, -53.23277, -44.70609, -62.54432, + + -19.15218, 0.10867, + + -1.91911, 1.47517, + + 16.51994, 5.00458, 3.88980, 1.55740, + + 3598.17109, 1831.07574, 2633.34851, 1775.69482, + 497.10486, 488.77343, 6.03892, 31.08365, + -2.06585, -1.12599, + + 230.37762, -113.95449, 162.40244, -46.57185, + 6.70207, 17.27241, -0.66092, -14.42065, + + -0.01044, -0.00287, + + -0.03894, -0.01663, + + 0.01629, 0.00496, + + 0.08411, 0.02855, + + 0.01795, -0.00695, + + 0.02426, -0.03921, + + -0.24495, -0.77369, -0.31404, 0.38668, + -0.05682, -0.17197, + + 0.06145, -0.00510, + + 0.00606, -0.00886, + + -0.00370, -0.00588, + + 0.02173, -0.11909, 0.00302, -0.01796, + + -0.01067, 0.00990, + + 0.05283, 0.06517, + + 59710.89716, -491.12783, 58672.38609, 19564.41947, + 10597.99050, 14313.02561, -2585.52040, 766.78396, + -138.39893, -802.43403, 131.35006, -31.97561, + 7.95978, 8.16075, + + 28.72669, 31.72473, 6.45792, 16.50701, + 0.01066, 1.29718, + + 0.11565, -0.13240, + + 0.05110, -0.01543, + + -0.09994, 0.18864, -0.01330, 0.04148, + + 0.03510, -0.00366, + + 0.00604, -0.00604, + + 0.03752, -0.00256, + + -7.00488, -21.63748, 1.43064, -17.10914, + -0.62987, 0.48719, 0.00697, -1.22665, + + -0.14435, -0.00550, + + 0.32008, -0.19855, + + -13976.73731, -3559.49432, -7709.90803, -9310.80334, + 749.31835, -3491.50696, 540.94979, -84.57550, + 16.96663, 35.53930, + + 37214.64771, -36361.15845, 21093.74492, -31855.33076, + 1500.84653, -7031.97901, -453.40865, -18.36692, + -2.07726, -17.92336, + + -56348.30507, 378512.71483, -111444.43340, 370543.95160, + -61893.70301, 112131.05507, -11977.44617, 9156.15245, + -567.61838, -495.25760, 16.96202, -44.06279, + + 4.24760, -48.83674, + + -643705.49516, -131013.09649, -838580.02217, 67627.11556, + -288441.70339, 150227.25291, -2500.57537, 42676.19888, + 7084.60505, 2043.65642, 9639.56835, -1502.03390, + + -4126.00409, -828.73564, -2801.35204, -2293.77751, + -209.23365, -1045.31476, 95.57334, -102.74623, + 7.19216, 1.89593, + + -0.05661, 0.02166, + + 120.38332, -141.16507, 98.31386, -40.23448, + 10.84269, 17.57713, 1.69239, 1.45065, + -0.19626, 2.76108, + + -0.00270, 0.00360, + + -0.02333, -0.00710, + + -0.01035, 0.02950, + + 0.00737, -0.06311, + + -0.00613, 0.01407, + + 0.01377, 0.00879, + + -0.03287, 0.00012, + + -0.21667, 0.01793, + + -1.54865, 0.10953, + + 0.54543, 0.12102, -9.48047, 0.11477, + + -1.34966, 0.23199, + + -1.50834, 0.26567, -0.64503, 0.10742, + -0.21452, 0.04428, + + -0.01920, -0.00906, + + -0.09378, 0.12773, -0.02787, -0.03090, + + 0.03111, 0.00140, + + 0.03771, -0.01269, + + -1.94794, 1.22823, 0.64183, -1.11467, + + -0.19301, -0.27357, 0.05710, -0.08115, + + -0.07318, 0.00806, + + 0.14286, 0.20297, + + 0.14920, -0.07897, + + 0.09682, 0.02379, + + -0.13928, 0.01679, + + -0.00774, 0.10060, + + 0.24433, 0.16760, + + -2.88905, -1.61439, 2.83052, -3.41031, + 36.37048, 3.37867, + + 0.29321, 0.09687, + + 0.29324, -0.14651, + + 8.11116, 1.79211, 1.36421, 0.88111, + + 1.21683, 2.37950, + + -357.76211, -87.84636, -117.55745, -67.18338, + -5.26029, -6.27559, + + 7509.94562, 3.68942, 4223.62097, -1041.13557, + -74.64464, -251.41613, -166.22180, -1.68190, + -214.55340, 62.79593, + + -0.08250, -0.15936, + + -0.03830, 0.10857, + + 0.21368, 0.50812, 0.00869, 0.09832, + + 0.02158, 0.02045, + + 0.01407, 0.03591, + + 0.03460, 0.01171, + + -0.16400, 0.09751, 0.03521, -0.12858, + + 0.00700, -0.00524, + + 0.01698, -0.04796, 0.04006, 0.00565, + + -0.02783, -0.00205, + + -0.02296, 0.00153, + + -0.16139, 0.01514, + + -0.78136, -0.01546, + + 0.40374, -0.06014, + + 0.06212, -0.01828, + + 0.00831, -0.00173, + + 0.06857, -0.11677, 0.00028, 0.05765, + + -0.00796, 0.00691, + + 0.03764, 0.14902, -0.02653, 0.02122, + + -0.05503, 0.01549, + + 1.56630, -0.35551, -1.87960, 1.14303, + + -0.06063, -0.03425, + + 0.03367, -0.11969, 0.04485, -0.01651, + + 0.04647, -0.02097, + + 0.22841, 0.47362, 0.99226, -0.60660, + + -0.01249, 0.00134, + + -0.07435, 0.00722, + + -0.31796, -0.00015, + + 0.20533, -0.04398, + + 0.93944, -0.26710, + + -5.60051, -9.32918, -5.13538, -4.05130, + -0.56529, 4.34112, 7.18308, -2.66103, + + 0.13241, -0.07999, + + 0.01046, -0.00535, + + -0.04037, -0.00455, + + -0.00510, 0.00731, + + -0.04576, 0.00513, + + -0.15846, -0.00236, + + 0.04628, -0.00463, + + -0.01585, 0.00585, + + -0.00213, 0.00283, + + 0.00778, -0.00198, + + -0.17803, 0.18321, 0.07702, -0.12325, + + 0.01091, 0.00349, + + 0.14211, -0.21830, 0.07289, -0.00994, + + 0.07090, -0.00079, + + 4.18441, -0.07413, + + -0.06247, -0.00011, + + -0.15453, 0.14499, -0.06557, -0.00098, + + 0.00290, 0.02921, + + -0.01923, 0.00457, + + -0.07538, -0.00120, + + 0.02263, -0.00037, + + -0.01061, 0.00591, + + -0.04725, 0.02364, + + -0.07460, -0.24108, -0.28310, 0.14643, + + -0.00700, 0.00427, + + 0.22963, 0.03713, + + -0.02062, 0.00478, + + 0.01434, 0.00095, + + -0.01425, 0.00376, + + 0.29611, -0.08038, -0.37811, 0.21703, + + -0.00723, -0.00924, + + -0.02736, 0.01814, + + 0.00934, 0.00731, + + 0.00613, 0.00686, + + -0.91503, -0.32009, -0.15505, 0.79589, + + -0.00555, -0.01536, + + -0.00698, 0.00480, + + 0.00373, -0.00046, + + 0.00715, -0.00470, + + -0.01970, -0.05238, + + 0.60649, -0.32669, 0.17790, 0.33383, + -2.74922, -0.25827, + + -0.07862, 0.00406, + + -0.00948, -0.02117, + + 0.03127, -0.04199, + + 0.89670, -0.02413, + + 0.01954, 0.03990, + + 0.00063, -0.00071, + + -0.00226, 0.02009, + + -0.04407, -0.05069, + + 0.38230, 0.16101, 0.11893, -0.06125, + + 0.02051, -0.00046, + + 0.39211, 0.03679, + + 0.01666, -0.31336, 53.28735, -0.01791, + + -0.39414, 0.04181, + + -0.01885, 0.00165, + + 0.31349, -0.47359, 0.16133, -0.01023, + + 0.00007, 0.01758, + + -0.13351, 0.07249, + + 0.00977, 0.05445, + + 0.11650, -0.00191, + + -0.09824, 0.40106, 2.41155, -0.30655, + + 0.24975, -0.01248, + + -0.03688, 0.01097, + + 0.00038, -0.00051, + + -0.04736, 0.02610, + + 0.00968, 0.02634, + + 0.07918, -0.00606, + + 0.02735, -0.00320, + + -0.07544, -0.00468, + + 0.19996, -0.01964, + + 0.00201, 0.00267, + + 0.39562, 0.43289, 1.24743, 0.31084, + + -0.00666, 0.00377, + + 0.05668, 0.00148, + + 0.03220, -0.00026, + + 0.03717, 0.01509, + +}; + +static signed char FAR uraargs[] = { + 0, 3, + 2, 1, 7, -2, 8, 0, + 2, 2, 7, -4, 8, 0, + 2, 3, 7, -6, 8, 1, + 2, 2, 5, -5, 6, 4, + 2, 1, 6, -3, 7, 3, + 3, 1, 6, -1, 7, -4, 8, 0, + 3, 2, 5, -7, 6, 6, 7, 0, + 3, 2, 6, -6, 7, 1, 8, 0, + 3, 2, 6, -7, 7, 3, 8, 0, + 3, 2, 6, -8, 7, 4, 8, 0, + 3, 2, 6, -7, 7, 2, 8, 0, + 2, 2, 6, -6, 7, 2, + 3, 1, 5, -4, 6, 4, 7, 0, + 3, 1, 6, -2, 7, -1, 8, 0, + 3, 1, 6, -3, 7, 1, 8, 0, + 3, 1, 6, -4, 7, 3, 8, 1, + 2, 5, 7, -9, 8, 0, + 2, 4, 7, -7, 8, 0, + 2, 2, 7, -3, 8, 6, + 2, 1, 7, -3, 8, 2, + 2, 2, 7, -5, 8, 0, + 2, 3, 7, -7, 8, 0, + 3, 1, 6, -6, 7, 5, 8, 1, + 3, 1, 6, -5, 7, 3, 8, 0, + 3, 2, 5, -8, 6, 8, 7, 0, + 3, 1, 5, -4, 6, 5, 7, 0, + 2, 2, 6, -5, 7, 3, + 3, 1, 6, 1, 7, -9, 8, 0, + 3, 2, 5, -4, 6, -2, 7, 0, + 2, 1, 6, -4, 8, 4, + 2, 1, 6, -2, 7, 4, + 2, 5, 7, -8, 8, 5, + 2, 3, 7, -4, 8, 0, + 1, 1, 7, 5, + 2, 2, 7, -6, 8, 4, + 3, 1, 6, -6, 7, 4, 8, 0, + 2, 1, 6, -4, 7, 4, + 3, 2, 6, -5, 7, 1, 8, 0, + 3, 2, 6, -6, 7, 3, 8, 0, + 2, 2, 6, -7, 7, 0, + 3, 1, 5, -4, 6, 3, 7, 0, + 3, 1, 6, -1, 7, -1, 8, 0, + 2, 1, 5, -2, 6, 0, + 2, 6, 7, -9, 8, 0, + 2, 5, 7, -7, 8, 0, + 2, 4, 7, -5, 8, 0, + 2, 3, 7, -3, 8, 1, + 2, 2, 7, -1, 8, 0, + 2, 1, 7, 1, 8, 2, + 1, 3, 8, 0, + 2, 3, 6, -7, 7, 1, + 3, 2, 5, -3, 6, -4, 7, 0, + 3, 2, 6, -3, 7, -2, 8, 0, + 2, 2, 6, -4, 7, 1, + 3, 2, 6, -5, 7, 2, 8, 1, + 3, 5, 5, -9, 6, -8, 7, 0, + 3, 2, 5, -4, 6, -1, 7, 0, + 3, 1, 6, 3, 7, -8, 8, 0, + 3, 2, 6, -8, 7, 1, 8, 0, + 3, 2, 5, -7, 6, 4, 7, 0, + 3, 4, 5,-10, 6, 2, 7, 0, + 2, 1, 6, -2, 8, 0, + 2, 1, 6, -1, 7, 2, + 2, 8, 7,-12, 8, 0, + 2, 7, 7,-10, 8, 0, + 2, 6, 7, -8, 8, 1, + 2, 5, 7, -6, 8, 0, + 2, 4, 7, -4, 8, 2, + 1, 2, 7, 4, + 1, 4, 8, 0, + 2, 1, 7, -6, 8, 0, + 2, 2, 7, -8, 8, 1, + 2, 3, 7,-10, 8, 0, + 2, 4, 7,-12, 8, 0, + 3, 1, 6, -6, 7, 2, 8, 0, + 2, 1, 6, -5, 7, 1, + 3, 1, 6, -4, 7, -2, 8, 0, + 3, 1, 5, -4, 6, 2, 7, 1, + 3, 1, 5, -2, 6, 1, 7, 0, + 2, 7, 7, -9, 8, 0, + 2, 6, 7, -7, 8, 0, + 2, 5, 7, -5, 8, 0, + 2, 4, 7, -3, 8, 0, + 2, 3, 7, -1, 8, 0, + 2, 2, 7, 1, 8, 0, + 2, 3, 6, -6, 7, 1, + 3, 3, 6, -7, 7, 2, 8, 0, + 3, 2, 5, -3, 6, -3, 7, 1, + 3, 2, 6, -2, 7, -2, 8, 0, + 2, 2, 6, -3, 7, 1, + 3, 2, 6, -4, 7, 2, 8, 0, + 3, 2, 5, -7, 6, 3, 7, 1, + 3, 1, 6, 1, 7, -2, 8, 0, + 1, 1, 6, 1, + 2, 8, 7,-10, 8, 0, + 2, 7, 7, -8, 8, 0, + 2, 6, 7, -6, 8, 0, + 2, 5, 7, -4, 8, 0, + 2, 4, 7, -2, 8, 0, + 1, 3, 7, 3, + 2, 2, 7, 2, 8, 0, + 2, 1, 7, 4, 8, 0, + 2, 1, 5, -4, 7, 0, + 2, 1, 6, -6, 7, 0, + 2, 8, 7, -9, 8, 0, + 2, 7, 7, -7, 8, 0, + 2, 6, 7, -5, 8, 0, + 2, 5, 7, -3, 8, 0, + 2, 4, 7, -1, 8, 0, + 3, 3, 6, -4, 7, -2, 8, 0, + 2, 3, 6, -5, 7, 1, + 3, 3, 6, -6, 7, 2, 8, 0, + 3, 2, 5, -3, 6, -2, 7, 1, + 3, 2, 6, -1, 7, -2, 8, 0, + 2, 2, 6, -2, 7, 0, + 3, 2, 6, -3, 7, 2, 8, 0, + 3, 2, 5, -7, 6, 2, 7, 1, + 2, 1, 6, 1, 7, 0, + 2, 9, 7,-10, 8, 0, + 2, 8, 7, -8, 8, 0, + 2, 7, 7, -6, 8, 0, + 2, 6, 7, -4, 8, 0, + 2, 5, 7, -2, 8, 0, + 1, 4, 7, 1, + 2, 3, 7, 2, 8, 0, + 2, 1, 5, -3, 7, 0, + 2, 9, 7, -9, 8, 0, + 2, 8, 7, -7, 8, 0, + 3, 3, 6, -3, 7, -2, 8, 0, + 2, 3, 6, -4, 7, 1, + 3, 3, 6, -5, 7, 2, 8, 0, + 3, 2, 5, -3, 6, -1, 7, 0, + 3, 2, 5, -8, 6, 4, 7, 0, + 2, 2, 6, -2, 8, 0, + 2, 2, 6, -1, 7, 1, + 3, 2, 6, -2, 7, 2, 8, 0, + 3, 2, 5, -7, 6, 1, 7, 0, + 2, 6, 7, -2, 8, 0, + 1, 5, 7, 0, + 3, 3, 6, -4, 7, 1, 8, 0, + 2, 1, 5, -2, 7, 2, + 3, 1, 5, -3, 7, 2, 8, 0, + 3, 1, 5, -1, 6, 1, 7, 0, + 2, 4, 6, -6, 7, 0, + 2, 3, 6, -3, 7, 0, + 1, 2, 6, 0, + 3, 2, 5, -4, 6, 3, 7, 0, + 3, 1, 5, 1, 6, -4, 7, 0, + 3, 3, 5, -5, 6, -1, 7, 0, + 1, 6, 7, 1, + 3, 1, 5, 1, 7, -4, 8, 0, + 2, 1, 5, -2, 8, 0, + 2, 1, 5, -1, 7, 1, + 3, 1, 5, -2, 7, 2, 8, 0, + 3, 1, 5, -3, 7, 4, 8, 0, + 3, 1, 5, -5, 6, 1, 7, 1, + 3, 1, 5, -1, 6, 2, 7, 0, + 2, 4, 6, -5, 7, 0, + 2, 3, 6, -2, 7, 0, + 3, 1, 5, 1, 7, -2, 8, 0, + 1, 1, 5, 1, + 2, 4, 6, -4, 7, 0, + 2, 3, 6, -1, 7, 0, + 3, 3, 5, -5, 6, 1, 7, 0, + 2, 5, 6, -6, 7, 0, + 2, 4, 6, -3, 7, 0, + 2, 5, 6, -5, 7, 0, + 2, 6, 6, -6, 7, 0, + 2, 2, 5, -3, 7, 0, + 2, 2, 5, -2, 7, 0, + 2, 2, 5, -2, 8, 0, + 2, 2, 5, -1, 7, 1, + 3, 2, 5, -2, 7, 2, 8, 0, + 1, 2, 5, 0, + 2, 3, 5, -3, 7, 0, + 2, 3, 5, -1, 7, 0, + -1 +}; +/* Total terms = 177, small = 171 */ +static struct plantbl FAR ura404 = { + { 0, 0, 0, 0, 5, 10, 9, 12, 0,}, + 6, + uraargs, + uratabl, + uratabb, + uratabr, + 1.9218446061800002e+01, +}; + +/* +First date in file = 625296.50 +Number of records = 16731.0 +Days per record = 131.0 + Julian Years Lon Lat Rad + -3000.0 to -2499.7: 0.44 0.30 0.50 + -2499.7 to -1999.7: 0.39 0.20 0.39 + -1999.7 to -1499.7: 0.31 0.15 0.31 + -1499.7 to -999.8: 0.32 0.19 0.36 + -999.8 to -499.8: 0.29 0.15 0.29 + -499.8 to 0.2: 0.31 0.14 0.27 + 0.2 to 500.2: 0.28 0.14 0.27 + 500.2 to 1000.1: 0.34 0.15 0.39 + 1000.1 to 1500.1: 0.31 0.16 0.31 + 1500.1 to 2000.1: 0.33 0.16 0.29 + 2000.1 to 2500.0: 0.38 0.21 0.36 + 2500.0 to 3000.0: 0.43 0.25 0.46 + 3000.0 to 3000.4: 0.122 0.071 0.260 +*/ +static double FAR neptabl[] = { + -1376.86480, 730.38970, 78655362.50948, 1095691.38676, + + -196.19023, 2086.77782, + + -122.04650, -276.81592, + + 184.56164, -148.08924, + + 3.39142, -14.75027, + + -9.22741, 0.87688, + + -0.13903, -0.44707, + + -0.17668, -0.36299, + + -0.12682, -0.26636, + + -0.51426, -0.24667, + + -0.04965, -0.03177, + + 0.05050, -0.00249, + + -0.80362, -0.07363, -0.15436, -0.07180, + + 2.45034, -3.50145, 0.86698, 0.09777, + + 7.72386, 7.16565, 2.10273, 8.86682, + + 2.44705, 77.90155, + + 0.28323, -11.87157, -13.64083, 252.70556, + + -4.94214, -6.17988, -305.60504, 51.23962, + -2759.81719, 2476.20912, + + 12.65762, 13.31543, + + 0.36996, -0.19077, 0.67363, 0.36737, + + 0.02312, 0.02216, + + 0.09953, 0.04777, + + -0.00572, -0.02772, + + -0.02478, -0.21920, + + -0.15289, -1.50784, + + -0.17822, 0.34638, -0.70473, -8.61559, + + -2.65756, 1.25632, + + -0.31453, -1.40348, -4.02571, -1.50467, + -69.62308, 3.21315, + + 0.69973, 0.08832, + + -0.00551, -0.04964, + + -0.02264, -0.34881, + + 0.00762, -1.85072, + + 0.01407, -0.30457, + + -0.09851, -0.02372, + + -0.07729, -0.11602, -0.75995, -0.71884, + + -0.08585, -0.30406, 0.45818, 0.14921, + + -0.01033, -0.11776, + + 0.00640, -0.57717, + + -0.01014, -0.01357, -0.00544, -0.02168, + + 0.40468, 0.28195, 0.00668, 0.14448, + + 0.01245, -0.08956, + + -0.26283, 0.01864, -0.00641, 18.55347, + + 0.01460, 0.08284, + + -0.04785, 0.11360, + + -0.33861, 0.01327, -0.06392, -0.18758, + + 0.05449, -0.05583, + + -0.00435, -0.09869, + + -0.00286, -0.04613, + + -0.00395, -0.14564, + + -0.01385, -0.01762, + + 0.21160, -0.61631, -0.52100, -0.04583, + + 0.32812, 0.32138, + + 0.04749, -0.05724, + + 0.11239, 0.13216, + + -0.01203, 0.40084, -0.05207, 34.07903, + + -0.21457, -0.34938, -0.04594, 0.11198, + + -0.30662, -0.20776, -0.01076, -0.10959, + + 0.10891, -0.10304, + + -0.28141, 0.25061, -0.20293, 0.79930, + +}; +static double FAR neptabb[] = { + -391.05987, -243.95958, -23.83558, 58.13857, + + 5.04859, -3.93183, + + -14.21914, 7.14247, + + -12.09415, -9.70132, + + 1.04307, 0.47323, + + -0.07504, 0.70575, + + -0.05239, 0.00482, + + -0.02916, 0.00877, + + -0.00528, -0.00286, + + 0.00028, -0.00228, + + -0.00056, -0.00149, + + 0.00049, 0.00047, + + -0.18765, -0.59571, 0.03742, -0.14653, + + 2.30535, 0.65092, 0.42216, 0.24521, + + -2.86932, 2.37808, -0.58456, 0.27446, + + -1.12264, -2.04413, + + -11.71318, -1.41554, -23.30671, -24.70499, + + 8.82738, 85.64657, -90.02223, 22.42604, + -4749.41359, -4244.46820, + + 25.20811, -18.51469, + + -1.19892, -0.61067, 0.67734, -1.08912, + + -0.01607, 0.00626, + + -0.00008, 0.00126, + + -0.00330, -0.00078, + + -0.01503, 0.00758, + + -0.13208, -0.00218, + + -0.04522, 0.20297, -0.94708, -0.77897, + + -2.74075, -3.01122, + + -1.03394, 0.00886, 1.55485, -4.68416, + -0.13244, -57.26983, + + 0.05589, -0.55396, + + -0.00130, 0.00526, + + -0.01028, 0.02086, + + 0.01334, 0.00699, + + 0.08565, 0.02020, + + 0.01001, -0.08402, + + 0.08558, -0.04488, 0.57268, -0.59574, + + 0.00807, 0.00492, 0.21993, -0.18949, + + -0.00396, 0.00735, + + 0.00487, 0.00230, + + 0.00699, -0.00473, 0.01406, -0.00139, + + 0.00738, 0.00099, 0.00161, 0.00019, + + -0.00067, -0.00047, + + 0.00572, -0.00486, -0.00842, 0.00322, + + 0.00018, -0.00109, + + -0.00272, 0.00112, + + -0.00041, 0.00763, 0.00211, 0.00118, + + -0.46842, -0.17877, + + 0.00209, -0.00179, + + 0.00090, -0.00075, + + 0.00618, 0.00610, + + 0.00015, 0.00032, + + -0.00123, 0.00026, 0.00332, 0.00135, + + 0.39130, -0.34727, + + 0.00015, -0.00027, + + -0.00026, -0.00052, + + 0.00162, 0.00913, -0.00697, 0.00308, + + -0.00333, -0.00258, -0.00117, 0.00035, + + 0.00766, 0.00194, 0.00135, 0.00067, + + -0.41171, 0.24241, + + 0.00106, 0.00025, 0.00013, -0.00019, + +}; +static double FAR neptabr[] = { + -767.68936, -460.59576, -52.41861, -273.85897, + + 59.52489, 1.85006, + + -39.64750, 23.63348, + + -34.60399, -23.41681, + + 2.74937, 1.55389, + + 0.20343, 2.15502, + + -0.12846, 0.07199, + + -0.07555, 0.05582, + + -0.04354, 0.01546, + + -0.03931, 0.07623, + + -0.00491, 0.00661, + + 0.00322, 0.01540, + + -0.06741, -0.35343, 0.00469, -0.08073, + + 1.94975, 0.66376, 0.06137, 0.31426, + + -2.93841, 4.27732, -4.00342, 1.11157, + + -36.87785, 1.24960, + + 4.69573, 2.15164, -114.24899, -6.69320, + + 12.99919, -9.47795, -21.82350, -156.88624, + -1237.19769, -1379.88864, + + 6.54369, -6.20873, + + -0.14163, -0.32700, 0.17937, -0.34864, + + 0.01393, -0.01286, + + 0.02876, -0.05767, + + 0.02210, -0.00128, + + 0.16495, -0.01242, + + 1.15915, -0.10365, + + -0.33224, -0.10045, 6.83719, -0.27499, + + -0.31284, -0.94332, + + 1.63704, -0.33318, 1.48134, -1.32257, + 0.96498, -8.31047, + + -0.00402, -0.09441, + + 0.04292, -0.00444, + + 0.30325, -0.02012, + + 1.67999, 0.00353, + + 0.00467, 0.03556, + + 0.01393, -0.01229, + + 0.01188, -0.01390, 0.04615, -0.03509, + + 0.32423, -0.12491, 0.13682, 0.15131, + + 0.11221, -0.01201, + + 0.57239, 0.00093, + + 0.02068, -0.01162, 0.00647, -0.00325, + + 0.27010, -0.42993, 0.14314, -0.01353, + + -0.08757, -0.00699, + + 0.00199, 0.31873, 18.80329, 0.01681, + + 0.08009, -0.00998, + + -0.14421, -0.15912, + + 0.37208, 0.49744, 0.35144, 0.06582, + + -0.11501, -0.14037, + + 0.10352, -0.00768, + + 0.04826, -0.00423, + + 0.19850, 0.00310, + + -0.01780, 0.01350, + + -0.61106, -0.20525, -0.04388, 0.52143, + + 0.19300, -0.21446, + + -0.05749, -0.04776, + + 0.12877, -0.10908, + + 0.39821, 0.00627, 34.03956, 0.04392, + + -0.34455, 0.22015, 0.11743, 0.04638, + + 0.20723, -0.30447, 0.10976, -0.01008, + + -0.20778, -0.21822, + + 0.24939, 0.27976, 0.79790, 0.20200, + +}; + +static signed char FAR nepargs[] = { + 0, 3, + 2, 1, 7, -2, 8, 0, + 3, 3, 5, -8, 6, 3, 8, 0, + 2, 2, 7, -4, 8, 0, + 3, 1, 5, -3, 6, 3, 8, 0, + 2, 3, 7, -6, 8, 0, + 2, 4, 7, -8, 8, 0, + 3, 1, 6, -6, 7, 6, 8, 0, + 3, 1, 6, -5, 7, 4, 8, 0, + 3, 1, 6, -4, 7, 2, 8, 0, + 2, 1, 6, -3, 7, 0, + 3, 1, 6, -2, 7, -1, 8, 0, + 2, 5, 7, -9, 8, 1, + 2, 4, 7, -7, 8, 1, + 2, 3, 7, -5, 8, 1, + 2, 2, 7, -3, 8, 0, + 2, 1, 7, -1, 8, 1, + 1, 1, 8, 2, + 2, 1, 7, -3, 8, 0, + 2, 2, 7, -5, 8, 1, + 3, 1, 6, -6, 7, 5, 8, 0, + 3, 1, 6, -5, 7, 3, 8, 0, + 2, 5, 7, -8, 8, 0, + 2, 4, 7, -6, 8, 0, + 2, 3, 7, -4, 8, 0, + 2, 2, 7, -2, 8, 1, + 1, 1, 7, 0, + 1, 2, 8, 2, + 2, 1, 7, -4, 8, 0, + 2, 5, 7, -7, 8, 0, + 2, 4, 7, -5, 8, 0, + 2, 3, 7, -3, 8, 0, + 2, 2, 7, -1, 8, 0, + 2, 1, 7, 1, 8, 0, + 1, 3, 8, 1, + 2, 1, 6, -2, 8, 1, + 2, 5, 7, -6, 8, 0, + 2, 4, 7, -4, 8, 0, + 1, 4, 8, 1, + 3, 2, 5, -4, 6, -1, 8, 1, + 3, 1, 6, 1, 7, -3, 8, 0, + 2, 1, 6, -1, 8, 1, + 3, 1, 6, -1, 7, 1, 8, 0, + 3, 2, 5, -6, 6, 1, 8, 0, + 2, 5, 7, -5, 8, 1, + 1, 1, 6, 0, + 2, 6, 7, -6, 8, 0, + 2, 7, 7, -7, 8, 0, + 2, 2, 6, -2, 8, 0, + 3, 2, 5, -3, 6, -1, 8, 0, + 2, 2, 6, -1, 8, 1, + 2, 1, 5, -2, 8, 0, + 3, 3, 5, -5, 6, -1, 8, 0, + 2, 4, 7, 5, 8, 0, + 2, 1, 5, -1, 8, 1, + 3, 1, 5, -1, 7, 1, 8, 1, + 3, 1, 5, -5, 6, 1, 8, 1, + 1, 1, 5, 0, + 2, 2, 5, -1, 8, 1, + -1 +}; +/* Total terms = 59, small = 58 */ +static struct plantbl FAR nep404 = { + { 0, 0, 0, 0, 3, 8, 7, 9, 0,}, + 3, + nepargs, + neptabl, + neptabb, + neptabr, + 3.0110386869399999e+01, +}; + +/* +First date in file = 625296.50 +Number of records = 16731.0 +Days per record = 131.0 + Julian Years Lon Lat Rad + -3000.0 to -2499.7: 1.17 0.90 0.83 + -2499.7 to -1999.7: 0.57 0.51 0.58 + -1999.7 to -1499.7: 0.63 0.39 0.40 + -1499.7 to -999.8: 0.40 0.45 0.41 + -999.8 to -499.8: 0.42 0.22 0.30 + -499.8 to 0.2: 0.41 0.24 0.35 + 0.2 to 500.2: 0.58 0.24 0.26 + 500.2 to 1000.1: 0.47 0.35 0.33 + 1000.1 to 1500.1: 0.43 0.31 0.28 + 1500.1 to 2000.1: 0.37 0.40 0.35 + 2000.1 to 2500.0: 0.46 0.35 0.39 + 2500.0 to 3000.0: 1.09 0.70 0.46 + 3000.0 to 3000.4: 0.871 0.395 0.051 +*/ +static double FAR plutabl[] = { + 74986469.33577, 100898343.73690, 48199471.54076, 9520076.03177, + 690431.67340, -427355.12716, 52266623.77862, 860190.70714, + + -21.08511, -143.39295, + + -126.71124, 48.18528, + + -88.74508, 40.50942, + + 51.29367, -10.24075, + + 0.63094, 32.03258, + + -410.00781, 399.90234, -116.54319, 51.50329, + + 116.84565, 687.76781, -13.38605, 182.70107, + + -1668.12226, -5162.22648, -585.68297, -2247.56041, + -20.95875, -193.13703, + + -57.12097, -10.35058, + + -1778.01442, -6463.73779, -657.86093, -2713.44436, + -41.32560, -211.82042, + + -107.16513, -36.58628, + + 97929588.08231, -33582903.63417, 143382679.31770, -47411568.92345, + 79428827.73581, -24658834.87499, 19861233.17488, -5755585.62084, + 1995060.95931, -693507.08147, 135176.31467, 109360.38672, + -8188.00598, -1680.95072, 71020.19608, -70785.39049, + + -24.56034, -20.34919, + + 1618.45976, -2079.48538, 635.62954, -850.87068, + 44.95257, -64.04459, + + -18.61475, -1.77734, + + 9.38079, 5.19958, + + 17422.08783, -4872.53852, 10985.76629, -1137.68569, + 1771.28893, 288.93745, 40.22664, 37.90027, + + 6.81361, -32.65868, + + 16.97268, 11.76152, + + 29.33024, -12.92289, + + -55.13187, -14.73791, + + 7.52474, -102.05060, + + 182.53144, -20.18960, + + -490237997.49400, 486646248.63360, -781277018.26430, 602300460.57290, + -463787999.46420, 249529525.96100, -123964746.86420, 31353019.97807, + -13353800.92159, -3463382.63269, -35469.17654, -1035343.45385, + 65076.64025, -38181.61312, -16473.33813, 3928.44674, + + 188.60263, 1000.42530, + + -208376.39376, -700566.62363, 114839.84613, -342407.71113, + 39467.04812, -14553.84849, + + 581895.26100, 1012499.16715, 406317.22416, 310804.78515, + 43625.07033, -4157.26545, + + -5930.13795, -2070.62413, + + 3348.17582, -10871.23729, + + 144609.18550, 60383.63650, 27912.02226, 15254.61228, + + -98561.37758, -67442.28158, -15573.63338, -19931.99773, + + 24323.06905, -37473.32558, 2840.64042, -8911.23694, + + -19636.31898, 71725.21946, -12280.54554, 12251.00101, + + 88626.52260, 5513.68450, 18506.41546, -6513.87434, + + -83350.14621, 44300.00743, -22075.37353, 3731.57531, + + -29167.76020, -21642.67384, + + 56602666.72177, -22225578.01823, 50576897.80669, -50319847.79086, + 5689259.25622, -29585299.79697, -4249711.27661, -4490830.29568, + -727678.08724, 366050.85631, 19183.62792, 55647.98226, + + 1897.78091, -1091.03988, 432.38158, -138.62556, + + 101.38743, 25.67379, + + 320.20735, 362.16615, 85.06067, 54.02616, + + 2.39460, 18.70004, + + -8.43353, 2.72100, + + -3.11205, -3.06201, + + 136.31503, -28.33620, 48.68781, -18.45285, + 1.15302, -1.52360, + + -0.13706, -0.37489, + + 0.08750, -0.14579, + + -0.07051, -0.06518, + + 0.30237, -0.00448, + + 4.83172, 6.83684, + + 1752447.78043, -945086.75857, 2340978.12819, -1963675.42559, + 1254147.25257, -1274861.91191, 279459.60237, -263954.01378, + 11835.62290, -16344.44434, 9119.98960, -2390.44218, + -23.67909, 86.73916, -642.78635, -1290.12208, + + -0.43345, -1.85348, + + 0.03094, -0.01655, + + 0.12380, 0.31834, + + 5.54756, -1.63109, 1.10598, -0.17578, + + 2.66994, -2.17573, 0.97360, -0.92226, + + -0.18533, -0.39747, + + 0.45809, -0.65286, + + 0.26129, 0.91922, + + 0.81068, 0.11183, + + 6.32182, 14.16786, 0.20872, 3.28489, + + -1.47458, -2.11724, + + 1.70020, -1.99889, + + 3.13003, 1.90638, + + -4483669.52795, -446454.90158, -6586256.67478, -671890.16779, + -3620444.55554, -499672.41074, -855998.32655, -191073.94266, + -73186.69110, -22649.38582, -2414.81729, -1294.40542, + 436.80907, 125.48109, -81.16877, 458.86508, + + -11.57414, -26.39114, -4.00801, -5.01054, + + -18.17569, 20.86879, -4.80965, 3.10535, + + -4.71122, 1.18169, + + 74.75544, 649.21464, -26.55060, 272.35592, + -8.06982, 16.86110, + + -26.54868, 26.75711, + + -35.82910, 38.51063, + + 22.22814, 19.38336, + + -6.30462, 0.90602, + + 0.62856, -0.34981, + + -0.10232, -0.00939, + + 0.04439, -0.18875, + + 0.16025, 0.11306, + + -0.06803, 0.06004, + + -91305.66728, 262370.61704, -194633.44577, 304838.17733, + -124505.90904, 94111.75602, -22317.18255, 1575.23438, + 748.66316, -349.78711, 166.64450, -89.05045, + 120.76207, -100.26715, + + 3.13806, 3.71747, + + -1.44731, -0.35235, + + -0.51660, -1.50621, + + 2.81310, -3.93573, 1.20292, -0.36412, + + -0.03340, -0.00561, + + -5.29764, 26.02941, 1.91382, 3.30686, + -3.35265, -3.20868, + + 0.05807, -0.11885, + + -0.78588, 0.34807, -0.19038, 0.11295, + + -0.03642, -0.03794, + + 0.00251, 0.03449, + + -0.08426, -0.00310, + + 0.05297, -0.09278, + + 0.10941, 0.00099, + + -228688.56632, 312567.73069, -331458.31119, 328200.19460, + -143760.57524, 104182.01134, -17313.30132, 12591.15513, + -440.32735, -105.67674, 104.35854, -852.84590, + 0.95527, 0.30212, -54.63983, 4.06948, + + 0.07545, -0.13429, + + 16.21005, 29.24658, 9.23410, 50.48867, + 30.55641, 12.76809, 0.11781, 0.70929, + -0.04100, 13.60859, + + 0.04976, -0.02083, + + 0.36279, 0.30130, -0.02129, 0.09363, + + -0.07812, 0.01570, + + -0.06217, -0.37181, + + -29348.55031, 43889.87672, -35765.41577, 33855.90070, + -10128.69894, 4535.32148, 281.75353, -218.49194, + -7.55224, 134.28640, 2.11319, -2.13109, + 15.71244, 11.07183, + + -0.05406, -0.23337, + + -1.28949, 1.34281, + + 0.04212, -0.02080, + + 0.08109, 0.14820, + + -6010.46564, 3639.41780, -5973.16000, 1381.66999, + -1177.36865, -501.06937, 166.14792, -103.36431, + 14.92766, 4.12877, -2.20893, -6.32033, + + -0.29038, -0.43172, + + -0.59341, 0.20477, -0.13143, -0.03150, + + 0.10992, 0.01976, + + -0.00254, 0.02028, + + -0.30044, -0.44658, -0.03409, -0.10758, + + 0.08349, 0.06153, + + -0.06055, 0.18249, + + -1.15341, -8.68699, -0.11348, -3.30688, + + 1.08604, 1.04018, + + -0.46892, -0.69765, 0.21504, 0.01968, + + -0.00455, -0.01678, + + 3.95643, -3.17191, 3.95220, -2.12670, + 0.99305, -0.16651, + + 0.34839, -0.49162, + + 0.85744, 0.20173, -0.00975, 0.20225, + + -0.02627, -0.02281, + + -0.18002, -0.01803, + + -0.06144, -0.21510, + + 0.15935, -0.01251, + + -0.21378, 0.44806, -0.01174, 0.05779, + + 0.07646, -0.19656, -0.04044, -0.02521, + + 0.02996, 0.06169, + + 0.16698, -0.04710, -0.06506, -0.02114, + + 0.05500, 0.00276, + + 0.08433, 0.03160, + + 0.08193, 0.35773, 0.05454, 0.10718, + + -0.02823, -0.00839, + + 0.54078, 0.49347, 0.09609, 0.11825, + + -0.16092, -0.11897, + + 0.09059, 0.08254, + + 0.16712, 0.05860, + + -0.09547, -0.03206, + + 0.03876, 0.04719, + + -0.02345, 0.02240, + + -0.00609, -0.00649, + + 0.03859, 0.00077, + + 0.47819, 0.26196, 0.09780, 0.08104, + + -0.16919, 0.05042, + + -0.42652, 0.30810, + + -0.03409, -0.51452, + + -0.23120, -0.01380, + + -0.01157, -0.00143, + + -0.00512, -0.01628, + + -0.00189, 0.00183, + + -0.01427, -0.02861, + + 0.00618, -0.00015, + + 0.13087, 0.13870, + + 0.15158, -0.21056, + + -3.94829, -1.06028, -1.36602, 0.77954, + + 0.08709, -0.03118, + + -44.74949, 91.17393, 8.78173, 45.84010, + 1.97560, -15.02849, -0.10755, -0.02884, + 3.38670, 0.30615, + + 130.92778, -24.33209, 43.01636, -40.81327, + -19.43900, 22.18162, -0.12691, 0.33795, + -6.44790, -6.23145, + + 0.00319, 0.01141, + + -0.03252, 0.03872, + + 0.04467, 0.01614, + + -0.00382, -0.00019, + + 0.05955, 0.01533, + + 16.11371, 41.37565, 61.44963, 6.90615, + 1.41326, -0.73920, -0.03871, 24.81978, + + -0.10229, -0.32775, -0.05188, -0.05628, + + -2.33618, 2.39053, + + -0.00584, 0.00436, + + 0.20903, 0.02220, + + -0.01738, -0.02765, + + -0.00217, 0.00613, + + -0.01772, 0.01903, + + 0.07075, -0.00530, + + 0.15234, -0.37760, -0.11641, -0.20102, + + -0.63675, 0.20525, -0.15783, 0.58945, + + -0.06243, 0.04306, + +}; +static double FAR plutabb[] = { + -35042727.30412, -49049197.81293, -25374963.60995, -5761406.03035, + -467370.57540, 14040.11453, 2329.15763, -13978.69390, + + 45.43441, 29.70305, + + 32.33772, -38.34012, + + 26.43575, -28.76136, + + -18.59040, 12.64837, + + 5.56569, -12.51581, + + 248.37350, -64.44466, 54.02618, 4.39466, + + -269.35114, -290.63134, -48.03841, -52.83576, + + 1508.94995, 1682.78967, 554.02336, 715.65819, + 34.37602, 58.44397, + + 16.63685, 16.10176, + + -1069.51609, 2300.89166, -437.16796, 927.89245, + -33.17679, 68.74495, + + 18.72022, 32.97640, + + -34004958.12619, -17758805.77098, -48416073.75788, -24973405.03542, + -25374996.23732, -13351084.97340, -5738294.54942, -3082092.63350, + -519989.39256, -206440.89101, 44186.23548, -87639.22630, + 2506.47602, 2327.01164, -53878.47903, -19670.13471, + + 2.66934, -3.86086, + + 106.32427, 576.47944, 46.56388, 218.28339, + 4.35402, 15.04642, + + 2.68717, -2.86835, + + 0.81728, -2.34417, + + -1604.85823, -1999.24986, -631.47343, -1382.19156, + -15.74075, -256.97077, 6.99648, -4.54257, + + 2.63478, 1.88838, + + 0.17628, -2.11518, + + -2.46735, -1.48743, + + 1.83456, 4.68487, + + -7.10919, 3.57046, + + -5.36342, -7.70367, + + 28395956.20816, -37176795.74372, 48969952.83034, -48145798.96248, + 31155823.23557, -21163596.14822, 9057634.38260, -3167688.51696, + 1167488.70078, 219103.97591, -19017.97335, 107849.61195, + -3814.43474, 4405.92120, 5800.13959, 12619.88708, + + 22.18168, -89.47801, + + 52202.81929, 55119.44083, 5082.58907, 37955.06062, + -3165.24355, 3316.67588, + + -113906.43970, -69279.41495, -57358.07767, -10176.17329, + -4179.79867, 2495.99374, + + 787.87180, -154.35591, + + -1148.62509, 1034.58199, + + -22194.95235, 3341.97949, -4578.53994, 108.30832, + + 7444.39789, 16646.40725, 509.75430, 3808.92686, + + -179.85869, 7408.76716, 340.65366, 1504.64227, + + -3783.09873, -13505.60867, 875.74489, -3181.27898, + + -16220.93983, 8041.37347, -2631.07448, 2899.50781, + + 18894.92095, -20072.81471, 5925.05701, -1947.91902, + + -6731.56601, 8014.52403, + + -987793.49463, 6491762.34471, -279205.73643, 6117135.96868, + -140925.91402, 2259422.06929, 114028.61646, 605600.90358, + 91858.00186, 56506.65187, 8949.15777, -9782.67413, + + -394.66541, -105.19208, -76.54752, -32.59411, + + -19.28741, 10.40013, + + -107.64003, -7.36229, -22.25126, 4.05952, + + -3.74402, -2.79308, + + 1.03337, -2.13968, + + 1.53794, -0.02617, + + 35.70756, 12.97733, 14.46213, 6.20518, + 1.79381, 1.65422, + + -0.31216, 0.29053, + + -0.03538, -0.01584, + + -0.08934, 0.00079, + + 0.05539, -0.21591, + + 2.86929, -2.24724, + + 320797.07455, 93342.16556, -20903.39115, 79523.22083, + -226588.37473, -121017.23944, -48472.25935, -74195.36778, + -7962.48081, -4607.76339, -4597.33274, -7983.12541, + -20.34500, 56.82999, -1038.19507, 619.69624, + + 1.08907, -0.91278, + + -0.13391, 0.34956, + + -0.19982, -0.18296, + + -0.97688, 2.36806, -0.30127, 0.50980, + + 0.96103, 1.96432, 0.43338, 0.87317, + + 0.36997, -0.01583, + + -0.44692, -0.25159, + + -0.53525, 0.01154, + + -0.13231, 0.35562, + + 3.88928, -4.02882, 1.06967, -0.56305, + + -0.45204, 0.77213, + + -0.82873, -0.25854, + + 0.21136, -1.06696, + + 458529.05491, 616790.47568, 698431.01349, 1124501.41713, + 300226.10339, 766533.33698, 26896.22954, 207880.75720, + 1116.29607, 21793.26153, -850.64044, 3528.95568, + 29.61278, -120.13367, 376.95131, 66.45758, + + -3.64868, 2.76062, -0.85352, 0.95115, + + 5.35056, 2.52803, 0.90026, 0.76403, + + 0.43191, 0.83605, + + 125.81792, -39.65364, 50.14425, -5.75891, + 2.78555, 2.05055, + + -4.27266, -4.92428, + + 6.78868, 5.73537, + + 3.35229, -3.70143, + + 0.08488, 1.07465, + + 0.10227, 0.06074, + + 0.00291, 0.01522, + + -0.02274, 0.00297, + + 0.01095, -0.01856, + + -0.02862, 0.00178, + + 143640.07486, 707.21331, 177163.08586, 53386.52697, + 56856.89297, 48268.74645, 1764.52814, 7711.76224, + 352.34159, -968.03169, -45.16568, -81.60481, + -76.35993, -98.06932, + + -1.42185, 1.81425, + + -0.23427, 0.59023, + + 0.57127, -0.36335, + + 1.89975, 0.66890, 0.28797, 0.43592, + + -0.03769, 0.03273, + + -6.06571, -2.68515, -0.55315, 0.86977, + 1.53840, -0.59422, + + -0.05453, 0.02447, + + -0.12658, 0.22814, -0.01715, 0.08497, + + -0.01288, -0.00606, + + 0.01547, -0.00692, + + 0.01157, 0.02407, + + -0.03883, 0.00835, + + -0.01542, -0.04761, + + 174386.39024, 158048.26273, 159192.81681, 220154.55148, + 33716.11953, 87537.86597, -116.90381, 7535.83928, + -962.06994, -132.28837, -644.90482, -110.52332, + 3.42499, 3.74660, -0.94008, 41.55548, + + -0.03824, -0.05607, + + 28.74787, -37.31399, 30.87853, -26.11940, + 10.79742, -5.97905, 1.01237, -0.04429, + 0.54402, 0.41905, + + -0.02440, -0.03991, + + -0.00347, -0.04362, -0.00347, -0.00469, + + -0.02707, 0.02761, + + -0.17773, -0.11789, + + 26475.02580, 35363.04345, 19877.11475, 41430.35940, + 2948.09998, 12983.41406, 281.93744, 570.70054, + 147.83157, 16.00090, -1.62814, -8.30846, + 9.29131, -10.16496, + + -0.15799, 0.03843, + + 1.44716, 0.46953, + + -0.02150, -0.02502, + + 0.08861, -0.06690, + + 2237.41551, 3739.08722, 753.74867, 3460.41553, + -298.69226, 520.47031, -33.62615, -138.12767, + 3.61843, -8.29860, -4.56656, 0.79553, + + 0.20041, -0.25771, + + -0.35233, -0.27913, -0.02799, -0.08328, + + -0.06889, -0.16853, + + 0.01701, -0.00964, + + -0.37737, 0.18030, -0.08525, 0.01906, + + 0.05236, -0.05155, + + 0.11320, 0.05991, + + -5.66926, -0.54402, -2.08508, -0.39407, + + 0.82155, -0.55975, + + 0.39168, -0.25551, 0.00623, 0.16162, + + -0.02519, 0.02420, + + -1.23293, -3.19649, -0.60519, -2.79729, + 0.05362, -0.61569, + + -0.25638, -0.27033, + + -0.03987, 0.46623, -0.12070, 0.00643, + + 0.00849, -0.00768, + + -0.03687, 0.10445, + + -0.13544, -0.00592, + + 0.02078, 0.09172, + + 0.15824, 0.15815, 0.02020, 0.00747, + + 0.10919, 0.09553, 0.01953, -0.00135, + + 0.04266, -0.00218, + + 0.02182, -0.13742, -0.01249, 0.01724, + + -0.02200, 0.02975, + + -0.01401, 0.03416, + + -0.28873, 0.04235, -0.08137, 0.04223, + + -0.00326, 0.02144, + + -0.40423, 0.14281, -0.08256, 0.02142, + + 0.08116, -0.03680, + + -0.02324, 0.07260, + + -0.06746, 0.11645, + + 0.03233, -0.05997, + + -0.03101, 0.02197, + + -0.00896, -0.00491, + + 0.00574, 0.00855, + + 0.00052, 0.01209, + + -0.31828, 0.29955, -0.08133, 0.04318, + + 0.06787, -0.08865, + + -0.13228, -0.06507, + + 0.34008, 0.06417, + + -0.00177, -0.15116, + + -0.00553, -0.01950, + + 0.01144, -0.00309, + + -0.00115, -0.00153, + + 0.02063, -0.00791, + + -0.00314, 0.00493, + + -0.10614, 0.08338, + + 0.08845, 0.20168, + + 1.38955, -2.52285, -0.30475, -1.05787, + + 0.00580, 0.06623, + + -44.33263, -47.70073, -29.80583, -8.77838, + 7.02948, 2.77221, 0.05248, -0.13702, + -0.78176, 1.77489, + + -16.32831, 46.68457, 2.54516, 21.78145, + -5.09080, -8.42611, -0.24419, -0.03315, + 2.80629, -1.12755, + + -0.00402, 0.00053, + + 0.00024, -0.00043, + + 0.00403, -0.00210, + + 0.00603, 0.00411, + + -0.00260, 0.00416, + + 2.29235, 3.05992, 2.36465, -0.58750, + 0.14030, 0.13523, 0.89998, 0.70156, + + -0.02188, 0.02003, -0.00533, 0.00447, + + 2.96411, 1.30183, + + 0.01422, 0.00624, + + -0.10737, -0.38316, + + -0.05968, 0.04379, + + 0.01171, 0.01180, + + -0.00989, -0.01375, + + -0.00845, 0.03782, + + 0.09484, 0.09909, 0.07640, -0.00898, + + -0.01076, 0.02760, 0.01630, 0.02198, + + 0.05985, 0.04130, + +}; +static double FAR plutabr[] = { + 17990649.12487, 24806479.30874, 12690953.00645, 2892671.69562, + 249947.71316, -5138.71425, 1142.68629, 6075.25751, + + -34.76785, -19.72399, + + -15.81516, 30.47718, + + -11.73638, 21.87955, + + 9.42107, -10.40957, + + -5.59670, 6.85778, + + -167.06735, -2.31999, -32.42575, -13.72714, + + 130.16635, 117.97555, 31.33915, 39.64331, + + -1378.54934, -395.83244, -562.79856, -167.74359, + -45.12476, -17.08986, + + -4.20576, -16.56724, + + 1762.12089, -1148.86987, 736.55320, -423.09108, + 56.13621, -26.26674, + + 9.77810, -38.05151, + + 4702224.98754, 27254904.94363, 5306232.25993, 39518429.29982, + 1725110.05669, 21833263.27069, 46010.62605, 5425411.66252, + 17238.09865, 536771.62156, -61263.36051, 66270.70142, + 2084.66296, -1936.71208, 35898.49503, 34885.28549, + + 1.93276, 10.66292, + + -665.11445, 3.70467, -265.68478, 16.16272, + -19.45954, 2.32738, + + 3.04237, 3.97339, + + -2.64312, 0.66308, + + -3207.68754, 3418.03720, -2342.62310, 1729.15030, + -450.84643, 179.00943, -13.20367, -1.86087, + + -4.95659, 7.22347, + + -5.08890, -1.28891, + + -6.21713, 5.10551, + + 13.97276, 0.44529, + + 3.25177, 25.02775, + + -45.56672, 11.58470, + + 124443355.55450, -100018293.41775, 190506421.77863, -118262753.40162, + 108199328.45091, -45247957.63323, 27272084.41143, -4125106.01144, + 2583469.66051, 1024678.12935, -22702.55109, 199269.51481, + -15783.14789, 5564.52481, -427.22231, -6330.86079, + + -97.50757, -204.32241, + + -9060.54822, 156661.77631, -47791.83678, 59725.58975, + -8807.74881, -92.38886, + + -28886.11572, -244419.59744, -53336.36915, -92232.16479, + -8724.89354, -2446.76739, + + 889.71335, 936.51108, + + 494.80305, 2252.83602, + + -18326.60823, -25443.13554, -3130.86382, -5426.29135, + + 23494.08846, 91.28882, 4664.14726, 1552.06143, + + -8090.43357, 2843.48366, -1445.73506, 1023.11482, + + 11664.20863, -7020.08612, 3100.21504, -64.16577, + + -9724.97938, -12261.47155, -3008.08276, -1523.06301, + + 6788.74046, 10708.27853, 343.09434, 1701.52760, + + 14743.99857, -4781.96586, + + -15922236.41469, 1825172.51825, -14006084.36972, 10363332.64447, + -979550.91360, 6542446.18797, 1160614.26915, 570804.88172, + 89912.68112, -171247.08757, -13899.52899, -6182.25841, + + -240.64725, 412.42581, -66.24510, 71.30726, + + -15.81125, -15.76899, + + -21.85515, -102.12717, -10.18287, -19.38527, + + 1.43749, -3.87533, + + 1.97109, 0.20138, + + 0.32012, 1.02928, + + -40.22077, 20.80684, -15.69766, 9.63663, + -1.26010, 0.56197, + + 0.08592, 0.18540, + + -0.07303, 0.03897, + + 0.01438, -0.08809, + + 0.15479, 0.10354, + + 0.19052, 2.08790, + + 405480.24475, -607986.83623, 582811.58843, -915111.10396, + 258696.21023, -493391.09443, 23403.62628, -119503.67282, + -4036.86957, -9766.17805, -663.93268, 2544.07799, + 40.36638, 76.26390, 246.67716, -13.93440, + + 0.12403, 0.25378, + + 0.14004, -0.08501, + + 0.07904, 0.12731, + + 1.02117, -1.34663, 0.25142, -0.26903, + + 0.18135, -0.57683, -0.30092, -0.36121, + + -0.09623, 0.05873, + + -0.05803, 0.02869, + + -0.01194, 0.04983, + + 0.04250, 0.04894, + + 1.34245, 0.70137, 0.24217, 0.25912, + + -0.32759, -0.03575, + + 0.06780, -0.41277, + + 0.43865, 0.17857, + + -763933.02226, 465658.17048, -1082753.91241, 593319.68634, + -553911.89340, 274748.95145, -122250.71547, 56608.95768, + -9914.17300, 2988.43709, 707.94605, -765.01470, + 52.73260, -34.22263, -43.58300, -38.43647, + + -4.95939, -1.97173, -1.04406, -0.13072, + + -0.34281, 4.75202, -0.35513, 0.93597, + + -0.54380, 0.70536, + + 84.83116, 102.93003, 26.34884, 48.57746, + 0.02853, 2.91676, + + -8.07116, 1.66613, + + -2.07908, 11.62592, + + 6.64704, 0.98291, + + -1.19192, 0.93791, + + 0.18822, 0.00900, + + -0.03181, -0.02000, + + 0.02755, -0.01398, + + -0.03971, -0.03756, + + 0.13454, -0.04193, + + -18672.98484, 28230.75834, -28371.58823, 26448.45214, + -13352.09393, 7461.71279, -2609.33578, 726.50321, + -309.72942, -86.71982, 12.48589, -9.69726, + 1.82185, 14.92220, + + -0.04748, 0.42510, + + -0.20047, 0.00154, + + 0.00176, -0.26262, + + 0.78218, -0.73243, 0.23694, -0.03132, + + -0.00290, -0.03678, + + 14.03094, 4.25948, 0.79368, -0.78489, + -2.30962, 2.31946, + + 0.00158, -0.04125, + + -0.01387, 0.28503, 0.00892, 0.05154, + + 0.00184, -0.01727, + + -0.00889, 0.03526, + + -0.00521, -0.02093, + + 0.00200, 0.04872, + + -0.02163, 0.00578, + + 20699.27413, -2175.57827, 31177.33085, 4572.02063, + 15486.28190, 8747.74091, 2455.51737, 3839.83609, + 51.31433, 507.91086, 15.90082, 44.75942, + -0.98374, -2.64477, 2.52336, -3.09203, + + -0.08897, -0.00083, + + -15.91892, 0.72597, 14.04523, -3.16525, + 4.33379, -30.82980, 0.40462, -0.75845, + 13.14831, -0.02721, + + -0.01779, 0.00481, + + 0.42365, -0.09048, 0.08653, 0.04391, + + 0.00846, 0.01082, + + -0.04736, 0.02308, + + 6282.21778, -4952.70286, 7886.57505, -5328.36122, + 3113.76826, -1696.84590, 330.70011, -155.51989, + -18.31559, -3.90798, -3.11242, 1.87818, + -1.05578, 0.11198, + + 0.05077, -0.01571, + + 2.41291, 2.40568, + + -0.01136, -0.00076, + + -0.00392, -0.02774, + + 634.85065, -352.21937, 674.31665, -260.73473, + 199.16422, -28.44198, 6.54187, 6.44960, + -1.55155, 0.29755, 0.16977, 0.17540, + + -0.02652, 0.03726, + + -0.00623, 0.11777, -0.00933, 0.02602, + + -0.13943, -0.24818, + + 0.02876, -0.01463, + + -0.07166, 0.06747, -0.01578, 0.01628, + + 0.00233, -0.00686, + + 0.00431, -0.00276, + + 0.21774, 0.09735, 0.07894, 0.07279, + + -0.01300, -0.00268, + + 0.10824, 0.09435, 0.00720, 0.02111, + + -0.01960, 0.06154, + + 0.56867, -0.07544, 0.18210, 0.06343, + -0.00906, 0.01942, + + -0.00850, -0.00351, + + -0.06988, 0.01713, -0.01110, -0.00663, + + 0.00196, -0.02064, + + -0.00008, 0.00043, + + 0.00375, 0.00084, + + -0.00279, 0.00100, + + 0.00271, -0.02017, -0.00074, -0.00357, + + 0.03793, -0.10108, -0.01083, -0.03952, + + 0.00030, 0.00012, + + 0.01576, 0.01142, 0.00351, 0.00277, + + 0.01409, -0.00774, + + -0.00065, 0.01895, + + 0.07350, -0.02519, 0.01528, -0.01057, + + -0.00099, -0.00295, + + 0.21347, -0.17458, 0.04940, -0.02757, + + -0.06243, 0.05203, + + 0.01055, -0.00109, + + 0.00003, -0.04201, + + -0.00263, 0.02387, + + 0.00886, -0.01168, + + 0.00479, 0.00204, + + -0.00239, 0.00022, + + -0.00223, -0.02029, + + -0.14130, -0.15237, -0.01827, -0.04877, + + 0.12104, 0.06796, + + 0.16379, 0.31892, + + -0.15605, 0.07048, + + -0.00700, 0.07481, + + -0.00370, -0.00142, + + -0.00446, 0.00329, + + -0.00018, 0.00117, + + -0.00910, 0.00510, + + -0.00055, -0.00114, + + 0.04131, -0.04013, + + -0.13238, 0.02680, + + -0.10369, 1.38709, 0.35515, 0.41437, + + -0.01327, -0.02692, + + 38.02603, 13.38166, 15.33389, -7.40145, + -8.55293, -0.13185, -0.03316, 0.13016, + 0.04428, -1.60953, + + -12.87829, -76.97922, -23.96039, -22.45636, + 14.83309, 14.09854, 0.24252, 0.13850, + -4.16582, 4.08846, + + 0.00751, -0.00051, + + 0.03456, 0.02900, + + 0.01625, -0.04660, + + 0.01390, -0.00530, + + 0.01665, -0.04571, + + 40.90768, -14.11641, 7.46071, -58.07356, + -0.27859, -1.33816, 23.76074, -0.03124, + + -0.27860, 0.13654, -0.04800, 0.05375, + + 4.38091, 4.39337, + + 0.02233, 0.00514, + + -0.25616, -0.54439, + + -0.05155, 0.11553, + + 0.02944, -0.00818, + + 0.00570, 0.00119, + + -0.00733, -0.02700, + + -0.23759, -0.08712, -0.12433, 0.07397, + + 0.20629, 0.60251, 0.56512, 0.14790, + + 0.07778, 0.11614, + +}; + +static signed char FAR pluargs[] = { + 0, 7, + 2, 3, 7, -9, 9, 0, + 2, 4, 7,-12, 9, 0, + 2, 4, 7, -8, 8, 0, + 3, -4, 7, 5, 8, 4, 9, 0, + 3, 3, 7, -5, 8, -1, 9, 0, + 2, 1, 6, -8, 9, 1, + 2, 3, 8, -5, 9, 1, + 2, 1, 6, -9, 9, 2, + 3, 6, 7, -6, 8, -8, 9, 0, + 3, 4, 7,-10, 8, 4, 9, 2, + 2, 3, 7, -8, 9, 0, + 1, 1, 9, 7, + 2, 3, 7,-10, 9, 0, + 3, 4, 7,-10, 8, 2, 9, 2, + 3, 5, 7,-12, 8, 2, 9, 0, + 2, 1, 6, -7, 9, 0, + 1, 1, 8, 3, + 2, 1, 6,-10, 9, 0, + 3, 6, 7,-12, 8, 2, 9, 0, + 3, 5, 7,-10, 8, 2, 9, 0, + 2, 5, 7,-13, 9, 0, + 2, 4, 7,-10, 9, 0, + 2, 3, 7, -7, 9, 0, + 1, 2, 9, 7, + 2, 3, 7,-11, 9, 0, + 3, 4, 7, -9, 8, 4, 9, 2, + 3, 3, 7, -5, 8, 1, 9, 2, + 2, 1, 6, -6, 9, 0, + 2, 7, 8,-13, 9, 0, + 2, 3, 8, -2, 9, 1, + 3, 1, 7, -5, 8, 2, 9, 1, + 3, 6, 7,-12, 8, 3, 9, 1, + 2, 5, 7,-12, 9, 1, + 2, 4, 7, -9, 9, 1, + 2, 2, 7, -3, 9, 1, + 1, 1, 7, 0, + 1, 3, 9, 5, + 2, 3, 7,-12, 9, 1, + 3, 5, 7, -9, 8, 2, 9, 0, + 3, 4, 7, -7, 8, 2, 9, 1, + 3, 3, 7, -5, 8, 2, 9, 0, + 3, 2, 7, -5, 8, 5, 9, 0, + 2, 1, 6, -5, 9, 0, + 2, 3, 8, -1, 9, 2, + 2, 1, 6,-12, 9, 0, + 3, 2, 7, -7, 8, 1, 9, 0, + 2, 5, 7,-11, 9, 0, + 2, 4, 7, -8, 9, 0, + 2, 2, 7, -2, 9, 0, + 1, 4, 9, 7, + 3, 2, 7, -8, 8, 2, 9, 0, + 3, 5, 7, -9, 8, 3, 9, 0, + 3, 4, 7, -9, 8, 6, 9, 0, + 3, 3, 7, -5, 8, 3, 9, 1, + 2, 2, 7, -1, 8, 1, + 2, 3, 8, -9, 9, 0, + 2, 9, 8, -9, 9, 0, + 2, 1, 6,-13, 9, 0, + 3, 2, 7, -5, 8, -3, 9, 0, + 2, 6, 7,-13, 9, 1, + 2, 5, 7,-10, 9, 0, + 2, 4, 7, -7, 9, 0, + 2, 3, 7, -4, 9, 0, + 1, 5, 9, 7, + 3, 6, 7, -9, 8, 1, 9, 1, + 3, 4, 7, -5, 8, 1, 9, 1, + 3, 3, 7, -3, 8, 1, 9, 0, + 2, 1, 6, -3, 9, 2, + 2, 3, 8,-10, 9, 0, + 2, 1, 8, 4, 9, 0, + 2, 5, 8, -2, 9, 0, + 2, 11, 8,-11, 9, 0, + 3, 1, 7, -9, 8, 5, 9, 0, + 2, 6, 7,-12, 9, 0, + 2, 5, 7, -9, 9, 0, + 2, 4, 7, -6, 9, 0, + 2, 3, 7, -3, 9, 0, + 1, 6, 9, 6, + 2, 2, 7,-12, 9, 0, + 3, 6, 7, -9, 8, 2, 9, 0, + 3, 3, 7,-12, 8, 3, 9, 0, + 3, 4, 7,-10, 8, -3, 9, 1, + 3, 3, 7, -3, 8, 2, 9, 0, + 2, 1, 6, -2, 9, 2, + 2, 1, 8, 5, 9, 0, + 2, 13, 8,-13, 9, 1, + 3, 2, 7, -9, 8, 1, 9, 0, + 2, 6, 7,-11, 9, 0, + 2, 5, 7, -8, 9, 0, + 2, 4, 7, -5, 9, 0, + 2, 3, 7, -2, 9, 0, + 1, 7, 9, 7, + 3, 6, 7, -9, 8, 3, 9, 0, + 2, 1, 6, -1, 9, 4, + 2, 3, 8, 3, 9, 0, + 2, 7, 7,-13, 9, 1, + 2, 3, 7, -1, 9, 0, + 2, 2, 7, 2, 9, 0, + 1, 8, 9, 6, + 3, 7, 7, -9, 8, 1, 9, 0, + 1, 1, 6, 0, + 1, 3, 7, 0, + 2, 2, 7, 3, 9, 0, + 1, 9, 9, 5, + 3, 1, 7,-10, 8, 3, 9, 0, + 3, 2, 7,-12, 8, 3, 9, 1, + 2, 1, 6, 1, 9, 0, + 3, 1, 7, -1, 8, 8, 9, 0, + 2, 3, 7, 1, 9, 1, + 2, 2, 7, 4, 9, 0, + 2, 1, 7, 7, 9, 0, + 2, 4, 8, 4, 9, 1, + 2, 12, 8, -8, 9, 0, + 3, 1, 7,-10, 8, 2, 9, 1, + 2, 1, 6, 2, 9, 0, + 1, 11, 9, 2, + 2, 12, 8, -7, 9, 0, + 3, 1, 7,-10, 8, 1, 9, 1, + 1, 4, 7, 0, + 1, 12, 9, 0, + 2, 6, 8, 3, 9, 0, + 3, 1, 7, -2, 8,-12, 9, 0, + 3, 7, 7, -7, 8, 2, 9, 1, + 2, 2, 6, -4, 9, 1, + 1, 13, 9, 0, + 2, 10, 8, -2, 9, 1, + 2, 4, 7, 2, 9, 0, + 2, 2, 6, -3, 9, 0, + 2, 2, 7, 8, 9, 1, + 2, 8, 8, 2, 9, 0, + 1, 5, 7, 1, + 2, 4, 7, 3, 9, 0, + 2, 3, 7, 6, 9, 0, + 2, 1, 5, -6, 9, 0, + 3, 2, 7, 8, 8, -3, 9, 0, + 3, 1, 7, 6, 8, 3, 9, 0, + 2, 6, 8, 6, 9, 0, + 3, 8, 7, -7, 8, 2, 9, 0, + 2, 9, 7,-11, 9, 0, + 2, 5, 7, 1, 9, 1, + 2, 4, 7, 4, 9, 0, + 2, 2, 6, -1, 9, 0, + 3, 2, 6, -1, 7, 2, 9, 0, + 2, 2, 7, 10, 9, 0, + 2, 1, 7, 13, 9, 0, + 2, 8, 7, -7, 9, 0, + 2, 7, 7, -4, 9, 0, + 2, 6, 7, -1, 9, 0, + 2, 5, 7, 3, 9, 0, + 2, 4, 7, 5, 9, 0, + 1, 2, 6, 0, + 2, 1, 5, -4, 9, 1, + 3, 1, 6, 9, 8, -5, 9, 0, + 2, 1, 5, -3, 9, 4, + 2, 1, 5, -2, 9, 4, + 3, 9, 7, -9, 8, 6, 9, 0, + 2, 8, 7, -4, 9, 0, + 2, 7, 7, -1, 9, 0, + 2, 1, 6, 3, 9, 0, + 2, 2, 6, 3, 9, 0, + 2, 1, 5, -1, 9, 3, + 3, 6, 7, -3, 8, 7, 9, 1, + 1, 1, 5, 0, + 2, 2, 6, 5, 9, 0, + 2, 1, 5, 1, 9, 0, + 2, 1, 5, 2, 9, 0, + 2, 1, 5, 3, 9, 0, + 2, 2, 5, -4, 9, 0, + 2, 2, 5, -3, 9, 0, + 2, 2, 5, -2, 9, 1, + 2, 2, 5, -1, 9, 1, + 1, 2, 5, 0, + -1 +}; +/* Total terms = 173, small = 156 */ +static struct plantbl FAR plu404 = { + { 0, 0, 0, 0, 2, 2, 9, 13, 13,}, + 7, + pluargs, + plutabl, + plutabb, + plutabr, + 3.9539999999999999e+01, +}; diff --git a/swe/src/swenut2000a.h b/swe/src/swenut2000a.h new file mode 100644 index 0000000..69fddf8 --- /dev/null +++ b/swe/src/swenut2000a.h @@ -0,0 +1,2820 @@ +/************************************************************ + $Header: /home/dieter/sweph/RCS/swenut2000a.h,v 1.74 2008/06/16 10:07:20 dieter Exp $ + definitions for nutation theory IAU 2000a + derived from public sources + + Compilation Authors: Dieter Koch and Alois Treindl, Astrodienst Zurich + +************************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + +/* 0.1 microarcsecond to degrees */ +#define O1MAS2DEG (1 / 3600.0 / 10000000.0) +/* Number of terms in the luni-solar nutation model */ +#define NLS 678 +#define NLS_2000B 77 +/* Number of terms in the planetary nutation model */ +#define NPL 687 +/* Luni-Solar argument multipliers +L L' F D Om */ +static int16 nls[] = { +0, 0, 0, 0, 1, +0, 0, 2, -2, 2, +0, 0, 2, 0, 2, +0, 0, 0, 0, 2, +0, 1, 0, 0, 0, +0, 1, 2, -2, 2, +1, 0, 0, 0, 0, +0, 0, 2, 0, 1, +1, 0, 2, 0, 2, +0, -1, 2, -2, 2, +0, 0, 2, -2, 1, +-1, 0, 2, 0, 2, +-1, 0, 0, 2, 0, +1, 0, 0, 0, 1, +-1, 0, 0, 0, 1, +-1, 0, 2, 2, 2, +1, 0, 2, 0, 1, +-2, 0, 2, 0, 1, +0, 0, 0, 2, 0, +0, 0, 2, 2, 2, +0, -2, 2, -2, 2, +-2, 0, 0, 2, 0, +2, 0, 2, 0, 2, +1, 0, 2, -2, 2, +-1, 0, 2, 0, 1, +2, 0, 0, 0, 0, +0, 0, 2, 0, 0, +0, 1, 0, 0, 1, +-1, 0, 0, 2, 1, +0, 2, 2, -2, 2, +0, 0, -2, 2, 0, +1, 0, 0, -2, 1, +0, -1, 0, 0, 1, +-1, 0, 2, 2, 1, +0, 2, 0, 0, 0, +1, 0, 2, 2, 2, +-2, 0, 2, 0, 0, +0, 1, 2, 0, 2, +0, 0, 2, 2, 1, +0, -1, 2, 0, 2, +0, 0, 0, 2, 1, +1, 0, 2, -2, 1, +2, 0, 2, -2, 2, +-2, 0, 0, 2, 1, +2, 0, 2, 0, 1, +0, -1, 2, -2, 1, +0, 0, 0, -2, 1, +-1, -1, 0, 2, 0, +2, 0, 0, -2, 1, +1, 0, 0, 2, 0, +0, 1, 2, -2, 1, +1, -1, 0, 0, 0, +-2, 0, 2, 0, 2, +3, 0, 2, 0, 2, +0, -1, 0, 2, 0, +1, -1, 2, 0, 2, +0, 0, 0, 1, 0, +-1, -1, 2, 2, 2, +-1, 0, 2, 0, 0, +0, -1, 2, 2, 2, +-2, 0, 0, 0, 1, +1, 1, 2, 0, 2, +2, 0, 0, 0, 1, +-1, 1, 0, 1, 0, +1, 1, 0, 0, 0, +1, 0, 2, 0, 0, +-1, 0, 2, -2, 1, +1, 0, 0, 0, 2, +-1, 0, 0, 1, 0, +0, 0, 2, 1, 2, +-1, 0, 2, 4, 2, +-1, 1, 0, 1, 1, +0, -2, 2, -2, 1, +1, 0, 2, 2, 1, +-2, 0, 2, 2, 2, +-1, 0, 0, 0, 2, +1, 1, 2, -2, 2, +-2, 0, 2, 4, 2, +-1, 0, 4, 0, 2, +2, 0, 2, -2, 1, +2, 0, 2, 2, 2, +1, 0, 0, 2, 1, +3, 0, 0, 0, 0, +3, 0, 2, -2, 2, +0, 0, 4, -2, 2, +0, 1, 2, 0, 1, +0, 0, -2, 2, 1, +0, 0, 2, -2, 3, +-1, 0, 0, 4, 0, +2, 0, -2, 0, 1, +-2, 0, 0, 4, 0, +-1, -1, 0, 2, 1, +-1, 0, 0, 1, 1, +0, 1, 0, 0, 2, +0, 0, -2, 0, 1, +0, -1, 2, 0, 1, +0, 0, 2, -1, 2, +0, 0, 2, 4, 2, +-2, -1, 0, 2, 0, +1, 1, 0, -2, 1, +-1, 1, 0, 2, 0, +-1, 1, 0, 1, 2, +1, -1, 0, 0, 1, +1, -1, 2, 2, 2, +-1, 1, 2, 2, 2, +3, 0, 2, 0, 1, +0, 1, -2, 2, 0, +-1, 0, 0, -2, 1, +0, 1, 2, 2, 2, +-1, -1, 2, 2, 1, +0, -1, 0, 0, 2, +1, 0, 2, -4, 1, +-1, 0, -2, 2, 0, +0, -1, 2, 2, 1, +2, -1, 2, 0, 2, +0, 0, 0, 2, 2, +1, -1, 2, 0, 1, +-1, 1, 2, 0, 2, +0, 1, 0, 2, 0, +0, -1, -2, 2, 0, +0, 3, 2, -2, 2, +0, 0, 0, 1, 1, +-1, 0, 2, 2, 0, +2, 1, 2, 0, 2, +1, 1, 0, 0, 1, +1, 1, 2, 0, 1, +2, 0, 0, 2, 0, +1, 0, -2, 2, 0, +-1, 0, 0, 2, 2, +0, 1, 0, 1, 0, +0, 1, 0, -2, 1, +-1, 0, 2, -2, 2, +0, 0, 0, -1, 1, +-1, 1, 0, 0, 1, +1, 0, 2, -1, 2, +1, -1, 0, 2, 0, +0, 0, 0, 4, 0, +1, 0, 2, 1, 2, +0, 0, 2, 1, 1, +1, 0, 0, -2, 2, +-1, 0, 2, 4, 1, +1, 0, -2, 0, 1, +1, 1, 2, -2, 1, +0, 0, 2, 2, 0, +-1, 0, 2, -1, 1, +-2, 0, 2, 2, 1, +4, 0, 2, 0, 2, +2, -1, 0, 0, 0, +2, 1, 2, -2, 2, +0, 1, 2, 1, 2, +1, 0, 4, -2, 2, +-1, -1, 0, 0, 1, +0, 1, 0, 2, 1, +-2, 0, 2, 4, 1, +2, 0, 2, 0, 0, +1, 0, 0, 1, 0, +-1, 0, 0, 4, 1, +-1, 0, 4, 0, 1, +2, 0, 2, 2, 1, +0, 0, 2, -3, 2, +-1, -2, 0, 2, 0, +2, 1, 0, 0, 0, +0, 0, 4, 0, 2, +0, 0, 0, 0, 3, +0, 3, 0, 0, 0, +0, 0, 2, -4, 1, +0, -1, 0, 2, 1, +0, 0, 0, 4, 1, +-1, -1, 2, 4, 2, +1, 0, 2, 4, 2, +-2, 2, 0, 2, 0, +-2, -1, 2, 0, 1, +-2, 0, 0, 2, 2, +-1, -1, 2, 0, 2, +0, 0, 4, -2, 1, +3, 0, 2, -2, 1, +-2, -1, 0, 2, 1, +1, 0, 0, -1, 1, +0, -2, 0, 2, 0, +-2, 0, 0, 4, 1, +-3, 0, 0, 0, 1, +1, 1, 2, 2, 2, +0, 0, 2, 4, 1, +3, 0, 2, 2, 2, +-1, 1, 2, -2, 1, +2, 0, 0, -4, 1, +0, 0, 0, -2, 2, +2, 0, 2, -4, 1, +-1, 1, 0, 2, 1, +0, 0, 2, -1, 1, +0, -2, 2, 2, 2, +2, 0, 0, 2, 1, +4, 0, 2, -2, 2, +2, 0, 0, -2, 2, +0, 2, 0, 0, 1, +1, 0, 0, -4, 1, +0, 2, 2, -2, 1, +-3, 0, 0, 4, 0, +-1, 1, 2, 0, 1, +-1, -1, 0, 4, 0, +-1, -2, 2, 2, 2, +-2, -1, 2, 4, 2, +1, -1, 2, 2, 1, +-2, 1, 0, 2, 0, +-2, 1, 2, 0, 1, +2, 1, 0, -2, 1, +-3, 0, 2, 0, 1, +-2, 0, 2, -2, 1, +-1, 1, 0, 2, 2, +0, -1, 2, -1, 2, +-1, 0, 4, -2, 2, +0, -2, 2, 0, 2, +-1, 0, 2, 1, 2, +2, 0, 0, 0, 2, +0, 0, 2, 0, 3, +-2, 0, 4, 0, 2, +-1, 0, -2, 0, 1, +-1, 1, 2, 2, 1, +3, 0, 0, 0, 1, +-1, 0, 2, 3, 2, +2, -1, 2, 0, 1, +0, 1, 2, 2, 1, +0, -1, 2, 4, 2, +2, -1, 2, 2, 2, +0, 2, -2, 2, 0, +-1, -1, 2, -1, 1, +0, -2, 0, 0, 1, +1, 0, 2, -4, 2, +1, -1, 0, -2, 1, +-1, -1, 2, 0, 1, +1, -1, 2, -2, 2, +-2, -1, 0, 4, 0, +-1, 0, 0, 3, 0, +-2, -1, 2, 2, 2, +0, 2, 2, 0, 2, +1, 1, 0, 2, 0, +2, 0, 2, -1, 2, +1, 0, 2, 1, 1, +4, 0, 0, 0, 0, +2, 1, 2, 0, 1, +3, -1, 2, 0, 2, +-2, 2, 0, 2, 1, +1, 0, 2, -3, 1, +1, 1, 2, -4, 1, +-1, -1, 2, -2, 1, +0, -1, 0, -1, 1, +0, -1, 0, -2, 1, +-2, 0, 0, 0, 2, +-2, 0, -2, 2, 0, +-1, 0, -2, 4, 0, +1, -2, 0, 0, 0, +0, 1, 0, 1, 1, +-1, 2, 0, 2, 0, +1, -1, 2, -2, 1, +1, 2, 2, -2, 2, +2, -1, 2, -2, 2, +1, 0, 2, -1, 1, +2, 1, 2, -2, 1, +-2, 0, 0, -2, 1, +1, -2, 2, 0, 2, +0, 1, 2, 1, 1, +1, 0, 4, -2, 1, +-2, 0, 4, 2, 2, +1, 1, 2, 1, 2, +1, 0, 0, 4, 0, +1, 0, 2, 2, 0, +2, 0, 2, 1, 2, +3, 1, 2, 0, 2, +4, 0, 2, 0, 1, +-2, -1, 2, 0, 0, +0, 1, -2, 2, 1, +1, 0, -2, 1, 0, +0, -1, -2, 2, 1, +2, -1, 0, -2, 1, +-1, 0, 2, -1, 2, +1, 0, 2, -3, 2, +0, 1, 2, -2, 3, +0, 0, 2, -3, 1, +-1, 0, -2, 2, 1, +0, 0, 2, -4, 2, +-2, 1, 0, 0, 1, +-1, 0, 0, -1, 1, +2, 0, 2, -4, 2, +0, 0, 4, -4, 4, +0, 0, 4, -4, 2, +-1, -2, 0, 2, 1, +-2, 0, 0, 3, 0, +1, 0, -2, 2, 1, +-3, 0, 2, 2, 2, +-3, 0, 2, 2, 1, +-2, 0, 2, 2, 0, +2, -1, 0, 0, 1, +-2, 1, 2, 2, 2, +1, 1, 0, 1, 0, +0, 1, 4, -2, 2, +-1, 1, 0, -2, 1, +0, 0, 0, -4, 1, +1, -1, 0, 2, 1, +1, 1, 0, 2, 1, +-1, 2, 2, 2, 2, +3, 1, 2, -2, 2, +0, -1, 0, 4, 0, +2, -1, 0, 2, 0, +0, 0, 4, 0, 1, +2, 0, 4, -2, 2, +-1, -1, 2, 4, 1, +1, 0, 0, 4, 1, +1, -2, 2, 2, 2, +0, 0, 2, 3, 2, +-1, 1, 2, 4, 2, +3, 0, 0, 2, 0, +-1, 0, 4, 2, 2, +1, 1, 2, 2, 1, +-2, 0, 2, 6, 2, +2, 1, 2, 2, 2, +-1, 0, 2, 6, 2, +1, 0, 2, 4, 1, +2, 0, 2, 4, 2, +1, 1, -2, 1, 0, +-3, 1, 2, 1, 2, +2, 0, -2, 0, 2, +-1, 0, 0, 1, 2, +-4, 0, 2, 2, 1, +-1, -1, 0, 1, 0, +0, 0, -2, 2, 2, +1, 0, 0, -1, 2, +0, -1, 2, -2, 3, +-2, 1, 2, 0, 0, +0, 0, 2, -2, 4, +-2, -2, 0, 2, 0, +-2, 0, -2, 4, 0, +0, -2, -2, 2, 0, +1, 2, 0, -2, 1, +3, 0, 0, -4, 1, +-1, 1, 2, -2, 2, +1, -1, 2, -4, 1, +1, 1, 0, -2, 2, +-3, 0, 2, 0, 0, +-3, 0, 2, 0, 2, +-2, 0, 0, 1, 0, +0, 0, -2, 1, 0, +-3, 0, 0, 2, 1, +-1, -1, -2, 2, 0, +0, 1, 2, -4, 1, +2, 1, 0, -4, 1, +0, 2, 0, -2, 1, +1, 0, 0, -3, 1, +-2, 0, 2, -2, 2, +-2, -1, 0, 0, 1, +-4, 0, 0, 2, 0, +1, 1, 0, -4, 1, +-1, 0, 2, -4, 1, +0, 0, 4, -4, 1, +0, 3, 2, -2, 2, +-3, -1, 0, 4, 0, +-3, 0, 0, 4, 1, +1, -1, -2, 2, 0, +-1, -1, 0, 2, 2, +1, -2, 0, 0, 1, +1, -1, 0, 0, 2, +0, 0, 0, 1, 2, +-1, -1, 2, 0, 0, +1, -2, 2, -2, 2, +0, -1, 2, -1, 1, +-1, 0, 2, 0, 3, +1, 1, 0, 0, 2, +-1, 1, 2, 0, 0, +1, 2, 0, 0, 0, +-1, 2, 2, 0, 2, +-1, 0, 4, -2, 1, +3, 0, 2, -4, 2, +1, 2, 2, -2, 1, +1, 0, 4, -4, 2, +-2, -1, 0, 4, 1, +0, -1, 0, 2, 2, +-2, 1, 0, 4, 0, +-2, -1, 2, 2, 1, +2, 0, -2, 2, 0, +1, 0, 0, 1, 1, +0, 1, 0, 2, 2, +1, -1, 2, -1, 2, +-2, 0, 4, 0, 1, +2, 1, 0, 0, 1, +0, 1, 2, 0, 0, +0, -1, 4, -2, 2, +0, 0, 4, -2, 4, +0, 2, 2, 0, 1, +-3, 0, 0, 6, 0, +-1, -1, 0, 4, 1, +1, -2, 0, 2, 0, +-1, 0, 0, 4, 2, +-1, -2, 2, 2, 1, +-1, 0, 0, -2, 2, +1, 0, -2, -2, 1, +0, 0, -2, -2, 1, +-2, 0, -2, 0, 1, +0, 0, 0, 3, 1, +0, 0, 0, 3, 0, +-1, 1, 0, 4, 0, +-1, -1, 2, 2, 0, +-2, 0, 2, 3, 2, +1, 0, 0, 2, 2, +0, -1, 2, 1, 2, +3, -1, 0, 0, 0, +2, 0, 0, 1, 0, +1, -1, 2, 0, 0, +0, 0, 2, 1, 0, +1, 0, 2, 0, 3, +3, 1, 0, 0, 0, +3, -1, 2, -2, 2, +2, 0, 2, -1, 1, +1, 1, 2, 0, 0, +0, 0, 4, -1, 2, +1, 2, 2, 0, 2, +-2, 0, 0, 6, 0, +0, -1, 0, 4, 1, +-2, -1, 2, 4, 1, +0, -2, 2, 2, 1, +0, -1, 2, 2, 0, +-1, 0, 2, 3, 1, +-2, 1, 2, 4, 2, +2, 0, 0, 2, 2, +2, -2, 2, 0, 2, +-1, 1, 2, 3, 2, +3, 0, 2, -1, 2, +4, 0, 2, -2, 1, +-1, 0, 0, 6, 0, +-1, -2, 2, 4, 2, +-3, 0, 2, 6, 2, +-1, 0, 2, 4, 0, +3, 0, 0, 2, 1, +3, -1, 2, 0, 1, +3, 0, 2, 0, 0, +1, 0, 4, 0, 2, +5, 0, 2, -2, 2, +0, -1, 2, 4, 1, +2, -1, 2, 2, 1, +0, 1, 2, 4, 2, +1, -1, 2, 4, 2, +3, -1, 2, 2, 2, +3, 0, 2, 2, 1, +5, 0, 2, 0, 2, +0, 0, 2, 6, 2, +4, 0, 2, 2, 2, +0, -1, 1, -1, 1, +-1, 0, 1, 0, 3, +0, -2, 2, -2, 3, +1, 0, -1, 0, 1, +2, -2, 0, -2, 1, +-1, 0, 1, 0, 2, +-1, 0, 1, 0, 1, +-1, -1, 2, -1, 2, +-2, 2, 0, 2, 2, +-1, 0, 1, 0, 0, +-4, 1, 2, 2, 2, +-3, 0, 2, 1, 1, +-2, -1, 2, 0, 2, +1, 0, -2, 1, 1, +2, -1, -2, 0, 1, +-4, 0, 2, 2, 0, +-3, 1, 0, 3, 0, +-1, 0, -1, 2, 0, +0, -2, 0, 0, 2, +0, -2, 0, 0, 2, +-3, 0, 0, 3, 0, +-2, -1, 0, 2, 2, +-1, 0, -2, 3, 0, +-4, 0, 0, 4, 0, +2, 1, -2, 0, 1, +2, -1, 0, -2, 2, +0, 0, 1, -1, 0, +-1, 2, 0, 1, 0, +-2, 1, 2, 0, 2, +1, 1, 0, -1, 1, +1, 0, 1, -2, 1, +0, 2, 0, 0, 2, +1, -1, 2, -3, 1, +-1, 1, 2, -1, 1, +-2, 0, 4, -2, 2, +-2, 0, 4, -2, 1, +-2, -2, 0, 2, 1, +-2, 0, -2, 4, 0, +1, 2, 2, -4, 1, +1, 1, 2, -4, 2, +-1, 2, 2, -2, 1, +2, 0, 0, -3, 1, +-1, 2, 0, 0, 1, +0, 0, 0, -2, 0, +-1, -1, 2, -2, 2, +-1, 1, 0, 0, 2, +0, 0, 0, -1, 2, +-2, 1, 0, 1, 0, +1, -2, 0, -2, 1, +1, 0, -2, 0, 2, +-3, 1, 0, 2, 0, +-1, 1, -2, 2, 0, +-1, -1, 0, 0, 2, +-3, 0, 0, 2, 0, +-3, -1, 0, 2, 0, +2, 0, 2, -6, 1, +0, 1, 2, -4, 2, +2, 0, 0, -4, 2, +-2, 1, 2, -2, 1, +0, -1, 2, -4, 1, +0, 1, 0, -2, 2, +-1, 0, 0, -2, 0, +2, 0, -2, -2, 1, +-4, 0, 2, 0, 1, +-1, -1, 0, -1, 1, +0, 0, -2, 0, 2, +-3, 0, 0, 1, 0, +-1, 0, -2, 1, 0, +-2, 0, -2, 2, 1, +0, 0, -4, 2, 0, +-2, -1, -2, 2, 0, +1, 0, 2, -6, 1, +-1, 0, 2, -4, 2, +1, 0, 0, -4, 2, +2, 1, 2, -4, 2, +2, 1, 2, -4, 1, +0, 1, 4, -4, 4, +0, 1, 4, -4, 2, +-1, -1, -2, 4, 0, +-1, -3, 0, 2, 0, +-1, 0, -2, 4, 1, +-2, -1, 0, 3, 0, +0, 0, -2, 3, 0, +-2, 0, 0, 3, 1, +0, -1, 0, 1, 0, +-3, 0, 2, 2, 0, +1, 1, -2, 2, 0, +-1, 1, 0, 2, 2, +1, -2, 2, -2, 1, +0, 0, 1, 0, 2, +0, 0, 1, 0, 1, +0, 0, 1, 0, 0, +-1, 2, 0, 2, 1, +0, 0, 2, 0, 2, +-2, 0, 2, 0, 2, +2, 0, 0, -1, 1, +3, 0, 0, -2, 1, +1, 0, 2, -2, 3, +1, 2, 0, 0, 1, +2, 0, 2, -3, 2, +-1, 1, 4, -2, 2, +-2, -2, 0, 4, 0, +0, -3, 0, 2, 0, +0, 0, -2, 4, 0, +-1, -1, 0, 3, 0, +-2, 0, 0, 4, 2, +-1, 0, 0, 3, 1, +2, -2, 0, 0, 0, +1, -1, 0, 1, 0, +-1, 0, 0, 2, 0, +0, -2, 2, 0, 1, +-1, 0, 1, 2, 1, +-1, 1, 0, 3, 0, +-1, -1, 2, 1, 2, +0, -1, 2, 0, 0, +-2, 1, 2, 2, 1, +2, -2, 2, -2, 2, +1, 1, 0, 1, 1, +1, 0, 1, 0, 1, +1, 0, 1, 0, 0, +0, 2, 0, 2, 0, +2, -1, 2, -2, 1, +0, -1, 4, -2, 1, +0, 0, 4, -2, 3, +0, 1, 4, -2, 1, +4, 0, 2, -4, 2, +2, 2, 2, -2, 2, +2, 0, 4, -4, 2, +-1, -2, 0, 4, 0, +-1, -3, 2, 2, 2, +-3, 0, 2, 4, 2, +-3, 0, 2, -2, 1, +-1, -1, 0, -2, 1, +-3, 0, 0, 0, 2, +-3, 0, -2, 2, 0, +0, 1, 0, -4, 1, +-2, 1, 0, -2, 1, +-4, 0, 0, 0, 1, +-1, 0, 0, -4, 1, +-3, 0, 0, -2, 1, +0, 0, 0, 3, 2, +-1, 1, 0, 4, 1, +1, -2, 2, 0, 1, +0, 1, 0, 3, 0, +-1, 0, 2, 2, 3, +0, 0, 2, 2, 2, +-2, 0, 2, 2, 2, +-1, 1, 2, 2, 0, +3, 0, 0, 0, 2, +2, 1, 0, 1, 0, +2, -1, 2, -1, 2, +0, 0, 2, 0, 1, +0, 0, 3, 0, 3, +0, 0, 3, 0, 2, +-1, 2, 2, 2, 1, +-1, 0, 4, 0, 0, +1, 2, 2, 0, 1, +3, 1, 2, -2, 1, +1, 1, 4, -2, 2, +-2, -1, 0, 6, 0, +0, -2, 0, 4, 0, +-2, 0, 0, 6, 1, +-2, -2, 2, 4, 2, +0, -3, 2, 2, 2, +0, 0, 0, 4, 2, +-1, -1, 2, 3, 2, +-2, 0, 2, 4, 0, +2, -1, 0, 2, 1, +1, 0, 0, 3, 0, +0, 1, 0, 4, 1, +0, 1, 0, 4, 0, +1, -1, 2, 1, 2, +0, 0, 2, 2, 3, +1, 0, 2, 2, 2, +-1, 0, 2, 2, 2, +-2, 0, 4, 2, 1, +2, 1, 0, 2, 1, +2, 1, 0, 2, 0, +2, -1, 2, 0, 0, +1, 0, 2, 1, 0, +0, 1, 2, 2, 0, +2, 0, 2, 0, 3, +3, 0, 2, 0, 2, +1, 0, 2, 0, 2, +1, 0, 3, 0, 3, +1, 1, 2, 1, 1, +0, 2, 2, 2, 2, +2, 1, 2, 0, 0, +2, 0, 4, -2, 1, +4, 1, 2, -2, 2, +-1, -1, 0, 6, 0, +-3, -1, 2, 6, 2, +-1, 0, 0, 6, 1, +-3, 0, 2, 6, 1, +1, -1, 0, 4, 1, +1, -1, 0, 4, 0, +-2, 0, 2, 5, 2, +1, -2, 2, 2, 1, +3, -1, 0, 2, 0, +1, -1, 2, 2, 0, +0, 0, 2, 3, 1, +-1, 1, 2, 4, 1, +0, 1, 2, 3, 2, +-1, 0, 4, 2, 1, +2, 0, 2, 1, 1, +5, 0, 0, 0, 0, +2, 1, 2, 1, 2, +1, 0, 4, 0, 1, +3, 1, 2, 0, 1, +3, 0, 4, -2, 2, +-2, -1, 2, 6, 2, +0, 0, 0, 6, 0, +0, -2, 2, 4, 2, +-2, 0, 2, 6, 1, +2, 0, 0, 4, 1, +2, 0, 0, 4, 0, +2, -2, 2, 2, 2, +0, 0, 2, 4, 0, +1, 0, 2, 3, 2, +4, 0, 0, 2, 0, +2, 0, 2, 2, 0, +0, 0, 4, 2, 2, +4, -1, 2, 0, 2, +3, 0, 2, 1, 2, +2, 1, 2, 2, 1, +4, 1, 2, 0, 2, +-1, -1, 2, 6, 2, +-1, 0, 2, 6, 1, +1, -1, 2, 4, 1, +1, 1, 2, 4, 2, +3, 1, 2, 2, 2, +5, 0, 2, 0, 1, +2, -1, 2, 4, 2, +2, 0, 2, 4, 1, +}; + +/* Luni-Solar nutation coefficients, unit 1e-7 arcsec + * longitude (sin, t*sin, cos), obliquity (cos, t*cos, sin) */ +static int32 cls[] = { +-172064161, -174666, 33386, 92052331, 9086, 15377, +-13170906, -1675, -13696, 5730336, -3015, -4587, +-2276413, -234, 2796, 978459, -485, 1374, +2074554, 207, -698, -897492, 470, -291, +1475877, -3633, 11817, 73871, -184, -1924, +-516821, 1226, -524, 224386, -677, -174, +711159, 73, -872, -6750, 0, 358, +-387298, -367, 380, 200728, 18, 318, +-301461, -36, 816, 129025, -63, 367, +215829, -494, 111, -95929, 299, 132, +128227, 137, 181, -68982, -9, 39, +123457, 11, 19, -53311, 32, -4, +156994, 10, -168, -1235, 0, 82, +63110, 63, 27, -33228, 0, -9, +-57976, -63, -189, 31429, 0, -75, +-59641, -11, 149, 25543, -11, 66, +-51613, -42, 129, 26366, 0, 78, +45893, 50, 31, -24236, -10, 20, +63384, 11, -150, -1220, 0, 29, +-38571, -1, 158, 16452, -11, 68, +32481, 0, 0, -13870, 0, 0, +-47722, 0, -18, 477, 0, -25, +-31046, -1, 131, 13238, -11, 59, +28593, 0, -1, -12338, 10, -3, +20441, 21, 10, -10758, 0, -3, +29243, 0, -74, -609, 0, 13, +25887, 0, -66, -550, 0, 11, +-14053, -25, 79, 8551, -2, -45, +15164, 10, 11, -8001, 0, -1, +-15794, 72, -16, 6850, -42, -5, +21783, 0, 13, -167, 0, 13, +-12873, -10, -37, 6953, 0, -14, +-12654, 11, 63, 6415, 0, 26, +-10204, 0, 25, 5222, 0, 15, +16707, -85, -10, 168, -1, 10, +-7691, 0, 44, 3268, 0, 19, +-11024, 0, -14, 104, 0, 2, +7566, -21, -11, -3250, 0, -5, +-6637, -11, 25, 3353, 0, 14, +-7141, 21, 8, 3070, 0, 4, +-6302, -11, 2, 3272, 0, 4, +5800, 10, 2, -3045, 0, -1, +6443, 0, -7, -2768, 0, -4, +-5774, -11, -15, 3041, 0, -5, +-5350, 0, 21, 2695, 0, 12, +-4752, -11, -3, 2719, 0, -3, +-4940, -11, -21, 2720, 0, -9, +7350, 0, -8, -51, 0, 4, +4065, 0, 6, -2206, 0, 1, +6579, 0, -24, -199, 0, 2, +3579, 0, 5, -1900, 0, 1, +4725, 0, -6, -41, 0, 3, +-3075, 0, -2, 1313, 0, -1, +-2904, 0, 15, 1233, 0, 7, +4348, 0, -10, -81, 0, 2, +-2878, 0, 8, 1232, 0, 4, +-4230, 0, 5, -20, 0, -2, +-2819, 0, 7, 1207, 0, 3, +-4056, 0, 5, 40, 0, -2, +-2647, 0, 11, 1129, 0, 5, +-2294, 0, -10, 1266, 0, -4, +2481, 0, -7, -1062, 0, -3, +2179, 0, -2, -1129, 0, -2, +3276, 0, 1, -9, 0, 0, +-3389, 0, 5, 35, 0, -2, +3339, 0, -13, -107, 0, 1, +-1987, 0, -6, 1073, 0, -2, +-1981, 0, 0, 854, 0, 0, +4026, 0, -353, -553, 0, -139, +1660, 0, -5, -710, 0, -2, +-1521, 0, 9, 647, 0, 4, +1314, 0, 0, -700, 0, 0, +-1283, 0, 0, 672, 0, 0, +-1331, 0, 8, 663, 0, 4, +1383, 0, -2, -594, 0, -2, +1405, 0, 4, -610, 0, 2, +1290, 0, 0, -556, 0, 0, +-1214, 0, 5, 518, 0, 2, +1146, 0, -3, -490, 0, -1, +1019, 0, -1, -527, 0, -1, +-1100, 0, 9, 465, 0, 4, +-970, 0, 2, 496, 0, 1, +1575, 0, -6, -50, 0, 0, +934, 0, -3, -399, 0, -1, +922, 0, -1, -395, 0, -1, +815, 0, -1, -422, 0, -1, +834, 0, 2, -440, 0, 1, +1248, 0, 0, -170, 0, 1, +1338, 0, -5, -39, 0, 0, +716, 0, -2, -389, 0, -1, +1282, 0, -3, -23, 0, 1, +742, 0, 1, -391, 0, 0, +1020, 0, -25, -495, 0, -10, +715, 0, -4, -326, 0, 2, +-666, 0, -3, 369, 0, -1, +-667, 0, 1, 346, 0, 1, +-704, 0, 0, 304, 0, 0, +-694, 0, 5, 294, 0, 2, +-1014, 0, -1, 4, 0, -1, +-585, 0, -2, 316, 0, -1, +-949, 0, 1, 8, 0, -1, +-595, 0, 0, 258, 0, 0, +528, 0, 0, -279, 0, 0, +-590, 0, 4, 252, 0, 2, +570, 0, -2, -244, 0, -1, +-502, 0, 3, 250, 0, 2, +-875, 0, 1, 29, 0, 0, +-492, 0, -3, 275, 0, -1, +535, 0, -2, -228, 0, -1, +-467, 0, 1, 240, 0, 1, +591, 0, 0, -253, 0, 0, +-453, 0, -1, 244, 0, -1, +766, 0, 1, 9, 0, 0, +-446, 0, 2, 225, 0, 1, +-488, 0, 2, 207, 0, 1, +-468, 0, 0, 201, 0, 0, +-421, 0, 1, 216, 0, 1, +463, 0, 0, -200, 0, 0, +-673, 0, 2, 14, 0, 0, +658, 0, 0, -2, 0, 0, +-438, 0, 0, 188, 0, 0, +-390, 0, 0, 205, 0, 0, +639, -11, -2, -19, 0, 0, +412, 0, -2, -176, 0, -1, +-361, 0, 0, 189, 0, 0, +360, 0, -1, -185, 0, -1, +588, 0, -3, -24, 0, 0, +-578, 0, 1, 5, 0, 0, +-396, 0, 0, 171, 0, 0, +565, 0, -1, -6, 0, 0, +-335, 0, -1, 184, 0, -1, +357, 0, 1, -154, 0, 0, +321, 0, 1, -174, 0, 0, +-301, 0, -1, 162, 0, 0, +-334, 0, 0, 144, 0, 0, +493, 0, -2, -15, 0, 0, +494, 0, -2, -19, 0, 0, +337, 0, -1, -143, 0, -1, +280, 0, -1, -144, 0, 0, +309, 0, 1, -134, 0, 0, +-263, 0, 2, 131, 0, 1, +253, 0, 1, -138, 0, 0, +245, 0, 0, -128, 0, 0, +416, 0, -2, -17, 0, 0, +-229, 0, 0, 128, 0, 0, +231, 0, 0, -120, 0, 0, +-259, 0, 2, 109, 0, 1, +375, 0, -1, -8, 0, 0, +252, 0, 0, -108, 0, 0, +-245, 0, 1, 104, 0, 0, +243, 0, -1, -104, 0, 0, +208, 0, 1, -112, 0, 0, +199, 0, 0, -102, 0, 0, +-208, 0, 1, 105, 0, 0, +335, 0, -2, -14, 0, 0, +-325, 0, 1, 7, 0, 0, +-187, 0, 0, 96, 0, 0, +197, 0, -1, -100, 0, 0, +-192, 0, 2, 94, 0, 1, +-188, 0, 0, 83, 0, 0, +276, 0, 0, -2, 0, 0, +-286, 0, 1, 6, 0, 0, +186, 0, -1, -79, 0, 0, +-219, 0, 0, 43, 0, 0, +276, 0, 0, 2, 0, 0, +-153, 0, -1, 84, 0, 0, +-156, 0, 0, 81, 0, 0, +-154, 0, 1, 78, 0, 0, +-174, 0, 1, 75, 0, 0, +-163, 0, 2, 69, 0, 1, +-228, 0, 0, 1, 0, 0, +91, 0, -4, -54, 0, -2, +175, 0, 0, -75, 0, 0, +-159, 0, 0, 69, 0, 0, +141, 0, 0, -72, 0, 0, +147, 0, 0, -75, 0, 0, +-132, 0, 0, 69, 0, 0, +159, 0, -28, -54, 0, 11, +213, 0, 0, -4, 0, 0, +123, 0, 0, -64, 0, 0, +-118, 0, -1, 66, 0, 0, +144, 0, -1, -61, 0, 0, +-121, 0, 1, 60, 0, 0, +-134, 0, 1, 56, 0, 1, +-105, 0, 0, 57, 0, 0, +-102, 0, 0, 56, 0, 0, +120, 0, 0, -52, 0, 0, +101, 0, 0, -54, 0, 0, +-113, 0, 0, 59, 0, 0, +-106, 0, 0, 61, 0, 0, +-129, 0, 1, 55, 0, 0, +-114, 0, 0, 57, 0, 0, +113, 0, -1, -49, 0, 0, +-102, 0, 0, 44, 0, 0, +-94, 0, 0, 51, 0, 0, +-100, 0, -1, 56, 0, 0, +87, 0, 0, -47, 0, 0, +161, 0, 0, -1, 0, 0, +96, 0, 0, -50, 0, 0, +151, 0, -1, -5, 0, 0, +-104, 0, 0, 44, 0, 0, +-110, 0, 0, 48, 0, 0, +-100, 0, 1, 50, 0, 0, +92, 0, -5, 12, 0, -2, +82, 0, 0, -45, 0, 0, +82, 0, 0, -45, 0, 0, +-78, 0, 0, 41, 0, 0, +-77, 0, 0, 43, 0, 0, +2, 0, 0, 54, 0, 0, +94, 0, 0, -40, 0, 0, +-93, 0, 0, 40, 0, 0, +-83, 0, 10, 40, 0, -2, +83, 0, 0, -36, 0, 0, +-91, 0, 0, 39, 0, 0, +128, 0, 0, -1, 0, 0, +-79, 0, 0, 34, 0, 0, +-83, 0, 0, 47, 0, 0, +84, 0, 0, -44, 0, 0, +83, 0, 0, -43, 0, 0, +91, 0, 0, -39, 0, 0, +-77, 0, 0, 39, 0, 0, +84, 0, 0, -43, 0, 0, +-92, 0, 1, 39, 0, 0, +-92, 0, 1, 39, 0, 0, +-94, 0, 0, 0, 0, 0, +68, 0, 0, -36, 0, 0, +-61, 0, 0, 32, 0, 0, +71, 0, 0, -31, 0, 0, +62, 0, 0, -34, 0, 0, +-63, 0, 0, 33, 0, 0, +-73, 0, 0, 32, 0, 0, +115, 0, 0, -2, 0, 0, +-103, 0, 0, 2, 0, 0, +63, 0, 0, -28, 0, 0, +74, 0, 0, -32, 0, 0, +-103, 0, -3, 3, 0, -1, +-69, 0, 0, 30, 0, 0, +57, 0, 0, -29, 0, 0, +94, 0, 0, -4, 0, 0, +64, 0, 0, -33, 0, 0, +-63, 0, 0, 26, 0, 0, +-38, 0, 0, 20, 0, 0, +-43, 0, 0, 24, 0, 0, +-45, 0, 0, 23, 0, 0, +47, 0, 0, -24, 0, 0, +-48, 0, 0, 25, 0, 0, +45, 0, 0, -26, 0, 0, +56, 0, 0, -25, 0, 0, +88, 0, 0, 2, 0, 0, +-75, 0, 0, 0, 0, 0, +85, 0, 0, 0, 0, 0, +49, 0, 0, -26, 0, 0, +-74, 0, -3, -1, 0, -1, +-39, 0, 0, 21, 0, 0, +45, 0, 0, -20, 0, 0, +51, 0, 0, -22, 0, 0, +-40, 0, 0, 21, 0, 0, +41, 0, 0, -21, 0, 0, +-42, 0, 0, 24, 0, 0, +-51, 0, 0, 22, 0, 0, +-42, 0, 0, 22, 0, 0, +39, 0, 0, -21, 0, 0, +46, 0, 0, -18, 0, 0, +-53, 0, 0, 22, 0, 0, +82, 0, 0, -4, 0, 0, +81, 0, -1, -4, 0, 0, +47, 0, 0, -19, 0, 0, +53, 0, 0, -23, 0, 0, +-45, 0, 0, 22, 0, 0, +-44, 0, 0, -2, 0, 0, +-33, 0, 0, 16, 0, 0, +-61, 0, 0, 1, 0, 0, +28, 0, 0, -15, 0, 0, +-38, 0, 0, 19, 0, 0, +-33, 0, 0, 21, 0, 0, +-60, 0, 0, 0, 0, 0, +48, 0, 0, -10, 0, 0, +27, 0, 0, -14, 0, 0, +38, 0, 0, -20, 0, 0, +31, 0, 0, -13, 0, 0, +-29, 0, 0, 15, 0, 0, +28, 0, 0, -15, 0, 0, +-32, 0, 0, 15, 0, 0, +45, 0, 0, -8, 0, 0, +-44, 0, 0, 19, 0, 0, +28, 0, 0, -15, 0, 0, +-51, 0, 0, 0, 0, 0, +-36, 0, 0, 20, 0, 0, +44, 0, 0, -19, 0, 0, +26, 0, 0, -14, 0, 0, +-60, 0, 0, 2, 0, 0, +35, 0, 0, -18, 0, 0, +-27, 0, 0, 11, 0, 0, +47, 0, 0, -1, 0, 0, +36, 0, 0, -15, 0, 0, +-36, 0, 0, 20, 0, 0, +-35, 0, 0, 19, 0, 0, +-37, 0, 0, 19, 0, 0, +32, 0, 0, -16, 0, 0, +35, 0, 0, -14, 0, 0, +32, 0, 0, -13, 0, 0, +65, 0, 0, -2, 0, 0, +47, 0, 0, -1, 0, 0, +32, 0, 0, -16, 0, 0, +37, 0, 0, -16, 0, 0, +-30, 0, 0, 15, 0, 0, +-32, 0, 0, 16, 0, 0, +-31, 0, 0, 13, 0, 0, +37, 0, 0, -16, 0, 0, +31, 0, 0, -13, 0, 0, +49, 0, 0, -2, 0, 0, +32, 0, 0, -13, 0, 0, +23, 0, 0, -12, 0, 0, +-43, 0, 0, 18, 0, 0, +26, 0, 0, -11, 0, 0, +-32, 0, 0, 14, 0, 0, +-29, 0, 0, 14, 0, 0, +-27, 0, 0, 12, 0, 0, +30, 0, 0, 0, 0, 0, +-11, 0, 0, 5, 0, 0, +-21, 0, 0, 10, 0, 0, +-34, 0, 0, 15, 0, 0, +-10, 0, 0, 6, 0, 0, +-36, 0, 0, 0, 0, 0, +-9, 0, 0, 4, 0, 0, +-12, 0, 0, 5, 0, 0, +-21, 0, 0, 5, 0, 0, +-29, 0, 0, -1, 0, 0, +-15, 0, 0, 3, 0, 0, +-20, 0, 0, 0, 0, 0, +28, 0, 0, 0, 0, -2, +17, 0, 0, 0, 0, 0, +-22, 0, 0, 12, 0, 0, +-14, 0, 0, 7, 0, 0, +24, 0, 0, -11, 0, 0, +11, 0, 0, -6, 0, 0, +14, 0, 0, -6, 0, 0, +24, 0, 0, 0, 0, 0, +18, 0, 0, -8, 0, 0, +-38, 0, 0, 0, 0, 0, +-31, 0, 0, 0, 0, 0, +-16, 0, 0, 8, 0, 0, +29, 0, 0, 0, 0, 0, +-18, 0, 0, 10, 0, 0, +-10, 0, 0, 5, 0, 0, +-17, 0, 0, 10, 0, 0, +9, 0, 0, -4, 0, 0, +16, 0, 0, -6, 0, 0, +22, 0, 0, -12, 0, 0, +20, 0, 0, 0, 0, 0, +-13, 0, 0, 6, 0, 0, +-17, 0, 0, 9, 0, 0, +-14, 0, 0, 8, 0, 0, +0, 0, 0, -7, 0, 0, +14, 0, 0, 0, 0, 0, +19, 0, 0, -10, 0, 0, +-34, 0, 0, 0, 0, 0, +-20, 0, 0, 8, 0, 0, +9, 0, 0, -5, 0, 0, +-18, 0, 0, 7, 0, 0, +13, 0, 0, -6, 0, 0, +17, 0, 0, 0, 0, 0, +-12, 0, 0, 5, 0, 0, +15, 0, 0, -8, 0, 0, +-11, 0, 0, 3, 0, 0, +13, 0, 0, -5, 0, 0, +-18, 0, 0, 0, 0, 0, +-35, 0, 0, 0, 0, 0, +9, 0, 0, -4, 0, 0, +-19, 0, 0, 10, 0, 0, +-26, 0, 0, 11, 0, 0, +8, 0, 0, -4, 0, 0, +-10, 0, 0, 4, 0, 0, +10, 0, 0, -6, 0, 0, +-21, 0, 0, 9, 0, 0, +-15, 0, 0, 0, 0, 0, +9, 0, 0, -5, 0, 0, +-29, 0, 0, 0, 0, 0, +-19, 0, 0, 10, 0, 0, +12, 0, 0, -5, 0, 0, +22, 0, 0, -9, 0, 0, +-10, 0, 0, 5, 0, 0, +-20, 0, 0, 11, 0, 0, +-20, 0, 0, 0, 0, 0, +-17, 0, 0, 7, 0, 0, +15, 0, 0, -3, 0, 0, +8, 0, 0, -4, 0, 0, +14, 0, 0, 0, 0, 0, +-12, 0, 0, 6, 0, 0, +25, 0, 0, 0, 0, 0, +-13, 0, 0, 6, 0, 0, +-14, 0, 0, 8, 0, 0, +13, 0, 0, -5, 0, 0, +-17, 0, 0, 9, 0, 0, +-12, 0, 0, 6, 0, 0, +-10, 0, 0, 5, 0, 0, +10, 0, 0, -6, 0, 0, +-15, 0, 0, 0, 0, 0, +-22, 0, 0, 0, 0, 0, +28, 0, 0, -1, 0, 0, +15, 0, 0, -7, 0, 0, +23, 0, 0, -10, 0, 0, +12, 0, 0, -5, 0, 0, +29, 0, 0, -1, 0, 0, +-25, 0, 0, 1, 0, 0, +22, 0, 0, 0, 0, 0, +-18, 0, 0, 0, 0, 0, +15, 0, 0, 3, 0, 0, +-23, 0, 0, 0, 0, 0, +12, 0, 0, -5, 0, 0, +-8, 0, 0, 4, 0, 0, +-19, 0, 0, 0, 0, 0, +-10, 0, 0, 4, 0, 0, +21, 0, 0, -9, 0, 0, +23, 0, 0, -1, 0, 0, +-16, 0, 0, 8, 0, 0, +-19, 0, 0, 9, 0, 0, +-22, 0, 0, 10, 0, 0, +27, 0, 0, -1, 0, 0, +16, 0, 0, -8, 0, 0, +19, 0, 0, -8, 0, 0, +9, 0, 0, -4, 0, 0, +-9, 0, 0, 4, 0, 0, +-9, 0, 0, 4, 0, 0, +-8, 0, 0, 4, 0, 0, +18, 0, 0, -9, 0, 0, +16, 0, 0, -1, 0, 0, +-10, 0, 0, 4, 0, 0, +-23, 0, 0, 9, 0, 0, +16, 0, 0, -1, 0, 0, +-12, 0, 0, 6, 0, 0, +-8, 0, 0, 4, 0, 0, +30, 0, 0, -2, 0, 0, +24, 0, 0, -10, 0, 0, +10, 0, 0, -4, 0, 0, +-16, 0, 0, 7, 0, 0, +-16, 0, 0, 7, 0, 0, +17, 0, 0, -7, 0, 0, +-24, 0, 0, 10, 0, 0, +-12, 0, 0, 5, 0, 0, +-24, 0, 0, 11, 0, 0, +-23, 0, 0, 9, 0, 0, +-13, 0, 0, 5, 0, 0, +-15, 0, 0, 7, 0, 0, +0, 0, -1988, 0, 0, -1679, +0, 0, -63, 0, 0, -27, +-4, 0, 0, 0, 0, 0, +0, 0, 5, 0, 0, 4, +5, 0, 0, -3, 0, 0, +0, 0, 364, 0, 0, 176, +0, 0, -1044, 0, 0, -891, +-3, 0, 0, 1, 0, 0, +4, 0, 0, -2, 0, 0, +0, 0, 330, 0, 0, 0, +5, 0, 0, -2, 0, 0, +3, 0, 0, -2, 0, 0, +-3, 0, 0, 1, 0, 0, +-5, 0, 0, 2, 0, 0, +3, 0, 0, -1, 0, 0, +3, 0, 0, 0, 0, 0, +3, 0, 0, 0, 0, 0, +0, 0, 5, 0, 0, 0, +0, 0, 0, 1, 0, 0, +4, 0, 0, -2, 0, 0, +6, 0, 0, 0, 0, 0, +5, 0, 0, -2, 0, 0, +-7, 0, 0, 0, 0, 0, +-12, 0, 0, 0, 0, 0, +5, 0, 0, -3, 0, 0, +3, 0, 0, -1, 0, 0, +-5, 0, 0, 0, 0, 0, +3, 0, 0, 0, 0, 0, +-7, 0, 0, 3, 0, 0, +7, 0, 0, -4, 0, 0, +0, 0, -12, 0, 0, -10, +4, 0, 0, -2, 0, 0, +3, 0, 0, -2, 0, 0, +-3, 0, 0, 2, 0, 0, +-7, 0, 0, 3, 0, 0, +-4, 0, 0, 2, 0, 0, +-3, 0, 0, 1, 0, 0, +0, 0, 0, 0, 0, 0, +-3, 0, 0, 1, 0, 0, +7, 0, 0, -3, 0, 0, +-4, 0, 0, 2, 0, 0, +4, 0, 0, -2, 0, 0, +-5, 0, 0, 3, 0, 0, +5, 0, 0, 0, 0, 0, +-5, 0, 0, 2, 0, 0, +5, 0, 0, -2, 0, 0, +-8, 0, 0, 3, 0, 0, +9, 0, 0, 0, 0, 0, +6, 0, 0, -3, 0, 0, +-5, 0, 0, 2, 0, 0, +3, 0, 0, 0, 0, 0, +-7, 0, 0, 0, 0, 0, +-3, 0, 0, 1, 0, 0, +5, 0, 0, 0, 0, 0, +3, 0, 0, 0, 0, 0, +-3, 0, 0, 2, 0, 0, +4, 0, 0, -2, 0, 0, +3, 0, 0, -1, 0, 0, +-5, 0, 0, 2, 0, 0, +4, 0, 0, -2, 0, 0, +9, 0, 0, -3, 0, 0, +4, 0, 0, 0, 0, 0, +4, 0, 0, -2, 0, 0, +-3, 0, 0, 2, 0, 0, +-4, 0, 0, 2, 0, 0, +9, 0, 0, -3, 0, 0, +-4, 0, 0, 0, 0, 0, +-4, 0, 0, 0, 0, 0, +3, 0, 0, -2, 0, 0, +8, 0, 0, 0, 0, 0, +3, 0, 0, 0, 0, 0, +-3, 0, 0, 2, 0, 0, +3, 0, 0, -1, 0, 0, +3, 0, 0, -1, 0, 0, +-3, 0, 0, 1, 0, 0, +6, 0, 0, -3, 0, 0, +3, 0, 0, 0, 0, 0, +-3, 0, 0, 1, 0, 0, +-7, 0, 0, 0, 0, 0, +9, 0, 0, 0, 0, 0, +-3, 0, 0, 2, 0, 0, +-3, 0, 0, 0, 0, 0, +-4, 0, 0, 0, 0, 0, +-5, 0, 0, 3, 0, 0, +-13, 0, 0, 0, 0, 0, +-7, 0, 0, 0, 0, 0, +10, 0, 0, 0, 0, 0, +3, 0, 0, -1, 0, 0, +10, 0, 13, 6, 0, -5, +0, 0, 30, 0, 0, 14, +0, 0, -162, 0, 0, -138, +0, 0, 75, 0, 0, 0, +-7, 0, 0, 4, 0, 0, +-4, 0, 0, 2, 0, 0, +4, 0, 0, -2, 0, 0, +5, 0, 0, -2, 0, 0, +5, 0, 0, -3, 0, 0, +-3, 0, 0, 0, 0, 0, +-3, 0, 0, 2, 0, 0, +-4, 0, 0, 2, 0, 0, +-5, 0, 0, 2, 0, 0, +6, 0, 0, 0, 0, 0, +9, 0, 0, 0, 0, 0, +5, 0, 0, 0, 0, 0, +-7, 0, 0, 0, 0, 0, +-3, 0, 0, 1, 0, 0, +-4, 0, 0, 2, 0, 0, +7, 0, 0, 0, 0, 0, +-4, 0, 0, 0, 0, 0, +4, 0, 0, 0, 0, 0, +-6, 0, -3, 3, 0, 1, +0, 0, -3, 0, 0, -2, +11, 0, 0, 0, 0, 0, +3, 0, 0, -1, 0, 0, +11, 0, 0, 0, 0, 0, +-3, 0, 0, 2, 0, 0, +-1, 0, 3, 3, 0, -1, +4, 0, 0, -2, 0, 0, +0, 0, -13, 0, 0, -11, +3, 0, 6, 0, 0, 0, +-7, 0, 0, 0, 0, 0, +5, 0, 0, -3, 0, 0, +-3, 0, 0, 1, 0, 0, +3, 0, 0, 0, 0, 0, +5, 0, 0, -3, 0, 0, +-7, 0, 0, 3, 0, 0, +8, 0, 0, -3, 0, 0, +-4, 0, 0, 2, 0, 0, +11, 0, 0, 0, 0, 0, +-3, 0, 0, 1, 0, 0, +3, 0, 0, -1, 0, 0, +-4, 0, 0, 2, 0, 0, +8, 0, 0, -4, 0, 0, +3, 0, 0, -1, 0, 0, +11, 0, 0, 0, 0, 0, +-6, 0, 0, 3, 0, 0, +-4, 0, 0, 2, 0, 0, +-8, 0, 0, 4, 0, 0, +-7, 0, 0, 3, 0, 0, +-4, 0, 0, 2, 0, 0, +3, 0, 0, -1, 0, 0, +6, 0, 0, -3, 0, 0, +-6, 0, 0, 3, 0, 0, +6, 0, 0, 0, 0, 0, +6, 0, 0, -1, 0, 0, +5, 0, 0, -2, 0, 0, +-5, 0, 0, 2, 0, 0, +-4, 0, 0, 0, 0, 0, +-4, 0, 0, 2, 0, 0, +4, 0, 0, 0, 0, 0, +6, 0, 0, -3, 0, 0, +-4, 0, 0, 2, 0, 0, +0, 0, -26, 0, 0, -11, +0, 0, -10, 0, 0, -5, +5, 0, 0, -3, 0, 0, +-13, 0, 0, 0, 0, 0, +3, 0, 0, -2, 0, 0, +4, 0, 0, -2, 0, 0, +7, 0, 0, -3, 0, 0, +4, 0, 0, 0, 0, 0, +5, 0, 0, 0, 0, 0, +-3, 0, 0, 2, 0, 0, +-6, 0, 0, 2, 0, 0, +-5, 0, 0, 2, 0, 0, +-7, 0, 0, 3, 0, 0, +5, 0, 0, -2, 0, 0, +13, 0, 0, 0, 0, 0, +-4, 0, 0, 2, 0, 0, +-3, 0, 0, 0, 0, 0, +5, 0, 0, -2, 0, 0, +-11, 0, 0, 0, 0, 0, +5, 0, 0, -2, 0, 0, +4, 0, 0, 0, 0, 0, +4, 0, 0, -2, 0, 0, +-4, 0, 0, 2, 0, 0, +6, 0, 0, -3, 0, 0, +3, 0, 0, -2, 0, 0, +-12, 0, 0, 0, 0, 0, +4, 0, 0, 0, 0, 0, +-3, 0, 0, 0, 0, 0, +-4, 0, 0, 0, 0, 0, +3, 0, 0, 0, 0, 0, +3, 0, 0, -1, 0, 0, +-3, 0, 0, 1, 0, 0, +0, 0, -5, 0, 0, -2, +-7, 0, 0, 4, 0, 0, +6, 0, 0, -3, 0, 0, +-3, 0, 0, 0, 0, 0, +5, 0, 0, -3, 0, 0, +3, 0, 0, -1, 0, 0, +3, 0, 0, 0, 0, 0, +-3, 0, 0, 1, 0, 0, +-5, 0, 0, 3, 0, 0, +-3, 0, 0, 2, 0, 0, +-3, 0, 0, 2, 0, 0, +12, 0, 0, 0, 0, 0, +3, 0, 0, -1, 0, 0, +-4, 0, 0, 2, 0, 0, +4, 0, 0, 0, 0, 0, +6, 0, 0, 0, 0, 0, +5, 0, 0, -3, 0, 0, +4, 0, 0, -2, 0, 0, +-6, 0, 0, 3, 0, 0, +4, 0, 0, -2, 0, 0, +6, 0, 0, -3, 0, 0, +6, 0, 0, 0, 0, 0, +-6, 0, 0, 3, 0, 0, +3, 0, 0, -2, 0, 0, +7, 0, 0, -4, 0, 0, +4, 0, 0, -2, 0, 0, +-5, 0, 0, 2, 0, 0, +5, 0, 0, 0, 0, 0, +-6, 0, 0, 3, 0, 0, +-6, 0, 0, 3, 0, 0, +-4, 0, 0, 2, 0, 0, +10, 0, 0, 0, 0, 0, +-4, 0, 0, 2, 0, 0, +7, 0, 0, 0, 0, 0, +7, 0, 0, -3, 0, 0, +4, 0, 0, 0, 0, 0, +11, 0, 0, 0, 0, 0, +5, 0, 0, -2, 0, 0, +-6, 0, 0, 2, 0, 0, +4, 0, 0, -2, 0, 0, +3, 0, 0, -2, 0, 0, +5, 0, 0, -2, 0, 0, +-4, 0, 0, 2, 0, 0, +-4, 0, 0, 2, 0, 0, +-3, 0, 0, 2, 0, 0, +4, 0, 0, -2, 0, 0, +3, 0, 0, -1, 0, 0, +-3, 0, 0, 1, 0, 0, +-3, 0, 0, 1, 0, 0, +-3, 0, 0, 2, 0, 0, +}; + +#if NUT_IAU_2000A +/* Planetary argument multipliers + * L L' F D Om Me Ve E Ma Ju Sa Ur Ne pre */ +static int16 npl[] = { +0, 0, 0, 0, 0, 0, 0, 8,-16, 4, 5, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -8, 16, -4, -5, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 8,-16, 4, 5, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 2, 2, +0, 0, 0, 0, 0, 0, 0, -4, 8, -1, -5, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 4, -8, 3, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, 0, 3, -8, 3, 0, 0, 0, 0, +-1, 0, 0, 0, 0, 0, 10, -3, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 6, -3, 0, 2, +0, 0, 0, 0, 0, 0, 0, 4, -8, 3, 0, 0, 0, 0, +0, 0, 1, -1, 1, 0, 0, -5, 8, -3, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -4, 8, -3, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 4, -8, 1, 5, 0, 0, 2, +0, 0, 0, 0, 0, 0, -5, 6, 4, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -5, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -5, 0, 0, 1, +0, 0, 1, -1, 1, 0, 0, -1, 0, 2, -5, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -5, 0, 0, 0, +0, 0, 1, -1, 1, 0, 0, -1, 0, -2, 5, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 5, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 5, 0, 0, 2, +2, 0, -1, -1, 0, 0, 0, 3, -7, 0, 0, 0, 0, 0, +1, 0, 0, -2, 0, 0, 19,-21, 3, 0, 0, 0, 0, 0, +0, 0, 1, -1, 1, 0, 2, -4, 0, -3, 0, 0, 0, 0, +1, 0, 0, -1, 1, 0, 0, -1, 0, 2, 0, 0, 0, 0, +0, 0, 1, -1, 1, 0, 0, -1, 0, -4, 10, 0, 0, 0, +-2, 0, 0, 2, 1, 0, 0, 2, 0, 0, -5, 0, 0, 0, +0, 0, 0, 0, 0, 0, 3, -7, 4, 0, 0, 0, 0, 0, +0, 0, -1, 1, 0, 0, 0, 1, 0, 1, -1, 0, 0, 0, +-2, 0, 0, 2, 1, 0, 0, 2, 0, -2, 0, 0, 0, 0, +-1, 0, 0, 0, 0, 0, 18,-16, 0, 0, 0, 0, 0, 0, +-2, 0, 1, 1, 2, 0, 0, 1, 0, -2, 0, 0, 0, 0, +-1, 0, 1, -1, 1, 0, 18,-17, 0, 0, 0, 0, 0, 0, +-1, 0, 0, 1, 1, 0, 0, 2, -2, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -8, 13, 0, 0, 0, 0, 0, 2, +0, 0, 2, -2, 2, 0, -8, 11, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -8, 13, 0, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, -8, 12, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 8,-13, 0, 0, 0, 0, 0, 0, +0, 0, 1, -1, 1, 0, 8,-14, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 8,-13, 0, 0, 0, 0, 0, 1, +-2, 0, 0, 2, 1, 0, 0, 2, 0, -4, 5, 0, 0, 0, +-2, 0, 0, 2, 2, 0, 3, -3, 0, 0, 0, 0, 0, 0, +-2, 0, 0, 2, 0, 0, 0, 2, 0, -3, 1, 0, 0, 0, +0, 0, 0, 0, 1, 0, 3, -5, 0, 2, 0, 0, 0, 0, +-2, 0, 0, 2, 0, 0, 0, 2, 0, -4, 3, 0, 0, 0, +0, 0, -1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, -1, 2, 0, 0, 0, 0, 0, +0, 0, 1, -1, 2, 0, 0, -2, 2, 0, 0, 0, 0, 0, +-1, 0, 1, 0, 1, 0, 3, -5, 0, 0, 0, 0, 0, 0, +-1, 0, 0, 1, 0, 0, 3, -4, 0, 0, 0, 0, 0, 0, +-2, 0, 0, 2, 0, 0, 0, 2, 0, -2, -2, 0, 0, 0, +-2, 0, 2, 0, 2, 0, 0, -5, 9, 0, 0, 0, 0, 0, +0, 0, 1, -1, 1, 0, 0, -1, 0, 0, 0, -1, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, +0, 0, 1, -1, 1, 0, 0, -1, 0, 0, 0, 0, 2, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, +-1, 0, 0, 1, 0, 0, 0, 3, -4, 0, 0, 0, 0, 0, +0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, +0, 0, 1, -1, 2, 0, 0, -1, 0, 0, 2, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, -9, 17, 0, 0, 0, 0, 0, +0, 0, 0, 0, 2, 0, -3, 5, 0, 0, 0, 0, 0, 0, +0, 0, 1, -1, 1, 0, 0, -1, 0, -1, 2, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -2, 0, 0, 0, +1, 0, 0, -2, 0, 0, 17,-16, 0, -2, 0, 0, 0, 0, +0, 0, 1, -1, 1, 0, 0, -1, 0, 1, -3, 0, 0, 0, +-2, 0, 0, 2, 1, 0, 0, 5, -6, 0, 0, 0, 0, 0, +0, 0, -2, 2, 0, 0, 0, 9,-13, 0, 0, 0, 0, 0, +0, 0, 1, -1, 2, 0, 0, -1, 0, 0, 1, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, +0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, +0, 0, -2, 2, 0, 0, 5, -6, 0, 0, 0, 0, 0, 0, +0, 0, -1, 1, 1, 0, 5, -7, 0, 0, 0, 0, 0, 0, +-2, 0, 0, 2, 0, 0, 6, -8, 0, 0, 0, 0, 0, 0, +2, 0, 1, -3, 1, 0, -6, 7, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, +0, 0, -1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, +0, 0, 1, -1, 1, 0, 0, -1, 0, 0, 0, 2, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, +0, 0, 0, 0, 0, 0, 0, -8, 15, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -8, 15, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, 0, -9, 15, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 8,-15, 0, 0, 0, 0, 0, +1, 0, -1, -1, 0, 0, 0, 8,-15, 0, 0, 0, 0, 0, +2, 0, 0, -2, 0, 0, 2, -5, 0, 0, 0, 0, 0, 0, +-2, 0, 0, 2, 0, 0, 0, 2, 0, -5, 5, 0, 0, 0, +2, 0, 0, -2, 1, 0, 0, -6, 8, 0, 0, 0, 0, 0, +2, 0, 0, -2, 1, 0, 0, -2, 0, 3, 0, 0, 0, 0, +-2, 0, 1, 1, 0, 0, 0, 1, 0, -3, 0, 0, 0, 0, +-2, 0, 1, 1, 1, 0, 0, 1, 0, -3, 0, 0, 0, 0, +-2, 0, 0, 2, 0, 0, 0, 2, 0, -3, 0, 0, 0, 0, +-2, 0, 0, 2, 0, 0, 0, 6, -8, 0, 0, 0, 0, 0, +-2, 0, 0, 2, 0, 0, 0, 2, 0, -1, -5, 0, 0, 0, +-1, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, +-1, 0, 1, 1, 1, 0,-20, 20, 0, 0, 0, 0, 0, 0, +1, 0, 0, -2, 0, 0, 20,-21, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, 8,-15, 0, 0, 0, 0, 0, +0, 0, 2, -2, 1, 0, 0,-10, 15, 0, 0, 0, 0, 0, +0, 0, -1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, +0, 0, 1, -1, 2, 0, 0, -1, 0, 1, 0, 0, 0, 0, +0, 0, 1, -1, 1, 0, 0, -1, 0, -2, 4, 0, 0, 0, +2, 0, 0, -2, 1, 0, -6, 8, 0, 0, 0, 0, 0, 0, +0, 0, -2, 2, 1, 0, 5, -6, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, +0, 0, 1, -1, 1, 0, 0, -1, 0, 0, -1, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, +0, 0, 1, -1, 1, 0, 0, -1, 0, 0, 1, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, +0, 0, 2, -2, 1, 0, 0, -9, 13, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, 7,-13, 0, 0, 0, 0, 0, +-2, 0, 0, 2, 0, 0, 0, 5, -6, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 9,-17, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -9, 17, 0, 0, 0, 0, 2, +1, 0, 0, -1, 1, 0, 0, -3, 4, 0, 0, 0, 0, 0, +1, 0, 0, -1, 1, 0, -3, 4, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 2, 0, 0, -1, 2, 0, 0, 0, 0, 0, +0, 0, -1, 1, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, +0, 0, -2, 2, 0, 1, 0, -2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 3, -5, 0, 2, 0, 0, 0, 0, +-2, 0, 0, 2, 1, 0, 0, 2, 0, -3, 1, 0, 0, 0, +-2, 0, 0, 2, 1, 0, 3, -3, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 8,-13, 0, 0, 0, 0, 0, 0, +0, 0, -1, 1, 0, 0, 8,-12, 0, 0, 0, 0, 0, 0, +0, 0, 2, -2, 1, 0, -8, 11, 0, 0, 0, 0, 0, 0, +-1, 0, 0, 1, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, +-1, 0, 0, 0, 1, 0, 18,-16, 0, 0, 0, 0, 0, 0, +0, 0, 1, -1, 1, 0, 0, -1, 0, -1, 1, 0, 0, 0, +0, 0, 0, 0, 1, 0, 3, -7, 4, 0, 0, 0, 0, 0, +-2, 0, 1, 1, 1, 0, 0, -3, 7, 0, 0, 0, 0, 0, +0, 0, 1, -1, 2, 0, 0, -1, 0, -2, 5, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, 0, 0, -2, 5, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, -4, 8, -3, 0, 0, 0, 0, +1, 0, 0, 0, 1, 0,-10, 3, 0, 0, 0, 0, 0, 0, +0, 0, 2, -2, 1, 0, 0, -2, 0, 0, 0, 0, 0, 0, +-1, 0, 0, 0, 1, 0, 10, -3, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, 4, -8, 3, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, 0, 0, 2, -5, 0, 0, 0, +0, 0, -1, 1, 0, 0, 0, 1, 0, 2, -5, 0, 0, 0, +2, 0, -1, -1, 1, 0, 0, 3, -7, 0, 0, 0, 0, 0, +-2, 0, 0, 2, 0, 0, 0, 2, 0, 0, -5, 0, 0, 0, +0, 0, 0, 0, 1, 0, -3, 7, -4, 0, 0, 0, 0, 0, +-2, 0, 0, 2, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0, +1, 0, 0, 0, 1, 0,-18, 16, 0, 0, 0, 0, 0, 0, +-2, 0, 1, 1, 1, 0, 0, 1, 0, -2, 0, 0, 0, 0, +0, 0, 1, -1, 2, 0, -8, 12, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, -8, 13, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 1, -2, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, 0, 0, -2, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 1, -2, 0, 0, 0, 0, 0, +0, 0, 1, -1, 1, 0, 0, -2, 2, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -1, 2, 0, 0, 0, 0, 1, +-1, 0, 0, 1, 1, 0, 3, -4, 0, 0, 0, 0, 0, 0, +-1, 0, 0, 1, 1, 0, 0, 3, -4, 0, 0, 0, 0, 0, +0, 0, 1, -1, 1, 0, 0, -1, 0, 0, -2, 0, 0, 0, +0, 0, 1, -1, 1, 0, 0, -1, 0, 0, 2, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, +0, 0, 1, -1, 0, 0, 3, -6, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, -3, 5, 0, 0, 0, 0, 0, 0, +0, 0, 1, -1, 2, 0, -3, 4, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, -2, 4, 0, 0, 0, 0, 0, +0, 0, 2, -2, 1, 0, -5, 6, 0, 0, 0, 0, 0, 0, +0, 0, -1, 1, 0, 0, 5, -7, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 5, -8, 0, 0, 0, 0, 0, 0, +-2, 0, 0, 2, 1, 0, 6, -8, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, -8, 15, 0, 0, 0, 0, 0, +-2, 0, 0, 2, 1, 0, 0, 2, 0, -3, 0, 0, 0, 0, +-2, 0, 0, 2, 1, 0, 0, 6, -8, 0, 0, 0, 0, 0, +1, 0, 0, -1, 1, 0, 0, -1, 0, 1, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 3, -5, 0, 0, 0, +0, 0, 1, -1, 1, 0, 0, -1, 0, -1, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, 0, -1, 0, 1, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, +0, 0, 1, -1, 2, 0, 0, -1, 0, 0, -1, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, +0, 0, -1, 1, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -7, 13, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 7,-13, 0, 0, 0, 0, 0, +2, 0, 0, -2, 1, 0, 0, -5, 6, 0, 0, 0, 0, 0, +0, 0, 2, -2, 1, 0, 0, -8, 11, 0, 0, 0, 0, 0, +0, 0, 2, -2, 1, -1, 0, 2, 0, 0, 0, 0, 0, 0, +-2, 0, 0, 2, 0, 0, 0, 4, -4, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, +0, 0, 1, -1, 1, 0, 0, -1, 0, 0, 3, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, +-2, 0, 0, 2, 0, 0, 3, -3, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 2, 0, 0, -4, 8, -3, 0, 0, 0, 0, +0, 0, 0, 0, 2, 0, 0, 4, -8, 3, 0, 0, 0, 0, +2, 0, 0, -2, 1, 0, 0, -2, 0, 2, 0, 0, 0, 0, +0, 0, 1, -1, 2, 0, 0, -1, 0, 2, 0, 0, 0, 0, +0, 0, 1, -1, 2, 0, 0, 0, -2, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, 1, -2, 0, 0, 0, 0, 0, +0, 0, -1, 1, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, +0, 0, -1, 1, 0, 0, 0, 1, 0, 0, -2, 0, 0, 0, +0, 0, 2, -2, 1, 0, 0, -2, 0, 0, 2, 0, 0, 0, +0, 0, 1, -1, 1, 0, 3, -6, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 3, -5, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 3, -5, 0, 0, 0, 0, 0, 0, +0, 0, 1, -1, 1, 0, -3, 4, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -3, 5, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, -3, 5, 0, 0, 0, 0, 0, 2, +0, 0, 2, -2, 2, 0, -3, 3, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -3, 5, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 2, -4, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, 0, 1, -4, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 2, -4, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -2, 4, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, 0, -3, 4, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -2, 4, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, -2, 4, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -5, 8, 0, 0, 0, 0, 0, 2, +0, 0, 2, -2, 2, 0, -5, 6, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -5, 8, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -5, 8, 0, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, -5, 7, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -5, 8, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 5, -8, 0, 0, 0, 0, 0, 0, +0, 0, 1, -1, 2, 0, 0, -1, 0, -1, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, +0, 0, -1, 1, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, +0, 0, 2, -2, 1, 0, 0, -2, 0, 1, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -6, 11, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 6,-11, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, -1, 0, 4, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 1, 0, -4, 0, 0, 0, 0, 0, 0, +2, 0, 0, -2, 1, 0, -3, 3, 0, 0, 0, 0, 0, 0, +-2, 0, 0, 2, 0, 0, 0, 2, 0, 0, -2, 0, 0, 0, +0, 0, 2, -2, 1, 0, 0, -7, 9, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 4, -5, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, 0, -1, 0, 2, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, +0, 0, 2, -2, 2, 0, 0, -2, 0, 2, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 2, +0, 0, 0, 0, 1, 0, 3, -5, 0, 0, 0, 0, 0, 0, +0, 0, -1, 1, 0, 0, 3, -4, 0, 0, 0, 0, 0, 0, +0, 0, 2, -2, 1, 0, -3, 3, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, 2, -4, 0, 0, 0, 0, 0, +0, 0, 2, -2, 1, 0, 0, -4, 4, 0, 0, 0, 0, 0, +0, 0, 1, -1, 2, 0, -5, 7, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 3, -6, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -3, 6, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, 0, -4, 6, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -3, 6, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, -3, 6, 0, 0, 0, 0, 2, +0, 0, -1, 1, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 2, -3, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -5, 9, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -5, 9, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 5, -9, 0, 0, 0, 0, 0, +0, 0, -1, 1, 0, 0, 0, 1, 0, -2, 0, 0, 0, 0, +0, 0, 2, -2, 1, 0, 0, -2, 0, 2, 0, 0, 0, 0, +-2, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, +0, 0, -2, 2, 0, 0, 3, -3, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -6, 10, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, -6, 10, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -2, 3, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -2, 3, 0, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, -2, 2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 2, -3, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 2, -3, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, 0, -1, 0, 3, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 4, -8, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -4, 8, 0, 0, 0, 0, 2, +0, 0, -2, 2, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -4, 7, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -4, 7, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 4, -7, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, -2, 3, 0, 0, 0, 0, 0, 0, +0, 0, 2, -2, 1, 0, 0, -2, 0, 3, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -5, 10, 0, 0, 0, 0, 2, +0, 0, 0, 0, 1, 0, -1, 2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -3, 5, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -3, 5, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 3, -5, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 1, -2, 0, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, 1, -3, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 1, -2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -7, 11, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -7, 11, 0, 0, 0, 0, 0, 1, +0, 0, -2, 2, 0, 0, 4, -4, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 2, -3, 0, 0, 0, 0, 0, +0, 0, 2, -2, 1, 0, -4, 4, 0, 0, 0, 0, 0, 0, +0, 0, -1, 1, 0, 0, 4, -5, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -4, 7, 0, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, -4, 6, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -4, 7, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -4, 6, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -4, 6, 0, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, -4, 5, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -4, 6, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 4, -6, 0, 0, 0, 0, 0, 0, +-2, 0, 0, 2, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, +0, 0, -1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 1, -1, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -1, 0, 5, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 1, -3, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -1, 3, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -7, 12, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, 1, -2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -2, 5, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -1, 0, 4, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 1, 0, -4, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, -1, 1, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -6, 10, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -6, 10, 0, 0, 0, 0, 0, +0, 0, 2, -2, 1, 0, 0, -3, 0, 3, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -3, 7, 0, 0, 0, 0, 2, +-2, 0, 0, 2, 0, 0, 4, -4, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -5, 8, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 5, -8, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -1, 0, 3, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -1, 0, 3, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 1, 0, -3, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 2, -4, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -2, 4, 0, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, -2, 3, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -2, 4, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -6, 9, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -6, 9, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 6, -9, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, 1, 0, -2, 0, 0, 0, 0, +0, 0, 2, -2, 1, 0, -2, 2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -4, 6, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 4, -6, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 3, -4, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -1, 0, 2, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 1, 0, -2, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, 1, 0, -1, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -5, 9, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 3, -4, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -3, 4, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -3, 4, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 3, -4, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 3, -4, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 1, 0, 0, 2, -2, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, -1, 0, 2, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -3, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 1, 0, 1, -5, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 1, 0, -3, 5, 0, 0, 0, +0, 0, 0, 0, 1, 0, -3, 4, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -2, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, -1, 0, 1, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, -2, 2, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -8, 14, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 1, 0, 2, -5, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 5, -8, 3, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 5, -8, 3, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 3, -8, 3, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -3, 8, -3, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 1, 0, -2, 5, 0, 0, 2, +0, 0, 0, 0, 0, 0, -8, 12, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -8, 12, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 1, 0, 1, -2, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 2, +0, 0, 2, -2, 1, 0, -5, 5, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 3, -6, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -3, 6, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, -3, 6, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -1, 4, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -5, 7, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -5, 7, 0, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, -5, 6, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 5, -7, 0, 0, 0, 0, 0, 0, +0, 0, 2, -2, 1, 0, 0, -1, 0, 1, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, +0, 0, 0, 0, 0, -1, 0, 3, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -2, 6, 0, 0, 0, 0, 2, +0, 0, 0, 0, 1, 0, 2, -2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -6, 9, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 6, -9, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -2, 2, 0, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, -2, 1, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -5, 7, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 5, -7, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, -2, 2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 4, -5, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 1, -3, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -1, 3, 0, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, -1, 2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -1, 3, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -7, 10, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -7, 10, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 3, -3, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -4, 8, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -4, 5, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -4, 5, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 4, -5, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -2, 0, 5, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -9, 13, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -1, 5, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -2, 0, 4, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 2, 0, -4, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -2, 7, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 2, 0, -3, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -2, 5, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, -2, 5, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -6, 8, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -6, 8, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 6, -8, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, 2, 0, -2, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -3, 9, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 5, -6, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 5, -6, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 2, 0, -2, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 2, 0, -2, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -5, 10, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 4, -4, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 4, -4, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -3, 3, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 3, -3, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 3, -3, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 3, -3, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 2, 0, 0, -3, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, -5, 13, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 2, 0, -1, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 2, 0, -1, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 2, 0, 0, -2, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 2, 0, 0, -2, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 3, -2, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 3, -2, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 2, 0, 0, -1, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -6, 15, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -8, 15, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -3, 9, -4, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 2, 0, 2, -5, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -2, 8, -1, -5, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 6, -8, 3, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, +0, 0, 1, -1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -6, 16, -4, -5, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -2, 8, -3, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -2, 8, -3, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 6, -8, 1, 5, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 2, 0, -2, 5, 0, 0, 2, +0, 0, 0, 0, 0, 0, 3, -5, 4, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -8, 11, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -8, 11, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, -8, 11, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 0, 2, +0, 0, 0, 0, 0, 0, 3, -3, 0, 2, 0, 0, 0, 2, +0, 0, 2, -2, 1, 0, 0, 4, -8, 3, 0, 0, 0, 0, +0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, +0, 0, 2, -2, 1, 0, 0, -4, 8, -3, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -3, 7, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -5, 6, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -5, 6, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 5, -6, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 5, -6, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -1, 6, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 7, -9, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 2, -1, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 2, -1, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 6, -7, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 5, -5, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -7, 9, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -7, 9, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 4, -3, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 3, -1, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -4, 4, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 4, -4, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 4, -4, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 4, -4, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -3, 0, 5, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -9, 12, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 3, 0, -4, 0, 0, 0, 0, +0, 0, 2, -2, 1, 0, 1, -1, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 7, -8, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 3, 0, -3, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 3, 0, -3, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -2, 6, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -6, 7, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 6, -7, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 6, -6, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 3, 0, -2, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 3, 0, -2, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 5, -4, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 3, -2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 3, -2, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 3, 0, -1, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 3, 0, -1, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 3, 0, 0, -2, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 4, -2, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 3, 0, 0, -1, 0, 0, 2, +0, 0, 2, -2, 1, 0, 0, 1, 0, -1, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, -8, 16, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 3, 0, 2, -5, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 7, -8, 3, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -5, 16, -4, -5, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, -1, 8, -3, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -8, 10, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -8, 10, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, -8, 10, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -3, 8, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -5, 5, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 5, -5, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 5, -5, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 5, -5, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 7, -7, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 7, -7, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 6, -5, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 7, -8, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 5, -3, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 4, -3, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -9, 11, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -9, 11, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 4, 0, -4, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 4, 0, -3, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -6, 6, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 6, -6, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 6, -6, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 4, 0, -2, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 6, -4, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 3, -1, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 3, -1, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 3, -1, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 4, 0, -1, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 4, 0, 0, -2, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 5, -2, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 8, -9, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 5, -4, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, -7, 7, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 7, -7, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 4, -2, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 4, -2, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 4, -2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 4, -2, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 5, 0, -4, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 5, 0, -3, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 5, 0, -2, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -8, 8, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 8, -8, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 5, -3, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 5, -3, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, -9, 9, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, -9, 9, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, -9, 9, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 9, -9, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 6, -4, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 1, +0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 2, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, +1, 0, 0, -2, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0, +1, 0, 0, -2, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, +1, 0, 0, -2, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, +1, 0, 0, -2, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, +-1, 0, 0, 0, 0, 0, 3, -3, 0, 0, 0, 0, 0, 0, +-1, 0, 0, 0, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0, +-1, 0, 0, 2, 0, 0, 0, 4, -8, 3, 0, 0, 0, 0, +1, 0, 0, -2, 0, 0, 0, 4, -8, 3, 0, 0, 0, 0, +-2, 0, 0, 2, 0, 0, 0, 4, -8, 3, 0, 0, 0, 0, +-1, 0, 0, 0, 0, 0, 0, 2, 0, -3, 0, 0, 0, 0, +-1, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, +-1, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, +-1, 0, 0, 2, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, +1, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, +-1, 0, 0, 2, 0, 0, 0, 2, 0, -3, 0, 0, 0, 0, +-2, 0, 0, 0, 0, 0, 0, 2, 0, -3, 0, 0, 0, 0, +1, 0, 0, 0, 0, 0, 0, 4, -8, 3, 0, 0, 0, 0, +-1, 0, 1, -1, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, +1, 0, 1, -1, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, +-1, 0, 0, 0, 0, 0, 0, 4, -8, 3, 0, 0, 0, 0, +-1, 0, 0, 2, 1, 0, 0, 2, 0, -2, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0, +-1, 0, 0, 2, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0, +-1, 0, 0, 2, 0, 0, 3, -3, 0, 0, 0, 0, 0, 0, +1, 0, 0, -2, 1, 0, 0, -2, 0, 2, 0, 0, 0, 0, +1, 0, 2, -2, 2, 0, -3, 3, 0, 0, 0, 0, 0, 0, +1, 0, 2, -2, 2, 0, 0, -2, 0, 2, 0, 0, 0, 0, +1, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, +1, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, +0, 0, 0, -2, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, +0, 0, 0, -2, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, +0, 0, 2, 0, 2, 0, -2, 2, 0, 0, 0, 0, 0, 0, +0, 0, 2, 0, 2, 0, 0, -1, 0, 1, 0, 0, 0, 0, +0, 0, 2, 0, 2, 0, -1, 1, 0, 0, 0, 0, 0, 0, +0, 0, 2, 0, 2, 0, -2, 3, 0, 0, 0, 0, 0, 0, +0, 0, 0, 2, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0, +0, 0, 1, 1, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, +1, 0, 2, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, +-1, 0, 2, 0, 2, 0, 10, -3, 0, 0, 0, 0, 0, 0, +0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, +1, 0, 2, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, +0, 0, 2, 0, 2, 0, 0, 4, -8, 3, 0, 0, 0, 0, +0, 0, 2, 0, 2, 0, 0, -4, 8, -3, 0, 0, 0, 0, +-1, 0, 2, 0, 2, 0, 0, -4, 8, -3, 0, 0, 0, 0, +2, 0, 2, -2, 2, 0, 0, -2, 0, 3, 0, 0, 0, 0, +1, 0, 2, 0, 1, 0, 0, -2, 0, 3, 0, 0, 0, 0, +0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, +-1, 0, 2, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, +-2, 0, 2, 2, 2, 0, 0, 2, 0, -2, 0, 0, 0, 0, +0, 0, 2, 0, 2, 0, 2, -3, 0, 0, 0, 0, 0, 0, +0, 0, 2, 0, 2, 0, 1, -1, 0, 0, 0, 0, 0, 0, +0, 0, 2, 0, 2, 0, 0, 1, 0, -1, 0, 0, 0, 0, +0, 0, 2, 0, 2, 0, 2, -2, 0, 0, 0, 0, 0, 0, +-1, 0, 2, 2, 2, 0, 0, -1, 0, 1, 0, 0, 0, 0, +1, 0, 2, 0, 2, 0, -1, 1, 0, 0, 0, 0, 0, 0, +-1, 0, 2, 2, 2, 0, 0, 2, 0, -3, 0, 0, 0, 0, +2, 0, 2, 0, 2, 0, 0, 2, 0, -3, 0, 0, 0, 0, +1, 0, 2, 0, 2, 0, 0, -4, 8, -3, 0, 0, 0, 0, +1, 0, 2, 0, 2, 0, 0, 4, -8, 3, 0, 0, 0, 0, +1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, +0, 0, 2, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, +2, 0, 2, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, +-1, 0, 2, 2, 2, 0, 0, 2, 0, -2, 0, 0, 0, 0, +-1, 0, 2, 2, 2, 0, 3, -3, 0, 0, 0, 0, 0, 0, +1, 0, 2, 0, 2, 0, 1, -1, 0, 0, 0, 0, 0, 0, +0, 0, 2, 2, 2, 0, 0, 2, 0, -2, 0, 0, 0, 0, +}; + +/* Planetary nutation coefficients, unit 1e-7 arcsec + * longitude (sin, cos), obliquity (sin, cos) */ +static int16 icpl[] = { +1440, 0, 0, 0, +56, -117, -42, -40, +125, -43, 0, -54, +0, 5, 0, 0, +3, -7, -3, 0, +3, 0, 0, -2, +-114, 0, 0, 61, +-219, 89, 0, 0, +-3, 0, 0, 0, +-462, 1604, 0, 0, +99, 0, 0, -53, +-3, 0, 0, 2, +0, 6, 2, 0, +3, 0, 0, 0, +-12, 0, 0, 0, +14, -218, 117, 8, +31, -481, -257, -17, +-491, 128, 0, 0, +-3084, 5123, 2735, 1647, +-1444, 2409, -1286, -771, +11, -24, -11, -9, +26, -9, 0, 0, +103, -60, 0, 0, +0, -13, -7, 0, +-26, -29, -16, 14, +9, -27, -14, -5, +12, 0, 0, -6, +-7, 0, 0, 0, +0, 24, 0, 0, +284, 0, 0, -151, +226, 101, 0, 0, +0, -8, -2, 0, +0, -6, -3, 0, +5, 0, 0, -3, +-41, 175, 76, 17, +0, 15, 6, 0, +425, 212, -133, 269, +1200, 598, 319, -641, +235, 334, 0, 0, +11, -12, -7, -6, +5, -6, 3, 3, +-5, 0, 0, 3, +6, 0, 0, -3, +15, 0, 0, 0, +13, 0, 0, -7, +-6, -9, 0, 0, +266, -78, 0, 0, +-460, -435, -232, 246, +0, 15, 7, 0, +-3, 0, 0, 2, +0, 131, 0, 0, +4, 0, 0, 0, +0, 3, 0, 0, +0, 4, 2, 0, +0, 3, 0, 0, +-17, -19, -10, 9, +-9, -11, 6, -5, +-6, 0, 0, 3, +-16, 8, 0, 0, +0, 3, 0, 0, +11, 24, 11, -5, +-3, -4, -2, 1, +3, 0, 0, -1, +0, -8, -4, 0, +0, 3, 0, 0, +0, 5, 0, 0, +0, 3, 2, 0, +-6, 4, 2, 3, +-3, -5, 0, 0, +-5, 0, 0, 2, +4, 24, 13, -2, +-42, 20, 0, 0, +-10, 233, 0, 0, +-3, 0, 0, 1, +78, -18, 0, 0, +0, 3, 1, 0, +0, -3, -1, 0, +0, -4, -2, 1, +0, -8, -4, -1, +0, -5, 3, 0, +-7, 0, 0, 3, +-14, 8, 3, 6, +0, 8, -4, 0, +0, 19, 10, 0, +45, -22, 0, 0, +-3, 0, 0, 0, +0, -3, 0, 0, +0, 3, 0, 0, +3, 5, 3, -2, +89, -16, -9, -48, +0, 3, 0, 0, +-3, 7, 4, 2, +-349, -62, 0, 0, +-15, 22, 0, 0, +-3, 0, 0, 0, +-53, 0, 0, 0, +5, 0, 0, -3, +0, -8, 0, 0, +15, -7, -4, -8, +-3, 0, 0, 1, +-21, -78, 0, 0, +20, -70, -37, -11, +0, 6, 3, 0, +5, 3, 2, -2, +-17, -4, -2, 9, +0, 6, 3, 0, +32, 15, -8, 17, +174, 84, 45, -93, +11, 56, 0, 0, +-66, -12, -6, 35, +47, 8, 4, -25, +0, 8, 4, 0, +10, -22, -12, -5, +-3, 0, 0, 2, +-24, 12, 0, 0, +5, -6, 0, 0, +3, 0, 0, -2, +4, 3, 1, -2, +0, 29, 15, 0, +-5, -4, -2, 2, +8, -3, -1, -5, +0, -3, 0, 0, +10, 0, 0, 0, +3, 0, 0, -2, +-5, 0, 0, 3, +46, 66, 35, -25, +-14, 7, 0, 0, +0, 3, 2, 0, +-5, 0, 0, 0, +-68, -34, -18, 36, +0, 14, 7, 0, +10, -6, -3, -5, +-5, -4, -2, 3, +-3, 5, 2, 1, +76, 17, 9, -41, +84, 298, 159, -45, +3, 0, 0, -1, +-3, 0, 0, 2, +-3, 0, 0, 1, +-82, 292, 156, 44, +-73, 17, 9, 39, +-9, -16, 0, 0, +3, 0, -1, -2, +-3, 0, 0, 0, +-9, -5, -3, 5, +-439, 0, 0, 0, +57, -28, -15, -30, +0, -6, -3, 0, +-4, 0, 0, 2, +-40, 57, 30, 21, +23, 7, 3, -13, +273, 80, 43, -146, +-449, 430, 0, 0, +-8, -47, -25, 4, +6, 47, 25, -3, +0, 23, 13, 0, +-3, 0, 0, 2, +3, -4, -2, -2, +-48, -110, -59, 26, +51, 114, 61, -27, +-133, 0, 0, 57, +0, 4, 0, 0, +-21, -6, -3, 11, +0, -3, -1, 0, +-11, -21, -11, 6, +-18, -436, -233, 9, +35, -7, 0, 0, +0, 5, 3, 0, +11, -3, -1, -6, +-5, -3, -1, 3, +-53, -9, -5, 28, +0, 3, 2, 1, +4, 0, 0, -2, +0, -4, 0, 0, +-50, 194, 103, 27, +-13, 52, 28, 7, +-91, 248, 0, 0, +6, 49, 26, -3, +-6, -47, -25, 3, +0, 5, 3, 0, +52, 23, 10, -23, +-3, 0, 0, 1, +0, 5, 3, 0, +-4, 0, 0, 0, +-4, 8, 3, 2, +10, 0, 0, 0, +3, 0, 0, -2, +0, 8, 4, 0, +0, 8, 4, 1, +-4, 0, 0, 0, +-4, 0, 0, 0, +-8, 4, 2, 4, +8, -4, -2, -4, +0, 15, 7, 0, +-138, 0, 0, 0, +0, -7, -3, 0, +0, -7, -3, 0, +54, 0, 0, -29, +0, 10, 4, 0, +-7, 0, 0, 3, +-37, 35, 19, 20, +0, 4, 0, 0, +-4, 9, 0, 0, +8, 0, 0, -4, +-9, -14, -8, 5, +-3, -9, -5, 3, +-145, 47, 0, 0, +-10, 40, 21, 5, +11, -49, -26, -7, +-2150, 0, 0, 932, +-12, 0, 0, 5, +85, 0, 0, -37, +4, 0, 0, -2, +3, 0, 0, -2, +-86, 153, 0, 0, +-6, 9, 5, 3, +9, -13, -7, -5, +-8, 12, 6, 4, +-51, 0, 0, 22, +-11, -268, -116, 5, +0, 12, 5, 0, +0, 7, 3, 0, +31, 6, 3, -17, +140, 27, 14, -75, +57, 11, 6, -30, +-14, -39, 0, 0, +0, -6, -2, 0, +4, 15, 8, -2, +0, 4, 0, 0, +-3, 0, 0, 1, +0, 11, 5, 0, +9, 6, 0, 0, +-4, 10, 4, 2, +5, 3, 0, 0, +16, 0, 0, -9, +-3, 0, 0, 0, +0, 3, 2, -1, +7, 0, 0, -3, +-25, 22, 0, 0, +42, 223, 119, -22, +-27, -143, -77, 14, +9, 49, 26, -5, +-1166, 0, 0, 505, +-5, 0, 0, 2, +-6, 0, 0, 3, +-8, 0, 1, 4, +0, -4, 0, 0, +117, 0, 0, -63, +-4, 8, 4, 2, +3, 0, 0, -2, +-5, 0, 0, 2, +0, 31, 0, 0, +-5, 0, 1, 3, +4, 0, 0, -2, +-4, 0, 0, 2, +-24, -13, -6, 10, +3, 0, 0, 0, +0, -32, -17, 0, +8, 12, 5, -3, +3, 0, 0, -1, +7, 13, 0, 0, +-3, 16, 0, 0, +50, 0, 0, -27, +0, -5, -3, 0, +13, 0, 0, 0, +0, 5, 3, 1, +24, 5, 2, -11, +5, -11, -5, -2, +30, -3, -2, -16, +18, 0, 0, -9, +8, 614, 0, 0, +3, -3, -1, -2, +6, 17, 9, -3, +-3, -9, -5, 2, +0, 6, 3, -1, +-127, 21, 9, 55, +3, 5, 0, 0, +-6, -10, -4, 3, +5, 0, 0, 0, +16, 9, 4, -7, +3, 0, 0, -2, +0, 22, 0, 0, +0, 19, 10, 0, +7, 0, 0, -4, +0, -5, -2, 0, +0, 3, 1, 0, +-9, 3, 1, 4, +17, 0, 0, -7, +0, -3, -2, -1, +-20, 34, 0, 0, +-10, 0, 1, 5, +-4, 0, 0, 2, +22, -87, 0, 0, +-4, 0, 0, 2, +-3, -6, -2, 1, +-16, -3, -1, 7, +0, -3, -2, 0, +4, 0, 0, 0, +-68, 39, 0, 0, +27, 0, 0, -14, +0, -4, 0, 0, +-25, 0, 0, 0, +-12, -3, -2, 6, +3, 0, 0, -1, +3, 66, 29, -1, +490, 0, 0, -213, +-22, 93, 49, 12, +-7, 28, 15, 4, +-3, 13, 7, 2, +-46, 14, 0, 0, +-5, 0, 0, 0, +2, 1, 0, 0, +0, -3, 0, 0, +-28, 0, 0, 15, +5, 0, 0, -2, +0, 3, 0, 0, +-11, 0, 0, 5, +0, 3, 1, 0, +-3, 0, 0, 1, +25, 106, 57, -13, +5, 21, 11, -3, +1485, 0, 0, 0, +-7, -32, -17, 4, +0, 5, 3, 0, +-6, -3, -2, 3, +30, -6, -2, -13, +-4, 4, 0, 0, +-19, 0, 0, 10, +0, 4, 2, -1, +0, 3, 0, 0, +4, 0, 0, -2, +0, -3, -1, 0, +-3, 0, 0, 0, +5, 3, 1, -2, +0, 11, 0, 0, +118, 0, 0, -52, +0, -5, -3, 0, +-28, 36, 0, 0, +5, -5, 0, 0, +14, -59, -31, -8, +0, 9, 5, 1, +-458, 0, 0, 198, +0, -45, -20, 0, +9, 0, 0, -5, +0, -3, 0, 0, +0, -4, -2, -1, +11, 0, 0, -6, +6, 0, 0, -2, +-16, 23, 0, 0, +0, -4, -2, 0, +-5, 0, 0, 2, +-166, 269, 0, 0, +15, 0, 0, -8, +10, 0, 0, -4, +-78, 45, 0, 0, +0, -5, -2, 0, +7, 0, 0, -4, +-5, 328, 0, 0, +3, 0, 0, -2, +5, 0, 0, -2, +0, 3, 1, 0, +-3, 0, 0, 0, +-3, 0, 0, 0, +0, -4, -2, 0, +-1223, -26, 0, 0, +0, 7, 3, 0, +3, 0, 0, 0, +0, 3, 2, 0, +-6, 20, 0, 0, +-368, 0, 0, 0, +-75, 0, 0, 0, +11, 0, 0, -6, +3, 0, 0, -2, +-3, 0, 0, 1, +-13, -30, 0, 0, +21, 3, 0, 0, +-3, 0, 0, 1, +-4, 0, 0, 2, +8, -27, 0, 0, +-19, -11, 0, 0, +-4, 0, 0, 2, +0, 5, 2, 0, +-6, 0, 0, 2, +-8, 0, 0, 0, +-1, 0, 0, 0, +-14, 0, 0, 6, +6, 0, 0, 0, +-74, 0, 0, 32, +0, -3, -1, 0, +4, 0, 0, -2, +8, 11, 0, 0, +0, 3, 2, 0, +-262, 0, 0, 114, +0, -4, 0, 0, +-7, 0, 0, 4, +0, -27, -12, 0, +-19, -8, -4, 8, +202, 0, 0, -87, +-8, 35, 19, 5, +0, 4, 2, 0, +16, -5, 0, 0, +5, 0, 0, -3, +0, -3, 0, 0, +1, 0, 0, 0, +-35, -48, -21, 15, +-3, -5, -2, 1, +6, 0, 0, -3, +3, 0, 0, -1, +0, -5, 0, 0, +12, 55, 29, -6, +0, 5, 3, 0, +-598, 0, 0, 0, +-3, -13, -7, 1, +-5, -7, -3, 2, +3, 0, 0, -1, +5, -7, 0, 0, +4, 0, 0, -2, +16, -6, 0, 0, +8, -3, 0, 0, +8, -31, -16, -4, +0, 3, 1, 0, +113, 0, 0, -49, +0, -24, -10, 0, +4, 0, 0, -2, +27, 0, 0, 0, +-3, 0, 0, 1, +0, -4, -2, 0, +5, 0, 0, -2, +0, -3, 0, 0, +-13, 0, 0, 6, +5, 0, 0, -2, +-18, -10, -4, 8, +-4, -28, 0, 0, +-5, 6, 3, 2, +-3, 0, 0, 1, +-5, -9, -4, 2, +17, 0, 0, -7, +11, 4, 0, 0, +0, -6, -2, 0, +83, 15, 0, 0, +-4, 0, 0, 2, +0, -114, -49, 0, +117, 0, 0, -51, +-5, 19, 10, 2, +-3, 0, 0, 0, +-3, 0, 0, 2, +0, -3, -1, 0, +3, 0, 0, 0, +0, -6, -2, 0, +393, 3, 0, 0, +-4, 21, 11, 2, +-6, 0, -1, 3, +-3, 8, 4, 1, +8, 0, 0, 0, +18, -29, -13, -8, +8, 34, 18, -4, +89, 0, 0, 0, +3, 12, 6, -1, +54, -15, -7, -24, +0, 3, 0, 0, +3, 0, 0, -1, +0, 35, 0, 0, +-154, -30, -13, 67, +15, 0, 0, 0, +0, 4, 2, 0, +0, 9, 0, 0, +80, -71, -31, -35, +0, -20, -9, 0, +11, 5, 2, -5, +61, -96, -42, -27, +14, 9, 4, -6, +-11, -6, -3, 5, +0, -3, -1, 0, +123, -415, -180, -53, +0, 0, 0, -35, +-5, 0, 0, 0, +7, -32, -17, -4, +0, -9, -5, 0, +0, -4, 2, 0, +-89, 0, 0, 38, +0, -86, -19, -6, +0, 0, -19, 6, +-123, -416, -180, 53, +0, -3, -1, 0, +12, -6, -3, -5, +-13, 9, 4, 6, +0, -15, -7, 0, +3, 0, 0, -1, +-62, -97, -42, 27, +-11, 5, 2, 5, +0, -19, -8, 0, +-3, 0, 0, 1, +0, 4, 2, 0, +0, 3, 0, 0, +0, 4, 2, 0, +-85, -70, -31, 37, +163, -12, -5, -72, +-63, -16, -7, 28, +-21, -32, -14, 9, +0, -3, -1, 0, +3, 0, 0, -2, +0, 8, 0, 0, +3, 10, 4, -1, +3, 0, 0, -1, +0, -7, -3, 0, +0, -4, -2, 0, +6, 19, 0, 0, +5, -173, -75, -2, +0, -7, -3, 0, +7, -12, -5, -3, +-3, 0, 0, 2, +3, -4, -2, -1, +74, 0, 0, -32, +-3, 12, 6, 2, +26, -14, -6, -11, +19, 0, 0, -8, +6, 24, 13, -3, +83, 0, 0, 0, +0, -10, -5, 0, +11, -3, -1, -5, +3, 0, 1, -1, +3, 0, 0, -1, +-4, 0, 0, 0, +5, -23, -12, -3, +-339, 0, 0, 147, +0, -10, -5, 0, +5, 0, 0, 0, +3, 0, 0, -1, +0, -4, -2, 0, +18, -3, 0, 0, +9, -11, -5, -4, +-8, 0, 0, 4, +3, 0, 0, -1, +0, 9, 0, 0, +6, -9, -4, -2, +-4, -12, 0, 0, +67, -91, -39, -29, +30, -18, -8, -13, +0, 0, 0, 0, +0, -114, -50, 0, +0, 0, 0, 23, +517, 16, 7, -224, +0, -7, -3, 0, +143, -3, -1, -62, +29, 0, 0, -13, +-4, 0, 0, 2, +-6, 0, 0, 3, +5, 12, 5, -2, +-25, 0, 0, 11, +-3, 0, 0, 1, +0, 4, 2, 0, +-22, 12, 5, 10, +50, 0, 0, -22, +0, 7, 4, 0, +0, 3, 1, 0, +-4, 4, 2, 2, +-5, -11, -5, 2, +0, 4, 2, 0, +4, 17, 9, -2, +59, 0, 0, 0, +0, -4, -2, 0, +-8, 0, 0, 4, +-3, 0, 0, 0, +4, -15, -8, -2, +370, -8, 0, -160, +0, 0, -3, 0, +0, 3, 1, 0, +-6, 3, 1, 3, +0, 6, 0, 0, +-10, 0, 0, 4, +0, 9, 4, 0, +4, 17, 7, -2, +34, 0, 0, -15, +0, 5, 3, 0, +-5, 0, 0, 2, +-37, -7, -3, 16, +3, 13, 7, -2, +40, 0, 0, 0, +0, -3, -2, 0, +-184, -3, -1, 80, +-3, 0, 0, 1, +-3, 0, 0, 0, +0, -10, -6, -1, +31, -6, 0, -13, +-3, -32, -14, 1, +-7, 0, 0, 3, +0, -8, -4, 0, +3, -4, 0, 0, +0, 4, 0, 0, +0, 3, 1, 0, +19, -23, -10, 2, +0, 0, 0, -10, +0, 3, 2, 0, +0, 9, 5, -1, +28, 0, 0, 0, +0, -7, -4, 0, +8, -4, 0, -4, +0, 0, -2, 0, +0, 3, 0, 0, +-3, 0, 0, 1, +-9, 0, 1, 4, +3, 12, 5, -1, +17, -3, -1, 0, +0, 7, 4, 0, +19, 0, 0, 0, +0, -5, -3, 0, +14, -3, 0, -1, +0, 0, -1, 0, +0, 0, 0, -5, +0, 5, 3, 0, +13, 0, 0, 0, +0, -3, -2, 0, +2, 9, 4, 3, +0, 0, 0, -4, +8, 0, 0, 0, +0, 4, 2, 0, +6, 0, 0, -3, +6, 0, 0, 0, +0, 3, 1, 0, +5, 0, 0, -2, +3, 0, 0, -1, +-3, 0, 0, 0, +6, 0, 0, 0, +7, 0, 0, 0, +-4, 0, 0, 0, +4, 0, 0, 0, +6, 0, 0, 0, +0, -4, 0, 0, +0, -4, 0, 0, +5, 0, 0, 0, +-3, 0, 0, 0, +4, 0, 0, 0, +-5, 0, 0, 0, +4, 0, 0, 0, +0, 3, 0, 0, +13, 0, 0, 0, +21, 11, 0, 0, +0, -5, 0, 0, +0, -5, -2, 0, +0, 5, 3, 0, +0, -5, 0, 0, +-3, 0, 0, 2, +20, 10, 0, 0, +-34, 0, 0, 0, +-19, 0, 0, 0, +3, 0, 0, -2, +-3, 0, 0, 1, +-6, 0, 0, 3, +-4, 0, 0, 0, +3, 0, 0, 0, +3, 0, 0, 0, +4, 0, 0, 0, +3, 0, 0, -1, +6, 0, 0, -3, +-8, 0, 0, 3, +0, 3, 1, 0, +-3, 0, 0, 0, +0, -3, -2, 0, +126, -63, -27, -55, +-5, 0, 1, 2, +-3, 28, 15, 2, +5, 0, 1, -2, +0, 9, 4, 1, +0, 9, 4, -1, +-126, -63, -27, 55, +3, 0, 0, -1, +21, -11, -6, -11, +0, -4, 0, 0, +-21, -11, -6, 11, +-3, 0, 0, 1, +0, 3, 1, 0, +8, 0, 0, -4, +-6, 0, 0, 3, +-3, 0, 0, 1, +3, 0, 0, -1, +-3, 0, 0, 1, +-5, 0, 0, 2, +24, -12, -5, -11, +0, 3, 1, 0, +0, 3, 1, 0, +0, 3, 2, 0, +-24, -12, -5, 10, +4, 0, -1, -2, +13, 0, 0, -6, +7, 0, 0, -3, +3, 0, 0, -1, +3, 0, 0, -1, +}; +#endif /* NUT_IAU_2000A */ diff --git a/swe/src/sweodef.h b/swe/src/sweodef.h new file mode 100644 index 0000000..c56606b --- /dev/null +++ b/swe/src/sweodef.h @@ -0,0 +1,325 @@ +/************************************************************ + $Header: /home/dieter/sweph/RCS/sweodef.h,v 1.74 2008/06/16 10:07:20 dieter Exp $ + definitions and constants for all Swiss Ephemeris source files, + only required for compiling the libraries, not for the external + interface of the libraries. + + The definitions are a subset of Astrodienst's ourdef.h content + and must be kept compatible. Everything not used in SwissEph + has been deleted. + + Does auto-detection of MSDOS (TURBO_C or MS_C), HPUNIX, Linux. + Must be extended for more portability; there should be a way + to detect byte order and file system type. + +************************************************************/ + +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + +#ifndef _OURDEF_INCLUDED /* ourdef.h is a superset of sweodef.h */ +#ifndef _SWEODEF_INCLUDED /* allow multiple #includes */ +#define _SWEODEF_INCLUDED + +# define MY_TRUE 1 /* for use in other defines, before TRUE is defined */ +# define MY_FALSE 0 /* for use in other defines, before TRUE is defined */ + + +#ifdef _WIN32 /* Microsoft VC 5.0 does not define MSDOS anymore */ +# undef MSDOS +# define MSDOS MY_TRUE +#include +#include +#include +#include +#include +#include +# define sleep(x) Sleep((x) * 1000) +#endif + +#ifdef _MSC_VER +# define MS_VC +#endif + +#ifdef WIN32 /* Microsoft VC 5.0 does not define MSDOS anymore */ +# define MSDOS MY_TRUE +#endif + +#ifdef MSDOS /* already defined by some DOS compilers */ +# undef MSDOS +# define MSDOS MY_TRUE +#endif + +#ifdef __TURBOC__ /* defined by turboc */ +# ifndef MSDOS +# define MSDOS MY_TRUE +# endif +# define TURBO_C +#endif + +#ifdef __SC__ /* defined by Symantec C */ +# ifndef MSDOS +# define MSDOS MY_TRUE +# endif +# define SYMANTEC_C +#endif + +#ifdef __WATCOMC__ /* defined by WatcomC */ +# ifndef MSDOS +# define MSDOS MY_TRUE +# endif +# define WATCOMC +#endif + +#ifdef __MWERKS__ /* defined on Macintosh CodeWarrior */ +# if macintosh && powerc +# define MACOS MY_TRUE /* let it undefined otherwise */ +# define MSDOS MY_FALSE /* in case one above fired falsely */ +# endif +#endif + +#ifdef MSDOS +# define HPUNIX MY_FALSE +# define INTEL_BYTE_ORDER 1 +# ifndef TURBO_C +# define MS_C /* assume Microsoft C compiler */ +# endif +# define MYFAR far +# define UNIX_FS MY_FALSE +#else +# ifdef MACOS +# define HPUNIX MY_FALSE +# define MYFAR +# define UNIX_FS MY_FALSE +# else +# define MSDOS MY_FALSE +# define HPUNIX MY_TRUE +# ifndef _HPUX_SOURCE +# define _HPUX_SOURCE +# endif +# define MYFAR +# define UNIX_FS MY_TRUE +# endif +#endif + +#include +#include +#ifndef FILE +# include +#endif + +#if HPUNIX +# include +#endif + +/* + * if we have 16-bit ints, we define INT_16; we will need %ld to printf an int32 + * if we have 64-bit long, we define LONG_64 + * If none is defined, we have int = long = 32 bit, and use %d to printf an int32 + */ +#include +#if INT_MAX < 40000 +# define INT_16 +#else +# if LONG_MAX > INT_MAX +# define LONG_64 +# endif +#endif + +#ifdef BYTE_ORDER +#ifdef LITTLE_ENDIAN +# if BYTE_ORDER == LITTLE_ENDIAN +# define INTEL_BYTE_ORDER +# endif +#endif +#endif + +#ifdef INT_16 + typedef long int32; + typedef unsigned long uint32; + typedef int int16; + typedef double REAL8; /* real with at least 64 bit precision */ + typedef long INT4; /* signed integer with at least 32 bit precision */ + typedef unsigned long UINT4; + /* unsigned integer with at least 32 bit precision */ + typedef int AS_BOOL; + typedef unsigned int UINT2; /* unsigned 16 bits */ +# define ABS4 labs /* abs function for long */ +#else + typedef int int32; + typedef long long int64; + typedef unsigned int uint32; + typedef short int16; + typedef double REAL8; /* real with at least 64 bit precision */ + typedef int INT4; /* signed integer with at least 32 bit precision */ + typedef unsigned int UINT4; + /* unsigned integer with at least 32 bit precision */ + typedef int AS_BOOL; + typedef unsigned short UINT2; /* unsigned 16 bits */ + # define ABS4 abs /* abs function for long */ +#endif + +#if MSDOS +# ifdef TURBO_C +# include /* MSC needs malloc ! */ +# else +# include +# endif +# define SIGALRM SIGINT +#endif + +#ifndef TRUE +# define TRUE 1 +# define FALSE 0 +#endif + +#ifndef OK +# define OK (0) +# define ERR (-1) +#endif + +/* hack because UCHAR is already used by mingw gcc */ +#ifdef __GNUC__ +#ifdef _WIN32 +#define UCHAR SWE_UCHAR +#endif +#endif + +typedef unsigned char UCHAR; +#define UCP (UCHAR*) +#define SCP (char*) + +# define ODEGREE_STRING "°" /* degree as string, utf8 encoding */ + + + +#ifndef HUGE +# define HUGE 1.7E+308 /* biggest value for REAL8 */ +#endif +#ifndef M_PI +# define M_PI 3.14159265358979323846 +#endif + +#define forward static + +#define AS_MAXCH 256 /* used for string declarations, allowing 255 char+\0 */ + +#define DEGTORAD 0.0174532925199433 +#define RADTODEG 57.2957795130823 + +typedef int32 centisec; /* centiseconds used for angles and times */ +#define CS (centisec) /* use for casting */ +#define CSEC centisec /* use for typing */ + +#define DEG 360000 /* degree expressed in centiseconds */ +#define DEG7_30 (2700000) /* 7.5 degrees */ +#define DEG15 (15 * DEG) +#define DEG24 (24 * DEG) +#define DEG30 (30 * DEG) +#define DEG60 (60 * DEG) +#define DEG90 (90 * DEG) +#define DEG120 (120 * DEG) +#define DEG150 (150 * DEG) +#define DEG180 (180 * DEG) +#define DEG270 (270 * DEG) +#define DEG360 (360 * DEG) + +#define CSTORAD 4.84813681109536E-08 /* centisec to rad: pi / 180 /3600/100 */ +#define RADTOCS 2.06264806247096E+07 /* rad to centisec 180*3600*100/pi */ + +#define CS2DEG (1.0/360000.0) /* centisec to degree */ + +/* control strings for fopen() */ +#if UNIX_FS +# define BFILE_R_ACCESS "r" /* open binary file for reading */ +# define BFILE_RW_ACCESS "r+" /* open binary file for writing and reading */ +# define BFILE_W_CREATE "w" /* create/open binary file for write*/ +# define BFILE_A_ACCESS "a+" /* create/open binary file for append*/ +# define FILE_R_ACCESS "r" /* open text file for reading */ +# define FILE_RW_ACCESS "r+" /* open text file for writing and reading */ +# define FILE_W_CREATE "w" /* create/open text file for write*/ +# define FILE_A_ACCESS "a+" /* create/open text file for append*/ +# define O_BINARY 0 /* for open(), not defined in Unix */ +# define OPEN_MODE 0666 /* default file creation mode */ +# define DIR_GLUE "/" /* glue string for directory/file */ +# define PATH_SEPARATOR ";:" /* semicolon or colon may be used */ +#else +# define BFILE_R_ACCESS "rb" /* open binary file for reading */ +# define BFILE_RW_ACCESS "r+b" /* open binary file for writing and reading */ +# define BFILE_W_CREATE "wb" /* create/open binary file for write*/ +# define BFILE_A_ACCESS "a+b" /* create/open binary file for append*/ +# define PATH_SEPARATOR ";" /* semicolon as PATH separator */ +# define OPEN_MODE 0666 /* default file creation mode */ +# ifdef MACOS +# define FILE_R_ACCESS "r" /* open text file for reading */ +# define FILE_RW_ACCESS "r+" /* open text file for writing and reading */ +# define FILE_W_CREATE "w" /* create/open text file for write*/ +# define FILE_A_ACCESS "a+" /* create/open text file for append*/ +# define DIR_GLUE ":" /* glue string for directory/file */ +# else +# define FILE_R_ACCESS "rt" /* open text file for reading */ +# define FILE_RW_ACCESS "r+t" /* open text file for writing and reading */ +# define FILE_W_CREATE "wt" /* create/open text file for write*/ +# define FILE_A_ACCESS "a+t" /* create/open text file for append*/ +/* attention, all backslashes for msdos directry names must be written as \\, + because it is the C escape character */ +# define DIR_GLUE "\\" /* glue string for directory/file */ +# endif +#endif + +#include +#include + +#endif /* _SWEODEF_INCLUDED */ +#endif /* _OURDEF_INCLUDED */ diff --git a/swe/src/swepcalc.c b/swe/src/swepcalc.c new file mode 100644 index 0000000..7011312 --- /dev/null +++ b/swe/src/swepcalc.c @@ -0,0 +1,758 @@ +/***************************************************** +$Header: /home/dieter/sweph/RCS/swepcalc.c,v 1.74 2008/06/16 10:07:20 dieter Exp $ +Placalc compatibility interface for Swiss Ephemeris. + +*******************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + +/* + * This file is the PLACALC compatibility interface for Swiss Ephemeris. + * It allows very easy porting of older Placalc application to the SwissEph. + * A user has to replace #include "placalc.h" and "housasp.h" with + * #include "swepcalc.h" + * If he has used "ourdef.h" he replaces it with "sweodef.h". + * Then he links his application with swepcalc.o and runs it against the + * Swiss Ephemeris DLL or linkable library. + * + * All calls which were present in the placalc sources are contained + * here, and either implemented directly or translated into Swiss Ephemeris + * calls. + * + * + */ + +#include "swepcalc.h" +#include "swephexp.h" + +/************************************************************ +local globals, not exported +************************************************************/ + +static int plac2swe[] = {SE_SUN, SE_MOON, SE_MERCURY, SE_VENUS, SE_MARS, SE_JUPITER, SE_SATURN, SE_URANUS, SE_NEPTUNE, SE_PLUTO, SE_MEAN_NODE, SE_TRUE_NODE, SE_CHIRON, SE_MEAN_APOG, SE_CERES, SE_PALLAS, SE_JUNO, SE_VESTA,}; + +/* If there occurs an internal error in placalc, a message is + * written into the string variable perrtx. + * The message can be read with placalc_get_errtext(); + */ +static char perrtx[AS_MAXCH]; +static double ekl, nut; + +/* + * mimimum and maximum distances computed over 1000 years with plamimax, + * required for relative distances rgeo, where the distance is given + * as 100 when a planet is closest and as 0 when farthest from earth. + */ +static double rmima[CALC_N][2] = { + { 0.98296342, 1.01704665}, + { 0.00238267, 0.00271861}, + { 0.54900496, 1.45169607}, + { 0.26411287, 1.73597885}, + { 0.37289847, 2.67626927}, + { 3.94877993, 6.45627627}, + { 7.99362824, 11.09276636}, + {17.28622633, 21.10714104}, + {28.81374786, 31.33507284}, + {28.67716748, 50.29208774}, + { 0.00, 0.00259553}, /* nodes don't get a real value*/ + { 0.00, 0.00259553}, + { 7.36277475, 19.86585062}}; + +/********************************************************** +function nacalc () +calculates an array of planet longitudes and speeds, +as needed for complete nathan data records. +The function knows itself how many planets and in which mode +they have to be calculated for Nathan. + +return OK or ERR + +The returned positions are in centiseconds, our standard +coordinate format for fast mathematics with planetary positions. + +This function is just a template of how the calc() package +can be used. +**********************************************************/ +int nacalc (double jd_ad, /* universal time relative julian date */ + centisec *plon, /* returned longitudes */ + centisec *pspe /* returned speeds, if not NULL pointer */ + ) +{ + char err[AS_MAXCH]; + int planet, flag; + double rlng, rrad, rlat, rspeed; + int result = OK; + flag = CALC_BIT_SPEED; /* same, with speed */ + jd_ad += deltat( jd_ad ); /* ET = UT + Delta_T */ + for (planet = SUN; planet <= MAXPL_NACALC; planet++) { + if (calc (planet, jd_ad, flag, &rlng, &rrad, &rlat, &rspeed) == OK) { + plon [planet] = swe_csnorm(swe_d2l (rlng * DEG)); + if (pspe != NULL) pspe [planet] = swe_d2l (rspeed * DEG); + } else { + plon [planet] = -1; + if (pspe != NULL) pspe [planet] = 0; + if (result != ERR) { /* save first error message */ + strcpy(err, placalc_get_errtext()); + } + result = ERR; + } + } + if (result == ERR) + strcpy(perrtx, err); + return result; +} /* end nacalc */ + +/****************************************************************** + * calculation server + * delivers positions in string format which can be sent easily + * over a communication line to the calculation client. + * if plalist = 0, only SUN .. CHIRON are delivered, no LILITH + ******************************************************************/ +int calcserv(int id, /* request id, random number to prevent phase err */ + double jd_ad, /* time as relative Astrodienst julian date */ + int flag, /* a set of CALC_BIT_ bitflags */ + int plalist,/* bit list of planets to be computed, 0 = all */ + char *so) /* output string, MUST BE LONG ENOUGH (800 bytes)*/ +{ + int p, planet, so_len; + double rlng, rrad, rlat, rspeed, rau[CALC_N]; + centisec lcs[CALC_N], lpcs[CALC_N], betcs[CALC_N]; + char s[AS_MAXCH]; + if (plalist == 0) plalist = (1 << 13) - 1; /* sun .. chiron */; + /* + * flag determines whether deltat is added to t; + * if CALC_BIT_EPHE is set, jd_ad is considered as ephemeris time, + * otherwise as universal time. + */ + if ((flag & CALC_BIT_EPHE) == 0) { + jd_ad += deltat (jd_ad); + } + for (p = SUN; p < CALC_N; p++) { + if (! check_bit(plalist, p)) continue; + if (calc (p, jd_ad, flag, &rlng, &rrad, &rlat, &rspeed) == OK) { + lcs [p] = swe_d2l (rlng * DEG); + lpcs [p] = swe_d2l (rspeed * DEG); + betcs [p] = swe_d2l (rlat * DEG); + rau [p] = rrad; + } else { + sprintf(so,"error at planet %d", p); + return ( ERR); + } + } + /* + * format comma separated list: id,teph,flag,plalist,ekl,nut + * double is given with 8 digits precision after decimal point, + * all angles are given in centiseconds. + * then for each requested planet: longitude (csec) + * then for each requested planet, if wanted: speed (csec/day) + * then for each requested planet, if wanted: latitude (csec) + * then for each requested planet, if wanted: rgeo (units 0..999) + * then for each requested planet, if wanted: rau (A.U.) + */ + sprintf (so, "%d,%.8f,%d,%d,%d,%d", id, jd_ad, flag, plalist, + swe_d2l(ekl * DEG), swe_d2l (nut * DEG) ); + so_len = strlen (so); + for (planet = SUN; planet < CALC_N; planet++) { + if (! check_bit(plalist, planet)) continue; + sprintf (s ,",%d", lcs[planet]); + strcat (so + so_len, s); + so_len += strlen (s); + } + if (flag & CALC_BIT_SPEED) { + for (planet = SUN; planet < CALC_N; planet++) { + if (! check_bit(plalist, planet)) continue; + sprintf (s ,",%d", lpcs[planet]); + strcat (so + so_len, s); + so_len += strlen (s); + } + } + if (flag & CALC_BIT_BETA) { + for (planet = SUN; planet < CALC_N; planet++) { + if (! check_bit(plalist, planet)) continue; + sprintf (s ,",%d", betcs[planet]); + strcat (so + so_len, s); + so_len += strlen (s); + } + } + if (flag & CALC_BIT_RGEO) { + for (planet = SUN; planet < CALC_N; planet++) { + if (! check_bit(plalist, planet)) continue; + sprintf (s ,",%d", rel_geo(planet,rau[planet])); + strcat (so + so_len, s); + so_len += strlen (s); + } + } + if (flag & CALC_BIT_RAU) { + for (planet = SUN; planet < CALC_N; planet++) { + if (! check_bit(plalist, planet)) continue; + sprintf (s ,",%.8f", rau[planet]); + strcat (so + so_len, s); + so_len += strlen (s); + } + } + return (OK); +} /* end calcserv */ + +/****************************************************************** + function calc(): + This is the main routine for computing a planets position. + The function has several modes, which are controlled by bits in + the parameter 'flag'. The normal mode (flag == 0) computes + a planets apparent geocentric position in ecliptic coordinates relative to + the true equinox of date, without speed + + Explanation of the arguments: see the functions header. + + Returns OK or ERR (if some planet out of time range). OK and ERR are + defined in ourdef.h and must not be confused with TRUE and FALSE. + OK and ERR are of type int, not of type AS_BOOL. + + Bits used in flag: + CALC_BIT_HELIO 0 = geocentric, 1 = heliocentric + CALC_BIT_NOAPP 0 = apparent positions, 1 = true positions + CALC_BIT_NONUT 0 = do nutation (true equinox of date) + 1 = don't do nutation (mean equinox of date). + + CALC_BIT_SPEED 0 = don't calc speed, + 1 = calc speed + + Time range: + The function can be used savely in the time range 3000 BC to + 3000 AD. + + Getting ecliptic and nutation: + calc(CALC_ONLY_ECL_NUT,teph,0,&nutv,&meaneklv,&eklv,NULL); + will return the values for time teph. + +******************************************************************/ +int calc(int planet, /* planet index as defined in placalc.h, + SUN = 0, MOON = 1 etc. + planet == -1 calc calculates only nut, ekl, meanekl */ + double jd_ad, /* relative Astrodienst Juldate, ephemeris time. + Astrodienst Juldate is relative 31 Dec 1949, noon. */ + int flag, /* See definition of flag bits above */ + double *alng, + double *arad, + double *alat, + double *alngspeed) + /* pointers to the return variables: + alng = ecliptic longitude in degrees + arad = radius vector in AU (astronomic units) + alat = ecliptic latitude in degrees + alngspeed = speed of planet in degrees per day + */ +{ + double tjd = jd_ad + JUL_OFFSET; + double x[6]; + int32 iflagret = 0, iflag = 0; + int ipl; + /* planet number + */ + /* ecliptic and nutation */ + if (planet == CALC_ONLY_ECL_NUT) + ipl = SE_ECL_NUT; + /* earth: placalc makes no difference between sun and earth, + * swisseph does */ + else if (planet == SUN && (flag & CALC_BIT_HELIO)) + ipl = SE_EARTH; + else if (planet >= SUN && planet <= VESTA) + ipl = plac2swe[planet]; + else { + sprintf(perrtx, "invalid planet number %d. ", planet); + return ERR; + } + /* flag */ + if (flag & CALC_BIT_HELIO) + if (ipl != SE_MEAN_NODE && ipl != SE_TRUE_NODE && ipl != SE_MEAN_APOG) + iflag |= SEFLG_HELCTR; /* lunar node and apogee is always geocentric */ + if (flag & CALC_BIT_NOAPP) + iflag |= SEFLG_TRUEPOS; + if (flag & CALC_BIT_NONUT) + iflag |= SEFLG_NONUT; + if (flag & CALC_BIT_SPEED) + iflag |= SEFLG_SPEED; + /* ecliptic and nutation */ + if ((iflagret = swe_calc(tjd, ipl, iflag, x, perrtx)) == ERR) + return iflagret; + if (ipl == SE_ECL_NUT) { + *alng = nut = x[2]; + *arad = x[1]; + *alat = ekl = x[0]; + } else { + *alng = x[0]; + *arad = x[2]; + *alat = x[1]; + *alngspeed = x[3]; + } + return (OK); +} /* end calc */ + +int rel_geo(int planet, double rau) +{ + /* + * get relative earth distance in range 0..1000: + * To compute the relative distance we use fixed values of + * mimimum and maximum distance measured empirically between + * 1300 AD and 2300 AD (see helconst.c). + * This approach is certainly fine for the + * outer planets, but not the best for Sun and Moon, where it + * would be better to look at the mean anomaly, i.e. the progress + * the planet makes on it's Kepler orbit. + * Considering the low importance astrologers give to the relative + * distance, we consider the effort not worthwile. + * Now we compare real radius with longtime-averaged distances. + */ + int rgeo; + if (planet == MEAN_NODE || planet == TRUE_NODE || planet == LILITH) { + return 0; + } else { + rgeo = 1000 * (1.0 - (rau - rmima[planet][0]) / (rmima[planet][1] - rmima[planet][0])); + } + if (rgeo < 0) + rgeo = 0; + else if (rgeo > 999) + rgeo = 999; + return rgeo; +} + +/* + * get the planet index for an AFL letter + * returns -1 if the letter does not correspond to a planet. + */ +int afl2planet(int afl) +{ + int p; + switch (afl) { + case AFL_SUN : p = SUN; break; + case AFL_MON : p = MOON; break; + case AFL_MER : p = MERCURY; break; + case AFL_VEN : p = VENUS; break; + case AFL_MAR : p = MARS; break; + case AFL_JUP : p = JUPITER; break; + case AFL_SAT : p = SATURN; break; + case AFL_URA : p = URANUS; break; + case AFL_NEP : p = NEPTUNE; break; + case AFL_PLU : p = PLUTO; break; + case AFL_MNODE : p = MEAN_NODE; break; + case AFL_TNODE : p = TRUE_NODE; break; + case AFL_CHI : p = CHIRON; break; + case AFL_LIL : p = LILITH; break; + case AFL_CER : p = CERES; break; + case AFL_PAL : p = PALLAS; break; + case AFL_JUN : p = JUNO; break; + case AFL_VES : p = VESTA; break; + case AFL_AC : p = AC; break; + case AFL_MC : p = MC; break; + default : p = -1; break; + } + return p; +} + +/* + * get the AFL letter for a planet + * returns -1 if no letter corresponds to a planet. + */ +int planet2afl(int planet) +{ + switch (planet) { + case SUN: return AFL_SUN; + case MOON: return AFL_MON; + case MERCURY: return AFL_MER; + case VENUS: return AFL_VEN; + case MARS: return AFL_MAR; + case JUPITER: return AFL_JUP; + case SATURN: return AFL_SAT; + case URANUS: return AFL_URA; + case NEPTUNE: return AFL_NEP; + case PLUTO: return AFL_PLU; + case MEAN_NODE: return AFL_MNODE; + case TRUE_NODE: return AFL_TNODE; + case CHIRON: return AFL_CHI; + case LILITH: return AFL_LIL; + case CERES: return AFL_CER; + case PALLAS: return AFL_PAL; + case JUNO: return AFL_JUN; + case VESTA: return AFL_VES; + case AC: return AFL_AC; + case MC: return AFL_MC; + } + if (planet >= FIRST_HSNR && planet <= LAST_HSNR) + return AFL_HOUSE; + else + return -1; +} + +/* + * get the 2-letter abbreviation for a planet + * returns ?? if not defined + */ +char *planet2abbr2(int planet) +{ + switch (planet) { + case SUN: return "su"; + case MOON: return "mo"; + case MERCURY: return "me"; + case VENUS: return "ve"; + case MARS: return "ma"; + case JUPITER: return "ju"; + case SATURN: return "sa"; + case URANUS: return "ur"; + case NEPTUNE: return "ne"; + case PLUTO: return "pl"; + case MEAN_NODE: return "mn"; + case TRUE_NODE: return "tn"; + case CHIRON: return "ch"; + case LILITH: return "li"; + case CERES: return "ce"; + case PALLAS: return "pa"; + case JUNO: return "jn"; + case VESTA: return "vs"; + case AC: return "ac"; + case MC: return "mc"; + } + return "??"; +} + +/* + * get the 3-letter abbreviation for a planet + * returns ??? if not defined + */ +char *planet2abbr3(int planet) +{ + switch (planet) { + case SUN: return "sun"; + case MOON: return "mon"; + case MERCURY: return "mer"; + case VENUS: return "ven"; + case MARS: return "mar"; + case JUPITER: return "jup"; + case SATURN: return "sat"; + case URANUS: return "ura"; + case NEPTUNE: return "nep"; + case PLUTO: return "plu"; + case MEAN_NODE: return "mno"; + case TRUE_NODE: return "tno"; + case CHIRON: return "chi"; + case LILITH: return "lil"; + case CERES: return "cer"; + case PALLAS: return "pal"; + case JUNO: return "jun"; + case VESTA: return "ves"; + case AC: return "asc"; + case MC: return "mc "; + } + return "???"; +} + +char *placalc_set_ephepath(char *path) +{ + static char *epath; + if (path == NULL) return epath; + if (epath != NULL) + free((void *) epath); + epath = malloc(strlen(path) + 1); + if (epath != NULL) { + strcpy(epath, path); + swe_set_ephe_path(epath); + } + return epath; +} + +void placalc_close_files() +{ + swe_close(); +} + +char *placalc_get_errtext() +{ + return perrtx; +} + +/***************************************************** +deltat(t): returns delta t (in julian days) from universal time t +is included by users +ET = UT + deltat +******************************************************/ +double deltat (double jd_ad) /* Astrodienst relative julian date */ +{ + return swe_deltat(jd_ad + JUL_OFFSET); +} + +/********************************************************** + * get fixstar positions + * parameters: + * star + * if string star contains a name, this star is searched. + * if it contains a number, the n'th star of the file + * is returned, starting with 0. + * In any case the name of the star is returned. + * jd absolute julian day + * lon, lat pointer for returning the ecliptic coordinates + * (mean ecliptic and equinox of date) +**********************************************************/ +int fixstar(char *star, double jd, double *lon, double *lat) +{ + double x[6]; + int i; + int32 retflag; + /* if call by number, fixstar() is 0-based, + * whereas swe_fixstar starts with 1 */ + if (isdigit((int) *star)) { + i = atoi(star); + sprintf(star, "%d", i+1); + } + retflag = swe_fixstar(star, jd, 0, x, perrtx); + *lon = x[0]; + *lat = x[1]; + return((int) retflag); +} + +/******************************************************************/ +double diff8360 (double a, double b) + /* a - b on a 360 degree circle, result -180..180*/ +{ + double d; + d = a - b; + if ( d >= 180.0 ) return( d - 360.0 ); + if ( d < -180.0 ) return( d + 360.0 ); + return( d ); +} /* diff8360 */ + +/* + * originally in swephous.c + */ + +/************************************* +return in which house pp is; +houses are numbered from 1 .. 12 +*************************************/ +int HouseNr(struct houses *hsp, CSEC pp) +{ + CSEC cx; + int i = 2; + cx = swe_difcsn(pp, hsp->cusp [1]); /* distance from cusp 1 */ + while (i < 13 && cx >= difcsn(hsp->cusp [i], hsp->cusp [1])) i++; + return (i - 1); +} + +/************************************ +returns the inp-house number, where pp is in +houses are numbered from 1 .. 12 +************************************/ +int InpHouseNr (struct houses *hsp, CSEC pp, CSEC *coff) +{ + CSEC cx; + int i = 2; + cx = swe_difcsn(pp, hsp->cusp [1] + coff [1]); + while(i<13 && cx >= swe_difcsn(hsp->cusp[i] + coff[i], hsp->cusp[1] + coff[1])) + i++; + return (i - 1); +} + +/* variation of InpHouseNr(). Able to handle house pre-orbs that are + * proportional to house size. + * value 1 in doff[0] means that the offset is proportional to house size, + * e.g. doff[ihs] = -5 means here: + * doff[ihs] = -5 / 30 * preceding_house_size; + * We first calculate the absolute offsets for each house of our birth chart, + * then call the function InpHouseNr() with those values. + */ +int InpHouseNr2 (struct houses *hsp, CSEC pp, CSEC *coff) +{ + int i, j; + CSEC myoff[13]; + for (i = 0; i < 13; i++) + myoff[i] = coff[i]; + if (myoff[0] == 1) { + for (i = 1; i < 13; i++) { + j = i + 1; + if (j > 12) j = 1; + myoff[j] = swe_degnorm((hsp->cusp[j] - hsp->cusp[i]) / 360000.0) / 30.0 * myoff[j]; + } + } + return InpHouseNr(hsp, pp, myoff); +} + +/* ********************************************************* */ +/* Houses: */ +/* ********************************************************* */ +/* Koch and Placidus don't work in the polar circle. */ +/* We swap MC/IC so that MC is always before AC in the zodiac */ +/* We than divide the quadrants into 3 equal parts. */ +/* ********************************************************* */ +/* All angles are expressed in centiseconds (1/100th of a */ +/* second of arc) and integer arithmetic is used for these. */ +/* Special trigonometric functions dsin, dcos etc. are im- */ +/* plemented for arguments in centiseconds. */ +/* ********************************************************* */ +/* Arguments: th = sidereal time (angle 0..360 degrees */ +/* hsy = letter code for house system; implemen- */ +/* ted are P,K,C,R,E,V. */ +/* fi = geographic latitude */ +/* ekl = obliquity of the ecliptic */ +/* iteration_count = number of iterations in */ +/* Placidus calculation; can be 1 or 2. */ +/* ********************************************************* */ +void CalcHouses(CSEC th, CSEC fi, CSEC mekl, char hsy, int iteration_count, + struct houses *hsp ) +{ + int retc = 0, i; + double cs2deg = 360000; + double cusps[13]; + double ascmc[10]; + /* iteration_count is always 2 */ + retc = swe_houses_armc(th / cs2deg, fi / cs2deg, mekl / cs2deg, (int) hsy, + cusps, ascmc); + for (i = 0; i < 13; i++) + hsp->cusp[i] = swe_d2l(cusps[i] * cs2deg); + hsp->ac = swe_d2l(ascmc[0] * cs2deg); + hsp->mc = swe_d2l(ascmc[1] * cs2deg); + /* + * this is just to shut up lint + */ + retc += iteration_count; + iteration_count = retc; +} /* procedure houses */ + +/******************************/ +void RecalcAspects(struct AspectType *a) +{ + centisec diff,orbis; + int p1, p2, i; + struct aspRec *arp; + if (a->ppos2 == NULL) { /* no set ppos2, no interaspects */ + for (p1 = 0; p1 < a->NrOfPlanets; p1++) { + a->Asp[p1][p1].index = 0; /* ignore p1 conjunct p1 */ + for (p2 = p1 + 1; p2 < a->NrOfPlanets; p2++) { + arp = &(a->Asp[p1][p2]); + diff = a->PlanetPos [p2] - a->PlanetPos [p1]; + if (diff >= DEG180) + diff -= DEG360; + else if (diff < - DEG180) + diff += DEG360; + i = 1; + arp->index = 0; + while (i <= a->NrOfAspects) { + orbis = ABS4 (diff) - a->Angle [i]; + if (ABS4 (orbis) <= a->Maxorb [i]) { + arp->index = i; + arp->orb = orbis; + break; /* out of while */ + } + i++; + } + a->Asp [p2][p1].index = arp->index; + a->Asp [p2][p1].orb = arp->orb; + } /* for p2 */ + } /* for p1 */ + } else { /* interaspects between set 1 and set 2 */ + for (p1 = 0; p1 < a->NrOfPlanets; p1++) { + for (p2 = 0; p2 < a->NrOfPlanets; p2++) { + arp = &(a->Asp[p1][p2]); + diff = a->ppos2 [p2] - a->PlanetPos [p1]; + if (diff >= DEG180) + diff -= DEG360; + else if (diff < - DEG180) + diff += DEG360; + i = 1; + arp->index = 0; + while (i <= a->NrOfAspects) { + orbis = ABS4 (diff) - a->Angle [i]; + if (ABS4 (orbis) <= a->Maxorb [i]) { + arp->index = i; + arp->orb = orbis; + break; /* out of while */ + } + i++; + } + } /* for p2 */ + } /* for p1 */ + } /* else */ + a->dataValid = TRUE; +} + +/*********************************************************** +function sidtime (t): returns sidereal time at greenwich; +Parameters differ from ASYS version! after AESuppl. 1961, page 75 +version 24-oct-87 +***********************************************************/ +double sidtime (double jd_ad, double ecl, double nuta) + /* jd_ad relative julian date */ + /* ecl, nuta ecliptic and nutation of date, in degrees */ +{ + return swe_sidtime0(jd_ad + JUL_OFFSET, ecl, nuta); +} + +# ifdef INTEL_BYTE_ORDER +/********************************************************************/ +void longreorder (UCHAR *p, int n) + /* p points to memory filled with int32 values; for + each of the values the seqeuence of the four bytes + has to be reversed, to translate HP-UX and VAX + ordering to MSDOS/Turboc ordering */ +{ + int i; + unsigned char c0, c1, c2, c3; + for (i = 0; i < n; i += 4, p += 4) { + c0 = *p; + c1 = *(p + 1); + c2 = *(p + 2); + c3 = *(p + 3); + *p = c3; + *(p + 1) = c2; + *(p + 2) = c1; + *(p + 3) = c0; + } +} +# endif diff --git a/swe/src/swepcalc.h b/swe/src/swepcalc.h new file mode 100644 index 0000000..2b0875c --- /dev/null +++ b/swe/src/swepcalc.h @@ -0,0 +1,461 @@ +/************************************************************ + $Header: /home/dieter/sweph/RCS/swepcalc.h,v 1.74 2008/06/16 10:07:20 dieter Exp $ + Definitions and constants for Placalc interface to SwissEph + + This should only be used for porting older Placalc applications. + All new applications should directly use the Swiss Ephemeris API. + + A programmer using the Placalc API needs only to include this file + in his code, and link his application with the SwissEph library. + + There is no documentation, as it is only intended for porting old + existing Placalc applications. + + The Placalc API is not supported in the Windows DLL versions of + Swiss Ephemeris. +************************************************************/ + +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + +#ifndef _SWEPCALC_INCLUDED +#define _SWEPCALC_INCLUDED + +#include "swephexp.h" + +#define degtocs(x) (d2l((x) * DEG)) +#define cstodeg(x) (double)((x) * CS2DEG) + +/* + * Some functions which came in the source files csec.c and d2l.c + * are by default not included in the compatibility interface because + * they have an identical counterpart in the SwissEph library. + * It is very simple to adapt your code to it. + * If you want to adapt your source code, turn the next TRUE into FALSE + */ +#if TRUE /* replace by if FALSE to deactivate macros */ +# define d2l(x) swe_d2l(x) +# define difcsn(x,y) swe_difcsn(x,y) +# define difcs2n(x,y) swe_difcs2n(x,y) +# define difdegn(x,y) swe_difdegn(x,y) +# define difdeg2n(x,y) swe_difdeg2n(x,y) +# define csnorm(x) swe_csnorm(x) +# define degnorm(x) swe_degnorm(x) +# define roundsec(x) swe_csroundsec(x) +#endif + +/************************************************************* + Exported functions, originally from placalc.c + + In all functions the variable jd_ad indicates the use of + Astrodienst relative julian days, and jd the use of absolute + julian days. +*************************************************************/ +extern int nacalc(double jd_ad, centisec *plon, centisec *pspe); +extern int calcserv(int id, double t, int flag, int plalist, char *so); +extern void helup(double jd_ad); +extern void togeo(double le, double re, double l, double r, double z, double *alg, double *arg); +extern int calc(int p, + double jd_ad, + int flag, + double *alng, + double *arad, + double *alat, + double *alngspeed); +extern int rel_geo(int p, double rau); +extern int hel( int p, /* planet index as defined by placalc.h */ + double jd_ad, /* relative juliand date, ephemeris time */ + /* Now come 6 pointers to return values. */ + double *al, /* longitude in degrees */ + double *ar, /* radius in AU */ + double *az, /* distance from ecliptic in AU */ + double *alp, /* speed in longitude, degrees per day */ + double *arp, /* speed in radius, AU per day */ + double *azp); /* speed in z, AU per day */ +extern int moon(double *al, double *ar, double *az); +extern double fraction(double t); +extern double sidtime(double jd_ad, double ecl, double nuta); +extern double smod8360(double x); +extern double mod8360(double x); +extern double diff8360(double x, double y); +extern double test_near_zero(double x); +extern double deltat(double jd_ad); +extern void to_mean_ekl (double jd, double xyz[], double lrz[]); +extern void placalc_close_files(); +extern int fixstar(char *star, double jd, double *lon, double *lat); +extern char *placalc_get_errtext(); +extern char *placalc_set_ephepath(char *new_path); /* sets ephepath; + if called with NULL, returns current path */ + +/* + * because deltat() required a relative Julian date due to historical reasons, + * we define a function deltatjd() with absolute Juliand date argument. + */ +# define deltatjd(x) deltat((x) - JUL_OFFSET) + +/* + * get the planet index for an AFL letter + * returns -1 if the letter does not correspond to a planet. + */ +extern int afl2planet(int afl); +/* + * get the AFL letter for a planet + * returns -1 if planet has no letter. + */ +extern int planet2afl(int p); +extern char *planet2abbr2(int planet); +extern char *planet2abbr3(int planet); + +/************************************************************* + exported variables + (these cannot be used by DLL clients) +*************************************************************/ + + +/************************************************************* + definitions +*************************************************************/ + +/* + * planet index numbers, used to identify a planet in calc() and + * other related functions. + */ +#define CALC_ONLY_ECL_NUT -1 /* pseudo planet index for calls to calc */ +#define SUN 0 /* used synonymously for earth too */ +#define EARTH 0 +#define MOON 1 +#define MERCURY 2 +#define VENUS 3 +#define MARS 4 +#define JUPITER 5 +#define SATURN 6 +#define URANUS 7 +#define NEPTUNE 8 +#define PLUTO 9 +#define LASTPLANET PLUTO +#define MEAN_NODE 10 +#define TRUE_NODE 11 +#define CHIRON 12 +#define LILITH 13 +#define CALC_N 14 /* number of planets in placalc module */ + +#define CERES 14 +#define PALLAS 15 +#define JUNO 16 +#define VESTA 17 + +#define MAXPL_NACALC (LILITH) /* nacalc computes SUN..LILITH */ +# define PROG_PLANET_OFFSET 50 /* progressed sun */ + +/* + * houses and axes get also a 'planet' index number, but they + * are not used by placalc itself + * between chiron and AC we leave 6 places unused for some other celestial + * bodies or chart factors. + * Axes and houses cannot be computed with calls to calc(); they must + * be computed with the housasp module functions. + */ +# define AC 19 +# define ASC 19 +# define MC 20 +# define CALC_N_MC 21 /* number of normal natal factors */ + +# define FIRST_HSNR 21 +# define LAST_HSNR 32 +# define NO_OF_HOUSES 12 +#define MAX_PL_INDEX 32 +/* + * in a bitlist flag each planet is represented by a bit; + * all 14 defined planets can be called at once with + */ +#define CALC_ALL_PLANET_BITS ((1 << CALC_N) - 1) /* bits 0..13 set */ + +/* + * AFL: Astrological factor letters for use in selections strings. + * Each factor (planet, house cusp etc) has a typical letter which + * can be combined in a selection string for specifying a certain + * sequence of factors for a table or other kind of display. + * The function afl2planet() can be used to translate the AFL letters + * into planet indices. + * The function planet2afl translates a planext index into the AFL letter. + */ + +# define AFL_SUN '0' +# define AFL_MON '1' +# define AFL_MER '2' +# define AFL_VEN '3' +# define AFL_MAR '4' +# define AFL_JUP '5' +# define AFL_SAT '6' +# define AFL_URA '7' +# define AFL_NEP '8' +# define AFL_PLU '9' +# define AFL_CHI 'c' +# define AFL_LIL 'i' /* mean Lilith: direction of lunar aphel */ +# define AFL_AC 'A' +# define AFL_MC 'M' +# define AFL_TNODE 'N' /* TRUE_NODE */ +# define AFL_MNODE 'n' /* MEAN_NODE */ +# define AFL_CER 'C' +# define AFL_PAL 'P' +# define AFL_JUN 'J' +# define AFL_VES 'V' + +/* + * other AFL definitions not recognized by afl2planet() + */ +# define AFL_SIDT 's' /* sidereal time */ +# define AFL_WDAY 'd' /* day of week column */ +# define AFL_HOUSE 'H' /* any house cusp */ + +# define apl2planet afl2planet /* change of original name */ + + +# define J2000 2451545.0 /* Epoch of JPL ephemeris DE200, absolute */ +# define J1950 2433282.423 /* Epoch of JPL ephemeris DE102 */ +# define JUL_OFFSET 2433282.0 /* offset of Astrodienst relative Julian date */ + +#ifndef GREG_CAL +# define GREG_CAL SE_GREG_CAL +# define JUL_CAL SE_JUL_CAL +#endif + +/* + * flag bits used in calc and calcserv + */ +# define CALC_BIT_HELIO 1 /* geo/helio */ +# define CALC_BIT_NOAPP 2 /* apparent/true positions */ +# define CALC_BIT_NONUT 4 /* true eq. of date/ mean equ. of date */ +# define CALC_BIT_EPHE 8 /* universal/ephemeris time */ +# define CALC_BIT_SPEED 16 /* without/with speed */ +# define CALC_BIT_BETA 32 /* without/with latitude */ +# define CALC_BIT_RGEO 64 /* without/with relative rgeo */ +# define CALC_BIT_RAU 128 /* without/with real radius */ +# define CALC_BIT_MUST_USE_EPHE 256 /* epheserv may not use calc */ +# define CALC_BIT_MAY_USE_EPHE 512 /* calcserv may use ephread */ +# define CALC_BIT_MUST_CALC 1024 /* ephread must calc */ + + +/* + * stuff from astrolib.h + */ + +#ifndef ADATE /* this must be bracketed because users of swepcalc + may also include astrolib.h for other reasons */ +#define ADATE struct adate + +/* makros for bit operations */ +# define clear_bit(v,bit_nr) ((v) & ~(1L << (bit_nr))) +# define set_bit(v,bit_nr) ((v) | (1L << (bit_nr))) +# define bit(bit_nr) (1L << (bit_nr)) +# define check_bit(v,bit_nr) ((v) & (1L << (bit_nr))) + +ADATE { /* date structure used by revjuls and juldays */ + int day, month, year; + centisec csec; + }; + +#endif /* ADATE */ + +/* + * functions exported by swepdate.c + */ +extern double julday(int month, int day, int year, double hour, int gregflag); +extern double juldays(int gregflag, ADATE *adp); +extern void revjul (double u, int gregflag, + int *jmon, int *jday, int *jyear, double *jut); +extern void revjuls(double u, int gregflag, ADATE *adp); +extern int day_of_week(double t); +/* + * end swpdate.c + */ + +/* + * stuff from housasp.h + */ +#ifndef ASP_144 /* allow including housasp wihout conflict */ +#define MAXPLANETS 16 + +/* + * definitions for aspect numbering; we always have a name and an angle + * due to historical reasons index 0 is unused, conjunct is 1. + * We define three different names for the aspects: + * ASP_CONJ (always 4 letters), ASP_0 and CONJ. + */ +# define ASP_CONJ 1 +# define ASP_0 1 +# define ASP_OPPO 2 +# define ASP_180 2 +# define ASP_SQUA 3 +# define ASP_90 3 +# define ASP_TRIN 4 +# define ASP_120 4 +# define ASP_SEXT 5 +# define ASP_60 5 +# define ASP_SMSX 6 +# define ASP_30 6 +# define ASP_QCNX 7 +# define ASP_150 7 +# define ASP_SMSQ 8 +# define ASP_45 8 +# define ASP_SQSQ 9 +# define ASP_135 9 +# define ASP_QINT 10 +# define ASP_72 10 +# define ASP_BQIN 11 +# define ASP_144 11 + +# define CONJ ASP_CONJ +# define OPPO ASP_OPPO +# define SQUA ASP_SQUA +# define TRIN ASP_TRIN +# define SEXT ASP_SEXT +# define SMSX ASP_SMSX +# define QCNX ASP_QCNX +# define SMSQ ASP_SMSQ +# define SQSQ ASP_SQSQ +# define QINT ASP_QINT +# define BQIN ASP_BQIN + +#define MAXASPECTS ASP_BQIN + +/* + * for compact encoding of aspect lists we set bit 1 for CONJ, bit 2 for OPPO + * and so on. asp_bit(asp) deleivers the mask. + */ +#define ALL_ASP_BITS 1022 /* bit mask with all aspect bits set */ +#define STRONG_ASP_BITS 62 /* bit mask with strong aspect bits set */ +#define HARD_ASP_BITS 14 /* bit mask with hard aspect bits set */ + +#define asp_bit(asp) (1 << (asp)) + +/* + * sometimes it is desirable to have a compact way to express planet-aspect + * combinations. + * We define PASP(planet,aspect) as a constant, 100*planet + aspect. + * We can then write things like: + * case PASP(PLUTO, JONJ): ... + * A definition like p << 8 + a would be faster but the combinations would + * be harder to read. + */ +#define PASP(p,a) (100*(p) + (a)) + +/* + * used to initialize an array centisec angles[MAXASPECTS+1] + */ +# define ASP_ANGLES {0, 0*DEG, 180*DEG, 90*DEG, 120*DEG,\ + 60*DEG, 30*DEG, 150*DEG, 45*DEG, 135*DEG, 72*DEG, 144*DEG} + +struct AspectType { + AS_BOOL dataValid; /* used as boolean */ + int NrOfPlanets, + NrOfAspects; + centisec *PlanetPos; /* pointer to an array of planet positions + [0..NrOfPlanets-1]; the user of the + structure must set this pointer to his + array of planet positions */ + centisec *ppos2; /* second set for mutual aspects only; if + not NULL, interaspects are calculated */ + centisec *Maxorb; /* pointer to an array [0..NrOfAspects] of + maximum orbes; element[0] not used; + the user of the structure must set this + pointer to his array of maxorbs */ + centisec *Angle; /* pointer to Angle[0..NrOfAspects] of the + angles of aspects; [0] not used; the + user must set this pointer to his array + of angles */ + struct aspRec { + int index; /* number of the found aspect */ + centisec orb; + } + Asp [MAXPLANETS] [MAXPLANETS]; + }; + +struct houses { + centisec cusp[13]; + centisec ac; + centisec mc; + }; + +# define HOUSES struct houses +#endif /* ifndef ASP_144 */ +/********************************** + functions exported originally from housasp.c +***********************************/ + +extern int HouseNr(HOUSES *h, CSEC p); + /* + return in which house pp is, + The caller is responsible for proper initialization of cusps + */ + +extern int InpHouseNr(HOUSES *h, CSEC p, CSEC *cuspoff); + /* returns the interpretation-house number, where pp is in; + * an interpretation house is defined differently from a normal + * house: the cusps are offset, so that it begins and ends + * a little earlier. + * cusp[1..12] and cuspoff[1..12] must be initialized + */ +extern int InpHouseNr2(HOUSES *h, CSEC p, CSEC *cuspoff); + /* variation of InpHouseNr(). Comment in swepcalc.c */ + +extern void CalcHouses(CSEC th, CSEC fi, CSEC ekl, char hsy, int icnt, + struct houses *h); + +extern void RecalcAspects(struct AspectType *a); + +extern void longreorder (UCHAR *p, int n); + + +#endif /* _SWEPCALC_INCLUDED */ diff --git a/swe/src/swepdate.c b/swe/src/swepdate.c new file mode 100644 index 0000000..088c0c8 --- /dev/null +++ b/swe/src/swepdate.c @@ -0,0 +1,242 @@ +/***************************************************** +$Header: swepdate.c,v 1.65 2003/06/14 13:02:01 alois Exp $ +Placalc compatibility interface for Swiss Ephemeris. +date functions + +*******************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + +/* + * This file is part of the PLACALC compatibility interface for Swiss Ephemeris. + * It allows very easy porting of older Placalc application to the SwissEph. + * A user has to replace #include "placalc.h" and "housasp.h" with + * #include "swepcalc.h" + * If he has used "ourdef.h" he replaces it with "sweodef.h". + * Then he links his application with swepcalc.o and runs it against the + * Swiss Ephemeris DLL or linkable library. + * + * All calls which were present in the placalc sources are contained + * here, and either implemented directly or translated into Swiss Ephemeris + * calls. + * + * + */ + +#include "swepcalc.h" +#include "swephexp.h" + +/*************** julday ******************************************** + * This function returns the absolute Julian day number (JD) + * for a given calendar date. + * The arguments are a calendar date: day, month, year as integers, + * hour as double with decimal fraction. + * If gregflag = 1, Gregorian calendar is assumed, gregflag = 0 + * Julian calendar is assumed. + * + The Julian day number is system of numbering all days continously + within the time range of known human history. It should be familiar + for every astrological or astronomical programmer. The time variable + in astronomical theories is usually expressed in Julian days or + Julian centuries (36525 days per century) relative to some start day; + the start day is called 'the epoch'. + The Julian day number is a double representing the number of + days since JD = 0.0 on 1 Jan -4712, 12:00 noon. + + Midnight has always a JD with fraction .5, because traditionally + the astronomical day started at noon. This was practical because + then there was no change of date during a night at the telescope. + From this comes also the fact the noon ephemerides were printed + before midnight ephemerides were introduced early in the 20th century. + + NOTE: The Julian day number is named after the monk Julianus. It must + not be confused with the Julian calendar system, which is named after + Julius Cesar, the Roman politician who introduced this calendar. + The Julian century is named after Cesar, i.e. a century in the Julian + calendar. The 'gregorian' century has a variable length. + + Be aware the we always use astronomical year numbering for the years + before Christ, not the historical year numbering. + Astronomical years are done with negative numbers, historical + years with indicators BC or BCE (before common era). + Year 0 (astronomical) = 1 BC + year -1 (astronomical) = 2 BC + etc. + + Original author: Marc Pottenger, Los Angeles. + with bug fix for year < -4711 15-aug-88 by Alois Treindl + (The parameter sequence m,d,y still indicates the US origin, + be careful because the similar function date_conversion() uses + other parameter sequence and also Astrodienst relative juldate.) + + References: Oliver Montenbruck, Grundlagen der Ephemeridenrechnung, + Verlag Sterne und Weltraum (1987), p.49 ff + + related functions: revjul() reverse Julian day number: compute the + calendar date from a given JD + date_conversion() includes test for legal date values + and notifies errors like 32 January. + ****************************************************************/ + +double julday(int month, int day, int year, double hour, int gregflag) +{ + double jd; + jd = swe_julday(year, month, day, hour, gregflag); + return jd; +} + +/* + * monday = 0, ... sunday = 6 + */ +int day_of_week(double jd) +{ + return (((int) floor (jd - 2433282 - 1.5) %7) + 7) % 7; +} + +/*************** julday ****************** + get absolute julian day number (author: Marc Pottenger) + with bug fix for year < -4711 15-aug-88 +*/ +double juldays(int gregflag, ADATE *adp ) +{ + return swe_julday(adp->year, adp->month, adp->day, adp->csec / 360000.0, gregflag); +} + +/*** revjul ****************************************************** + revjul() is the inverse function to julday(), see the description + there. + Arguments are julian day number, calendar flag (0=julian, 1=gregorian) + return values are the calendar day, month, year and the hour of + the day with decimal fraction (0 .. 23.999999). + + Be aware the we use astronomical year numbering for the years + before Christ, not the historical year numbering. + Astronomical years are done with negative numbers, historical + years with indicators BC or BCE (before common era). + Year 0 (astronomical) = 1 BC historical year + year -1 (astronomical) = 2 BC historical year + year -234 (astronomical) = 235 BC historical year + etc. + + Original author Mark Pottenger, Los Angeles. + with bug fix for year < -4711 16-aug-88 Alois Treindl +*************************************************************************/ +void revjul (double jd, int gregflag, + int *jmon, int *jday, int *jyear, double *jut) +{ + swe_revjul(jd, gregflag, jyear, jmon, jday, jut); +} + +/************************************* revjul ********* + get calendar date from julian day # + with bug fix for year < -4711 16-aug-88 + arguments are julian day #, calendar flag (0=julian, 1=gregorian) +*/ +void revjuls(double jd, int gregflag, struct adate *adp) +{ + double jut; + swe_revjul(jd, gregflag, &adp->year, &adp->month, &adp->day, &jut); + adp->csec = jut * 360000.0 + 0.5; +} + +/********************************************************* + $Header: swepdate.c,v 1.65 2003/06/14 13:02:01 alois Exp $ + version 15-feb-89 16:30 + + This function converts some date+time input {d,m,y,utime} + into the Julian day number tgmt, which is an Astrodienst relative + Julian date. + The function checks that the input is a legal combination + of dates; for illegal dates like 32 January 1993 it returns ERR + but still converts the date correctly, i.e. like 1 Feb 1993. + The function is usually used to convert user input of birth data + into the Julian day number. Illegal dates should be notified to the user. + + Be aware the we always use astronomical year numbering for the years + before Christ, not the historical year numbering. + Astronomical years are done with negative numbers, historical + years with indicators BC or BCE (before common era). + Year 0 (astronomical) = 1 BC historical. + year -1 (astronomical) = 2 BC + etc. + Many users of Astro programs do not know about this difference. + + Return: OK or ERR (for illegal date) +*********************************************************/ + +int date_conversion (int d , + int m , + int y , /* day, month, year */ + centisec gutime, /* greenwich time in centiseconds */ + char c, /* calendar g[regorian]|j[ulian]|a[stro = greg] */ + double *tgmt + /* julian date relative 0.Jan.1950 12:00 gmt */ + /* shift is 2433282 from absolute Julian date */ + ) +{ + int rday, rmon, ryear; + double rut, jd; + int gregflag = SE_JUL_CAL; + if (c == 'g' || c == 'a') + gregflag = SE_GREG_CAL; + rut = gutime / 360000.0; /* hours GMT */ + jd = julday(m, d, y, rut, gregflag); + revjul(jd, gregflag, &rmon, &rday, &ryear, &rut); + *tgmt = jd - JUL_OFFSET; + if (rmon == m && rday == d && ryear == y) { + return OK; + } else { + return ERR; + } +} /* end date_conversion */ diff --git a/swe/src/sweph.c b/swe/src/sweph.c new file mode 100644 index 0000000..48afe4a --- /dev/null +++ b/swe/src/sweph.c @@ -0,0 +1,6256 @@ +/* SWISSEPH + $Header: /home/dieter/sweph/RCS/sweph.c,v 1.76 2009/07/10 14:08:53 dieter Exp $ + + Ephemeris computations + + Authors: Dieter Koch and Alois Treindl, Astrodienst Zurich + +**************************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + + +#include +#include +#include "swejpl.h" +#include "swephexp.h" +#include "sweph.h" +#include "swephlib.h" + +#define IS_PLANET 0 +#define IS_MOON 1 +#define IS_ANY_BODY 2 +#define IS_MAIN_ASTEROID 3 + +#define DO_SAVE TRUE +#define NO_SAVE FALSE + +#define SEFLG_EPHMASK (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH) + +struct meff_ele {double r,m;}; + +/**************** + * global stuff * + ****************/ +struct swe_data FAR swed = {FALSE, /* ephe_path_is_set = FALSE */ + FALSE, /* jpl_file_is_open = FALSE */ + NULL, /* fixed stars file pointer */ + SE_EPHE_PATH, /* ephe path */ + SE_FNAME_DFT, /* JPL file name, default */ + FALSE, /* geopos is set, for topocentric */ + FALSE, /* ayanamsa is set */ + }; + +/************* + * constants * + *************/ + +static char *ayanamsa_name[] = { + "Fagan/Bradley", + "Lahiri", + "De Luce", + "Raman", + "Ushashashi", + "Krishnamurti", + "Djwhal Khul", + "Yukteshwar", + "J.N. Bhasin", + "Babylonian/Kugler 1", + "Babylonian/Kugler 2", + "Babylonian/Kugler 3", + "Babylonian/Huber", + "Babylonian/Eta Piscium", + "Babylonian/Aldebaran = 15 Tau", + "Hipparchos", + "Sassanian", + "Galact. Center = 0 Sag", + "J2000", + "J1900", + "B1950", + "Suryasiddhanta", + "Suryasiddhanta, mean Sun", + "Aryabhata", + "Aryabhata, mean Sun", +}; +static const int FAR pnoint2jpl[] = PNOINT2JPL; + +static const int pnoext2int[] = {SEI_SUN, SEI_MOON, SEI_MERCURY, SEI_VENUS, SEI_MARS, SEI_JUPITER, SEI_SATURN, SEI_URANUS, SEI_NEPTUNE, SEI_PLUTO, 0, 0, 0, 0, SEI_EARTH, SEI_CHIRON, SEI_PHOLUS, SEI_CERES, SEI_PALLAS, SEI_JUNO, SEI_VESTA, }; + +static int do_fread(void *targ, int size, int count, int corrsize, + FILE *fp, int32 fpos, int freord, int fendian, int ifno, + char *serr); +static int get_new_segment(double tjd, int ipli, int ifno, char *serr); +static int main_planet(double tjd, int ipli, int32 epheflag, int32 iflag, + char *serr); +static int main_planet_bary(double tjd, int ipli, int32 epheflag, int32 iflag, + AS_BOOL do_save, + double *xp, double *xe, double *xs, double *xm, + char *serr); +static int32 swecalc(double tjd, int ipl, int32 iflag, double *x, char *serr); +static int sweplan(double tjd, int ipli, int ifno, int32 iflag, AS_BOOL do_save, + double *xp, double *xpe, double *xps, double *xpm, + char *serr); +static int swemoon(double tjd, int32 iflag, AS_BOOL do_save, double *xp, char *serr); +static int sweph(double tjd, int ipli, int ifno, int32 iflag, double *xsunb, AS_BOOL do_save, + double *xp, char *serr); +static int jplplan(double tjd, int ipli, int32 iflag, AS_BOOL do_save, + double *xp, double *xpe, double *xps, char *serr); +static void rot_back(int ipl); +static int read_const(int ifno, char *serr); +static void embofs(double *xemb, double *xmoon); +static int app_pos_etc_plan(int ipli, int32 iflag, char *serr); +static int app_pos_etc_plan_osc(int ipl, int ipli, int32 iflag, char *serr); +static int app_pos_etc_sun(int32 iflag, char *serr); +static int app_pos_etc_moon(int32 iflag, char *serr); +static int app_pos_etc_sbar(int32 iflag, char *serr); +extern int swi_plan_for_osc_elem(int32 iflag, double tjd, double *xx); +static int app_pos_etc_mean(int ipl, int32 iflag, char *serr); +static void nut_matrix(struct nut *nu, struct epsilon *oec); +static void calc_epsilon(double tjd, struct epsilon *e); +static int lunar_osc_elem(double tjd, int ipl, int32 iflag, char *serr); +static int intp_apsides(double tjd, int ipl, int32 iflag, char *serr); +static double meff(double r); +static void denormalize_positions(double *x0, double *x1, double *x2); +static void calc_speed(double *x0, double *x1, double *x2, double dt); +static int32 plaus_iflag(int32 iflag); +void FAR PASCAL_CONV swe_set_sid_mode(int32 sid_mode, double t0, double ayan_t0); +static int app_pos_rest(struct plan_data *pdp, int32 iflag, + double *xx, double *x2000, struct epsilon *oe, char *serr); + +#ifdef TRACE +static void trace_swe_calc(int param, double tjd, int ipl, int32 iflag, double *xx, char *serr); +static void trace_swe_fixstar(int swtch, char *star, double tjd, int32 iflag, double *xx, char *serr); +static void trace_swe_get_planet_name(int swtch, int ipl, char *s); +#endif + +char *FAR PASCAL_CONV swe_version(char *s) +{ + strcpy(s, SE_VERSION); + return s; +} + +/* The routine called by the user. + * It checks whether a position for the same planet, the same t, and the + * same flag bits has already been computed. + * If yes, this position is returned. Otherwise it is computed. + * -> If the SEFLG_SPEED flag has been specified, the speed will be returned + * at offset 3 of position array x[]. Its precision is probably better + * than 0.002"/day. + * -> If the SEFLG_SPEED3 flag has been specified, the speed will be computed + * from three positions. This speed is less accurate than SEFLG_SPEED, + * i.e. better than 0.1"/day. And it is much slower. It is used for + * program tests only. + * -> If no speed flag has been specified, no speed will be returned. + */ +int32 FAR PASCAL_CONV swe_calc(double tjd, int ipl, int32 iflag, + double *xx, char *serr) +{ + int i, j; + int32 iflgcoor; + int32 iflgsave = iflag; + int32 epheflag; + static int32 epheflag_sv = 0; + struct save_positions *sd; + double x[6], *xs, x0[24], x2[24]; + double dt; +#ifdef TRACE +#ifdef FORCE_IFLAG + /* + * If this source file is compiled with /DFORCE_IFLAG or -DFORCE_IFLAG + * and also with TRACE, then the actual value of iflag used in swe_calc() + * can be manipulated from the outside of an application: + * Create a text file 'force.flg' and put one text line into it + * containing a number, e.g. 1024 + * This number will be or'ed into the iflag used by the caller of swe_calc() + * + * See the code below for the details. + * This is not an important mechanism. We used it to debug an application + * which showed strange behaviour, by compiling a special DLL with TRACE and + * FORCE_IFLAG and then running the application with this DLL (we had no + * source code of the application itself). + */ + static int force_flag = 0; + static int32 iflag_forced = 0; + static int force_flag_checked = 0; + FILE *fp; + char s[AS_MAXCH], *sp; + memset(x, 0, sizeof(double) * 6); + /* if the following file exists, flag is read from it and or'ed into iflag */ + if (!force_flag_checked) { + if ((fp = fopen(fname_force_flg, BFILE_R_ACCESS)) != NULL) { + force_flag = 1; + fgets(s, AS_MAXCH, fp); + if ((sp = strchr(s, '\n')) != NULL) + *sp = '\0'; + iflag_forced = atol(s); + fclose(fp); + } + force_flag_checked = 1; + } + if (force_flag) + iflag |= iflag_forced; +#endif + swi_open_trace(serr); + trace_swe_calc(1, tjd, ipl, iflag, xx, NULL); +#endif /* TRACE */ +#ifdef NO_JPL + if (iflag & SEFLG_JPLEPH) { + iflag = iflag & ~SEFLG_EPHMASK; + iflag |= SEFLG_SWIEPH; + } +#endif + /* function calls for Pluto with asteroid number 134340 + * are treated as calls for Pluto as main body SE_PLUTO. + * Reason: Our numerical integrator takes into account Pluto + * perturbation and therefore crashes with body 134340 Pluto. */ + if (ipl == SE_AST_OFFSET + 134340) + ipl = SE_PLUTO; + /* if ephemeris flag != ephemeris flag of last call, + * we clear the save area, to prevent swecalc() using + * previously computed data for current calculation. + * except with ipl = SE_ECL_NUT which is not dependent + * on ephemeris, and except if change is from + * ephemeris = 0 to ephemeris = SEFLG_DEFAULTEPH + * or vice-versa. + */ + epheflag = iflag & SEFLG_EPHMASK; + if (epheflag & SEFLG_DEFAULTEPH) + epheflag = 0; + if (epheflag_sv != epheflag && ipl != SE_ECL_NUT) { + swe_close(); + epheflag_sv = epheflag; + } + /* high precision speed prevails fast speed */ + if ((iflag & SEFLG_SPEED3) && (iflag & SEFLG_SPEED)) + iflag = iflag & ~SEFLG_SPEED3; + /* cartesian flag excludes radians flag */ + if ((iflag & SEFLG_XYZ) && (iflag & SEFLG_RADIANS)) + iflag = iflag & ~SEFLG_RADIANS; +/* if (iflag & SEFLG_ICRS) + iflag |= SEFLG_J2000;*/ + /* pointer to save area */ + if (ipl < SE_NPLANETS && ipl >= SE_SUN) + sd = &swed.savedat[ipl]; + else + /* other bodies, e.g. asteroids called with ipl = SE_AST_OFFSET + MPC# */ + sd = &swed.savedat[SE_NPLANETS]; + /* + * if position is available in save area, it is returned. + * this is the case, if tjd = tsave and iflag = iflgsave. + * coordinate flags can be neglected, because save area + * provides all coordinate types. + * if ipl > SE_AST(EROID)_OFFSET, ipl must be checked, + * because all asteroids called by MPC number share the same + * save area. + */ + iflgcoor = SEFLG_EQUATORIAL | SEFLG_XYZ | SEFLG_RADIANS; + if (sd->tsave == tjd && tjd != 0 && ipl == sd->ipl) { + if ((sd->iflgsave & ~iflgcoor) == (iflag & ~iflgcoor)) + goto end_swe_calc; + } + /* + * otherwise, new position must be computed + */ + if ((iflag & SEFLG_SPEED3) == 0) { + /* + * with high precision speed from one call of swecalc() + * (FAST speed) + */ + sd->tsave = tjd; + sd->ipl = ipl; + if ((sd->iflgsave = swecalc(tjd, ipl, iflag, sd->xsaves, serr)) == ERR) + goto return_error; + } else { + /* + * with speed from three calls of swecalc(), slower and less accurate. + * (SLOW speed, for test only) + */ + sd->tsave = tjd; + sd->ipl = ipl; + switch(ipl) { + case SE_MOON: + dt = MOON_SPEED_INTV; + break; + case SE_OSCU_APOG: + case SE_TRUE_NODE: + /* this is the optimum dt with Moshier ephemeris, but not with + * JPL ephemeris or SWISSEPH. To avoid completely false speed + * in case that JPL is wanted but the program returns Moshier, + * we use Moshier optimum. + * For precise speed, use JPL and FAST speed computation, + */ + dt = NODE_CALC_INTV_MOSH; + break; + default: + dt = PLAN_SPEED_INTV; + break; + } + if ((sd->iflgsave = swecalc(tjd-dt, ipl, iflag, x0, serr)) == ERR) + goto return_error; + if ((sd->iflgsave = swecalc(tjd+dt, ipl, iflag, x2, serr)) == ERR) + goto return_error; + if ((sd->iflgsave = swecalc(tjd, ipl, iflag, sd->xsaves, serr)) == ERR) + goto return_error; + denormalize_positions(x0, sd->xsaves, x2); + calc_speed(x0, sd->xsaves, x2, dt); + } + end_swe_calc: + if (iflag & SEFLG_EQUATORIAL) + xs = sd->xsaves+12; /* equatorial coordinates */ + else + xs = sd->xsaves; /* ecliptic coordinates */ + if (iflag & SEFLG_XYZ) + xs = xs+6; /* cartesian coordinates */ + if (ipl == SE_ECL_NUT) + i = 4; + else + i = 3; + for (j = 0; j < i; j++) + x[j] = *(xs + j); + for (j = i; j < 6; j++) + x[j] = 0; + if (iflag & (SEFLG_SPEED3 | SEFLG_SPEED)) { + for (j = 3; j < 6; j++) + x[j] = *(xs + j); + } +#if 1 + if (iflag & SEFLG_RADIANS) { + if (ipl == SE_ECL_NUT) { + for (j = 0; j < 4; j++) + x[j] *= DEGTORAD; + } else { + for (j = 0; j < 2; j++) + x[j] *= DEGTORAD; + if (iflag & (SEFLG_SPEED3 | SEFLG_SPEED)) { + for (j = 3; j < 5; j++) + x[j] *= DEGTORAD; + } + } + } +#endif + for (i = 0; i <= 5; i++) + xx[i] = x[i]; + iflag = sd->iflgsave; + /* if no ephemeris has been specified, do not return chosen ephemeris */ + if ((iflgsave & SEFLG_EPHMASK) == 0) + iflag = iflag & ~SEFLG_DEFAULTEPH; +#ifdef TRACE + trace_swe_calc(2, tjd, ipl, iflag, xx, serr); +#endif + return iflag; +return_error: + for (i = 0; i <= 5; i++) + xx[i] = 0; +#ifdef TRACE + trace_swe_calc(2, tjd, ipl, iflag, xx, serr); +#endif + return ERR; +} + +int32 FAR PASCAL_CONV swe_calc_ut(double tjd_ut, int32 ipl, int32 iflag, + double *xx, char *serr) +{ + return swe_calc(tjd_ut + swe_deltat(tjd_ut), ipl, iflag, xx, serr); +} + +static int32 swecalc(double tjd, int ipl, int32 iflag, double *x, char *serr) +{ + int i; + int ipli, ipli_ast, ifno; + int retc; + int32 epheflag = SEFLG_DEFAULTEPH; + struct plan_data *pdp; + struct plan_data *pedp = &swed.pldat[SEI_EARTH]; + struct plan_data *psdp = &swed.pldat[SEI_SUNBARY]; +#if 0 + struct node_data *ndp; +#else + struct plan_data *ndp; +#endif + double *xp, *xp2; + double ss[3]; + char serr2[AS_MAXCH]; + if (serr != NULL) + *serr = '\0'; + serr2[0] = '\0'; + /****************************************** + * iflag plausible? * + ******************************************/ + iflag = plaus_iflag(iflag); + /****************************************** + * which ephemeris is wanted, which is used? + * Three ephemerides are possible: MOSEPH, SWIEPH, JPLEPH. + * JPLEPH is best, SWIEPH is nearly as good, MOSEPH is least precise. + * The availability of the various ephemerides depends on the installed + * ephemeris files in the users ephemeris directory. This can change at + * any time. + * Swisseph should try to fulfil the wish of the user for a specific + * ephemeris, but use a less precise one if the desired ephemeris is not + * available for the given date and body. + * If internal ephemeris errors are detected (data error, file length error) + * an error is returned. + * If the time range is bad but another ephemeris can deliver this range, + * the other ephemeris is used. + * If no ephemeris is specified, DEFAULTEPH is assumed as desired. + * DEFAULTEPH is defined at compile time, usually as JPLEPH. + * The caller learns from the return flag which ephemeris was used. + * ephe_flag is extracted from iflag, but can change later if the + * desired ephe is not available. + ******************************************/ + if (iflag & SEFLG_MOSEPH) + epheflag = SEFLG_MOSEPH; + if (iflag & SEFLG_SWIEPH) + epheflag = SEFLG_SWIEPH; + if (iflag & SEFLG_JPLEPH) + epheflag = SEFLG_JPLEPH; + /* no barycentric calculations with Moshier ephemeris */ + if ((iflag & SEFLG_BARYCTR) && (iflag & SEFLG_MOSEPH)) { + if (serr != NULL) + strcpy(serr, "barycentric Moshier positions are not supported."); + return ERR; + } + if (epheflag != SEFLG_MOSEPH && !swed.ephe_path_is_set) + swe_set_ephe_path(NULL); + if ((iflag & SEFLG_SIDEREAL) && !swed.ayana_is_set) + swe_set_sid_mode(SE_SIDM_FAGAN_BRADLEY, 0, 0); + /****************************************** + * obliquity of ecliptic 2000 and of date * + ******************************************/ + swi_check_ecliptic(tjd); + /****************************************** + * nutation * + ******************************************/ + swi_check_nutation(tjd, iflag); + /****************************************** + * select planet and ephemeris * + * * + * ecliptic and nutation * + ******************************************/ + if (ipl == SE_ECL_NUT) { + x[0] = swed.oec.eps + swed.nut.nutlo[1]; /* true ecliptic */ + x[1] = swed.oec.eps; /* mean ecliptic */ + x[2] = swed.nut.nutlo[0]; /* nutation in longitude */ + x[3] = swed.nut.nutlo[1]; /* nutation in obliquity */ + /*if ((iflag & SEFLG_RADIANS) == 0)*/ + for (i = 0; i <= 3; i++) + x[i] *= RADTODEG; + return(iflag); + /****************************************** + * moon * + ******************************************/ + } else if (ipl == SE_MOON) { + /* internal planet number */ + ipli = SEI_MOON; + pdp = &swed.pldat[ipli]; + xp = pdp->xreturn; + switch(epheflag) { +#ifndef NO_JPL + case SEFLG_JPLEPH: + retc = jplplan(tjd, ipli, iflag, DO_SAVE, NULL, NULL, NULL, serr); + /* read error or corrupt file */ + if (retc == ERR) + goto return_error; + /* jpl ephemeris not on disk or date beyond ephemeris range + * or file corrupt */ + if (retc == NOT_AVAILABLE) { + iflag = (iflag & ~SEFLG_JPLEPH) | SEFLG_SWIEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, " \ntrying Swiss Eph; "); + goto sweph_moon; + } else if (retc == BEYOND_EPH_LIMITS) { + if (tjd > MOSHLUEPH_START && tjd < MOSHLUEPH_END) { + iflag = (iflag & ~SEFLG_JPLEPH) | SEFLG_MOSEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, " \nusing Moshier Eph; "); + goto moshier_moon; + } else + goto return_error; + } + break; +#endif + case SEFLG_SWIEPH: + sweph_moon: +#if 0 + /* for hel. or bary. position, we need earth and sun as well; + * this is done by sweplan(), but not by swemoon() */ + if (iflag & (SEFLG_HELCTR | SEFLG_BARYCTR | SEFLG_NOABERR)) + retc = sweplan(tjd, ipli, SEI_FILE_MOON, iflag, DO_SAVE, + NULL, NULL, NULL, NULL, serr); + else + retc = swemoon(tjd, iflag, DO_SAVE, pdp->x, serr);/**/ +#else + retc = sweplan(tjd, ipli, SEI_FILE_MOON, iflag, DO_SAVE, + NULL, NULL, NULL, NULL, serr); +#endif + if (retc == ERR) + goto return_error; + /* if sweph file not found, switch to moshier */ + if (retc == NOT_AVAILABLE) { + if (tjd > MOSHLUEPH_START && tjd < MOSHLUEPH_END) { + iflag = (iflag & ~SEFLG_SWIEPH) | SEFLG_MOSEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, " \nusing Moshier eph.; "); + goto moshier_moon; + } else + goto return_error; + } + break; + case SEFLG_MOSEPH: + moshier_moon: + retc = swi_moshmoon(tjd, DO_SAVE, NULL, serr);/**/ + if (retc == ERR) + goto return_error; + /* for hel. position, we need earth as well */ + retc = swi_moshplan(tjd, SEI_EARTH, DO_SAVE, NULL, NULL, serr);/**/ + if (retc == ERR) + goto return_error; + break; + default: + break; + } + /* heliocentric, lighttime etc. */ + if ((retc = app_pos_etc_moon(iflag, serr)) != OK) + goto return_error; /* retc may be wrong with sidereal calculation */ + /********************************************** + * barycentric sun * + * (only JPL and SWISSEPH ephemerises) * + **********************************************/ + } else if (ipl == SE_SUN && (iflag & SEFLG_BARYCTR)) { + /* barycentric sun must be handled separately because of + * the following reasons: + * ordinary planetary computations use the function + * main_planet() and its subfunction jplplan(), + * see further below. + * now, these functions need the swisseph internal + * planetary indices, where SEI_EARTH = SEI_SUN = 0. + * therefore they don't know the difference between + * a barycentric sun and a barycentric earth and + * always return barycentric earth. + * to avoid this problem, many functions would have to + * be changed. as an alternative, we choose a more + * separate handling. */ + ipli = SEI_SUN; /* = SEI_EARTH ! */ + xp = pedp->xreturn; + switch(epheflag) { +#ifndef NO_JPL + case SEFLG_JPLEPH: + /* open ephemeris, if still closed */ + if (!swed.jpl_file_is_open) { + retc = swi_open_jpl_file(ss, swed.jplfnam, swed.ephepath, serr); + if (retc != OK) + goto sweph_sbar; + swed.jpldenum = swi_get_jpl_denum(); + swed.jpl_file_is_open = TRUE; + } + retc = swi_pleph(tjd, J_SUN, J_SBARY, psdp->x, serr); + if (retc == ERR || retc == BEYOND_EPH_LIMITS) { + swi_close_jpl_file(); + swed.jpl_file_is_open = FALSE; + goto return_error; + } + /* jpl ephemeris not on disk or date beyond ephemeris range + * or file corrupt */ + if (retc == NOT_AVAILABLE) { + iflag = (iflag & ~SEFLG_JPLEPH) | SEFLG_SWIEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, " \ntrying Swiss Eph; "); + goto sweph_sbar; + } + psdp->teval = tjd; + break; +#endif + case SEFLG_SWIEPH: + sweph_sbar: + /* sweplan() provides barycentric sun as a by-product in save area; + * it is saved in swed.pldat[SEI_SUNBARY].x */ + retc = sweplan(tjd, SEI_EARTH, SEI_FILE_PLANET, iflag, DO_SAVE, NULL, NULL, NULL, NULL, serr); +#if 1 + if (retc == ERR || retc == NOT_AVAILABLE) + goto return_error; +#else /* this code would be needed if barycentric moshier calculation + * were implemented */ + if (retc == ERR) + goto return_error; + /* if sweph file not found, switch to moshier */ + if (retc == NOT_AVAILABLE) { + if (tjd > MOSHLUEPH_START && tjd < MOSHLUEPH_END) { + iflag = (iflag & ~SEFLG_SWIEPH) | SEFLG_MOSEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, " \nusing Moshier; "); + goto moshier_sbar; + } else + goto return_error; + } +#endif + psdp->teval = tjd; + /* pedp->teval = tjd; */ + break; + default: +#if 0 + moshier_sbar: +#endif + return ERR; + break; + } + /* flags */ + if ((retc = app_pos_etc_sbar(iflag, serr)) != OK) + goto return_error; + /* iflag has possibly changed */ + iflag = pedp->xflgs; + /* barycentric sun is now in save area of barycentric earth. + * (pedp->xreturn = swed.pldat[SEI_EARTH].xreturn). + * in case a barycentric earth computation follows for the same + * date, the planetary functions will return the barycentric + * SUN unless we force a new computation of pedp->xreturn. + * this can be done by initializing the save of iflag. + */ + pedp->xflgs = -1; + /****************************************** + * mercury - pluto * + ******************************************/ + } else if (ipl == SE_SUN /* main planet */ + || ipl == SE_MERCURY + || ipl == SE_VENUS + || ipl == SE_MARS + || ipl == SE_JUPITER + || ipl == SE_SATURN + || ipl == SE_URANUS + || ipl == SE_NEPTUNE + || ipl == SE_PLUTO + || ipl == SE_EARTH) { + if (iflag & SEFLG_HELCTR) { + if (ipl == SE_SUN) { + /* heliocentric position of Sun does not exist */ + for (i = 0; i < 24; i++) + x[i] = 0; + return iflag; + } + } else if (iflag & SEFLG_BARYCTR) { + ; + } else { /* geocentric */ + if (ipl == SE_EARTH) { + /* geocentric position of Earth does not exist */ + for (i = 0; i < 24; i++) + x[i] = 0; + return iflag; + } + } + /* internal planet number */ + ipli = pnoext2int[ipl]; + pdp = &swed.pldat[ipli]; + xp = pdp->xreturn; + retc = main_planet(tjd, ipli, epheflag, iflag, serr); + if (retc == ERR) + goto return_error; + /* iflag has possibly changed in main_planet() */ + iflag = pdp->xflgs; + /*********************i************************ + * mean lunar node * + * for comment s. moshmoon.c, swi_mean_node() * + **********************************************/ + } else if (ipl == SE_MEAN_NODE) { + if ((iflag & SEFLG_HELCTR) || (iflag & SEFLG_BARYCTR)) { + /* heliocentric/barycentric lunar node not allowed */ + for (i = 0; i < 24; i++) + x[i] = 0; + return iflag; + } + ndp = &swed.nddat[SEI_MEAN_NODE]; + xp = ndp->xreturn; + xp2 = ndp->x; + retc = swi_mean_node(tjd, xp2, serr); + if (retc == ERR) + goto return_error; + /* speed (is almost constant; variation < 0.001 arcsec) */ + retc = swi_mean_node(tjd - MEAN_NODE_SPEED_INTV, xp2+3, serr); + if (retc == ERR) + goto return_error; + xp2[3] = swe_difrad2n(xp2[0], xp2[3]) / MEAN_NODE_SPEED_INTV; + xp2[4] = xp2[5] = 0; + ndp->teval = tjd; + ndp->xflgs = -1; + /* lighttime etc. */ + if ((retc = app_pos_etc_mean(SEI_MEAN_NODE, iflag, serr)) != OK) + goto return_error; + /* to avoid infinitesimal deviations from latitude = 0 + * that result from conversions */ + if (!(iflag & SEFLG_SIDEREAL) && !(iflag & SEFLG_J2000)) { + ndp->xreturn[1] = 0.0; /* ecl. latitude */ + ndp->xreturn[4] = 0.0; /* speed */ + ndp->xreturn[5] = 0.0; /* radial speed */ + ndp->xreturn[8] = 0.0; /* z coordinate */ + ndp->xreturn[11] = 0.0; /* speed */ + } + if (retc == ERR) + goto return_error; + /********************************************** + * mean lunar apogee ('dark moon', 'lilith') * + * for comment s. moshmoon.c, swi_mean_apog() * + **********************************************/ + } else if (ipl == SE_MEAN_APOG) { + if ((iflag & SEFLG_HELCTR) || (iflag & SEFLG_BARYCTR)) { + /* heliocentric/barycentric lunar apogee not allowed */ + for (i = 0; i < 24; i++) + x[i] = 0; + return iflag; + } + ndp = &swed.nddat[SEI_MEAN_APOG]; + xp = ndp->xreturn; + xp2 = ndp->x; + retc = swi_mean_apog(tjd, xp2, serr); + if (retc == ERR) + goto return_error; + /* speed (is not constant! variation ~= several arcsec) */ + retc = swi_mean_apog(tjd - MEAN_NODE_SPEED_INTV, xp2+3, serr); + if (retc == ERR) + goto return_error; + for(i = 0; i <= 1; i++) + xp2[3+i] = swe_difrad2n(xp2[i], xp2[3+i]) / MEAN_NODE_SPEED_INTV; + xp2[5] = 0; + ndp->teval = tjd; + ndp->xflgs = -1; + /* lighttime etc. */ + if ((retc = app_pos_etc_mean(SEI_MEAN_APOG, iflag, serr)) != OK) + goto return_error; + /* to avoid infinitesimal deviations from r-speed = 0 + * that result from conversions */ + ndp->xreturn[5] = 0.0; /* speed */ + if (retc == ERR) + goto return_error; + /*********************************************** + * osculating lunar node ('true node') * + ***********************************************/ + } else if (ipl == SE_TRUE_NODE) { + if ((iflag & SEFLG_HELCTR) || (iflag & SEFLG_BARYCTR)) { + /* heliocentric/barycentric lunar node not allowed */ + for (i = 0; i < 24; i++) + x[i] = 0; + return iflag; + } + ndp = &swed.nddat[SEI_TRUE_NODE]; + xp = ndp->xreturn; + retc = lunar_osc_elem(tjd, SEI_TRUE_NODE, iflag, serr); + iflag = ndp->xflgs; + /* to avoid infinitesimal deviations from latitude = 0 + * that result from conversions */ + if (!(iflag & SEFLG_SIDEREAL) && !(iflag & SEFLG_J2000)) { + ndp->xreturn[1] = 0.0; /* ecl. latitude */ + ndp->xreturn[4] = 0.0; /* speed */ + ndp->xreturn[8] = 0.0; /* z coordinate */ + ndp->xreturn[11] = 0.0; /* speed */ + } + if (retc == ERR) + goto return_error; + /*********************************************** + * osculating lunar apogee * + ***********************************************/ + } else if (ipl == SE_OSCU_APOG) { + if ((iflag & SEFLG_HELCTR) || (iflag & SEFLG_BARYCTR)) { + /* heliocentric/barycentric lunar apogee not allowed */ + for (i = 0; i < 24; i++) + x[i] = 0; + return iflag; + } + ndp = &swed.nddat[SEI_OSCU_APOG]; + xp = ndp->xreturn; + retc = lunar_osc_elem(tjd, SEI_OSCU_APOG, iflag, serr); + iflag = ndp->xflgs; + if (retc == ERR) + goto return_error; + /*********************************************** + * interpolated lunar apogee * + ***********************************************/ + } else if (ipl == SE_INTP_APOG) { + if ((iflag & SEFLG_HELCTR) || (iflag & SEFLG_BARYCTR)) { + /* heliocentric/barycentric lunar apogee not allowed */ + for (i = 0; i < 24; i++) + x[i] = 0; + return iflag; + } + ndp = &swed.nddat[SEI_INTP_APOG]; + xp = ndp->xreturn; + retc = intp_apsides(tjd, SEI_INTP_APOG, iflag, serr); + iflag = ndp->xflgs; + if (retc == ERR) + goto return_error; + /*********************************************** + * interpolated lunar perigee * + ***********************************************/ + } else if (ipl == SE_INTP_PERG) { + if ((iflag & SEFLG_HELCTR) || (iflag & SEFLG_BARYCTR)) { + /* heliocentric/barycentric lunar apogee not allowed */ + for (i = 0; i < 24; i++) + x[i] = 0; + return iflag; + } + ndp = &swed.nddat[SEI_INTP_PERG]; + xp = ndp->xreturn; + retc = intp_apsides(tjd, SEI_INTP_PERG, iflag, serr); + iflag = ndp->xflgs; + if (retc == ERR) + goto return_error; + /*********************************************** + * minor planets * + ***********************************************/ + } else if (ipl == SE_CHIRON + || ipl == SE_PHOLUS + || ipl == SE_CERES /* Ceres - Vesta */ + || ipl == SE_PALLAS + || ipl == SE_JUNO + || ipl == SE_VESTA + || ipl > SE_AST_OFFSET) { + /* internal planet number */ + if (ipl < SE_NPLANETS) + ipli = pnoext2int[ipl]; + else if (ipl <= SE_AST_OFFSET + MPC_VESTA) { + ipli = SEI_CERES + ipl - SE_AST_OFFSET - 1; + ipl = SE_CERES + ipl - SE_AST_OFFSET - 1; +#if 0 + } else if (ipl == SE_AST_OFFSET + MPC_CHIRON) { + ipli = SEI_CHIRON; + ipl = SE_CHIRON; + } else if (ipl == SE_AST_OFFSET + MPC_PHOLUS) { + ipli = SEI_PHOLUS; + ipl = SE_PHOLUS; +#endif + } else /* any asteroid except*/ + ipli = SEI_ANYBODY; + if (ipli == SEI_ANYBODY) + ipli_ast = ipl; + else + ipli_ast = ipli; + pdp = &swed.pldat[ipli]; + xp = pdp->xreturn; + if (ipli_ast > SE_AST_OFFSET) + ifno = SEI_FILE_ANY_AST; + else + ifno = SEI_FILE_MAIN_AST; + if (ipli == SEI_CHIRON && (tjd < CHIRON_START || tjd > CHIRON_END)) { + if (serr != NULL) + sprintf(serr, "Chiron's ephemeris is restricted to JD %8.1f - JD %8.1f", + CHIRON_START, CHIRON_END); + return ERR; + } + if (ipli == SEI_PHOLUS && tjd < PHOLUS_START) { + if (serr != NULL) + sprintf(serr, + "Pholus's ephemeris is restricted to the time after JD %8.1f", + PHOLUS_START); + return ERR; + } + do_asteroid: + /* earth and sun are also needed */ + retc = main_planet(tjd, SEI_EARTH, epheflag, iflag, serr); + if (retc == ERR) + goto return_error; + /* iflag (ephemeris bit) has possibly changed in main_planet() */ + iflag = swed.pldat[SEI_EARTH].xflgs; + /* asteroid */ + if (serr != NULL) { + strcpy(serr2, serr); + *serr = '\0'; + } + /* asteroid */ + retc = sweph(tjd, ipli_ast, ifno, iflag, psdp->x, DO_SAVE, NULL, serr); + if (retc == ERR || retc == NOT_AVAILABLE) + goto return_error; + retc = app_pos_etc_plan(ipli_ast, iflag, serr); + if (retc == ERR) + goto return_error; + /* app_pos_etc_plan() might have failed, if t(light-time) + * is beyond ephemeris range. in this case redo with Moshier + */ + if (retc == NOT_AVAILABLE || retc == BEYOND_EPH_LIMITS) { + if (epheflag != SEFLG_MOSEPH) { + iflag = (iflag & ~SEFLG_EPHMASK) | SEFLG_MOSEPH; + epheflag = SEFLG_MOSEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, "\nusing Moshier eph.; "); + goto do_asteroid; + } else + goto return_error; + } + /* add warnings from earth/sun computation */ + if (serr != NULL && *serr == '\0' && *serr2 != '\0') { + strcpy(serr, "sun: "); + serr2[AS_MAXCH-5] = '\0'; + strcat(serr, serr2); + } + /*********************************************** + * fictitious planets * + * (Isis-Transpluto and Uranian planets) * + ***********************************************/ + } else if (ipl >= SE_FICT_OFFSET && ipl <= SE_FICT_MAX) { +#if 0 + ipl == SE_CUPIDO + || ipl == SE_HADES + || ipl == SE_ZEUS + || ipl == SE_KRONOS + || ipl == SE_APOLLON + || ipl == SE_ADMETOS + || ipl == SE_VULKANUS + || ipl == SE_POSEIDON + || ipl == SE_ISIS + || ipl == SE_NEPTUNE_LEVERRIER + || ipl == SE_NEPTUNE_ADAMS) +#endif + /* internal planet number */ + ipli = SEI_ANYBODY; + pdp = &swed.pldat[ipli]; + xp = pdp->xreturn; + do_fict_plan: + /* the earth for geocentric position */ + retc = main_planet(tjd, SEI_EARTH, epheflag, iflag, serr); + /* iflag (ephemeris bit) has possibly changed in main_planet() */ + iflag = swed.pldat[SEI_EARTH].xflgs; + /* planet from osculating elements */ + if (swi_osc_el_plan(tjd, pdp->x, ipl-SE_FICT_OFFSET, ipli, pedp->x, psdp->x, serr) != OK) + goto return_error; + if (retc == ERR) + goto return_error; + retc = app_pos_etc_plan_osc(ipl, ipli, iflag, serr); + if (retc == ERR) + goto return_error; + /* app_pos_etc_plan_osc() might have failed, if t(light-time) + * is beyond ephemeris range. in this case redo with Moshier + */ + if (retc == NOT_AVAILABLE || retc == BEYOND_EPH_LIMITS) { + if (epheflag != SEFLG_MOSEPH) { + iflag = (iflag & ~SEFLG_EPHMASK) | SEFLG_MOSEPH; + epheflag = SEFLG_MOSEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, "\nusing Moshier eph.; "); + goto do_fict_plan; + } else + goto return_error; + } + /*********************************************** + * invalid body number * + ***********************************************/ + } else { + if (serr != NULL) { + sprintf(serr, "illegal planet number %d.", ipl); + } + goto return_error; + } + for (i = 0; i < 24; i++) + x[i] = xp[i]; + return(iflag); + /*********************************************** + * return error * + ***********************************************/ + return_error:; + for (i = 0; i < 24; i++) + x[i] = 0; + return ERR; +} + +/* closes all open files, frees space of planetary data, + * deletes memory of all computed positions + */ +void FAR PASCAL_CONV swe_close(void) +{ + int i; + /* close SWISSEPH files */ + for (i = 0; i < SEI_NEPHFILES; i ++) { + if (swed.fidat[i].fptr != NULL) + fclose(swed.fidat[i].fptr); + memset((void *) &swed.fidat[i], 0, sizeof(struct file_data)); + } + /* free planets data space */ + for (i = 0; i < SEI_NPLANETS; i++) { + if (swed.pldat[i].segp != NULL) { + free((void *) swed.pldat[i].segp); + } + if (swed.pldat[i].refep != NULL) { + free((void *) swed.pldat[i].refep); + } + memset((void *) &swed.pldat[i], 0, sizeof(struct plan_data)); + } + for (i = 0; i <= SE_NPLANETS; i++) /* "<=" is correct! see decl. */ + memset((void *) &swed.savedat[i], 0, sizeof(struct save_positions)); + /* clear node data space */ + for (i = 0; i < SEI_NNODE_ETC; i++) { +#if 0 + memset((void *) &swed.nddat[i], 0, sizeof(struct node_data)); +#else + memset((void *) &swed.nddat[i], 0, sizeof(struct plan_data)); +#endif + } + memset((void *) &swed.oec, 0, sizeof(struct epsilon)); + memset((void *) &swed.oec2000, 0, sizeof(struct epsilon)); + memset((void *) &swed.nut, 0, sizeof(struct nut)); + memset((void *) &swed.nut2000, 0, sizeof(struct nut)); + memset((void *) &swed.nutv, 0, sizeof(struct nut)); + /* close JPL file */ +#ifndef NO_JPL + swi_close_jpl_file(); +#endif + swed.jpl_file_is_open = FALSE; + swed.jpldenum = 0; + /* close fixed stars */ + if (swed.fixfp != NULL) { + fclose(swed.fixfp); + swed.fixfp = NULL; + } +#ifdef TRACE +#define TRACE_CLOSE FALSE + swi_open_trace(NULL); + if (swi_fp_trace_c != NULL) { + if (swi_trace_count < TRACE_COUNT_MAX) { + fputs("\n/*SWE_CLOSE*/\n", swi_fp_trace_c); + fputs(" swe_close();\n", swi_fp_trace_c); +#if TRACE_CLOSE + fputs("}\n", swi_fp_trace_c); +#endif + fflush(swi_fp_trace_c); + } +#if TRACE_CLOSE + fclose(swi_fp_trace_c); +#endif + } +#if TRACE_CLOSE + if (swi_fp_trace_out != NULL) + fclose(swi_fp_trace_out); + swi_fp_trace_c = NULL; + swi_fp_trace_out = NULL; +#endif +#endif /* TRACE */ +} + +/* sets ephemeris file path. + * also calls swe_close(). this makes sure that swe_calc() + * won't return planet positions previously computed from other + * ephemerides + */ +void FAR PASCAL_CONV swe_set_ephe_path(char *path) +{ + int i; + char s[AS_MAXCH]; + char *sp; + swed.ephe_path_is_set = TRUE; + /* close all open files and delete all planetary data */ + swe_close(); + /* environment variable SE_EPHE_PATH has priority */ + if ((sp = getenv("SE_EPHE_PATH")) != NULL + && strlen(sp) != 0 + && strlen(sp) <= AS_MAXCH-1-13) { + strcpy(s, sp); + } else if (path == NULL) { + strcpy(s, SE_EPHE_PATH); + } else if (strlen(path) <= AS_MAXCH-1-13) + strcpy(s, path); + else + strcpy(s, SE_EPHE_PATH); + i = strlen(s); + if (*(s + i - 1) != *DIR_GLUE && *s != '\0') + strcat(s, DIR_GLUE); + strcpy(swed.ephepath, s); +#ifdef TRACE + swi_open_trace(NULL); + if (swi_trace_count < TRACE_COUNT_MAX) { + if (swi_fp_trace_c != NULL) { + fputs("\n/*SWE_SET_EPHE_PATH*/\n", swi_fp_trace_c); + if (path == NULL) + fputs(" *s = '\\0';\n", swi_fp_trace_c); + else + fprintf(swi_fp_trace_c, " strcpy(s, \"%s\");\n", path); + fputs(" swe_set_ephe_path(s);\n", swi_fp_trace_c); + fputs(" printf(\"swe_set_ephe_path: path_in = \");", swi_fp_trace_c); + fputs(" printf(s);\n", swi_fp_trace_c); + fputs(" \tprintf(\"\\tpath_set = unknown to swetrace\\n\"); /* unknown to swetrace */\n", swi_fp_trace_c); + fflush(swi_fp_trace_c); + } + if (swi_fp_trace_out != NULL) { + fputs("swe_set_ephe_path: path_in = ", swi_fp_trace_out); + if (path != NULL) + fputs(path, swi_fp_trace_out); + fputs("\tpath_set = ", swi_fp_trace_out); + fputs(s, swi_fp_trace_out); + fputs("\n", swi_fp_trace_out); + fflush(swi_fp_trace_out); + } + } +#endif +} + +/* sets jpl file name. + * also calls swe_close(). this makes sure that swe_calc() + * won't return planet positions previously computed from other + * ephemerides + */ +void FAR PASCAL_CONV swe_set_jpl_file(char *fname) +{ + char *sp; + /* close all open files and delete all planetary data */ + swe_close(); + /* if path is contained in fnam, it is filled into the path variable */ + sp = strrchr(fname, (int) *DIR_GLUE); + if (sp == NULL) + sp = fname; + else + sp = sp + 1; + if (strlen(sp) >= AS_MAXCH) + sp[AS_MAXCH] = '\0'; + strcpy(swed.jplfnam, sp); +#ifdef TRACE + swi_open_trace(NULL); + if (swi_trace_count < TRACE_COUNT_MAX) { + if (swi_fp_trace_c != NULL) { + fputs("\n/*SWE_SET_JPL_FILE*/\n", swi_fp_trace_c); + fprintf(swi_fp_trace_c, " strcpy(s, \"%s\");\n", fname); + fputs(" swe_set_jpl_file(s);\n", swi_fp_trace_c); + fputs(" printf(\"swe_set_jpl_file: fname_in = \");", swi_fp_trace_c); + fputs(" printf(s);\n", swi_fp_trace_c); + fputs(" printf(\"\\tfname_set = unknown to swetrace\\n\"); /* unknown to swetrace */\n", swi_fp_trace_c); + fflush(swi_fp_trace_c); + } + if (swi_fp_trace_out != NULL) { + fputs("swe_set_jpl_file: fname_in = ", swi_fp_trace_out); + fputs(fname, swi_fp_trace_out); + fputs("\tfname_set = ", swi_fp_trace_out); + fputs(sp, swi_fp_trace_out); + fputs("\n", swi_fp_trace_out); + fflush(swi_fp_trace_out); + } + } +#endif +} + +/* calculates obliquity of ecliptic and stores it together + * with its date, sine, and cosine + */ +static void calc_epsilon(double tjd, struct epsilon *e) +{ + e->teps = tjd; + e->eps = swi_epsiln(tjd); + e->seps = sin(e->eps); + e->ceps = cos(e->eps); +} + +/* computes a main planet from any ephemeris, if it + * has not yet been computed for this date. + * since a geocentric position requires the earth, the + * earth's position will be computed as well. With SWISSEPH + * files the barycentric sun will be done as well. + * With Moshier, the moon will be done as well. + * + * tjd = julian day + * ipli = body number + * epheflag = which ephemeris? JPL, SWISSEPH, Moshier? + * iflag = other flags + * + * the geocentric apparent position of ipli (or whatever has + * been specified in iflag) will be saved in + * &swed.pldat[ipli].xreturn[]; + * + * the barycentric (heliocentric with Moshier) position J2000 + * will be kept in + * &swed.pldat[ipli].x[]; + */ +static int main_planet(double tjd, int ipli, int32 epheflag, int32 iflag, + char *serr) +{ + int retc; + switch(epheflag) { +#ifndef NO_JPL + case SEFLG_JPLEPH: + retc = jplplan(tjd, ipli, iflag, DO_SAVE, NULL, NULL, NULL, serr); + /* read error or corrupt file */ + if (retc == ERR) + return ERR; + /* jpl ephemeris not on disk or date beyond ephemeris range */ + if (retc == NOT_AVAILABLE) { + iflag = (iflag & ~SEFLG_JPLEPH) | SEFLG_SWIEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, " \ntrying Swiss Eph; "); + goto sweph_planet; + } else if (retc == BEYOND_EPH_LIMITS) { + if (tjd > MOSHPLEPH_START && tjd < MOSHPLEPH_END) { + iflag = (iflag & ~SEFLG_JPLEPH) | SEFLG_MOSEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, " \nusing Moshier Eph; "); + goto moshier_planet; + } else + return ERR; + } + /* geocentric, lighttime etc. */ + if (ipli == SEI_SUN) + retc = app_pos_etc_sun(iflag, serr)/**/; + else + retc = app_pos_etc_plan(ipli, iflag, serr); + if (retc == ERR) + return ERR; + /* t for light-time beyond ephemeris range */ + if (retc == NOT_AVAILABLE) { + iflag = (iflag & ~SEFLG_JPLEPH) | SEFLG_SWIEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, " \ntrying Swiss Eph; "); + goto sweph_planet; + } else if (retc == BEYOND_EPH_LIMITS) { + if (tjd > MOSHPLEPH_START && tjd < MOSHPLEPH_END) { + iflag = (iflag & ~SEFLG_JPLEPH) | SEFLG_MOSEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, " \nusing Moshier Eph; "); + goto moshier_planet; + } else + return ERR; + } + break; +#endif + case SEFLG_SWIEPH: + sweph_planet: + /* compute barycentric planet (+ earth, sun, moon) */ + retc = sweplan(tjd, ipli, SEI_FILE_PLANET, iflag, DO_SAVE, NULL, NULL, NULL, NULL, serr); + if (retc == ERR) + return ERR; + /* if sweph file not found, switch to moshier */ + if (retc == NOT_AVAILABLE) { + if (tjd > MOSHPLEPH_START && tjd < MOSHPLEPH_END) { + iflag = (iflag & ~SEFLG_SWIEPH) | SEFLG_MOSEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, " \nusing Moshier eph.; "); + goto moshier_planet; + } else + return ERR; + } + /* geocentric, lighttime etc. */ + if (ipli == SEI_SUN) + retc = app_pos_etc_sun(iflag, serr)/**/; + else + retc = app_pos_etc_plan(ipli, iflag, serr); + if (retc == ERR) + return ERR; + /* if sweph file for t(lighttime) not found, switch to moshier */ + if (retc == NOT_AVAILABLE) { + if (tjd > MOSHPLEPH_START && tjd < MOSHPLEPH_END) { + iflag = (iflag & ~SEFLG_SWIEPH) | SEFLG_MOSEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, " \nusing Moshier eph.; "); + goto moshier_planet; + } else + return ERR; + } + break; + case SEFLG_MOSEPH: + moshier_planet: + retc = swi_moshplan(tjd, ipli, DO_SAVE, NULL, NULL, serr);/**/ + if (retc == ERR) + return ERR; + /* geocentric, lighttime etc. */ + if (ipli == SEI_SUN) + retc = app_pos_etc_sun(iflag, serr)/**/; + else + retc = app_pos_etc_plan(ipli, iflag, serr); + if (retc == ERR) + return ERR; + break; + default: + break; + } + return OK; +} + +/* Computes a main planet from any ephemeris or returns + * it again, if it has been computed before. + * In barycentric equatorial position of the J2000 equinox. + * The earth's position is computed as well. With SWISSEPH + * and JPL ephemeris the barycentric sun is computed, too. + * With Moshier, the moon is returned, as well. + * + * tjd = julian day + * ipli = body number + * epheflag = which ephemeris? JPL, SWISSEPH, Moshier? + * iflag = other flags + * xp, xe, xs, and xm are the pointers, where the program + * either finds or stores (if not found) the barycentric + * (heliocentric with Moshier) positions of the following + * bodies: + * xp planet + * xe earth + * xs sun + * xm moon + * + * xm is used with Moshier only + */ +static int main_planet_bary(double tjd, int ipli, int32 epheflag, int32 iflag, AS_BOOL do_save, + double *xp, double *xe, double *xs, double *xm, + char *serr) +{ + int i, retc; + switch(epheflag) { +#ifndef NO_JPL + case SEFLG_JPLEPH: + retc = jplplan(tjd, ipli, iflag, do_save, xp, xe, xs, serr); + /* read error or corrupt file */ + if (retc == ERR || retc == BEYOND_EPH_LIMITS) + return retc; + /* jpl ephemeris not on disk or date beyond ephemeris range */ + if (retc == NOT_AVAILABLE) { + iflag = (iflag & ~SEFLG_JPLEPH) | SEFLG_SWIEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, " \ntrying Swiss Eph; "); + goto sweph_planet; + } + break; +#endif + case SEFLG_SWIEPH: + sweph_planet: + /* compute barycentric planet (+ earth, sun, moon) */ + retc = sweplan(tjd, ipli, SEI_FILE_PLANET, iflag, do_save, xp, xe, xs, xm, serr); +#if 1 + if (retc == ERR || retc == NOT_AVAILABLE) + return retc; +#else /* if barycentric moshier calculation were implemented */ + if (retc == ERR) + return ERR; + /* if sweph file not found, switch to moshier */ + if (retc == NOT_AVAILABLE) { + if (tjd > MOSHPLEPH_START && tjd < MOSHPLEPH_END) { + iflag = (iflag & ~SEFLG_SWIEPH) | SEFLG_MOSEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, " \nusing Moshier eph.; "); + goto moshier_planet; + } else + goto return_error; + } +#endif + break; + case SEFLG_MOSEPH: +#if 0 + moshier_planet: +#endif + retc = swi_moshplan(tjd, ipli, do_save, xp, xe, serr);/**/ + if (retc == ERR) + return ERR; + for (i = 0; i <= 5; i++) + xs[i] = 0; + break; + default: + break; + } + return OK; +} + +/* SWISSEPH + * this routine computes heliocentric cartesian equatorial coordinates + * of equinox 2000 of + * geocentric moon + * + * tjd julian date + * iflag flag + * do_save save J2000 position in save area pdp->x ? + * xp array of 6 doubles for lunar position and speed + * serr error string + */ +static int swemoon(double tjd, int32 iflag, AS_BOOL do_save, double *xpret, char *serr) +{ + int i, retc; + struct plan_data *pdp = &swed.pldat[SEI_MOON]; + int32 speedf1, speedf2; + double xx[6], *xp; + if (do_save) + xp = pdp->x; + else + xp = xx; + /* if planet has already been computed for this date, return + * if speed flag has been turned on, recompute planet */ + speedf1 = pdp->xflgs & SEFLG_SPEED; + speedf2 = iflag & SEFLG_SPEED; + if (tjd == pdp->teval + && pdp->iephe == SEFLG_SWIEPH + && (!speedf2 || speedf1)) { + xp = pdp->x; + } else { + /* call sweph for moon */ + retc = sweph(tjd, SEI_MOON, SEI_FILE_MOON, iflag, NULL, do_save, xp, serr); + if (retc != OK) + return(retc); + if (do_save) { + pdp->teval = tjd; + pdp->xflgs = -1; + pdp->iephe = SEFLG_SWIEPH; + } + } + if (xpret != NULL) + for (i = 0; i <= 5; i++) + xpret[i] = xp[i]; + return(OK); +} + +/* SWISSEPH + * this function computes + * 1. a barycentric planet + * plus, under certain conditions, + * 2. the barycentric sun, + * 3. the barycentric earth, and + * 4. the geocentric moon, + * in barycentric cartesian equatorial coordinates J2000. + * + * these are the data needed for calculation of light-time etc. + * + * tjd julian date + * ipli SEI_ planet number + * ifno ephemeris file number + * do_save write new positions in save area + * xp array of 6 doubles for planet's position and velocity + * xpe earth's + * xps sun's + * xpm moon's + * serr error string + * + * xp - xpm can be NULL. if do_save is TRUE, all of them can be NULL. + * the positions will be written into the save area (swed.pldat[ipli].x) + */ +static int sweplan(double tjd, int ipli, int ifno, int32 iflag, AS_BOOL do_save, + double *xpret, double *xperet, double *xpsret, double *xpmret, + char *serr) +{ + int i, retc; + int do_earth = FALSE, do_moon = FALSE, do_sunbary = FALSE; + struct plan_data *pdp = &swed.pldat[ipli]; + struct plan_data *pebdp = &swed.pldat[SEI_EMB]; + struct plan_data *psbdp = &swed.pldat[SEI_SUNBARY]; + struct plan_data *pmdp = &swed.pldat[SEI_MOON]; + double xxp[6], xxm[6], xxs[6], xxe[6]; + double *xp, *xpe, *xpm, *xps; + int32 speedf1, speedf2; + /* xps (barycentric sun) may be necessary because some planets on sweph + * file are heliocentric, other ones are barycentric. without xps, + * the heliocentric ones cannot be returned barycentrically. + */ + if (do_save || ipli == SEI_SUNBARY || (pdp->iflg & SEI_FLG_HELIO) + || xpsret != NULL || (iflag & SEFLG_HELCTR)) + do_sunbary = TRUE; + if (do_save || ipli == SEI_EARTH || xperet != NULL) + do_earth = TRUE; + if (ipli == SEI_MOON) { +#if 0 + if (iflag & (SEFLG_HELCTR | SEFLG_BARYCTR | SEFLG_NOABERR)) + do_earth = TRUE; + if (iflag & (SEFLG_HELCTR | SEFLG_NOABERR)) + do_sunbary = TRUE; +#else + do_earth = TRUE; + do_sunbary = TRUE; +#endif + } + if (do_save || ipli == SEI_MOON || ipli == SEI_EARTH || xperet != NULL || xpmret != NULL) + do_moon = TRUE; + if (do_save) { + xp = pdp->x; + xpe = pebdp->x; + xps = psbdp->x; + xpm = pmdp->x; + } else { + xp = xxp; + xpe = xxe; + xps = xxs; + xpm = xxm; + } + speedf2 = iflag & SEFLG_SPEED; + /* barycentric sun */ + if (do_sunbary) { + speedf1 = psbdp->xflgs & SEFLG_SPEED; + /* if planet has already been computed for this date, return + * if speed flag has been turned on, recompute planet */ + if (tjd == psbdp->teval + && psbdp->iephe == SEFLG_SWIEPH + && (!speedf2 || speedf1)) { + for (i = 0; i <= 5; i++) + xps[i] = psbdp->x[i]; + } else { + retc = sweph(tjd, SEI_SUNBARY, SEI_FILE_PLANET, iflag, NULL, do_save, xps, serr);/**/ + if (retc != OK) + return(retc); + } + if (xpsret != NULL) + for (i = 0; i <= 5; i++) + xpsret[i] = xps[i]; + } + /* moon */ + if (do_moon) { + speedf1 = pmdp->xflgs & SEFLG_SPEED; + if (tjd == pmdp->teval + && pmdp->iephe == SEFLG_SWIEPH + && (!speedf2 || speedf1)) { + for (i = 0; i <= 5; i++) + xpm[i] = pmdp->x[i]; + } else { + retc = sweph(tjd, SEI_MOON, SEI_FILE_MOON, iflag, NULL, do_save, xpm, serr); + if (retc == ERR) + return(retc); + /* if moon file doesn't exist, take moshier moon */ + if (swed.fidat[SEI_FILE_MOON].fptr == NULL) { + if (serr != NULL && strlen(serr) + 35 < AS_MAXCH) + strcat(serr, " \nusing Moshier eph. for moon; "); + retc = swi_moshmoon(tjd, do_save, xpm, serr); + if (retc != OK) + return(retc); + } + } + if (xpmret != NULL) + for (i = 0; i <= 5; i++) + xpmret[i] = xpm[i]; + } + /* barycentric earth */ + if (do_earth) { + speedf1 = pebdp->xflgs & SEFLG_SPEED; + if (tjd == pebdp->teval + && pebdp->iephe == SEFLG_SWIEPH + && (!speedf2 || speedf1)) { + for (i = 0; i <= 5; i++) + xpe[i] = pebdp->x[i]; + } else { + retc = sweph(tjd, SEI_EMB, SEI_FILE_PLANET, iflag, NULL, do_save, xpe, serr); + if (retc != OK) + return(retc); + /* earth from emb and moon */ + embofs(xpe, xpm); + /* speed is needed, if + * 1. true position is being computed before applying light-time etc. + * this is the position saved in pdp->x. + * in this case, speed is needed for light-time correction. + * 2. the speed flag has been specified. + */ + if (xpe == pebdp->x || (iflag & SEFLG_SPEED)) + embofs(xpe+3, xpm+3); + } + if (xperet != NULL) + for (i = 0; i <= 5; i++) + xperet[i] = xpe[i]; + } + if (ipli == SEI_MOON) { + for (i = 0; i <= 5; i++) + xp[i] = xpm[i]; + } else if (ipli == SEI_EARTH) { + for (i = 0; i <= 5; i++) + xp[i] = xpe[i]; + } else if (ipli == SEI_SUN) { + for (i = 0; i <= 5; i++) + xp[i] = xps[i]; + } else { + /* planet */ + speedf1 = pdp->xflgs & SEFLG_SPEED; + if (tjd == pdp->teval + && pdp->iephe == SEFLG_SWIEPH + && (!speedf2 || speedf1)) { + for (i = 0; i <= 5; i++) + xp[i] = pdp->x[i]; + return(OK); + } else { + retc = sweph(tjd, ipli, ifno, iflag, NULL, do_save, xp, serr); + if (retc != OK) + return(retc); + /* if planet is heliocentric, it must be transformed to barycentric */ + if (pdp->iflg & SEI_FLG_HELIO) { + /* now barycentric planet */ + for (i = 0; i <= 2; i++) + xp[i] += xps[i]; + if (do_save || (iflag & SEFLG_SPEED)) + for (i = 3; i <= 5; i++) + xp[i] += xps[i]; + } + } + } + if (xpret != NULL) + for (i = 0; i <= 5; i++) + xpret[i] = xp[i]; + return(OK); +} + +#ifndef NO_JPL +/* jpl ephemeris. + * this function computes + * 1. a barycentric planet position + * plus, under certain conditions, + * 2. the barycentric sun, + * 3. the barycentric earth, + * in barycentric cartesian equatorial coordinates J2000. + + * tjd julian day + * ipli sweph internal planet number + * do_save write new positions in save area + * xp array of 6 doubles for planet's position and speed vectors + * xpe earth's + * xps sun's + * serr pointer to error string + * + * xp - xps can be NULL. if do_save is TRUE, all of them can be NULL. + * the positions will be written into the save area (swed.pldat[ipli].x) + */ +static int jplplan(double tjd, int ipli, int32 iflag, AS_BOOL do_save, + double *xpret, double *xperet, double *xpsret, char *serr) +{ + int i, retc; + AS_BOOL do_earth = FALSE, do_sunbary = FALSE; + double ss[3]; + double xxp[6], xxe[6], xxs[6]; + double *xp, *xpe, *xps; + int ictr = J_SBARY; + struct plan_data *pdp = &swed.pldat[ipli]; + struct plan_data *pedp = &swed.pldat[SEI_EARTH]; + struct plan_data *psdp = &swed.pldat[SEI_SUNBARY]; + /* we assume Teph ~= TDB ~= TT. The maximum error is < 0.002 sec, + * corresponding to an ephemeris error < 0.001 arcsec for the moon */ + /* double tjd_tdb, T; + T = (tjd - 2451545.0)/36525.0; + tjd_tdb = tjd + (0.001657 * sin(628.3076 * T + 6.2401) + + 0.000022 * sin(575.3385 * T + 4.2970) + + 0.000014 * sin(1256.6152 * T + 6.1969)) / 8640.0;*/ + if (do_save) { + xp = pdp->x; + xpe = pedp->x; + xps = psdp->x; + } else { + xp = xxp; + xpe = xxe; + xps = xxs; + } + if (do_save || ipli == SEI_EARTH || xperet != NULL + || (ipli == SEI_MOON)) /* && (iflag & (SEFLG_HELCTR | SEFLG_BARYCTR | SEFLG_NOABERR)))) */ + do_earth = TRUE; + if (do_save || ipli == SEI_SUNBARY || xpsret != NULL + || (ipli == SEI_MOON)) /* && (iflag & (SEFLG_HELCTR | SEFLG_NOABERR)))) */ + do_sunbary = TRUE; + if (ipli == SEI_MOON) + ictr = J_EARTH; + /* open ephemeris, if still closed */ + if (!swed.jpl_file_is_open) { + retc = swi_open_jpl_file(ss, swed.jplfnam, swed.ephepath, serr); + if (retc != OK) + return (retc); + swed.jpldenum = swi_get_jpl_denum(); + swed.jpl_file_is_open = TRUE; + } + if (do_earth) { + /* barycentric earth */ + if (tjd != pedp->teval || tjd == 0) { + retc = swi_pleph(tjd, J_EARTH, J_SBARY, xpe, serr); + if (retc != OK) { + swi_close_jpl_file(); + swed.jpl_file_is_open = FALSE; + return retc; + } + if (do_save) { + pedp->teval = tjd; + pedp->xflgs = -1; /* new light-time etc. required */ + pedp->iephe = SEFLG_JPLEPH; + } + } else { + xpe = pedp->x; + } + if (xperet != NULL) + for (i = 0; i <= 5; i++) + xperet[i] = xpe[i]; + + } + if (do_sunbary) { + /* barycentric sun */ + if (tjd != psdp->teval || tjd == 0) { + retc = swi_pleph(tjd, J_SUN, J_SBARY, xps, serr); + if (retc != OK) { + swi_close_jpl_file(); + swed.jpl_file_is_open = FALSE; + return retc; + } + if (do_save) { + psdp->teval = tjd; + psdp->xflgs = -1; + psdp->iephe = SEFLG_JPLEPH; + } + } else { + xps = psdp->x; + } + if (xpsret != NULL) + for (i = 0; i <= 5; i++) + xpsret[i] = xps[i]; + } + /* earth is wanted */ + if (ipli == SEI_EARTH) { + for (i = 0; i <= 5; i++) + xp[i] = xpe[i]; + /* sunbary is wanted */ + } if (ipli == SEI_SUNBARY) { + for (i = 0; i <= 5; i++) + xp[i] = xps[i]; + /* other planet */ + } else { + /* if planet already computed */ + if (tjd == pdp->teval && pdp->iephe == SEFLG_JPLEPH) { + xp = pdp->x; + } else { + retc = swi_pleph(tjd, pnoint2jpl[ipli], ictr, xp, serr); + if (retc != OK) { + swi_close_jpl_file(); + swed.jpl_file_is_open = FALSE; + return retc; + } + if (do_save) { + pdp->teval = tjd; + pdp->xflgs = -1; + pdp->iephe = SEFLG_JPLEPH; + } + } + } + if (xpret != NULL) + for (i = 0; i <= 5; i++) + xpret[i] = xp[i]; + return (OK); +} +#endif /* NO_JPL */ + +/* + * this function looks for an ephemeris file, + * opens it, if not yet open, + * reads constants, if not yet read, + * computes a planet, if not yet computed + * attention: asteroids are heliocentric + * other planets barycentric + * + * tjd julian date + * ipli SEI_ planet number + * ifno ephemeris file number + * xsunb INPUT (!) array of 6 doubles containing barycentric sun + * (must be given with asteroids) + * do_save boolean: save result in save area + * xp return array of 6 doubles for planet's position + * serr error string + */ +static int sweph(double tjd, int ipli, int ifno, int32 iflag, double *xsunb, AS_BOOL do_save, double *xpret, char *serr) +{ + int i, ipl, retc, subdirlen; + char s[AS_MAXCH], subdirnam[AS_MAXCH], fname[AS_MAXCH], *sp; + double t, tsv; + double xemb[6], xx[6], *xp; + struct plan_data *pdp; + struct plan_data *pedp = &swed.pldat[SEI_EARTH]; + struct plan_data *psdp = &swed.pldat[SEI_SUNBARY]; + struct file_data *fdp = &swed.fidat[ifno]; + int32 speedf1, speedf2; + AS_BOOL need_speed; + ipl = ipli; + if (ipli > SE_AST_OFFSET) + ipl = SEI_ANYBODY; + pdp = &swed.pldat[ipl]; + if (do_save) + xp = pdp->x; + else + xp = xx; + /* if planet has already been computed for this date, return. + * if speed flag has been turned on, recompute planet */ + speedf1 = pdp->xflgs & SEFLG_SPEED; + speedf2 = iflag & SEFLG_SPEED; + if (tjd == pdp->teval + && pdp->iephe == SEFLG_SWIEPH + && (!speedf2 || speedf1) + && ipl < SEI_ANYBODY) { + if (xpret != NULL) + for (i = 0; i <= 5; i++) + xpret[i] = pdp->x[i]; + return(OK); + } + /****************************** + * get correct ephemeris file * + ******************************/ + if (fdp->fptr != NULL) { + /* if tjd is beyond file range, close old file. + * if new asteroid, close old file. */ + if (tjd < fdp->tfstart || tjd > fdp->tfend + || (ipl == SEI_ANYBODY && ipli != pdp->ibdy)) { + fclose(fdp->fptr); + fdp->fptr = NULL; + if (pdp->refep != NULL) + free((void *) pdp->refep); + pdp->refep = NULL; + if (pdp->segp != NULL) + free((void *) pdp->segp); + pdp->segp = NULL; + } + } + /* if sweph file not open, find and open it */ + if (fdp->fptr == NULL) { + swi_gen_filename(tjd, ipli, fname); + strcpy(subdirnam, fname); + sp = strrchr(subdirnam, (int) *DIR_GLUE); + if (sp != NULL) { + *sp = '\0'; + subdirlen = strlen(subdirnam); + } else { + subdirlen = 0; + } + strcpy(s, fname); +again: + fdp->fptr = swi_fopen(ifno, s, swed.ephepath, serr); + if (fdp->fptr == NULL) { + /* + * if it is a numbered asteroid file, try also for short files (..s.se1) + * On the second try, the inserted 's' will be seen and not tried again. + */ + if (ipli > SE_AST_OFFSET) { + char *spp; + spp = strchr(s, '.'); + if (spp > s && *(spp-1) != 's') { /* no 's' before '.' ? */ + sprintf(spp, "s.%s", SE_FILE_SUFFIX); /* insert an 's' */ + goto again; + } + /* + * if we still have 'ast0' etc. in front of the filename, + * we remove it now, remove the 's' also, + * and try in the main ephemeris directory instead of the + * asteroid subdirectory. + */ + spp--; /* point to the character before '.' which must be a 's' */ + swi_strcpy(spp, spp + 1); /* remove the s */ + if (subdirlen > 0 && strncmp(s, subdirnam, (size_t) subdirlen) == 0) { + swi_strcpy(s, s + subdirlen + 1); /* remove "ast0/" etc. */ + goto again; + } + } + return(NOT_AVAILABLE); + } + /* during the search error messages may have been built, delete them */ + if (serr != NULL) *serr = '\0'; + retc = read_const(ifno, serr); + if (retc != OK) + return(retc); + } + /* if first ephemeris file (J-3000), it might start a mars period + * after -3000. if last ephemeris file (J3000), it might end a + * 4000-day-period before 3000. */ + if (tjd < fdp->tfstart || tjd > fdp->tfend) { + if (serr != NULL) { + if (tjd < fdp->tfstart) + sprintf(s, "jd %f < Swiss Eph. lower limit %f;", + tjd, fdp->tfstart); + else + sprintf(s, "jd %f > Swiss Eph. upper limit %f;", + tjd, fdp->tfend); + if (strlen(serr) + strlen(s) < AS_MAXCH) + strcat(serr, s); + } + return(NOT_AVAILABLE); + } + /****************************** + * get planet's position + ******************************/ + /* get new segment, if necessary */ + if (pdp->segp == NULL || tjd < pdp->tseg0 || tjd > pdp->tseg1) { + retc = get_new_segment(tjd, ipl, ifno, serr); + if (retc != OK) + return(retc); + /* rotate cheby coeffs back to equatorial system. + * if necessary, add reference orbit. */ + if (pdp->iflg & SEI_FLG_ROTATE) + rot_back(ipl); /**/ + else + pdp->neval = pdp->ncoe; + } + /* evaluate chebyshew polynomial for tjd */ + t = (tjd - pdp->tseg0) / pdp->dseg; + t = t * 2 - 1; + /* speed is needed, if + * 1. true position is being computed before applying light-time etc. + * this is the position saved in pdp->x. + * in this case, speed is needed for light-time correction. + * 2. the speed flag has been specified. + */ + need_speed = (do_save || (iflag & SEFLG_SPEED)); + for (i = 0; i <= 2; i++) { + xp[i] = swi_echeb (t, pdp->segp+(i*pdp->ncoe), pdp->neval); + if (need_speed) + xp[i+3] = swi_edcheb(t, pdp->segp+(i*pdp->ncoe), pdp->neval) / pdp->dseg * 2; + else + xp[i+3] = 0; /* von Alois als billiger fix, evtl. illegal */ + } + /* if planet wanted is barycentric sun and must be computed + * from heliocentric earth and barycentric earth: the + * computation above gives heliocentric earth, therefore we + * have to compute barycentric earth and subtract heliocentric + * earth from it. this may be necessary with calls from + * sweplan() and from app_pos_etc_sun() (light-time). */ + if (ipl == SEI_SUNBARY && (pdp->iflg & SEI_FLG_EMBHEL)) { + /* sweph() calls sweph() !!! for EMB. + * Attention: a new calculation must be forced in any case. + * Otherwise EARTH (instead of EMB) will possibly taken from + * save area. + * to force new computation, set pedp->teval = 0 and restore it + * after call of sweph(EMB). + */ + tsv = pedp->teval; + pedp->teval = 0; + retc = sweph(tjd, SEI_EMB, ifno, iflag | SEFLG_SPEED, NULL, NO_SAVE, xemb, serr); + if (retc != OK) + return(retc); + pedp->teval = tsv; + for (i = 0; i <= 2; i++) + xp[i] = xemb[i] - xp[i]; + if (need_speed) + for (i = 3; i <= 5; i++) + xp[i] = xemb[i] - xp[i]; + } +#if 1 + /* asteroids are heliocentric. + * if JPL or SWISSEPH, convert to barycentric */ + if ((iflag & SEFLG_JPLEPH) || (iflag & SEFLG_SWIEPH)) { + if (ipl >= SEI_ANYBODY) { + for (i = 0; i <= 2; i++) + xp[i] += xsunb[i]; + if (need_speed) + for (i = 3; i <= 5; i++) + xp[i] += xsunb[i]; + } + } +#endif + if (do_save) { + pdp->teval = tjd; + pdp->xflgs = -1; /* do new computation of light-time etc. */ + if (ifno == SEI_FILE_PLANET || ifno == SEI_FILE_MOON) + pdp->iephe = SEFLG_SWIEPH;/**/ + else + pdp->iephe = psdp->iephe; + } + if (xpret != NULL) + for (i = 0; i <= 5; i++) + xpret[i] = xp[i]; + return(OK); +} + +/* + * Alois 2.12.98: inserted error message generation for file not found + */ +FILE *swi_fopen(int ifno, char *fname, char *ephepath, char *serr) +{ + int np, i, j; + FILE *fp = NULL; + char *fnamp, fn[AS_MAXCH]; + char *cpos[20]; + char s[2 * AS_MAXCH], *s1 = s + AS_MAXCH; /* a little trick */ + if (ifno >= 0) { + fnamp = swed.fidat[ifno].fnam; + } else { + fnamp = fn; + } + strcpy(s1, ephepath); + np = swi_cutstr(s1, PATH_SEPARATOR, cpos, 20); + for (i = 0; i < np; i++) { + strcpy(s, cpos[i]); + if (strcmp(s, ".") == 0) /* current directory */ + *s = '\0'; + else { + j = strlen(s); + if (*(s + j - 1) != *DIR_GLUE && *s != '\0') + strcat(s, DIR_GLUE); + } + strcpy(fnamp, s); + if (strlen(fnamp) + strlen(fname) < AS_MAXCH) + strcat(fnamp, fname); + else { + if (serr != NULL) + sprintf(serr, "error: file path and name must be shorter than %d.", AS_MAXCH); + return NULL; + } + fp = fopen(fnamp, BFILE_R_ACCESS); + if (fp != NULL) + return fp; + } + sprintf(s, "SwissEph file '%s' not found in PATH '%s'", fname, ephepath); + s[AS_MAXCH-1] = '\0'; /* s may be longer then AS_MAXCH */ + if (serr != NULL) + strcpy(serr, s); + return NULL; +} + +/* converts planets from barycentric to geocentric, + * apparent positions + * precession and nutation + * according to flags + * ipli planet number + * iflag flags + * serr error string + */ +static int app_pos_etc_plan(int ipli, int32 iflag, char *serr) +{ + int i, j, niter, retc = OK; + int ipl, ifno, ibody; + int32 flg1, flg2; + double xx[6], dx[3], dt, t, dtsave_for_defl; + double xobs[6], xobs2[6]; + double xearth[6], xsun[6]; + double xxsp[6], xxsv[6]; + struct plan_data *pedp = &swed.pldat[SEI_EARTH]; + struct plan_data *pdp; + struct epsilon *oe = &swed.oec2000; + int32 epheflag = iflag & SEFLG_EPHMASK; + t = dtsave_for_defl = 0; /* dummy assignment to silence gcc */ + /* ephemeris file */ + if (ipli > SE_AST_OFFSET) { + ifno = SEI_FILE_ANY_AST; + ibody = IS_ANY_BODY; + pdp = &swed.pldat[SEI_ANYBODY]; + } else if (ipli == SEI_CHIRON + || ipli == SEI_PHOLUS + || ipli == SEI_CERES + || ipli == SEI_PALLAS + || ipli == SEI_JUNO + || ipli == SEI_VESTA) { + ifno = SEI_FILE_MAIN_AST; + ibody = IS_MAIN_ASTEROID; + pdp = &swed.pldat[ipli]; + } else { + ifno = SEI_FILE_PLANET; + ibody = IS_PLANET; + pdp = &swed.pldat[ipli]; + } + /* if the same conversions have already been done for the same + * date, then return */ + flg1 = iflag & ~SEFLG_EQUATORIAL & ~SEFLG_XYZ; + flg2 = pdp->xflgs & ~SEFLG_EQUATORIAL & ~SEFLG_XYZ; + if (flg1 == flg2) { + pdp->xflgs = iflag; + pdp->iephe = iflag & SEFLG_EPHMASK; + return OK; + } + /* the conversions will be done with xx[]. */ + for (i = 0; i <= 5; i++) + xx[i] = pdp->x[i]; + /* if heliocentric position is wanted */ + if (iflag & SEFLG_HELCTR) { + if (pdp->iephe == SEFLG_JPLEPH || pdp->iephe == SEFLG_SWIEPH) + for (i = 0; i <= 5; i++) + xx[i] -= swed.pldat[SEI_SUNBARY].x[i]; + } + /************************************ + * observer: geocenter or topocenter + ************************************/ + /* if topocentric position is wanted */ + if (iflag & SEFLG_TOPOCTR) { + if (swed.topd.teval != pedp->teval + || swed.topd.teval == 0) { + if (swi_get_observer(pedp->teval, iflag, DO_SAVE, xobs, serr) != OK) + return ERR; + } else { + for (i = 0; i <= 5; i++) + xobs[i] = swed.topd.xobs[i]; + } + /* barycentric position of observer */ + for (i = 0; i <= 5; i++) + xobs[i] = xobs[i] + pedp->x[i]; + } else { + /* barycentric position of geocenter */ + for (i = 0; i <= 5; i++) + xobs[i] = pedp->x[i]; + } + /******************************* + * light-time geocentric * + *******************************/ + if (!(iflag & SEFLG_TRUEPOS)) { + /* number of iterations - 1 */ + if (pdp->iephe == SEFLG_JPLEPH || pdp->iephe == SEFLG_SWIEPH) + niter = 1; + else /* SEFLG_MOSEPH or planet from osculating elements */ + niter = 0; + if (iflag & SEFLG_SPEED) { + /* + * Apparent speed is influenced by the fact that dt changes with + * motion. This makes a difference of several hundredths of an + * arc second. To take this into account, we compute + * 1. true position - apparent position at time t - 1. + * 2. true position - apparent position at time t. + * 3. the difference between the two is the part of the daily motion + * that results from the change of dt. + */ + for (i = 0; i <= 2; i++) + xxsv[i] = xxsp[i] = xx[i] - xx[i+3]; + for (j = 0; j <= niter; j++) { + for (i = 0; i <= 2; i++) { + dx[i] = xxsp[i]; + if (!(iflag & SEFLG_HELCTR) && !(iflag & SEFLG_BARYCTR)) + dx[i] -= (xobs[i] - xobs[i+3]); + } + /* new dt */ + dt = sqrt(square_sum(dx)) * AUNIT / CLIGHT / 86400.0; + for (i = 0; i <= 2; i++) /* rough apparent position at t-1 */ + xxsp[i] = xxsv[i] - dt * pdp->x[i+3]; + } + /* true position - apparent position at time t-1 */ + for (i = 0; i <= 2; i++) + xxsp[i] = xxsv[i] - xxsp[i]; + } + /* dt and t(apparent) */ + for (j = 0; j <= niter; j++) { + for (i = 0; i <= 2; i++) { + dx[i] = xx[i]; + if (!(iflag & SEFLG_HELCTR) && !(iflag & SEFLG_BARYCTR)) + dx[i] -= xobs[i]; + } + dt = sqrt(square_sum(dx)) * AUNIT / CLIGHT / 86400.0; + /* new t */ + t = pdp->teval - dt; + dtsave_for_defl = dt; + for (i = 0; i <= 2; i++) /* rough apparent position at t*/ + xx[i] = pdp->x[i] - dt * pdp->x[i+3]; + } + /* part of daily motion resulting from change of dt */ + if (iflag & SEFLG_SPEED) + for (i = 0; i <= 2; i++) + xxsp[i] = pdp->x[i] - xx[i] - xxsp[i]; + /* new position, accounting for light-time (accurate) */ + switch(epheflag) { +#ifndef NO_JPL + case SEFLG_JPLEPH: + if (ibody >= IS_ANY_BODY) + ipl = -1; /* will not be used */ /*pnoint2jpl[SEI_ANYBODY];*/ + else + ipl = pnoint2jpl[ipli]; + if (ibody == IS_PLANET) { + retc = swi_pleph(t, ipl, J_SBARY, xx, serr); + if (retc != OK) { + swi_close_jpl_file(); + swed.jpl_file_is_open = FALSE; + } + } else { /* asteroid */ + /* first sun */ + retc = swi_pleph(t, J_SUN, J_SBARY, xsun, serr); + if (retc != OK) { + swi_close_jpl_file(); + swed.jpl_file_is_open = FALSE; + } + /* asteroid */ + retc = sweph(t, ipli, ifno, iflag, xsun, NO_SAVE, xx, serr); + } + if (retc != OK) + return(retc); + /* for accuracy in speed, we need earth as well */ + if ((iflag & SEFLG_SPEED) + && !(iflag & SEFLG_HELCTR) && !(iflag & SEFLG_BARYCTR)) { + retc = swi_pleph(t, J_EARTH, J_SBARY, xearth, serr); + if (retc != OK) { + swi_close_jpl_file(); + swed.jpl_file_is_open = FALSE; + return(retc); + } + } + break; +#endif + case SEFLG_SWIEPH: + if (ibody == IS_PLANET) + retc = sweplan(t, ipli, ifno, iflag, NO_SAVE, xx, xearth, xsun, NULL, serr); + else { /*asteroid*/ + retc = sweplan(t, SEI_EARTH, SEI_FILE_PLANET, iflag, NO_SAVE, xearth, NULL, xsun, NULL, serr); + if (retc == OK) + retc = sweph(t, ipli, ifno, iflag, xsun, NO_SAVE, xx, serr); + } + if (retc != OK) + return(retc); + break; + case SEFLG_MOSEPH: + default: + /* + * with moshier or other ephemerides, subtraction of dt * speed + * is sufficient (has been done in light-time iteration above) + */ +#if 0 + for (i = 0; i <= 2; i++) { + xx[i] = pdp->x[i] - dt * pdp->x[i+3];/**/ + xx[i+3] = pdp->x[i+3]; + } +#endif + /* if speed flag is true, we call swi_moshplan() for new t. + * this does not increase position precision, + * but speed precision, which becomes better than 0.01"/day. + * for precise speed, we need earth as well. + */ + if (iflag & SEFLG_SPEED + && !(iflag & (SEFLG_HELCTR | SEFLG_BARYCTR))) { + if (ibody == IS_PLANET) + retc = swi_moshplan(t, ipli, NO_SAVE, xxsv, xearth, serr); + else { /* if asteroid */ + retc = sweph(t, ipli, ifno, iflag, NULL, NO_SAVE, xxsv, serr); + if (retc == OK) + retc = swi_moshplan(t, SEI_EARTH, NO_SAVE, xearth, xearth, serr); + } + if (retc != OK) + return(retc); + /* only speed is taken from this computation, otherwise position + * calculations with and without speed would not agree. The difference + * would be about 0.01", which is far below the intrinsic error of the + * moshier ephemeris. + */ + for (i = 3; i <= 5; i++) + xx[i] = xxsv[i]; + } + break; + } + if (iflag & SEFLG_HELCTR) { + if (pdp->iephe == SEFLG_JPLEPH || pdp->iephe == SEFLG_SWIEPH) + for (i = 0; i <= 5; i++) + xx[i] -= swed.pldat[SEI_SUNBARY].x[i]; + } + if (iflag & SEFLG_SPEED) { + /* observer position for t(light-time) */ + if (iflag & SEFLG_TOPOCTR) { + if (swi_get_observer(t, iflag, NO_SAVE, xobs2, serr) != OK) + return ERR; + for (i = 0; i <= 5; i++) + xobs2[i] += xearth[i]; + } else { + for (i = 0; i <= 5; i++) + xobs2[i] = xearth[i]; + } + } + } + /******************************* + * conversion to geocenter * + *******************************/ + if (!(iflag & SEFLG_HELCTR) && !(iflag & SEFLG_BARYCTR)) { + /* subtract earth */ + for (i = 0; i <= 5; i++) + xx[i] -= xobs[i]; +#if 0 + /* earth and planets are barycentric with jpl and swisseph, + * but asteroids are heliocentric. therefore, add baryctr. sun */ + if (ibody != IS_PLANET && !(iflag & SEFLG_MOSEPH)) { + for (i = 0; i <= 5; i++) + xx[i] += swed.pldat[SEI_SUNBARY].x[i]; + } +#endif + if ((iflag & SEFLG_TRUEPOS) == 0 ) { + /* + * Apparent speed is also influenced by + * the change of dt during motion. + * Neglect of this would result in an error of several 0.01" + */ + if (iflag & SEFLG_SPEED) + for (i = 3; i <= 5; i++) + xx[i] -= xxsp[i-3]; + } + } + if (!(iflag & SEFLG_SPEED)) + for (i = 3; i <= 5; i++) + xx[i] = 0; + /************************************ + * relativistic deflection of light * + ************************************/ + if (!(iflag & SEFLG_TRUEPOS) && !(iflag & SEFLG_NOGDEFL)) + /* SEFLG_NOGDEFL is on, if SEFLG_HELCTR or SEFLG_BARYCTR */ + swi_deflect_light(xx, dtsave_for_defl, iflag); + /********************************** + * 'annual' aberration of light * + **********************************/ + if (!(iflag & SEFLG_TRUEPOS) && !(iflag & SEFLG_NOABERR)) { + /* SEFLG_NOABERR is on, if SEFLG_HELCTR or SEFLG_BARYCTR */ + swi_aberr_light(xx, xobs, iflag); + /* + * Apparent speed is also influenced by + * the difference of speed of the earth between t and t-dt. + * Neglecting this would involve an error of several 0.1" + */ + if (iflag & SEFLG_SPEED) + for (i = 3; i <= 5; i++) + xx[i] += xobs[i] - xobs2[i]; + } + if (!(iflag & SEFLG_SPEED)) + for (i = 3; i <= 5; i++) + xx[i] = 0; + /* ICRS to J2000 */ + if (!(iflag & SEFLG_ICRS) && swed.jpldenum >= 403) { + swi_bias(xx, iflag, FALSE); + }/**/ + /* save J2000 coordinates; required for sidereal positions */ + for (i = 0; i <= 5; i++) + xxsv[i] = xx[i]; + /************************************************ + * precession, equator 2000 -> equator of date * + ************************************************/ + if (!(iflag & SEFLG_J2000)) { + swi_precess(xx, pdp->teval, J2000_TO_J); + if (iflag & SEFLG_SPEED) + swi_precess_speed(xx, pdp->teval, J2000_TO_J); + oe = &swed.oec; + } else + oe = &swed.oec2000; + return app_pos_rest(pdp, iflag, xx, xxsv, oe, serr); +} + +static int app_pos_rest(struct plan_data *pdp, int32 iflag, + double *xx, double *x2000, + struct epsilon *oe, char *serr) +{ + int i; + /************************************************ + * nutation * + ************************************************/ + if (!(iflag & SEFLG_NONUT)) + swi_nutate(xx, iflag, FALSE); + /* now we have equatorial cartesian coordinates; save them */ + for (i = 0; i <= 5; i++) + pdp->xreturn[18+i] = xx[i]; + /************************************************ + * transformation to ecliptic. * + * with sidereal calc. this will be overwritten * + * afterwards. * + ************************************************/ + swi_coortrf2(xx, xx, oe->seps, oe->ceps); + if (iflag & SEFLG_SPEED) + swi_coortrf2(xx+3, xx+3, oe->seps, oe->ceps); + if (!(iflag & SEFLG_NONUT)) { + swi_coortrf2(xx, xx, swed.nut.snut, swed.nut.cnut); + if (iflag & SEFLG_SPEED) + swi_coortrf2(xx+3, xx+3, swed.nut.snut, swed.nut.cnut); + } + /* now we have ecliptic cartesian coordinates */ + for (i = 0; i <= 5; i++) + pdp->xreturn[6+i] = xx[i]; + /************************************ + * sidereal positions * + ************************************/ + if (iflag & SEFLG_SIDEREAL) { + /* project onto ecliptic t0 */ + if (swed.sidd.sid_mode & SE_SIDBIT_ECL_T0) { + if (swi_trop_ra2sid_lon(x2000, pdp->xreturn+6, pdp->xreturn+18, iflag, serr) != OK) + return ERR; + /* project onto solar system equator */ + } else if (swed.sidd.sid_mode & SE_SIDBIT_SSY_PLANE) { + if (swi_trop_ra2sid_lon_sosy(x2000, pdp->xreturn+6, pdp->xreturn+18, iflag, serr) != OK) + return ERR; + } else { + /* traditional algorithm */ + swi_cartpol_sp(pdp->xreturn+6, pdp->xreturn); + pdp->xreturn[0] -= swe_get_ayanamsa(pdp->teval) * DEGTORAD; + swi_polcart_sp(pdp->xreturn, pdp->xreturn+6); + } + } + /************************************************ + * transformation to polar coordinates * + ************************************************/ + swi_cartpol_sp(pdp->xreturn+18, pdp->xreturn+12); + swi_cartpol_sp(pdp->xreturn+6, pdp->xreturn); + /********************** + * radians to degrees * + **********************/ + /*if ((iflag & SEFLG_RADIANS) == 0) {*/ + for (i = 0; i < 2; i++) { + pdp->xreturn[i] *= RADTODEG; /* ecliptic */ + pdp->xreturn[i+3] *= RADTODEG; + pdp->xreturn[i+12] *= RADTODEG; /* equator */ + pdp->xreturn[i+15] *= RADTODEG; + } + /*}*/ + /* save, what has been done */ + pdp->xflgs = iflag; + pdp->iephe = iflag & SEFLG_EPHMASK; + return OK; +} + +void FAR PASCAL_CONV swe_set_sid_mode(int32 sid_mode, double t0, double ayan_t0) +{ + struct sid_data *sip = &swed.sidd; + sip->sid_mode = sid_mode; + if (sid_mode >= SE_SIDBITS) + sid_mode %= SE_SIDBITS; + /* standard equinoxes: positions always referred to ecliptic of t0 */ + if (sid_mode == SE_SIDM_J2000 + || sid_mode == SE_SIDM_J1900 + || sid_mode == SE_SIDM_B1950) { + sip->sid_mode |= SE_SIDBIT_ECL_T0; + } + if (sid_mode >= SE_NSIDM_PREDEF && sid_mode != SE_SIDM_USER) { + sip->sid_mode = sid_mode = SE_SIDM_FAGAN_BRADLEY; + } + swed.ayana_is_set = TRUE; + if (sid_mode == SE_SIDM_USER) { + sip->t0 = t0; + sip->ayan_t0 = ayan_t0; + } else { + sip->t0 = ayanamsa[sid_mode].t0; + sip->ayan_t0 = ayanamsa[sid_mode].ayan_t0; + } + swi_force_app_pos_etc(); +} + +/* the ayanamsa (precession in longitude) + * according to Newcomb's definition: 360 - + * longitude of the vernal point of t referred to the + * ecliptic of t0. + */ +double FAR PASCAL_CONV swe_get_ayanamsa(double tjd_et) +{ + double x[6], eps; + struct sid_data *sip = &swed.sidd; + if (!swed.ayana_is_set) + swe_set_sid_mode(SE_SIDM_FAGAN_BRADLEY, 0, 0); + /* vernal point (tjd), cartesian */ + x[0] = 1; + x[1] = x[2] = 0; + /* to J2000 */ + if (tjd_et != J2000) + swi_precess(x, tjd_et, J_TO_J2000); + /* to t0 */ + swi_precess(x, sip->t0, J2000_TO_J); + /* to ecliptic */ + eps = swi_epsiln(sip->t0); + swi_coortrf(x, x, eps); + /* to polar */ + swi_cartpol(x, x); + /* subtract initial value of ayanamsa */ + x[0] = x[0] * RADTODEG - sip->ayan_t0; + /* get ayanamsa */ + return swe_degnorm(-x[0]); +} + +double FAR PASCAL_CONV swe_get_ayanamsa_ut(double tjd_ut) +{ + return swe_get_ayanamsa(tjd_ut + swe_deltat(tjd_ut)); +} + +/* + * input coordinates are J2000, cartesian. + * xout ecliptical sidereal position + * xoutr equatorial sidereal position + */ +int swi_trop_ra2sid_lon(double *xin, double *xout, double *xoutr, int32 iflag, char *serr) +{ + double x[6]; + int i; + struct sid_data *sip = &swed.sidd; + struct epsilon oectmp; + for (i = 0; i <= 5; i++) + x[i] = xin[i]; + if (sip->t0 != J2000) { + swi_precess(x, sip->t0, J2000_TO_J); + swi_precess(x+3, sip->t0, J2000_TO_J); /* speed */ + } + for (i = 0; i <= 5; i++) + xoutr[i] = x[i]; + calc_epsilon(swed.sidd.t0, &oectmp); + swi_coortrf2(x, x, oectmp.seps, oectmp.ceps); + if (iflag & SEFLG_SPEED) + swi_coortrf2(x+3, x+3, oectmp.seps, oectmp.ceps); + /* to polar coordinates */ + swi_cartpol_sp(x, x); + /* subtract ayan_t0 */ + x[0] -= sip->ayan_t0 * DEGTORAD; + /* back to cartesian */ + swi_polcart_sp(x, xout); + return OK; +} + +/* + * input coordinates are J2000, cartesian. + * xout ecliptical sidereal position + * xoutr equatorial sidereal position + */ +int swi_trop_ra2sid_lon_sosy(double *xin, double *xout, double *xoutr, int32 iflag, char *serr) +{ + double x[6], x0[6]; + int i; + struct sid_data *sip = &swed.sidd; + struct epsilon *oe = &swed.oec2000; + double plane_node = SSY_PLANE_NODE_E2000; + double plane_incl = SSY_PLANE_INCL; + for (i = 0; i <= 5; i++) + x[i] = xin[i]; + /* planet to ecliptic 2000 */ + swi_coortrf2(x, x, oe->seps, oe->ceps); + if (iflag & SEFLG_SPEED) + swi_coortrf2(x+3, x+3, oe->seps, oe->ceps); + /* to polar coordinates */ + swi_cartpol_sp(x, x); + /* to solar system equator */ + x[0] -= plane_node; + swi_polcart_sp(x, x); + swi_coortrf(x, x, plane_incl); + swi_coortrf(x+3, x+3, plane_incl); + swi_cartpol_sp(x, x); + /* zero point of t0 in J2000 system */ + x0[0] = 1; + x0[1] = x0[2] = 0; + if (sip->t0 != J2000) + swi_precess(x0, sip->t0, J_TO_J2000); + /* zero point to ecliptic 2000 */ + swi_coortrf2(x0, x0, oe->seps, oe->ceps); + /* to polar coordinates */ + swi_cartpol(x0, x0); + /* to solar system equator */ + x0[0] -= plane_node; + swi_polcart(x0, x0); + swi_coortrf(x0, x0, plane_incl); + swi_cartpol(x0, x0); + /* measure planet from zero point */ + x[0] -= x0[0]; + x[0] *= RADTODEG; + /* subtract ayan_t0 */ + x[0] -= sip->ayan_t0; + x[0] = swe_degnorm(x[0]) * DEGTORAD; + /* back to cartesian */ + swi_polcart_sp(x, xout); + return OK; +} + +/* converts planets from barycentric to geocentric, + * apparent positions + * precession and nutation + * according to flags + * ipli planet number + * iflag flags + */ +static int app_pos_etc_plan_osc(int ipl, int ipli, int32 iflag, char *serr) +{ + int i, j, niter, retc; + double xx[6], dx[3], dt, dtsave_for_defl; + double xearth[6], xsun[6], xmoon[6]; + double xxsv[6], xxsp[3]={0}, xobs[6], xobs2[6]; + double t; + struct plan_data *pdp = &swed.pldat[ipli]; + struct plan_data *pedp = &swed.pldat[SEI_EARTH]; + struct plan_data *psdp = &swed.pldat[SEI_SUNBARY]; + struct epsilon *oe = &swed.oec2000; + int32 epheflag = SEFLG_DEFAULTEPH; + dt = dtsave_for_defl = 0; /* dummy assign to silence gcc */ + if (iflag & SEFLG_MOSEPH) + epheflag = SEFLG_MOSEPH; + else if (iflag & SEFLG_SWIEPH) + epheflag = SEFLG_SWIEPH; + else if (iflag & SEFLG_JPLEPH) + epheflag = SEFLG_JPLEPH; + /* the conversions will be done with xx[]. */ + for (i = 0; i <= 5; i++) + xx[i] = pdp->x[i]; + /************************************ + * barycentric position is required * + ************************************/ + /* = heliocentric position with Moshier ephemeris */ + /************************************ + * observer: geocenter or topocenter + ************************************/ + /* if topocentric position is wanted */ + if (iflag & SEFLG_TOPOCTR) { + if (swed.topd.teval != pedp->teval + || swed.topd.teval == 0) { + if (swi_get_observer(pedp->teval, iflag, DO_SAVE, xobs, serr) != OK) + return ERR; + } else { + for (i = 0; i <= 5; i++) + xobs[i] = swed.topd.xobs[i]; + } + /* barycentric position of observer */ + for (i = 0; i <= 5; i++) + xobs[i] = xobs[i] + pedp->x[i]; + } else if (iflag & SEFLG_BARYCTR) { + for (i = 0; i <= 5; i++) + xobs[i] = 0; + } else if (iflag & SEFLG_HELCTR) { + if (iflag & SEFLG_MOSEPH) { + for (i = 0; i <= 5; i++) + xobs[i] = 0; + } else { + for (i = 0; i <= 5; i++) + xobs[i] = psdp->x[i]; + } + } else { + for (i = 0; i <= 5; i++) + xobs[i] = pedp->x[i]; + } + /******************************* + * light-time * + *******************************/ + if (!(iflag & SEFLG_TRUEPOS)) { + niter = 1; + if (iflag & SEFLG_SPEED) { + /* + * Apparent speed is influenced by the fact that dt changes with + * motion. This makes a difference of several hundredths of an + * arc second. To take this into account, we compute + * 1. true position - apparent position at time t - 1. + * 2. true position - apparent position at time t. + * 3. the difference between the two is the daily motion resulting from + * the change of dt. + */ + for (i = 0; i <= 2; i++) + xxsv[i] = xxsp[i] = xx[i] - xx[i+3]; + for (j = 0; j <= niter; j++) { + for (i = 0; i <= 2; i++) { + dx[i] = xxsp[i]; + if (!(iflag & SEFLG_HELCTR) && !(iflag & SEFLG_BARYCTR)) + dx[i] -= (xobs[i] - xobs[i+3]); + } + /* new dt */ + dt = sqrt(square_sum(dx)) * AUNIT / CLIGHT / 86400.0; + for (i = 0; i <= 2; i++) + xxsp[i] = xxsv[i] - dt * pdp->x[i+3];/* rough apparent position */ + } + /* true position - apparent position at time t-1 */ + for (i = 0; i <= 2; i++) + xxsp[i] = xxsv[i] - xxsp[i]; + } + /* dt and t(apparent) */ + for (j = 0; j <= niter; j++) { + for (i = 0; i <= 2; i++) { + dx[i] = xx[i]; + if (!(iflag & SEFLG_HELCTR) && !(iflag & SEFLG_BARYCTR)) + dx[i] -= xobs[i]; + } + /* new dt */ + dt = sqrt(square_sum(dx)) * AUNIT / CLIGHT / 86400.0; + dtsave_for_defl = dt; + /* new position: subtract t * speed + */ + for (i = 0; i <= 2; i++) { + xx[i] = pdp->x[i] - dt * pdp->x[i+3];/**/ + xx[i+3] = pdp->x[i+3]; + } + } + if (iflag & SEFLG_SPEED) { + /* part of daily motion resulting from change of dt */ + for (i = 0; i <= 2; i++) + xxsp[i] = pdp->x[i] - xx[i] - xxsp[i]; + t = pdp->teval - dt; + /* for accuracy in speed, we will need earth as well */ + retc = main_planet_bary(t, SEI_EARTH, epheflag, iflag, NO_SAVE, xearth, xearth, xsun, xmoon, serr); + if (swi_osc_el_plan(t, xx, ipl-SE_FICT_OFFSET, ipli, xearth, xsun, serr) != OK) + return ERR; + if (retc != OK) + return(retc); + if (iflag & SEFLG_TOPOCTR) { + if (swi_get_observer(t, iflag, NO_SAVE, xobs2, serr) != OK) + return ERR; + for (i = 0; i <= 5; i++) + xobs2[i] += xearth[i]; + } else { + for (i = 0; i <= 5; i++) + xobs2[i] = xearth[i]; + } + } + } + /******************************* + * conversion to geocenter * + *******************************/ + for (i = 0; i <= 5; i++) + xx[i] -= xobs[i]; + if (!(iflag & SEFLG_TRUEPOS)) { + /* + * Apparent speed is also influenced by + * the change of dt during motion. + * Neglect of this would result in an error of several 0.01" + */ + if (iflag & SEFLG_SPEED) + for (i = 3; i <= 5; i++) + xx[i] -= xxsp[i-3]; + } + if (!(iflag & SEFLG_SPEED)) + for (i = 3; i <= 5; i++) + xx[i] = 0; + /************************************ + * relativistic deflection of light * + ************************************/ + if (!(iflag & SEFLG_TRUEPOS) && !(iflag & SEFLG_NOGDEFL)) + /* SEFLG_NOGDEFL is on, if SEFLG_HELCTR or SEFLG_BARYCTR */ + swi_deflect_light(xx, dtsave_for_defl, iflag); + /********************************** + * 'annual' aberration of light * + **********************************/ + if (!(iflag & SEFLG_TRUEPOS) && !(iflag & SEFLG_NOABERR)) { + /* SEFLG_NOABERR is on, if SEFLG_HELCTR or SEFLG_BARYCTR */ + swi_aberr_light(xx, xobs, iflag); + /* + * Apparent speed is also influenced by + * the difference of speed of the earth between t and t-dt. + * Neglecting this would involve an error of several 0.1" + */ + if (iflag & SEFLG_SPEED) + for (i = 3; i <= 5; i++) + xx[i] += xobs[i] - xobs2[i]; + } + /* save J2000 coordinates; required for sidereal positions */ + for (i = 0; i <= 5; i++) + xxsv[i] = xx[i]; + /************************************************ + * precession, equator 2000 -> equator of date * + ************************************************/ + if (!(iflag & SEFLG_J2000)) { + swi_precess(xx, pdp->teval, J2000_TO_J); + if (iflag & SEFLG_SPEED) + swi_precess_speed(xx, pdp->teval, J2000_TO_J); + oe = &swed.oec; + } else + oe = &swed.oec2000; + return app_pos_rest(pdp, iflag, xx, xxsv, oe, serr); +} + +/* influence of precession on speed + * xx position and speed of planet in equatorial cartesian + * coordinates */ +void swi_precess_speed(double *xx, double t, int direction) +{ + struct epsilon *oe; + double fac, dpre, dpre2; + double tprec = (t - J2000) / 36525.0; + if (direction == J2000_TO_J) { + fac = 1; + oe = &swed.oec; + } else { + fac = -1; + oe = &swed.oec2000; + } + /* first correct rotation. + * this costs some sines and cosines, but neglect might + * involve an error > 1"/day */ + swi_precess(xx+3, t, direction); + /* then add 0.137"/day */ + swi_coortrf2(xx, xx, oe->seps, oe->ceps); + swi_coortrf2(xx+3, xx+3, oe->seps, oe->ceps); + swi_cartpol_sp(xx, xx); + if (PREC_VONDRAK_2011) { + swi_ldp_peps(t, &dpre, NULL); + swi_ldp_peps(t + 1, &dpre2, NULL); + xx[3] += (dpre2 - dpre) * fac; + } else { + xx[3] += (50.290966 + 0.0222226 * tprec) / 3600 / 365.25 * DEGTORAD * fac; + /* formula from Montenbruck, German 1994, p. 18 */ + } + swi_polcart_sp(xx, xx); + swi_coortrf2(xx, xx, -oe->seps, oe->ceps); + swi_coortrf2(xx+3, xx+3, -oe->seps, oe->ceps); +} + +/* multiplies cartesian equatorial coordinates with previously + * calculated nutation matrix. also corrects speed. + */ +void swi_nutate(double *xx, int32 iflag, AS_BOOL backward) +{ + int i; + double x[6], xv[6]; + for (i = 0; i <= 2; i++) { + if (backward) + x[i] = xx[0] * swed.nut.matrix[i][0] + + xx[1] * swed.nut.matrix[i][1] + + xx[2] * swed.nut.matrix[i][2]; + else + x[i] = xx[0] * swed.nut.matrix[0][i] + + xx[1] * swed.nut.matrix[1][i] + + xx[2] * swed.nut.matrix[2][i]; + } + if (iflag & SEFLG_SPEED) { + /* correct speed: + * first correct rotation */ + for (i = 0; i <= 2; i++) { + if (backward) + x[i+3] = xx[3] * swed.nut.matrix[i][0] + + xx[4] * swed.nut.matrix[i][1] + + xx[5] * swed.nut.matrix[i][2]; + else + x[i+3] = xx[3] * swed.nut.matrix[0][i] + + xx[4] * swed.nut.matrix[1][i] + + xx[5] * swed.nut.matrix[2][i]; + } + /* then apparent motion due to change of nutation during day. + * this makes a difference of 0.01" */ + for (i = 0; i <= 2; i++) { + if (backward) + xv[i] = xx[0] * swed.nutv.matrix[i][0] + + xx[1] * swed.nutv.matrix[i][1] + + xx[2] * swed.nutv.matrix[i][2]; + else + xv[i] = xx[0] * swed.nutv.matrix[0][i] + + xx[1] * swed.nutv.matrix[1][i] + + xx[2] * swed.nutv.matrix[2][i]; + /* new speed */ + xx[3+i] = x[3+i] + (x[i] - xv[i]) / NUT_SPEED_INTV; + } + } + /* new position */ + for (i = 0; i <= 2; i++) + xx[i] = x[i]; +} + +/* computes 'annual' aberration + * xx planet's position accounted for light-time + * and gravitational light deflection + * xe earth's position and speed + */ +void swi_aberr_light(double *xx, double *xe, int32 iflag) { + int i; + double xxs[6], v[6], u[6], ru; + double xx2[6], dx1, dx2; + double b_1, f1, f2; + double v2; + double intv = PLAN_SPEED_INTV; + for (i = 0; i <= 5; i++) + u[i] = xxs[i] = xx[i]; + ru = sqrt(square_sum(u)); + for (i = 0; i <= 2; i++) + v[i] = xe[i+3] / 24.0 / 3600.0 / CLIGHT * AUNIT; + v2 = square_sum(v); + b_1 = sqrt(1 - v2); + f1 = dot_prod(u, v) / ru; + f2 = 1.0 + f1 / (1.0 + b_1); + for (i = 0; i <= 2; i++) + xx[i] = (b_1*xx[i] + f2*ru*v[i]) / (1.0 + f1); + if (iflag & SEFLG_SPEED) { + /* correction of speed + * the influence of aberration on apparent velocity can + * reach 0.4"/day + */ + for (i = 0; i <= 2; i++) + u[i] = xxs[i] - intv * xxs[i+3]; + ru = sqrt(square_sum(u)); + f1 = dot_prod(u, v) / ru; + f2 = 1.0 + f1 / (1.0 + b_1); + for (i = 0; i <= 2; i++) + xx2[i] = (b_1*u[i] + f2*ru*v[i]) / (1.0 + f1); + for (i = 0; i <= 2; i++) { + dx1 = xx[i] - xxs[i]; + dx2 = xx2[i] - u[i]; + dx1 -= dx2; + xx[i+3] += dx1 / intv; + } + } +} + +/* computes relativistic light deflection by the sun + * ipli sweph internal planet number + * xx planet's position accounted for light-time + * dt dt of light-time + */ +void swi_deflect_light(double *xx, double dt, int32 iflag) +{ + int i; + double xx2[6]; + double u[6], e[6], q[6], ru, re, rq, uq, ue, qe, g1, g2; +#if 1 + double xx3[6], dx1, dx2, dtsp; +#endif + double xsun[6], xearth[6]; + double sina, sin_sunr, meff_fact; + struct plan_data *pedp = &swed.pldat[SEI_EARTH]; + struct plan_data *psdp = &swed.pldat[SEI_SUNBARY]; + int32 iephe = pedp->iephe; + for (i = 0; i <= 5; i++) + xearth[i] = pedp->x[i]; + if (iflag & SEFLG_TOPOCTR) + for (i = 0; i <= 5; i++) + xearth[i] += swed.topd.xobs[i]; + /* U = planetbary(t-tau) - earthbary(t) = planetgeo */ + for (i = 0; i <= 2; i++) + u[i] = xx[i]; + /* Eh = earthbary(t) - sunbary(t) = earthhel */ + if (iephe == SEFLG_JPLEPH || iephe == SEFLG_SWIEPH) + for (i = 0; i <= 2; i++) + e[i] = xearth[i] - psdp->x[i]; + else + for (i = 0; i <= 2; i++) + e[i] = xearth[i]; + /* Q = planetbary(t-tau) - sunbary(t-tau) = 'planethel' */ + /* first compute sunbary(t-tau) for */ + if (iephe == SEFLG_JPLEPH || iephe == SEFLG_SWIEPH) { + for (i = 0; i <= 2; i++) + /* this is sufficient precision */ + xsun[i] = psdp->x[i] - dt * psdp->x[i+3]; + for (i = 3; i <= 5; i++) + xsun[i] = psdp->x[i]; + } else { + for (i = 0; i <= 5; i++) + xsun[i] = psdp->x[i]; + } + for (i = 0; i <= 2; i++) + q[i] = xx[i] + xearth[i] - xsun[i]; + ru = sqrt(square_sum(u)); + rq = sqrt(square_sum(q)); + re = sqrt(square_sum(e)); + for (i = 0; i <= 2; i++) { + u[i] /= ru; + q[i] /= rq; + e[i] /= re; + } + uq = dot_prod(u,q); + ue = dot_prod(u,e); + qe = dot_prod(q,e); + /* When a planet approaches the center of the sun in superior + * conjunction, the formula for the deflection angle as given + * in Expl. Suppl. p. 136 cannot be used. The deflection seems + * to increase rapidly towards infinity. The reason is that the + * formula considers the sun as a point mass. AA recommends to + * set deflection = 0 in such a case. + * However, to get a continous motion, we modify the formula + * for a non-point-mass, taking into account the mass distribution + * within the sun. For more info, s. meff(). + */ + sina = sqrt(1 - ue * ue); /* sin(angle) between sun and planet */ + sin_sunr = SUN_RADIUS / re; /* sine of sun radius (= sun radius) */ + if (sina < sin_sunr) + meff_fact = meff(sina / sin_sunr); + else + meff_fact = 1; + g1 = 2.0 * HELGRAVCONST * meff_fact / CLIGHT / CLIGHT / AUNIT / re; + g2 = 1.0 + qe; + /* compute deflected position */ + for (i = 0; i <= 2; i++) + xx2[i] = ru * (u[i] + g1/g2 * (uq * e[i] - ue * q[i])); + if (iflag & SEFLG_SPEED) { + /* correction of speed + * influence of light deflection on a planet's apparent speed: + * for an outer planet at the solar limb with + * |v(planet) - v(sun)| = 1 degree, this makes a difference of 7"/day. + * if the planet is within the solar disc, the difference may increase + * to 30" or more. + * e.g. mercury at j2434871.45: + * distance from sun 45" + * 1. speed without deflection 2d10'10".4034 + * 2. speed with deflection 2d10'42".8460 (-speed flag) + * 3. speed with deflection 2d10'43".4824 (< 3 positions/ + * -speed3 flag) + * 3. is not very precise. Smaller dt would give result closer to 2., + * but will probably never be as good as 2, unless int32 doubles are + * used. (try also j2434871.46!!) + * however, in such a case speed changes rapidly. before being + * passed by the sun, the planet accelerates, and after the sun + * has passed it slows down. some time later it regains 'normal' + * speed. + * to compute speed, we do the same calculation as above with + * slightly different u, e, q, and find out the difference in + * deflection. + */ + dtsp = -DEFL_SPEED_INTV; + /* U = planetbary(t-tau) - earthbary(t) = planetgeo */ + for (i = 0; i <= 2; i++) + u[i] = xx[i] - dtsp * xx[i+3]; + /* Eh = earthbary(t) - sunbary(t) = earthhel */ + if (iephe == SEFLG_JPLEPH || iephe == SEFLG_SWIEPH) { + for (i = 0; i <= 2; i++) + e[i] = xearth[i] - psdp->x[i] - + dtsp * (xearth[i+3] - psdp->x[i+3]); + } else + for (i = 0; i <= 2; i++) + e[i] = xearth[i] - dtsp * xearth[i+3]; + /* Q = planetbary(t-tau) - sunbary(t-tau) = 'planethel' */ + for (i = 0; i <= 2; i++) + q[i] = u[i] + xearth[i] - xsun[i] - + dtsp * (xearth[i+3] - xsun[i+3]); + ru = sqrt(square_sum(u)); + rq = sqrt(square_sum(q)); + re = sqrt(square_sum(e)); + for (i = 0; i <= 2; i++) { + u[i] /= ru; + q[i] /= rq; + e[i] /= re; + } + uq = dot_prod(u,q); + ue = dot_prod(u,e); + qe = dot_prod(q,e); + sina = sqrt(1 - ue * ue); /* sin(angle) between sun and planet */ + sin_sunr = SUN_RADIUS / re; /* sine of sun radius (= sun radius) */ + if (sina < sin_sunr) + meff_fact = meff(sina / sin_sunr); + else + meff_fact = 1; + g1 = 2.0 * HELGRAVCONST * meff_fact / CLIGHT / CLIGHT / AUNIT / re; + g2 = 1.0 + qe; + for (i = 0; i <= 2; i++) + xx3[i] = ru * (u[i] + g1/g2 * (uq * e[i] - ue * q[i])); + for (i = 0; i <= 2; i++) { + dx1 = xx2[i] - xx[i]; + dx2 = xx3[i] - u[i] * ru; + dx1 -= dx2; + xx[i+3] += dx1 / dtsp; + } + } /* endif speed */ + /* deflected position */ + for (i = 0; i <= 2; i++) + xx[i] = xx2[i]; +} + +/* converts the sun from barycentric to geocentric, + * the earth from barycentric to heliocentric + * computes + * apparent position, + * precession, and nutation + * according to flags + * iflag flags + * serr error string + */ +static int app_pos_etc_sun(int32 iflag, char *serr) +{ + int i, j, niter, retc = OK; + int32 flg1, flg2; + double xx[6], xxsv[6], dx[3], dt, t; + double xearth[6], xsun[6], xobs[6]; + struct plan_data *pedp = &swed.pldat[SEI_EARTH]; + struct plan_data *psdp = &swed.pldat[SEI_SUNBARY]; + struct epsilon *oe = &swed.oec2000; + /* if the same conversions have already been done for the same + * date, then return */ + flg1 = iflag & ~SEFLG_EQUATORIAL & ~SEFLG_XYZ; + flg2 = pedp->xflgs & ~SEFLG_EQUATORIAL & ~SEFLG_XYZ; + if (flg1 == flg2) { + pedp->xflgs = iflag; + pedp->iephe = iflag & SEFLG_EPHMASK; + return OK; + } + /************************************ + * observer: geocenter or topocenter + ************************************/ + /* if topocentric position is wanted */ + if (iflag & SEFLG_TOPOCTR) { + if (swed.topd.teval != pedp->teval + || swed.topd.teval == 0) { + if (swi_get_observer(pedp->teval, iflag, DO_SAVE, xobs, serr) != OK) + return ERR; + } else { + for (i = 0; i <= 5; i++) + xobs[i] = swed.topd.xobs[i]; + } + /* barycentric position of observer */ + for (i = 0; i <= 5; i++) + xobs[i] = xobs[i] + pedp->x[i]; + } else { + /* barycentric position of geocenter */ + for (i = 0; i <= 5; i++) + xobs[i] = pedp->x[i]; + } + /*************************************** + * true heliocentric position of earth * + ***************************************/ + if (pedp->iephe == SEFLG_MOSEPH || (iflag & SEFLG_BARYCTR)) + for (i = 0; i <= 5; i++) + xx[i] = xobs[i]; + else + for (i = 0; i <= 5; i++) + xx[i] = xobs[i] - psdp->x[i]; + /******************************* + * light-time * + *******************************/ + if (!(iflag & SEFLG_TRUEPOS)) { + /* number of iterations - 1 + * the following if() does the following: + * with jpl and swiss ephemeris: + * with geocentric computation of sun: + * light-time correction of barycentric sun position. + * with heliocentric or barycentric computation of earth: + * light-time correction of barycentric earth position. + * with moshier ephemeris (heliocentric!!!): + * with geocentric computation of sun: + * nothing! (aberration will be done later) + * with heliocentric or barycentric computation of earth: + * light-time correction of heliocentric earth position. + */ + if (pedp->iephe == SEFLG_JPLEPH || pedp->iephe == SEFLG_SWIEPH + || (iflag & SEFLG_HELCTR) || (iflag & SEFLG_BARYCTR)) { + for (i = 0; i <= 5; i++) { + xearth[i] = xobs[i]; + if (pedp->iephe == SEFLG_MOSEPH) + xsun[i] = 0; + else + xsun[i] = psdp->x[i]; + } + niter = 1; /* # of iterations */ + for (j = 0; j <= niter; j++) { + /* distance earth-sun */ + for (i = 0; i <= 2; i++) { + dx[i] = xearth[i]; + if (!(iflag & SEFLG_BARYCTR)) + dx[i] -= xsun[i]; + } + /* new t */ + dt = sqrt(square_sum(dx)) * AUNIT / CLIGHT / 86400.0; + t = pedp->teval - dt; + /* new position */ + switch(pedp->iephe) { + /* if geocentric sun, new sun at t' + * if heliocentric or barycentric earth, new earth at t' */ +#ifndef NO_JPL + case SEFLG_JPLEPH: + if ((iflag & SEFLG_HELCTR) || (iflag & SEFLG_BARYCTR)) + retc = swi_pleph(t, J_EARTH, J_SBARY, xearth, serr); + else + retc = swi_pleph(t, J_SUN, J_SBARY, xsun, serr); + if (retc != OK) { + swi_close_jpl_file(); + swed.jpl_file_is_open = FALSE; + return(retc); + } + break; +#endif + case SEFLG_SWIEPH: + /* + retc = sweph(t, SEI_SUN, SEI_FILE_PLANET, iflag, NULL, NO_SAVE, xearth, serr); + */ + if ((iflag & SEFLG_HELCTR) || (iflag & SEFLG_BARYCTR)) + retc = sweplan(t, SEI_EARTH, SEI_FILE_PLANET, iflag, NO_SAVE, xearth, NULL, xsun, NULL, serr); + else + retc = sweph(t, SEI_SUNBARY, SEI_FILE_PLANET, iflag, NULL, NO_SAVE, xsun, serr); + break; + case SEFLG_MOSEPH: + if ((iflag & SEFLG_HELCTR) || (iflag & SEFLG_BARYCTR)) + retc = swi_moshplan(t, SEI_EARTH, NO_SAVE, xearth, xearth, serr); + /* with moshier there is no barycentric sun */ + break; + default: + retc = ERR; + break; + } + if (retc != OK) + return(retc); + } + /* apparent heliocentric earth */ + for (i = 0; i <= 5; i++) { + xx[i] = xearth[i]; + if (!(iflag & SEFLG_BARYCTR)) + xx[i] -= xsun[i]; + } + } + } + if (!(iflag & SEFLG_SPEED)) + for (i = 3; i <= 5; i++) + xx[i] = 0; + /******************************* + * conversion to geocenter * + *******************************/ + if (!(iflag & SEFLG_HELCTR) && !(iflag & SEFLG_BARYCTR)) + for (i = 0; i <= 5; i++) + xx[i] = -xx[i]; + /********************************** + * 'annual' aberration of light * + **********************************/ + if (!(iflag & SEFLG_TRUEPOS) && !(iflag & SEFLG_NOABERR)) { + /* SEFLG_NOABERR is on, if SEFLG_HELCTR or SEFLG_BARYCTR */ + swi_aberr_light(xx, xobs, iflag); + } + if (!(iflag & SEFLG_SPEED)) + for (i = 3; i <= 5; i++) + xx[i] = 0; + /* ICRS to J2000 */ + if (!(iflag & SEFLG_ICRS) && swed.jpldenum >= 403) { + swi_bias(xx, iflag, FALSE); + }/**/ + /* save J2000 coordinates; required for sidereal positions */ + for (i = 0; i <= 5; i++) + xxsv[i] = xx[i]; + /************************************************ + * precession, equator 2000 -> equator of date * + ************************************************/ + if (!(iflag & SEFLG_J2000)) { + swi_precess(xx, pedp->teval, J2000_TO_J);/**/ + if (iflag & SEFLG_SPEED) + swi_precess_speed(xx, pedp->teval, J2000_TO_J);/**/ + oe = &swed.oec; + } else + oe = &swed.oec2000; + return app_pos_rest(pedp, iflag, xx, xxsv, oe, serr); +} + + +/* transforms the position of the moon: + * heliocentric position + * barycentric position + * astrometric position + * apparent position + * precession and nutation + * + * note: + * for apparent positions, we consider the earth-moon + * system as independant. + * for astrometric positions (SEFLG_NOABERR), we + * consider the motions of the earth and the moon + * related to the solar system barycenter. + */ +static int app_pos_etc_moon(int32 iflag, char *serr) +{ + int i; + int32 flg1, flg2; + double xx[6], xxsv[6], xobs[6], xxm[6], xs[6], xe[6], xobs2[6], dt; + struct plan_data *pedp = &swed.pldat[SEI_EARTH]; + struct plan_data *psdp = &swed.pldat[SEI_SUNBARY]; + struct plan_data *pdp = &swed.pldat[SEI_MOON]; + struct epsilon *oe = &swed.oec; + double t; + int32 retc; + /* if the same conversions have already been done for the same + * date, then return */ + flg1 = iflag & ~SEFLG_EQUATORIAL & ~SEFLG_XYZ; + flg2 = pdp->xflgs & ~SEFLG_EQUATORIAL & ~SEFLG_XYZ; + if (flg1 == flg2) { + pdp->xflgs = iflag; + pdp->iephe = iflag & SEFLG_EPHMASK; + return OK; + } + /* the conversions will be done with xx[]. */ + for (i = 0; i <= 5; i++) { + xx[i] = pdp->x[i]; + xxm[i] = xx[i]; + } + /*********************************** + * to solar system barycentric + ***********************************/ + for (i = 0; i <= 5; i++) + xx[i] += pedp->x[i]; + /******************************* + * observer + *******************************/ + if (iflag & SEFLG_TOPOCTR) { + if (swed.topd.teval != pdp->teval + || swed.topd.teval == 0) { + if (swi_get_observer(pdp->teval, iflag, DO_SAVE, xobs, NULL) != OK) + return ERR; + } else { + for (i = 0; i <= 5; i++) + xobs[i] = swed.topd.xobs[i]; + } + for (i = 0; i <= 5; i++) + xxm[i] -= xobs[i]; + for (i = 0; i <= 5; i++) + xobs[i] += pedp->x[i]; + } else if (iflag & SEFLG_BARYCTR) { + for (i = 0; i <= 5; i++) + xobs[i] = 0; + for (i = 0; i <= 5; i++) + xxm[i] += pedp->x[i]; + } else if (iflag & SEFLG_HELCTR) { + for (i = 0; i <= 5; i++) + xobs[i] = psdp->x[i]; + for (i = 0; i <= 5; i++) + xxm[i] += pedp->x[i] - psdp->x[i]; + } else { + for (i = 0; i <= 5; i++) + xobs[i] = pedp->x[i]; + } + /******************************* + * light-time * + *******************************/ + if ((iflag & SEFLG_TRUEPOS) == 0) { + dt = sqrt(square_sum(xxm)) * AUNIT / CLIGHT / 86400.0; + t = pdp->teval - dt; + switch(pdp->iephe) { + case SEFLG_JPLEPH: + retc = swi_pleph(t, J_MOON, J_EARTH, xx, serr); + if (retc == OK) + retc = swi_pleph(t, J_EARTH, J_SBARY, xe, serr); + if (retc == OK && (iflag & SEFLG_HELCTR)) + retc = swi_pleph(t, J_SUN, J_SBARY, xs, serr); + if (retc != OK) { + swi_close_jpl_file(); + swed.jpl_file_is_open = FALSE; + } + for (i = 0; i <= 5; i++) + xx[i] += xe[i]; + break; + case SEFLG_SWIEPH: + retc = sweplan(t, SEI_MOON, SEI_FILE_MOON, iflag, NO_SAVE, xx, xe, xs, NULL, serr); + if (retc != OK) + return(retc); + for (i = 0; i <= 5; i++) + xx[i] += xe[i]; + break; + case SEFLG_MOSEPH: + /* this method results in an error of a milliarcsec in speed */ + for (i = 0; i <= 2; i++) { + xx[i] -= dt * xx[i+3]; + xe[i] = pedp->x[i] - dt * pedp->x[i+3]; + xe[i+3] = pedp->x[i+3]; + xs[i] = 0; + xs[i+3] = 0; + } + break; + } + if (iflag & SEFLG_TOPOCTR) { + if (swi_get_observer(t, iflag, NO_SAVE, xobs2, NULL) != OK) + return ERR; + for (i = 0; i <= 5; i++) + xobs2[i] += xe[i]; + } else if (iflag & SEFLG_BARYCTR) { + for (i = 0; i <= 5; i++) + xobs2[i] = 0; + } else if (iflag & SEFLG_HELCTR) { + for (i = 0; i <= 5; i++) + xobs2[i] = xs[i]; + } else { + for (i = 0; i <= 5; i++) + xobs2[i] = xe[i]; + } + } + /************************* + * to correct center + *************************/ + for (i = 0; i <= 5; i++) + xx[i] -= xobs[i]; + /********************************** + * 'annual' aberration of light * + **********************************/ + if (!(iflag & SEFLG_TRUEPOS) && !(iflag & SEFLG_NOABERR)) { + /* SEFLG_NOABERR is on, if SEFLG_HELCTR or SEFLG_BARYCTR */ + swi_aberr_light(xx, xobs, iflag); + /* + * Apparent speed is also influenced by + * the difference of speed of the earth between t and t-dt. + * Neglecting this would lead to an error of several 0.1" + */ +#if 1 + if (iflag & SEFLG_SPEED) + for (i = 3; i <= 5; i++) + xx[i] += xobs[i] - xobs2[i]; +#endif + } + /* if !speedflag, speed = 0 */ + if (!(iflag & SEFLG_SPEED)) + for (i = 3; i <= 5; i++) + xx[i] = 0; + /* ICRS to J2000 */ + if (!(iflag & SEFLG_ICRS) && swed.jpldenum >= 403) { + swi_bias(xx, iflag, FALSE); + }/**/ + /* save J2000 coordinates; required for sidereal positions */ + for (i = 0; i <= 5; i++) + xxsv[i] = xx[i]; + /************************************************ + * precession, equator 2000 -> equator of date * + ************************************************/ + if (!(iflag & SEFLG_J2000)) { + swi_precess(xx, pdp->teval, J2000_TO_J); + if (iflag & SEFLG_SPEED) + swi_precess_speed(xx, pdp->teval, J2000_TO_J); + oe = &swed.oec; + } else + oe = &swed.oec2000; + return app_pos_rest(pdp, iflag, xx, xxsv, oe, serr); +} + +/* transforms the position of the barycentric sun: + * precession and nutation + * according to flags + * iflag flags + * serr error string + */ +static int app_pos_etc_sbar(int32 iflag, char *serr) +{ + int i; + double xx[6], xxsv[6], dt; + struct plan_data *psdp = &swed.pldat[SEI_EARTH]; + struct plan_data *psbdp = &swed.pldat[SEI_SUNBARY]; + struct epsilon *oe = &swed.oec; + /* the conversions will be done with xx[]. */ + for (i = 0; i <= 5; i++) + xx[i] = psbdp->x[i]; + /************** + * light-time * + **************/ + if (!(iflag & SEFLG_TRUEPOS)) { + dt = sqrt(square_sum(xx)) * AUNIT / CLIGHT / 86400.0; + for (i = 0; i <= 2; i++) + xx[i] -= dt * xx[i+3]; /* apparent position */ + } + if (!(iflag & SEFLG_SPEED)) + for (i = 3; i <= 5; i++) + xx[i] = 0; + /* ICRS to J2000 */ + if (!(iflag & SEFLG_ICRS) && swed.jpldenum >= 403) { + swi_bias(xx, iflag, FALSE); + }/**/ + /* save J2000 coordinates; required for sidereal positions */ + for (i = 0; i <= 5; i++) + xxsv[i] = xx[i]; + /************************************************ + * precession, equator 2000 -> equator of date * + ************************************************/ + if (!(iflag & SEFLG_J2000)) { + swi_precess(xx, psbdp->teval, J2000_TO_J); + if (iflag & SEFLG_SPEED) + swi_precess_speed(xx, psbdp->teval, J2000_TO_J); + oe = &swed.oec; + } else + oe = &swed.oec2000; + return app_pos_rest(psdp, iflag, xx, xxsv, oe, serr); +} + +/* transforms position of mean lunar node or apogee: + * input is polar coordinates in mean ecliptic of date. + * output is, according to iflag: + * position accounted for light-time + * position referred to J2000 (i.e. precession subtracted) + * position with nutation + * equatorial coordinates + * cartesian coordinates + * heliocentric position is not allowed ?????????????? + * DAS WAERE ZIEMLICH AUFWENDIG. SONNE UND ERDE MUESSTEN + * SCHON VORHANDEN SEIN! + * ipl bodynumber (SE_MEAN_NODE or SE_MEAN_APOG) + * iflag flags + * serr error string + */ +static int app_pos_etc_mean(int ipl, int32 iflag, char *serr) +{ + int i; + int32 flg1, flg2; + double xx[6], xxsv[6]; +#if 0 + struct node_data *pdp = &swed.nddat[ipl]; +#else + struct plan_data *pdp = &swed.nddat[ipl]; +#endif + struct epsilon *oe; + /* if the same conversions have already been done for the same + * date, then return */ + flg1 = iflag & ~SEFLG_EQUATORIAL & ~SEFLG_XYZ; + flg2 = pdp->xflgs & ~SEFLG_EQUATORIAL & ~SEFLG_XYZ; + if (flg1 == flg2) { + pdp->xflgs = iflag; + pdp->iephe = iflag & SEFLG_EPHMASK; + return OK; + } + for (i = 0; i <= 5; i++) + xx[i] = pdp->x[i]; + /* cartesian equatorial coordinates */ + swi_polcart_sp(xx, xx); + swi_coortrf2(xx, xx, -swed.oec.seps, swed.oec.ceps); + swi_coortrf2(xx+3, xx+3, -swed.oec.seps, swed.oec.ceps); +#if 0 + /**************************************************** + * light-time, this is only a few milliarcseconds * + ***************************************************/ + if ((iflag & SEFLG_TRUEPOS) == 0) { + dt = pdp->x[3] * AUNIT / CLIGHT / 86400; + for (i = 0; i <= 2; i++) + xx[i] -= dt * xx[i+3]; + } +#endif + if (!(iflag & SEFLG_SPEED)) + for (i = 3; i <= 5; i++) + xx[i] = 0; + /* J2000 coordinates; required for sidereal positions */ + if (((iflag & SEFLG_SIDEREAL) + && (swed.sidd.sid_mode & SE_SIDBIT_ECL_T0)) + || (swed.sidd.sid_mode & SE_SIDBIT_SSY_PLANE)) { + for (i = 0; i <= 5; i++) + xxsv[i] = xx[i]; + /* xxsv is not J2000 yet! */ + if (pdp->teval != J2000) { + swi_precess(xxsv, pdp->teval, J_TO_J2000); + if (iflag & SEFLG_SPEED) + swi_precess_speed(xxsv, pdp->teval, J_TO_J2000); + } + } + /***************************************************** + * if no precession, equator of date -> equator 2000 * + *****************************************************/ + if (iflag & SEFLG_J2000) { + swi_precess(xx, pdp->teval, J_TO_J2000); + if (iflag & SEFLG_SPEED) + swi_precess_speed(xx, pdp->teval, J_TO_J2000); + oe = &swed.oec2000; + } else + oe = &swed.oec; + return app_pos_rest(pdp, iflag, xx, xxsv, oe, serr); +} + +/* fetch chebyshew coefficients from sweph file for + * tjd time + * ipli planet number + * ifno file number + * serr error string + */ +static int get_new_segment(double tjd, int ipli, int ifno, char *serr) +{ + int i, j, k, m, n, o, icoord, retc; + int32 iseg; + int32 fpos; + int nsizes, nsize[6]; + int nco; + int idbl; + unsigned char c[4]; + struct plan_data *pdp = &swed.pldat[ipli]; + struct file_data *fdp = &swed.fidat[ifno]; + FILE *fp = fdp->fptr; + int freord = (int) fdp->iflg & SEI_FILE_REORD; + int fendian = (int) fdp->iflg & SEI_FILE_LITENDIAN; + uint32 longs[MAXORD+1]; + /* compute segment number */ + iseg = (int32) ((tjd - pdp->tfstart) / pdp->dseg); + /*if (tjd - pdp->tfstart < 0) + return(NOT_AVAILABLE);*/ + pdp->tseg0 = pdp->tfstart + iseg * pdp->dseg; + pdp->tseg1 = pdp->tseg0 + pdp->dseg; + /* get file position of coefficients from file */ + fpos = pdp->lndx0 + iseg * 3; + retc = do_fread((void *) &fpos, 3, 1, 4, fp, fpos, freord, fendian, ifno, serr); + if (retc != OK) + return (retc); + fseek(fp, fpos, SEEK_SET); + /* clear space of chebyshew coefficients */ + if (pdp->segp == NULL) + pdp->segp = (double *) malloc((size_t) pdp->ncoe * 3 * 8); + memset((void *) pdp->segp, 0, (size_t) pdp->ncoe * 3 * 8); + /* read coefficients for 3 coordinates */ + for (icoord = 0; icoord < 3; icoord++) { + idbl = icoord * pdp->ncoe; + /* first read header */ + /* first bit indicates number of sizes of packed coefficients */ + retc = do_fread((void *) &c[0], 1, 2, 1, fp, SEI_CURR_FPOS, freord, fendian, ifno, serr); + if (retc != OK) + return (retc); + if (c[0] & 128) { + nsizes = 6; + retc = do_fread((void *) (c+2), 1, 2, 1, fp, SEI_CURR_FPOS, freord, fendian, ifno, serr); + if (retc != OK) + return (retc); + nsize[0] = (int) c[1] / 16; + nsize[1] = (int) c[1] % 16; + nsize[2] = (int) c[2] / 16; + nsize[3] = (int) c[2] % 16; + nsize[4] = (int) c[3] / 16; + nsize[5] = (int) c[3] % 16; + nco = nsize[0] + nsize[1] + nsize[2] + nsize[3] + nsize[4] + nsize[5]; + } else { + nsizes = 4; + nsize[0] = (int) c[0] / 16; + nsize[1] = (int) c[0] % 16; + nsize[2] = (int) c[1] / 16; + nsize[3] = (int) c[1] % 16; + nco = nsize[0] + nsize[1] + nsize[2] + nsize[3]; + } + /* there may not be more coefficients than interpolation + * order + 1 */ + if (nco > pdp->ncoe) { + if (serr != NULL) { + sprintf(serr, "error in ephemeris file: %d coefficients instead of %d. ", nco, pdp->ncoe); + if (strlen(serr) + strlen(fdp->fnam) < AS_MAXCH - 1) + sprintf(serr, "error in ephemeris file %s: %d coefficients instead of %d. ", fdp->fnam, nco, pdp->ncoe); + } + free(pdp->segp); + pdp->segp = NULL; + return (ERR); + } + /* now unpack */ + for (i = 0; i < nsizes; i++) { + if (nsize[i] == 0) + continue; + if (i < 4) { + j = (4 - i); + k = nsize[i]; + retc = do_fread((void *) &longs[0], j, k, 4, fp, SEI_CURR_FPOS, freord, fendian, ifno, serr); + if (retc != OK) + return (retc); + for (m = 0; m < k; m++, idbl++) { + if (longs[m] & 1) /* will be negative */ + pdp->segp[idbl] = -(((longs[m]+1) / 2) / 1e+9 * pdp->rmax / 2); + else + pdp->segp[idbl] = (longs[m] / 2) / 1e+9 * pdp->rmax / 2; + } + } else if (i == 4) { /* half byte packing */ + j = 1; + k = (nsize[i] + 1) / 2; + retc = do_fread((void *) longs, j, k, 4, fp, SEI_CURR_FPOS, freord, fendian, ifno, serr); + if (retc != OK) + return (retc); + for (m = 0, j = 0; + m < k && j < nsize[i]; + m++) { + for (n = 0, o = 16; + n < 2 && j < nsize[i]; + n++, j++, idbl++, longs[m] %= o, o /= 16) { + if (longs[m] & o) + pdp->segp[idbl] = + -(((longs[m]+o) / o / 2) * pdp->rmax / 2 / 1e+9); + else + pdp->segp[idbl] = (longs[m] / o / 2) * pdp->rmax / 2 / 1e+9; + } + } + } else if (i == 5) { /* quarter byte packing */ + j = 1; + k = (nsize[i] + 3) / 4; + retc = do_fread((void *) longs, j, k, 4, fp, SEI_CURR_FPOS, freord, fendian, ifno, serr); + if (retc != OK) + return (retc); + for (m = 0, j = 0; + m < k && j < nsize[i]; + m++) { + for (n = 0, o = 64; + n < 4 && j < nsize[i]; + n++, j++, idbl++, longs[m] %= o, o /= 4) { + if (longs[m] & o) + pdp->segp[idbl] = + -(((longs[m]+o) / o / 2) * pdp->rmax / 2 / 1e+9); + else + pdp->segp[idbl] = (longs[m] / o / 2) * pdp->rmax / 2 / 1e+9; + } + } + } + } + } +#if 0 + if (ipli == SEI_SUNBARY) { + printf("%d, %x\n", fpos, fpos); + for (i = 0; i < pdp->ncoe; i++) + printf("%e, %e, %e\n", pdp->segp[i], pdp->segp[i+pdp->ncoe], pdp->segp[i+2*pdp->ncoe]); + } +#endif + return(OK); +} + +/* SWISSEPH + * reads constants on ephemeris file + * ifno file # + * serr error string + */ +static int read_const(int ifno, char *serr) +{ + char *c, c2, *sp; + char s[AS_MAXCH*2], s2[AS_MAXCH]; + char sastnam[41]; + int i, ipli, kpl; + int retc; + int fendian, freord; + int lastnam = 19; + FILE *fp; + int32 lng; + uint32 ulng; + int32 flen, fpos; + short nplan; + int32 testendian; + double doubles[20]; + struct plan_data *pdp; + struct file_data *fdp = &swed.fidat[ifno]; + char *serr_file_damage = "Ephemeris file %s is damaged. "; + int errmsglen = strlen(serr_file_damage) + strlen(fdp->fnam); + int nbytes_ipl = 2; + fp = fdp->fptr; + /************************************* + * version number of file * + *************************************/ + sp = fgets(s, AS_MAXCH, fp); + if (sp == NULL || strstr(sp, "\r\n") == NULL) + goto file_damage; + sp = strchr(s, '\r'); + *sp = '\0'; + sp = s; + while (isdigit((int) *sp) == 0 && *sp != '\0') + sp++; + if (*sp == '\0') + goto file_damage; + /* version unused so far */ + fdp->fversion = atoi(sp); + /************************************* + * correct file name? * + *************************************/ + sp = fgets(s, AS_MAXCH, fp); + if (sp == NULL || strstr(sp, "\r\n") == NULL) + goto file_damage; + /* file name, without path */ + sp = strrchr(fdp->fnam, (int) *DIR_GLUE); + if (sp == NULL) + sp = fdp->fnam; + else + sp++; + strcpy(s2, sp); + /* to lower case */ + for (sp = s2; *sp != '\0'; sp++) + *sp = tolower((int) *sp); + /* prepare string of should-be file name */ + sp = s + strlen(s) - 1; + while (*sp == '\n' || *sp == '\r' || *sp == ' ') { + *sp = '\0'; + sp--; + } + for (sp = s; *sp != '\0'; sp++) + *sp = tolower((int) *sp); + if (strcmp(s2, s) != 0) { + if (serr != NULL) + sprintf(serr, "Ephemeris file name '%s' wrong; rename '%s' ", s2, s); + goto return_error; + } + /************************************* + * copyright * + *************************************/ + sp = fgets(s, AS_MAXCH, fp); + if (sp == NULL || strstr(sp, "\r\n") == NULL) + goto file_damage; + /**************************************** + * orbital elements, if single asteroid * + ****************************************/ + if (ifno == SEI_FILE_ANY_AST) { + sp = fgets(s, AS_MAXCH * 2, fp); + if (sp == NULL || strstr(sp, "\r\n") == NULL) + goto file_damage; + /* MPC number and name; will be analyzed below: + * search "asteroid name" */ + while(*sp == ' ') sp++; + while(isdigit(*sp)) sp++; + sp++; + i = sp - s; + strncpy(sastnam, sp, lastnam+i); + *(sastnam+lastnam+i) = '\0'; + /* save elements, they are required for swe_plan_pheno() */ + strcpy(swed.astelem, s); + /* required for magnitude */ + swed.ast_H = atof(s + 35 + i); + swed.ast_G = atof(s + 42 + i); + if (swed.ast_G == 0) swed.ast_G = 0.15; + /* diameter in kilometers, not always given: */ + strncpy(s2, s+51+i, 7); + *(s2 + 7) = '\0'; + swed.ast_diam = atof(s2); + if (swed.ast_diam == 0) { + /* estimate the diameter from magnitude; assume albedo = 0.15 */ + swed.ast_diam = 1329/sqrt(0.15) * pow(10, -0.2 * swed.ast_H); + } +#if 0 + i = 5; + while (*(sp+i) != ' ') + i++; + j = i - 5; + strncpy(sastnam, sp, lastnam+i); + *(sastnam+lastnam+i) = 0; + /* save elements, they are required for swe_plan_pheno() */ + strcpy(swed.astelem, s); + /* required for magnitude */ + swed.ast_G = atof(sp + 40 + j); + swed.ast_H = atof(sp + 46 + j); + /* diameter in kilometers, not always given: */ + strncpy(s2, sp+56+j, 7); + *(s2 + 7) = '\0'; + swed.ast_diam = atof(s2); +#endif + } + /************************************* + * one int32 for test of byte order * + *************************************/ + if (fread((void *) &testendian, 4, 1, fp) != 1) + goto file_damage; + /* is byte order correct? */ + if (testendian == SEI_FILE_TEST_ENDIAN) + freord = SEI_FILE_NOREORD; + else { + freord = SEI_FILE_REORD; + sp = (char *) &lng; + c = (char *) &testendian; + for (i = 0; i < 4; i++) + *(sp+i) = *(c+3-i); + if (lng != SEI_FILE_TEST_ENDIAN) + goto file_damage; + /* printf("%d %x\n", lng, lng);*/ + } + /* is file bigendian or littlendian? + * test first byte of test integer, which is highest if bigendian */ + c = (char *) &testendian; + c2 = SEI_FILE_TEST_ENDIAN / 16777216L; + if (*c == c2) + fendian = SEI_FILE_BIGENDIAN; + else + fendian = SEI_FILE_LITENDIAN; + fdp->iflg = (int32) freord | fendian; + /************************************* + * length of file correct? * + *************************************/ + retc = do_fread((void *) &lng, 4, 1, 4, fp, SEI_CURR_FPOS, freord, +fendian, ifno, serr); + if (retc != OK) + return (retc); + fpos = ftell(fp); + if (fseek(fp, 0L, SEEK_END) != 0) + goto file_damage; + flen = ftell(fp); + if (lng != flen) + goto file_damage; + /********************************************************** + * DE number of JPL ephemeris which this file is based on * + **********************************************************/ + retc = do_fread((void *) &fdp->sweph_denum, 4, 1, 4, fp, fpos, freord, +fendian, ifno, serr); + if (retc != OK) + return (retc); + swed.jpldenum = fdp->sweph_denum; + /************************************* + * start and end epoch of file * + *************************************/ + retc = do_fread((void *) &fdp->tfstart, 8, 1, 8, fp, SEI_CURR_FPOS, +freord, fendian, ifno, serr); + if (retc != OK) + return (retc); + retc = do_fread((void *) &fdp->tfend, 8, 1, 8, fp, SEI_CURR_FPOS, freord, +fendian, ifno, serr); + if (retc != OK) + return (retc); + /************************************* + * how many planets are in file? * + *************************************/ + retc = do_fread((void *) &nplan, 2, 1, 2, fp, SEI_CURR_FPOS, freord, fendian, ifno, serr); + if (retc != OK) + return (retc); + if (nplan > 256) { + nbytes_ipl = 4; + nplan %= 256; + } + if (nplan < 1 || nplan > 20) + goto file_damage; + fdp->npl = nplan; + /* which ones? */ + retc = do_fread((void *) fdp->ipl, nbytes_ipl, (int) nplan, sizeof(int), fp, SEI_CURR_FPOS, +freord, fendian, ifno, serr); + if (retc != OK) + return (retc); + /************************************* + * asteroid name * + *************************************/ + if (ifno == SEI_FILE_ANY_AST) { + char sastno[12]; + int j; + /* name of asteroid is taken from orbital elements record + * read above */ + j = 4; /* old astorb.dat had only 4 characters for MPC# */ + while (sastnam[j] != ' ' && j < 10) /* new astorb.dat has 5 */ + j++; + strncpy(sastno, sastnam, j); + sastno[j] = '\0'; + i = (int) atol(sastno); + if (i == fdp->ipl[0] - SE_AST_OFFSET) { + /* element record is from bowell database */ + strncpy(fdp->astnam, sastnam+j+1, lastnam); + /* overread old ast. name field */ + if (fread((void *) s, 30, 1, fp) != 1) + goto file_damage; + } else { + /* older elements record structure: the name + * is taken from old name field */ + if (fread((void *) fdp->astnam, 30, 1, fp) != 1) + goto file_damage; + } + /* in worst case strlen of not null terminated area! */ + i = strlen(fdp->astnam) - 1; + if (i < 0) + i = 0; + sp = fdp->astnam + i; + while(*sp == ' ') { + sp--; + } + sp[1] = '\0'; + } + /************************************* + * check CRC * + *************************************/ + fpos = ftell(fp); + /* read CRC from file */ + retc = do_fread((void *) &ulng, 4, 1, 4, fp, SEI_CURR_FPOS, freord, +fendian, ifno, serr); + if (retc != OK) + return (retc); + /* read check area from file */ + fseek(fp, 0L, SEEK_SET); + /* must check that defined length of s is less than fpos */ + if (fpos - 1 > 2 * AS_MAXCH) + goto file_damage; + if (fread((void *) s, (size_t) fpos, 1, fp) != 1) + goto file_damage; +#if 1 + if (swi_crc32((unsigned char *) s, (int) fpos) != ulng) + goto file_damage; + /*printf("crc %d %d\n", ulng2, ulng);*/ +#endif + fseek(fp, fpos+4, SEEK_SET); + /************************************* + * read general constants * + *************************************/ + /* clight, aunit, helgravconst, ratme, sunradius + * these constants are currently not in use */ + retc = do_fread((void *) &doubles[0], 8, 5, 8, fp, SEI_CURR_FPOS, freord, +fendian, ifno, serr); + if (retc != OK) + return (retc); + swed.gcdat.clight = doubles[0]; + swed.gcdat.aunit = doubles[1]; + swed.gcdat.helgravconst = doubles[2]; + swed.gcdat.ratme = doubles[3]; + swed.gcdat.sunradius = doubles[4]; + /************************************* + * read constants of planets * + *************************************/ + for (kpl = 0; kpl < fdp->npl; kpl++) { + /* get SEI_ planet number */ + ipli = fdp->ipl[kpl]; + if (ipli >= SE_AST_OFFSET) + pdp = &swed.pldat[SEI_ANYBODY]; + else + pdp = &swed.pldat[ipli]; + pdp->ibdy = ipli; + /* file position of planet's index */ + retc = do_fread((void *) &pdp->lndx0, 4, 1, 4, fp, SEI_CURR_FPOS, +freord, fendian, ifno, serr); + if (retc != OK) + return (retc); + /* flags: helio/geocentric, rotation, reference ellipse */ + retc = do_fread((void *) &pdp->iflg, 1, 1, sizeof(int32), fp, +SEI_CURR_FPOS, freord, fendian, ifno, serr); + if (retc != OK) + return (retc); + /* number of chebyshew coefficients / segment */ + /* = interpolation order +1 */ + retc = do_fread((void *) &pdp->ncoe, 1, 1, sizeof(int), fp, +SEI_CURR_FPOS, freord, fendian, ifno, serr); + if (retc != OK) + return (retc); + /* rmax = normalisation factor */ + retc = do_fread((void *) &lng, 4, 1, 4, fp, SEI_CURR_FPOS, freord, +fendian, ifno, serr); + if (retc != OK) + return (retc); + pdp->rmax = lng / 1000.0; + /* start and end epoch of planetary ephemeris, */ + /* segment length, and orbital elements */ + retc = do_fread((void *) doubles, 8, 10, 8, fp, SEI_CURR_FPOS, freord, +fendian, ifno, serr); + if (retc != OK) + return (retc); + pdp->tfstart = doubles[0]; + pdp->tfend = doubles[1]; + pdp->dseg = doubles[2]; + pdp->nndx = (int32) ((doubles[1] - doubles[0] + 0.1) /doubles[2]); + pdp->telem = doubles[3]; + pdp->prot = doubles[4]; + pdp->dprot = doubles[5]; + pdp->qrot = doubles[6]; + pdp->dqrot = doubles[7]; + pdp->peri = doubles[8]; + pdp->dperi = doubles[9]; + /* alloc space for chebyshew coefficients */ + /* if reference ellipse is used, read its coefficients */ + if (pdp->iflg & SEI_FLG_ELLIPSE) { + if (pdp->refep != NULL) { /* if switch to other eph. file */ + free((void *) pdp->refep); + if (pdp->segp != NULL) { + free((void *) pdp->segp); /* array of coefficients of */ + pdp->segp = NULL; /* ephemeris segment */ + } + } + pdp->refep = (double *) malloc((size_t) pdp->ncoe * 2 * 8); + retc = do_fread((void *) pdp->refep, 8, 2*pdp->ncoe, 8, fp, +SEI_CURR_FPOS, freord, fendian, ifno, serr); + if (retc != OK) + return (retc); + }/**/ + } + return(OK); +file_damage: + if (serr != NULL) { + *serr = '\0'; + if (errmsglen < AS_MAXCH) + sprintf(serr, serr_file_damage, fdp->fnam); + } +return_error: + fclose(fp); + fdp->fptr = NULL; + return(ERR); +} + +/* SWISSEPH + * reads from a file and, if necessary, reorders bytes + * targ target pointer + * size size of item to be read + * count number of items + * corrsize in what size should it be returned + * (e.g. 3 byte int -> 4 byte int) + * fp file pointer + * fpos file position: if (fpos >= 0) then fseek + * freord reorder bytes or no + * fendian little/bigendian + * ifno file number + * serr error string + */ +static int do_fread(void *trg, int size, int count, int corrsize, FILE *fp, int32 fpos, int freord, int fendian, int ifno, char *serr) +{ + int i, j, k; + int totsize; + unsigned char space[1000]; + unsigned char *targ = (unsigned char *) trg; + totsize = size * count; + if (fpos >= 0) + fseek(fp, fpos, SEEK_SET); + /* if no byte reorder has to be done, and read size == return size */ + if (!freord && size == corrsize) { + if (fread((void *) targ, (size_t) totsize, 1, fp) == 0) { + if (serr != NULL) { + strcpy(serr, "Ephemeris file is damaged. "); + if (strlen(serr) + strlen(swed.fidat[ifno].fnam) < AS_MAXCH - 1) + sprintf(serr, "Ephemeris file %s is damaged.", swed.fidat[ifno].fnam); + } + fclose(fp); + fp = NULL; + return(ERR); + } else + return(OK); + } else { + if (fread((void *) &space[0], (size_t) totsize, 1, fp) == 0) { + if (serr != NULL) { + strcpy(serr, "Ephemeris file is damaged. "); + if (strlen(serr) + strlen(swed.fidat[ifno].fnam) < AS_MAXCH - 1) + sprintf(serr, "Ephemeris file %s is damaged.", swed.fidat[ifno].fnam); + } + fclose(fp); + fp = NULL; + return(ERR); + } + if (size != corrsize) { + memset((void *) targ, 0, (size_t) count * corrsize); + } + for(i = 0; i < count; i++) { + for (j = size-1; j >= 0; j--) { + if (freord) + k = size-j-1; + else + k = j; + if (size != corrsize) + if ((fendian == SEI_FILE_BIGENDIAN && !freord) || + (fendian == SEI_FILE_LITENDIAN && freord)) + k += corrsize - size; + targ[i*corrsize+k] = space[i*size+j]; + } + } + } + return(OK); +} + +/* SWISSEPH + * adds reference orbit to chebyshew series (if SEI_FLG_ELLIPSE), + * rotates series to mean equinox of J2000 + * + * ipli planet number + */ +static void rot_back(int ipli) +{ + int i; + double t, tdiff; + double qav, pav, dn; + double omtild, com, som, cosih2; + double x[MAXORD+1][3]; + double uix[3], uiy[3], uiz[3]; + double xrot, yrot, zrot; + double *chcfx, *chcfy, *chcfz; + double *refepx, *refepy; + double seps2000 = swed.oec2000.seps; + double ceps2000 = swed.oec2000.ceps; + struct plan_data *pdp = &swed.pldat[ipli]; + int nco = pdp->ncoe; + t = pdp->tseg0 + pdp->dseg / 2; + chcfx = pdp->segp; + chcfy = chcfx + nco; + chcfz = chcfx + 2 * nco; + tdiff= (t - pdp->telem) / 365250.0; + if (ipli == SEI_MOON) { + dn = pdp->prot + tdiff * pdp->dprot; + i = (int) (dn / TWOPI); + dn -= i * TWOPI; + qav = (pdp->qrot + tdiff * pdp->dqrot) * cos(dn); + pav = (pdp->qrot + tdiff * pdp->dqrot) * sin(dn); + } else { + qav = pdp->qrot + tdiff * pdp->dqrot; + pav = pdp->prot + tdiff * pdp->dprot; + } + /*calculate cosine and sine of average perihelion longitude. */ + for (i = 0; i < nco; i++) { + x[i][0] = chcfx[i]; + x[i][1] = chcfy[i]; + x[i][2] = chcfz[i]; + } + if (pdp->iflg & SEI_FLG_ELLIPSE) { + refepx = pdp->refep; + refepy = refepx + nco; + omtild = pdp->peri + tdiff * pdp->dperi; + i = (int) (omtild / TWOPI); + omtild -= i * TWOPI; + com = cos(omtild); + som = sin(omtild); + /*add reference orbit. */ + for (i = 0; i < nco; i++) { + x[i][0] = chcfx[i] + com * refepx[i] - som * refepy[i]; + x[i][1] = chcfy[i] + com * refepy[i] + som * refepx[i]; + } + } + /* construct right handed orthonormal system with first axis along + origin of longitudes and third axis along angular momentum + this uses the standard formulas for equinoctal variables + (see papers by broucke and by cefola). */ + cosih2 = 1.0 / (1.0 + qav * qav + pav * pav); + /* calculate orbit pole. */ + uiz[0] = 2.0 * pav * cosih2; + uiz[1] = -2.0 * qav * cosih2; + uiz[2] = (1.0 - qav * qav - pav * pav) * cosih2; + /* calculate origin of longitudes vector. */ + uix[0] = (1.0 + qav * qav - pav * pav) * cosih2; + uix[1] = 2.0 * qav * pav * cosih2; + uix[2] = -2.0 * pav * cosih2; + /* calculate vector in orbital plane orthogonal to origin of + longitudes. */ + uiy[0] =2.0 * qav * pav * cosih2; + uiy[1] =(1.0 - qav * qav + pav * pav) * cosih2; + uiy[2] =2.0 * qav * cosih2; + /* rotate to actual orientation in space. */ + for (i = 0; i < nco; i++) { + xrot = x[i][0] * uix[0] + x[i][1] * uiy[0] + x[i][2] * uiz[0]; + yrot = x[i][0] * uix[1] + x[i][1] * uiy[1] + x[i][2] * uiz[1]; + zrot = x[i][0] * uix[2] + x[i][1] * uiy[2] + x[i][2] * uiz[2]; + if (fabs(xrot) + fabs(yrot) + fabs(zrot) >= 1e-14) + pdp->neval = i; + x[i][0] = xrot; + x[i][1] = yrot; + x[i][2] = zrot; + if (ipli == SEI_MOON) { + /* rotate to j2000 equator */ + x[i][1] = ceps2000 * yrot - seps2000 * zrot; + x[i][2] = seps2000 * yrot + ceps2000 * zrot; + } + } + for (i = 0; i < nco; i++) { + chcfx[i] = x[i][0]; + chcfy[i] = x[i][1]; + chcfz[i] = x[i][2]; + } +} + +/* Adjust position from Earth-Moon barycenter to Earth + * + * xemb = hel./bar. position or velocity vectors of emb (input) + * earth (output) + * xmoon= geocentric position or velocity vector of moon + */ +static void embofs(double *xemb, double *xmoon) +{ + int i; + for (i = 0; i <= 2; i++) + xemb[i] -= xmoon[i] / (EARTH_MOON_MRAT + 1.0); +} + +/* calculates the nutation matrix + * nu pointer to nutation data structure + * oe pointer to epsilon data structure + */ +static void nut_matrix(struct nut *nu, struct epsilon *oe) +{ + double psi, eps; + double sinpsi, cospsi, sineps, coseps, sineps0, coseps0; + psi = nu->nutlo[0]; + eps = oe->eps + nu->nutlo[1]; + sinpsi = sin(psi); + cospsi = cos(psi); + sineps0 = oe->seps; + coseps0 = oe->ceps; + sineps = sin(eps); + coseps = cos(eps); + nu->matrix[0][0] = cospsi; + nu->matrix[0][1] = sinpsi * coseps; + nu->matrix[0][2] = sinpsi * sineps; + nu->matrix[1][0] = -sinpsi * coseps0; + nu->matrix[1][1] = cospsi * coseps * coseps0 + sineps * sineps0; + nu->matrix[1][2] = cospsi * sineps * coseps0 - coseps * sineps0; + nu->matrix[2][0] = -sinpsi * sineps0; + nu->matrix[2][1] = cospsi * coseps * sineps0 - sineps * coseps0; + nu->matrix[2][2] = cospsi * sineps * sineps0 + coseps * coseps0; +} + +/* lunar osculating elements, i.e. + * osculating node ('true' node) and + * osculating apogee ('black moon', 'lilith'). + * tjd julian day + * ipl body number, i.e. SEI_TRUE_NODE or SEI_OSCU_APOG + * iflag flags (which ephemeris, nutation, etc.) + * serr error string + * + * definitions and remarks: + * the osculating node and the osculating apogee are defined + * as the orbital elements of the momentary lunar orbit. + * their advantage is that when the moon crosses the ecliptic, + * it is really at the osculating node, and when it passes + * its greatest distance from earth it is really at the + * osculating apogee. with the mean elements this is not + * the case. (some define the apogee as the second focus of + * the lunar ellipse. but, as seen from the geocenter, both + * points are in the same direction.) + * problems: + * the osculating apogee is given in the 'New International + * Ephemerides' (Editions St. Michel) as the 'True Lilith'. + * however, this name is misleading. this point is based on + * the idea that the lunar orbit can be approximated by an + * ellipse. + * arguments against this: + * 1. this procedure considers celestial motions as two body + * problems. this is quite good for planets, but not for + * the moon. the strong gravitational attraction of the sun + * destroys the idea of an ellipse. + * 2. the NIE 'True Lilith' has strong oscillations around the + * mean one with an amplitude of about 30 degrees. however, + * when the moon is in apogee, its distance from the mean + * apogee never exceeds 5 degrees. + * besides, the computation of NIE is INACCURATE. the mistake + * reaches 20 arc minutes. + * According to Santoni, the point was calculated using 'les 58 + * premiers termes correctifs au Perigee moyen' published by + * Chapront and Chapront-Touze. And he adds: "Nous constatons + * que meme en utilisant ces 58 termes CORRECTIFS, l'erreur peut + * atteindre 0,5d!" (p. 13) We avoid this error, computing the + * orbital elements directly from the position and the speed vector. + * + * how about the node? it is less problematic, because we + * we needn't derive it from an orbital ellipse. we can say: + * the axis of the osculating nodes is the intersection line of + * the actual orbital plane of the moon and the plane of the + * ecliptic. or: the osculating nodes are the intersections of + * the two great circles representing the momentary apparent + * orbit of the moon and the ecliptic. in this way they make + * some sense. then, the nodes are really an axis, and they + * have no geocentric distance. however, in this routine + * we give a distance derived from the osculating ellipse. + * the node could also be defined as the intersection axis + * of the lunar orbital plane and the solar orbital plane, + * which is not precisely identical to the ecliptic. this + * would make a difference of several arcseconds. + * + * is it possible to keep the idea of a continuously moving + * apogee that is exact at the moment when the moon passes + * its greatest distance from earth? + * to achieve this, we would probably have to interpolate between + * the actual apogees. + * the nodes could also be computed by interpolation. the resulting + * nodes would deviate from the so-called 'true node' by less than + * 30 arc minutes. + * + * sidereal and j2000 true node are first computed for the ecliptic + * of epoch and then precessed to ecliptic of t0(ayanamsa) or J2000. + * there is another procedure that computes the node for the ecliptic + * of t0(ayanamsa) or J2000. it is excluded by + * #ifdef SID_TNODE_FROM_ECL_T0 + */ +static int lunar_osc_elem(double tjd, int ipl, int32 iflag, char *serr) +{ + int i, j, istart; + int ipli = SEI_MOON; + int32 epheflag = SEFLG_DEFAULTEPH; + int retc = ERR; + int32 flg1, flg2; +#if 0 + struct node_data *ndp, *ndnp, *ndap; +#else + struct plan_data *ndp, *ndnp, *ndap; +#endif + struct epsilon *oe; + double speed_intv = NODE_CALC_INTV; /* to silence gcc warning */ + double a, b; + double xpos[3][6], xx[3][6], xxa[3][6], xnorm[6], r[6]; + double *xp; + double rxy, rxyz, t, dt, fac, sgn; + double sinnode, cosnode, sinincl, cosincl, sinu, cosu, sinE, cosE; + double uu, ny, sema, ecce, Gmsm, c2, v2, pp; + int32 speedf1, speedf2; +#ifdef SID_TNODE_FROM_ECL_T0 + struct sid_data *sip = &swed.sidd; + struct epsilon oectmp; + if (iflag & SEFLG_SIDEREAL) { + calc_epsilon(sip->t0, &oectmp); + oe = &oectmp; + } else if (iflag & SEFLG_J2000) + oe = &swed.oec2000; + else +#endif + oe = &swed.oec; + ndp = &swed.nddat[ipl]; + /* if elements have already been computed for this date, return + * if speed flag has been turned on, recompute */ + flg1 = iflag & ~SEFLG_EQUATORIAL & ~SEFLG_XYZ; + flg2 = ndp->xflgs & ~SEFLG_EQUATORIAL & ~SEFLG_XYZ; + speedf1 = ndp->xflgs & SEFLG_SPEED; + speedf2 = iflag & SEFLG_SPEED; + if (tjd == ndp->teval + && tjd != 0 + && flg1 == flg2 + && (!speedf2 || speedf1)) { + ndp->xflgs = iflag; + ndp->iephe = iflag & SEFLG_EPHMASK; + return OK; + } + /* the geocentric position vector and the speed vector of the + * moon make up the lunar orbital plane. the position vector + * of the node is along the intersection line of the orbital + * plane and the plane of the ecliptic. + * to calculate the osculating node, we need one lunar position + * with speed. + * to calculate the speed of the osculating node, we need + * three lunar positions and the speed of each of them. + * this is relatively cheap, if the jpl-moon or the swisseph + * moon is used. with the moshier moon this is much more + * expensive, because then we need 9 lunar positions for + * three speeds. but one position and speed can normally + * be taken from swed.pldat[moon], which corresponds to + * three moshier moon calculations. + * the same is also true for the osculating apogee: we need + * three lunar positions and speeds. + */ + /********************************************* + * now three lunar positions with speeds * + *********************************************/ + if (iflag & SEFLG_MOSEPH) + epheflag = SEFLG_MOSEPH; + else if (iflag & SEFLG_SWIEPH) + epheflag = SEFLG_SWIEPH; + else if (iflag & SEFLG_JPLEPH) + epheflag = SEFLG_JPLEPH; + /* there may be a moon of wrong ephemeris in save area + * force new computation: */ + swed.pldat[SEI_MOON].teval = 0; + if (iflag & SEFLG_SPEED) + istart = 0; + else + istart = 2; + if (serr != NULL) + *serr = '\0'; + three_positions: + switch(epheflag) { +#ifndef NO_JPL + case SEFLG_JPLEPH: + speed_intv = NODE_CALC_INTV; + for (i = istart; i <= 2; i++) { + if (i == 0) + t = tjd - speed_intv; + else if (i == 1) + t = tjd + speed_intv; + else + t = tjd; + xp = xpos[i]; + retc = jplplan(t, ipli, iflag, NO_SAVE, xp, NULL, NULL, serr); + /* read error or corrupt file */ + if (retc == ERR) + return(ERR); + /* light-time-corrected moon for apparent node + * this makes a difference of several milliarcseconds with + * the node and 0.1" with the apogee. + * the simple formual 'x[j] -= dt * speed' should not be + * used here. the error would be greater than the advantage + * of computation speed. */ + if ((iflag & SEFLG_TRUEPOS) == 0 && retc >= OK) { + dt = sqrt(square_sum(xpos[i])) * AUNIT / CLIGHT / 86400.0; + retc = jplplan(t-dt, ipli, iflag, NO_SAVE, xpos[i], NULL, NULL, serr);/**/ + /* read error or corrupt file */ + if (retc == ERR) + return(ERR); + } + /* jpl ephemeris not on disk, or date beyond ephemeris range */ + if (retc == NOT_AVAILABLE) { + iflag = (iflag & ~SEFLG_JPLEPH) | SEFLG_SWIEPH; + epheflag = SEFLG_SWIEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, " \ntrying Swiss Eph; "); + break; + } else if (retc == BEYOND_EPH_LIMITS) { + if (tjd > MOSHLUEPH_START && tjd < MOSHLUEPH_END) { + iflag = (iflag & ~SEFLG_JPLEPH) | SEFLG_MOSEPH; + epheflag = SEFLG_MOSEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, " \nusing Moshier Eph; "); + break; + } else + return ERR; + } + /* precession and nutation etc. */ + retc = swi_plan_for_osc_elem(iflag|SEFLG_SPEED, t, xpos[i]); /* retc is always ok */ + } + break; +#endif /* NO_JPL */ + case SEFLG_SWIEPH: +#if 0 + sweph_moon: +#endif + speed_intv = NODE_CALC_INTV; + for (i = istart; i <= 2; i++) { + if (i == 0) + t = tjd - speed_intv; + else if (i == 1) + t = tjd + speed_intv; + else + t = tjd; + retc = swemoon(t, iflag | SEFLG_SPEED, NO_SAVE, xpos[i], serr);/**/ + if (retc == ERR) + return(ERR); + /* light-time-corrected moon for apparent node (~ 0.006") */ + if ((iflag & SEFLG_TRUEPOS) == 0 && retc >= OK) { + dt = sqrt(square_sum(xpos[i])) * AUNIT / CLIGHT / 86400.0; + retc = swemoon(t-dt, iflag | SEFLG_SPEED, NO_SAVE, xpos[i], serr);/**/ + if (retc == ERR) + return(ERR); + } + if (retc == NOT_AVAILABLE) { + if (tjd > MOSHPLEPH_START && tjd < MOSHPLEPH_END) { + iflag = (iflag & ~SEFLG_SWIEPH) | SEFLG_MOSEPH; + epheflag = SEFLG_MOSEPH; + if (serr != NULL && strlen(serr) + 30 < AS_MAXCH) + strcat(serr, " \nusing Moshier eph.; "); + break; + } else + return ERR; + } + /* precession and nutation etc. */ + retc = swi_plan_for_osc_elem(iflag|SEFLG_SPEED, t, xpos[i]); /* retc is always ok */ + } + break; + case SEFLG_MOSEPH: +#if 0 + moshier_moon: +#endif + /* with moshier moon, we need a greater speed_intv, because here the + * node and apogee oscillate wildly within small intervals */ + speed_intv = NODE_CALC_INTV_MOSH; + for (i = istart; i <= 2; i++) { + if (i == 0) + t = tjd - speed_intv; + else if (i == 1) + t = tjd + speed_intv; + else + t = tjd; + retc = swi_moshmoon(t, NO_SAVE, xpos[i], serr);/**/ + if (retc == ERR) + return(retc); +#if 0 + /* light-time-corrected moon for apparent node. + * can be neglected with moshier */ + if ((iflag & SEFLG_TRUEPOS) == 0 && retc >= OK) { + dt = sqrt(square_sum(xpos[i])) * AUNIT / CLIGHT / 86400; + retc = swi_moshmoon(t-dt, NO_SAVE, xpos[i], serr);/**/ + } +#endif + /* precession and nutation etc. */ + retc = swi_plan_for_osc_elem(iflag|SEFLG_SPEED, t, xpos[i]); /* retc is always ok */ + } + break; + default: + break; + } + if (retc == NOT_AVAILABLE || retc == BEYOND_EPH_LIMITS) + goto three_positions; + /********************************************* + * node with speed * + *********************************************/ + /* node is always needed, even if apogee is wanted */ + ndnp = &swed.nddat[SEI_TRUE_NODE]; + /* three nodes */ + for (i = istart; i <= 2; i++) { + if (fabs(xpos[i][5]) < 1e-15) + xpos[i][5] = 1e-15; + fac = xpos[i][2] / xpos[i][5]; + sgn = xpos[i][5] / fabs(xpos[i][5]); + for (j = 0; j <= 2; j++) + xx[i][j] = (xpos[i][j] - fac * xpos[i][j+3]) * sgn; + } + /* now we have the correct direction of the node, the + * intersection of the lunar plane and the ecliptic plane. + * the distance is the distance of the point where the tangent + * of the lunar motion penetrates the ecliptic plane. + * this can be very large, e.g. j2415080.37372. + * below, a new distance will be derived from the osculating + * ellipse. + */ + /* save position and speed */ + for (i = 0; i <= 2; i++) { + ndnp->x[i] = xx[2][i]; + if (iflag & SEFLG_SPEED) { + b = (xx[1][i] - xx[0][i]) / 2; + a = (xx[1][i] + xx[0][i]) / 2 - xx[2][i]; + ndnp->x[i+3] = (2 * a + b) / speed_intv; + } else + ndnp->x[i+3] = 0; + ndnp->teval = tjd; + ndnp->iephe = epheflag; + } + /************************************************************ + * apogee with speed * + * must be computed anyway to get the node's distance * + ************************************************************/ + ndap = &swed.nddat[SEI_OSCU_APOG]; + Gmsm = GEOGCONST * (1 + 1 / EARTH_MOON_MRAT) /AUNIT/AUNIT/AUNIT*86400.0*86400.0; + /* three apogees */ + for (i = istart; i <= 2; i++) { + /* node */ + rxy = sqrt(xx[i][0] * xx[i][0] + xx[i][1] * xx[i][1]); + cosnode = xx[i][0] / rxy; + sinnode = xx[i][1] / rxy; + /* inclination */ + swi_cross_prod(xpos[i], xpos[i]+3, xnorm); + rxy = xnorm[0] * xnorm[0] + xnorm[1] * xnorm[1]; + c2 = (rxy + xnorm[2] * xnorm[2]); + rxyz = sqrt(c2); + rxy = sqrt(rxy); + sinincl = rxy / rxyz; + cosincl = sqrt(1 - sinincl * sinincl); + /* argument of latitude */ + cosu = xpos[i][0] * cosnode + xpos[i][1] * sinnode; + sinu = xpos[i][2] / sinincl; + uu = atan2(sinu, cosu); + /* semi-axis */ + rxyz = sqrt(square_sum(xpos[i])); + v2 = square_sum((xpos[i]+3)); + sema = 1 / (2 / rxyz - v2 / Gmsm); + /* eccentricity */ + pp = c2 / Gmsm; + ecce = sqrt(1 - pp / sema); + /* eccentric anomaly */ + cosE = 1 / ecce * (1 - rxyz / sema); + sinE = 1 / ecce / sqrt(sema * Gmsm) * dot_prod(xpos[i], (xpos[i]+3)); + /* true anomaly */ + ny = 2 * atan(sqrt((1+ecce)/(1-ecce)) * sinE / (1 + cosE)); + /* distance of apogee from ascending node */ + xxa[i][0] = swi_mod2PI(uu - ny + PI); + xxa[i][1] = 0; /* latitude */ + xxa[i][2] = sema * (1 + ecce); /* distance */ + /* transformation to ecliptic coordinates */ + swi_polcart(xxa[i], xxa[i]); + swi_coortrf2(xxa[i], xxa[i], -sinincl, cosincl); + swi_cartpol(xxa[i], xxa[i]); + /* adding node, we get apogee in ecl. coord. */ + xxa[i][0] += atan2(sinnode, cosnode); + swi_polcart(xxa[i], xxa[i]); + /* new distance of node from orbital ellipse: + * true anomaly of node: */ + ny = swi_mod2PI(ny - uu); + /* eccentric anomaly */ + cosE = cos(2 * atan(tan(ny / 2) / sqrt((1+ecce) / (1-ecce)))); + /* new distance */ + r[0] = sema * (1 - ecce * cosE); + /* old node distance */ + r[1] = sqrt(square_sum(xx[i])); + /* correct length of position vector */ + for (j = 0; j <= 2; j++) + xx[i][j] *= r[0] / r[1]; + } + /* save position and speed */ + for (i = 0; i <= 2; i++) { + /* apogee */ + ndap->x[i] = xxa[2][i]; + if (iflag & SEFLG_SPEED) + ndap->x[i+3] = (xxa[1][i] - xxa[0][i]) / speed_intv / 2; + else + ndap->x[i+3] = 0; + ndap->teval = tjd; + ndap->iephe = epheflag; + /* node */ + ndnp->x[i] = xx[2][i]; + if (iflag & SEFLG_SPEED) + ndnp->x[i+3] = (xx[1][i] - xx[0][i]) / speed_intv / 2;/**/ + else + ndnp->x[i+3] = 0; + } + /********************************************************************** + * precession and nutation have already been taken into account + * because the computation is on the basis of lunar positions + * that have gone through swi_plan_for_osc_elem. + * light-time is already contained in lunar positions. + * now compute polar and equatorial coordinates: + **********************************************************************/ + for (j = 0; j <= 1; j++) { + double x[6]; + if (j == 0) + ndp = &swed.nddat[SEI_TRUE_NODE]; + else + ndp = &swed.nddat[SEI_OSCU_APOG]; + memset((void *) ndp->xreturn, 0, 24 * sizeof(double)); + /* cartesian ecliptic */ + for (i = 0; i <= 5; i++) + ndp->xreturn[6+i] = ndp->x[i]; + /* polar ecliptic */ + swi_cartpol_sp(ndp->xreturn+6, ndp->xreturn); + /* cartesian equatorial */ + swi_coortrf2(ndp->xreturn+6, ndp->xreturn+18, -oe->seps, oe->ceps); + if (iflag & SEFLG_SPEED) + swi_coortrf2(ndp->xreturn+9, ndp->xreturn+21, -oe->seps, oe->ceps); +#ifdef SID_TNODE_FROM_ECL_T0 + /* sideral: we return NORMAL equatorial coordinates, there are no + * sidereal ones */ + if (iflag & SEFLG_SIDEREAL) { + /* to J2000 */ + swi_precess(ndp->xreturn+18, sip->t0, J_TO_J2000); + if (iflag & SEFLG_SPEED) + swi_precess_speed(ndp->xreturn+21, sip->t0, J_TO_J2000); + if (!(iflag & SEFLG_J2000)) { + /* to tjd */ + swi_precess(ndp->xreturn+18, tjd, J2000_TO_J); + if (iflag & SEFLG_SPEED) + swi_precess_speed(ndp->xreturn+21, tjd, J2000_TO_J); + } + } +#endif + if (!(iflag & SEFLG_NONUT)) { + swi_coortrf2(ndp->xreturn+18, ndp->xreturn+18, -swed.nut.snut, swed.nut.cnut); + if (iflag & SEFLG_SPEED) + swi_coortrf2(ndp->xreturn+21, ndp->xreturn+21, -swed.nut.snut, swed.nut.cnut); + } + /* polar equatorial */ + swi_cartpol_sp(ndp->xreturn+18, ndp->xreturn+12); + ndp->xflgs = iflag; + ndp->iephe = iflag & SEFLG_EPHMASK; +#ifdef SID_TNODE_FROM_ECL_T0 + /* node and apogee are already referred to t0; + * nothing has to be done */ +#else + if (iflag & SEFLG_SIDEREAL) { + /* node and apogee are referred to t; + * the ecliptic position must be transformed to t0 */ + /* rigorous algorithm */ + if ((swed.sidd.sid_mode & SE_SIDBIT_ECL_T0) + || (swed.sidd.sid_mode & SE_SIDBIT_SSY_PLANE)) { + for (i = 0; i <= 5; i++) + x[i] = ndp->xreturn[18+i]; + /* remove nutation */ + if (!(iflag & SEFLG_NONUT)) + swi_nutate(x, iflag, TRUE); + /* precess to J2000 */ + swi_precess(x, tjd, J_TO_J2000); + if (iflag & SEFLG_SPEED) + swi_precess_speed(x, tjd, J_TO_J2000); + if (swed.sidd.sid_mode & SE_SIDBIT_ECL_T0) + swi_trop_ra2sid_lon(x, ndp->xreturn+6, ndp->xreturn+18, iflag, NULL); + /* project onto solar system equator */ + else if (swed.sidd.sid_mode & SE_SIDBIT_SSY_PLANE) + swi_trop_ra2sid_lon_sosy(x, ndp->xreturn+6, ndp->xreturn+18, iflag, NULL); + /* to polar */ + swi_cartpol_sp(ndp->xreturn+6, ndp->xreturn); + swi_cartpol_sp(ndp->xreturn+18, ndp->xreturn+12); + /* traditional algorithm; + * this is a bit clumsy, but allows us to keep the + * sidereal code together */ + } else { + swi_cartpol_sp(ndp->xreturn+6, ndp->xreturn); + ndp->xreturn[0] -= swe_get_ayanamsa(ndp->teval) * DEGTORAD; + swi_polcart_sp(ndp->xreturn, ndp->xreturn+6); + } + } else if (iflag & SEFLG_J2000) { + /* node and apogee are referred to t; + * the ecliptic position must be transformed to J2000 */ + for (i = 0; i <= 5; i++) + x[i] = ndp->xreturn[18+i]; + /* precess to J2000 */ + swi_precess(x, tjd, J_TO_J2000); + if (iflag & SEFLG_SPEED) + swi_precess_speed(x, tjd, J_TO_J2000); + for (i = 0; i <= 5; i++) + ndp->xreturn[18+i] = x[i]; + swi_cartpol_sp(ndp->xreturn+18, ndp->xreturn+12); + swi_coortrf2(ndp->xreturn+18, ndp->xreturn+6, swed.oec2000.seps, swed.oec2000.ceps); + if (iflag & SEFLG_SPEED) + swi_coortrf2(ndp->xreturn+21, ndp->xreturn+9, swed.oec2000.seps, swed.oec2000.ceps); + swi_cartpol_sp(ndp->xreturn+6, ndp->xreturn); + } +#endif + /********************** + * radians to degrees * + **********************/ + /*if (!(iflag & SEFLG_RADIANS)) {*/ + for (i = 0; i < 2; i++) { + ndp->xreturn[i] *= RADTODEG; /* ecliptic */ + ndp->xreturn[i+3] *= RADTODEG; + ndp->xreturn[i+12] *= RADTODEG; /* equator */ + ndp->xreturn[i+15] *= RADTODEG; + } + ndp->xreturn[0] = swe_degnorm(ndp->xreturn[0]); + ndp->xreturn[12] = swe_degnorm(ndp->xreturn[12]); + /*}*/ + } + return OK; +} + +/* lunar osculating elements, i.e. + */ +static int intp_apsides(double tjd, int ipl, int32 iflag, char *serr) +{ + int i; + int32 flg1, flg2; + struct plan_data *ndp; + struct epsilon *oe; + struct nut *nut; + double speed_intv = 0.1; + double t, dt; + double xpos[3][6], xx[6], x[6]; + int32 speedf1, speedf2; + oe = &swed.oec; + nut = &swed.nut; + ndp = &swed.nddat[ipl]; + /* if same calculation was done before, return + * if speed flag has been turned on, recompute */ + flg1 = iflag & ~SEFLG_EQUATORIAL & ~SEFLG_XYZ; + flg2 = ndp->xflgs & ~SEFLG_EQUATORIAL & ~SEFLG_XYZ; + speedf1 = ndp->xflgs & SEFLG_SPEED; + speedf2 = iflag & SEFLG_SPEED; + if (tjd == ndp->teval + && tjd != 0 + && flg1 == flg2 + && (!speedf2 || speedf1)) { + ndp->xflgs = iflag; + ndp->iephe = iflag & SEFLG_MOSEPH; + return OK; + } + /********************************************* + * now three apsides * + *********************************************/ + for (t = tjd - speed_intv, i = 0; i < 3; t += speed_intv, i++) { + if (! (iflag & SEFLG_SPEED) && i != 1) continue; + swi_intp_apsides(t, xpos[i], ipl); + } + /************************************************************ + * apsis with speed * + ************************************************************/ + for (i = 0; i < 3; i++) { + xx[i] = xpos[1][i]; + xx[i+3] = 0; + } + if (iflag & SEFLG_SPEED) { + xx[3] = swe_difrad2n(xpos[2][0], xpos[0][0]) / speed_intv / 2.0; + xx[4] = (xpos[2][1] - xpos[0][1]) / speed_intv / 2.0; + xx[5] = (xpos[2][2] - xpos[0][2]) / speed_intv / 2.0; + } + memset((void *) ndp->xreturn, 0, 24 * sizeof(double)); + /* ecliptic polar to cartesian */ + swi_polcart_sp(xx, xx); + /* light-time */ + if (!(iflag & SEFLG_TRUEPOS)) { + dt = sqrt(square_sum(xx)) * AUNIT / CLIGHT / 86400.0; + for (i = 1; i < 3; i++) + xx[i] -= dt * xx[i+3]; + } + for (i = 0; i <= 5; i++) + ndp->xreturn[i+6] = xx[i]; + /*printf("%.10f, %.10f, %.10f, %.10f\n", xx[0] /DEGTORAD, xx[1] / DEGTORAD, xx [2], xx[3] /DEGTORAD);*/ + /* equatorial cartesian */ + swi_coortrf2(ndp->xreturn+6, ndp->xreturn+18, -oe->seps, oe->ceps); + if (iflag & SEFLG_SPEED) + swi_coortrf2(ndp->xreturn+9, ndp->xreturn+21, -oe->seps, oe->ceps); + ndp->teval = tjd; + ndp->xflgs = iflag; + ndp->iephe = iflag & SEFLG_EPHMASK; + if (iflag & SEFLG_SIDEREAL) { + /* apogee is referred to t; + * the ecliptic position must be transformed to t0 */ + /* rigorous algorithm */ + if ((swed.sidd.sid_mode & SE_SIDBIT_ECL_T0) + || (swed.sidd.sid_mode & SE_SIDBIT_SSY_PLANE)) { + for (i = 0; i <= 5; i++) + x[i] = ndp->xreturn[18+i]; + /* precess to J2000 */ + swi_precess(x, tjd, J_TO_J2000); + if (iflag & SEFLG_SPEED) + swi_precess_speed(x, tjd, J_TO_J2000); + if (swed.sidd.sid_mode & SE_SIDBIT_ECL_T0) + swi_trop_ra2sid_lon(x, ndp->xreturn+6, ndp->xreturn+18, iflag, NULL); + /* project onto solar system equator */ + else if (swed.sidd.sid_mode & SE_SIDBIT_SSY_PLANE) + swi_trop_ra2sid_lon_sosy(x, ndp->xreturn+6, ndp->xreturn+18, iflag, NULL); + /* to polar */ + swi_cartpol_sp(ndp->xreturn+6, ndp->xreturn); + swi_cartpol_sp(ndp->xreturn+18, ndp->xreturn+12); + } else { + /* traditional algorithm */ + swi_cartpol_sp(ndp->xreturn+6, ndp->xreturn); + ndp->xreturn[0] -= swe_get_ayanamsa(ndp->teval) * DEGTORAD; + swi_polcart_sp(ndp->xreturn, ndp->xreturn+6); + swi_cartpol_sp(ndp->xreturn+18, ndp->xreturn+12); + } + } else if (iflag & SEFLG_J2000) { + /* node and apogee are referred to t; + * the ecliptic position must be transformed to J2000 */ + for (i = 0; i <= 5; i++) + x[i] = ndp->xreturn[18+i]; + /* precess to J2000 */ + swi_precess(x, tjd, J_TO_J2000); + if (iflag & SEFLG_SPEED) + swi_precess_speed(x, tjd, J_TO_J2000); + for (i = 0; i <= 5; i++) + ndp->xreturn[18+i] = x[i]; + swi_cartpol_sp(ndp->xreturn+18, ndp->xreturn+12); + swi_coortrf2(ndp->xreturn+18, ndp->xreturn+6, swed.oec2000.seps, swed.oec2000.ceps); + if (iflag & SEFLG_SPEED) + swi_coortrf2(ndp->xreturn+21, ndp->xreturn+9, swed.oec2000.seps, swed.oec2000.ceps); + swi_cartpol_sp(ndp->xreturn+6, ndp->xreturn); + } else { + /* tropical ecliptic positions */ + /* precession has already been taken into account, but not nutation */ + if (!(iflag & SEFLG_NONUT)) { + swi_nutate(ndp->xreturn+18, iflag, FALSE); + } + /* equatorial polar */ + swi_cartpol_sp(ndp->xreturn+18, ndp->xreturn+12); + /* ecliptic cartesian */ + swi_coortrf2(ndp->xreturn+18, ndp->xreturn+6, oe->seps, oe->ceps); + if (iflag & SEFLG_SPEED) + swi_coortrf2(ndp->xreturn+21, ndp->xreturn+9, oe->seps, oe->ceps); + if (!(iflag & SEFLG_NONUT)) { + swi_coortrf2(ndp->xreturn+6, ndp->xreturn+6, nut->snut, nut->cnut); + if (iflag & SEFLG_SPEED) + swi_coortrf2(ndp->xreturn+9, ndp->xreturn+9, nut->snut, nut->cnut); + } + /* ecliptic polar */ + swi_cartpol_sp(ndp->xreturn+6, ndp->xreturn); + } + /********************** + * radians to degrees * + **********************/ + /*if (!(iflag & SEFLG_RADIANS)) {*/ + for (i = 0; i < 2; i++) { + ndp->xreturn[i] *= RADTODEG; /* ecliptic */ + ndp->xreturn[i+3] *= RADTODEG; + ndp->xreturn[i+12] *= RADTODEG; /* equator */ + ndp->xreturn[i+15] *= RADTODEG; + } + ndp->xreturn[0] = swe_degnorm(ndp->xreturn[0]); + ndp->xreturn[12] = swe_degnorm(ndp->xreturn[12]); + /*}*/ + return OK; +} + +/* transforms the position of the moon in a way we can use it + * for calculation of osculating node and apogee: + * precession and nutation (attention to speed vector!) + * according to flags + * iflag flags + * tjd time for which the element is computed + * i.e. date of ecliptic + * xx array equatorial cartesian position and speed + * serr error string + */ +int swi_plan_for_osc_elem(int32 iflag, double tjd, double *xx) +{ + int i; + double x[6]; + struct nut nuttmp; + struct nut *nutp = &nuttmp; /* dummy assign, to silence gcc warning */ + struct epsilon *oe = &swed.oec; + struct epsilon oectmp; + /* ICRS to J2000 */ + if (!(iflag & SEFLG_ICRS) && swed.jpldenum >= 403) { + swi_bias(xx, iflag, FALSE); + }/**/ + /************************************************ + * precession, equator 2000 -> equator of date * + * attention: speed vector has to be rotated, * + * but daily precession 0.137" may not be added!*/ +#ifdef SID_TNODE_FROM_ECL_T0 + struct sid_data *sip = &swed.sidd; + /* For sidereal calculation we need node refered* + * to ecliptic of t0 of ayanamsa * + ************************************************/ + if (iflag & SEFLG_SIDEREAL) { + tjd = sip->t0; + swi_precess(xx, tjd, J2000_TO_J); + swi_precess(xx+3, tjd, J2000_TO_J); + calc_epsilon(tjd, &oectmp); + oe = &oectmp; + } else if (!(iflag & SEFLG_J2000)) { +#endif + swi_precess(xx, tjd, J2000_TO_J); + swi_precess(xx+3, tjd, J2000_TO_J); + /* epsilon */ + if (tjd == swed.oec.teps) + oe = &swed.oec; + else if (tjd == J2000) + oe = &swed.oec2000; + else { + calc_epsilon(tjd, &oectmp); + oe = &oectmp; + } +#ifdef SID_TNODE_FROM_ECL_T0 + } else /* if SEFLG_J2000 */ + oe = &swed.oec2000; +#endif + /************************************************ + * nutation * + * again: speed vector must be rotated, but not * + * added 'speed' of nutation * + ************************************************/ + if (!(iflag & SEFLG_NONUT)) { + if (tjd == swed.nut.tnut) + nutp = &swed.nut; + else if (tjd == J2000) + nutp = &swed.nut2000; + else if (tjd == swed.nutv.tnut) + nutp = &swed.nutv; + else { + nutp = &nuttmp; + swi_nutation(tjd, nutp->nutlo); + nutp->tnut = tjd; + nutp->snut = sin(nutp->nutlo[1]); + nutp->cnut = cos(nutp->nutlo[1]); + nut_matrix(nutp, oe); + } + for (i = 0; i <= 2; i++) + x[i] = xx[0] * nutp->matrix[0][i] + + xx[1] * nutp->matrix[1][i] + + xx[2] * nutp->matrix[2][i]; + /* speed: + * rotation only */ + for (i = 0; i <= 2; i++) + x[i+3] = xx[3] * nutp->matrix[0][i] + + xx[4] * nutp->matrix[1][i] + + xx[5] * nutp->matrix[2][i]; + for (i = 0; i <= 5; i++) + xx[i] = x[i]; + } + /************************************************ + * transformation to ecliptic * + ************************************************/ + swi_coortrf2(xx, xx, oe->seps, oe->ceps); + swi_coortrf2(xx+3, xx+3, oe->seps, oe->ceps); +#ifdef SID_TNODE_FROM_ECL_T0 + if (iflag & SEFLG_SIDEREAL) { + /* subtract ayan_t0 */ + swi_cartpol_sp(xx, xx); + xx[0] -= sip->ayan_t0; + swi_polcart_sp(xx, xx); + } else +#endif + if (!(iflag & SEFLG_NONUT)) { + swi_coortrf2(xx, xx, nutp->snut, nutp->cnut); + swi_coortrf2(xx+3, xx+3, nutp->snut, nutp->cnut); + } + return(OK); +} + +static const struct meff_ele FAR eff_arr[] = { + /* + * r , m_eff for photon passing the sun at min distance r (fraction of Rsun) + * the values where computed with sun_model.c, which is a classic + * treatment of a photon passing a gravity field, multiplied by 2. + * The sun mass distribution m(r) is from Michael Stix, The Sun, p. 47. + */ + {1.000, 1.000000}, + {0.990, 0.999979}, + {0.980, 0.999940}, + {0.970, 0.999881}, + {0.960, 0.999811}, + {0.950, 0.999724}, + {0.940, 0.999622}, + {0.930, 0.999497}, + {0.920, 0.999354}, + {0.910, 0.999192}, + {0.900, 0.999000}, + {0.890, 0.998786}, + {0.880, 0.998535}, + {0.870, 0.998242}, + {0.860, 0.997919}, + {0.850, 0.997571}, + {0.840, 0.997198}, + {0.830, 0.996792}, + {0.820, 0.996316}, + {0.810, 0.995791}, + {0.800, 0.995226}, + {0.790, 0.994625}, + {0.780, 0.993991}, + {0.770, 0.993326}, + {0.760, 0.992598}, + {0.750, 0.991770}, + {0.740, 0.990873}, + {0.730, 0.989919}, + {0.720, 0.988912}, + {0.710, 0.987856}, + {0.700, 0.986755}, + {0.690, 0.985610}, + {0.680, 0.984398}, + {0.670, 0.982986}, + {0.660, 0.981437}, + {0.650, 0.979779}, + {0.640, 0.978024}, + {0.630, 0.976182}, + {0.620, 0.974256}, + {0.610, 0.972253}, + {0.600, 0.970174}, + {0.590, 0.968024}, + {0.580, 0.965594}, + {0.570, 0.962797}, + {0.560, 0.959758}, + {0.550, 0.956515}, + {0.540, 0.953088}, + {0.530, 0.949495}, + {0.520, 0.945741}, + {0.510, 0.941838}, + {0.500, 0.937790}, + {0.490, 0.933563}, + {0.480, 0.928668}, + {0.470, 0.923288}, + {0.460, 0.917527}, + {0.450, 0.911432}, + {0.440, 0.905035}, + {0.430, 0.898353}, + {0.420, 0.891022}, + {0.410, 0.882940}, + {0.400, 0.874312}, + {0.390, 0.865206}, + {0.380, 0.855423}, + {0.370, 0.844619}, + {0.360, 0.833074}, + {0.350, 0.820876}, + {0.340, 0.808031}, + {0.330, 0.793962}, + {0.320, 0.778931}, + {0.310, 0.763021}, + {0.300, 0.745815}, + {0.290, 0.727557}, + {0.280, 0.708234}, + {0.270, 0.687583}, + {0.260, 0.665741}, + {0.250, 0.642597}, + {0.240, 0.618252}, + {0.230, 0.592586}, + {0.220, 0.565747}, + {0.210, 0.537697}, + {0.200, 0.508554}, + {0.190, 0.478420}, + {0.180, 0.447322}, + {0.170, 0.415454}, + {0.160, 0.382892}, + {0.150, 0.349955}, + {0.140, 0.316691}, + {0.130, 0.283565}, + {0.120, 0.250431}, + {0.110, 0.218327}, + {0.100, 0.186794}, + {0.090, 0.156287}, + {0.080, 0.128421}, + {0.070, 0.102237}, + {0.060, 0.077393}, + {0.050, 0.054833}, + {0.040, 0.036361}, + {0.030, 0.020953}, + {0.020, 0.009645}, + {0.010, 0.002767}, + {0.000, 0.000000} +}; +static double meff(double r) +{ + double f, m; + int i; + if (r <= 0) + return 0.0; + else if (r >= 1) + return 1.0; + for (i = 0; eff_arr[i].r > r; i++) + ; /* empty body */ + f = (r - eff_arr[i-1].r) / (eff_arr[i].r - eff_arr[i-1].r); + m = eff_arr[i-1].m + f * (eff_arr[i].m - eff_arr[i-1].m); + return m; +} + +static void denormalize_positions(double *x0, double *x1, double *x2) +{ + int i; + /* x*[0] = ecliptic longitude, x*[12] = rectascension */ + for (i = 0; i <= 12; i += 12) { + if (x1[i] - x0[i] < -180) + x0[i] -= 360; + if (x1[i] - x0[i] > 180) + x0[i] += 360; + if (x1[i] - x2[i] < -180) + x2[i] -= 360; + if (x1[i] - x2[i] > 180) + x2[i] += 360; + } +} + +static void calc_speed(double *x0, double *x1, double *x2, double dt) +{ + int i, j, k; + double a, b; + for (j = 0; j <= 18; j += 6) { + for (i = 0; i < 3; i++) { + k = j + i; + b = (x2[k] - x0[k]) / 2; + a = (x2[k] + x0[k]) / 2 - x1[k]; + x1[k+3] = (2 * a + b) / dt; + } + } +} + +void swi_check_ecliptic(double tjd) +{ + if (swed.oec2000.teps != J2000) { + calc_epsilon(J2000, &swed.oec2000); + } + if (tjd == J2000) { + swed.oec.teps = swed.oec2000.teps; + swed.oec.eps = swed.oec2000.eps; + swed.oec.seps = swed.oec2000.seps; + swed.oec.ceps = swed.oec2000.ceps; + return; + } + if (swed.oec.teps != tjd || tjd == 0) { + calc_epsilon(tjd, &swed.oec); + } +} + +/* computes nutation, if it is wanted and has not yet been computed. + * if speed flag has been turned on since last computation, + * nutation is recomputed */ +void swi_check_nutation(double tjd, int32 iflag) +{ + int32 speedf1, speedf2; + static int32 nutflag = 0; + double t; + speedf1 = nutflag & SEFLG_SPEED; + speedf2 = iflag & SEFLG_SPEED; + if (!(iflag & SEFLG_NONUT) + && (tjd != swed.nut.tnut || tjd == 0 + || (!speedf1 && speedf2))) { + swi_nutation(tjd, swed.nut.nutlo); + swed.nut.tnut = tjd; + swed.nut.snut = sin(swed.nut.nutlo[1]); + swed.nut.cnut = cos(swed.nut.nutlo[1]); + nutflag = iflag; + nut_matrix(&swed.nut, &swed.oec); + if (iflag & SEFLG_SPEED) { + /* once more for 'speed' of nutation, which is needed for + * planetary speeds */ + t = tjd - NUT_SPEED_INTV; + swi_nutation(t, swed.nutv.nutlo); + swed.nutv.tnut = t; + swed.nutv.snut = sin(swed.nutv.nutlo[1]); + swed.nutv.cnut = cos(swed.nutv.nutlo[1]); + nut_matrix(&swed.nutv, &swed.oec); + } + } +} + +static int32 plaus_iflag(int32 iflag) +{ + int32 epheflag = 0; + /* if topocentric bit, turn helio- and barycentric bits off */ + if (iflag & SEFLG_TOPOCTR) + iflag = iflag & ~(SEFLG_HELCTR | SEFLG_BARYCTR); + /* if heliocentric bit, turn aberration and deflection off */ + if (iflag & SEFLG_HELCTR) + iflag |= SEFLG_NOABERR | SEFLG_NOGDEFL; /*iflag |= SEFLG_TRUEPOS;*/ + /* same, if barycentric bit */ + if (iflag & SEFLG_BARYCTR) + iflag |= SEFLG_NOABERR | SEFLG_NOGDEFL; /*iflag |= SEFLG_TRUEPOS;*/ + /* if no_precession bit is set, set also no_nutation bit */ + if (iflag & SEFLG_J2000) + iflag |= SEFLG_NONUT; + /* if sidereal bit is set, set also no_nutation bit */ + if (iflag & SEFLG_SIDEREAL) + iflag |= SEFLG_NONUT; + /* if truepos is set, turn off grav. defl. and aberration */ + if (iflag & SEFLG_TRUEPOS) + iflag |= (SEFLG_NOGDEFL | SEFLG_NOABERR); + if (iflag & SEFLG_MOSEPH) + epheflag = SEFLG_MOSEPH; + if (iflag & SEFLG_SWIEPH) + epheflag = SEFLG_SWIEPH; + if (iflag & SEFLG_JPLEPH) + epheflag = SEFLG_JPLEPH; + if (epheflag == 0) + epheflag = SEFLG_DEFAULTEPH; +#ifdef NO_JPL + if (epheflag == SEFLG_JPLEPH) + epheflag = SEFLG_SWIEPH; +#endif + /* delete wrong ephe bits from flag */ + iflag = (iflag & ~SEFLG_EPHMASK) | epheflag; + + return iflag; +} + +/********************************************************** + * get fixstar positions + * parameters: + * star name of star or line number in star file + * (start from 1, don't count comment). + * If no error occurs, the name of the star is returned + * in the format trad_name, nomeclat_name + * + * tjd absolute julian day + * iflag s. swecalc(); speed bit does not function + * x pointer for returning the ecliptic coordinates + * serr error return string +**********************************************************/ +int32 FAR PASCAL_CONV swe_fixstar(char *star, double tjd, int32 iflag, + double *xx, char *serr) +{ + int i; + int star_nr = 0; + AS_BOOL isnomclat = FALSE; + size_t cmplen; + double x[6], xxsv[6], xobs[6], *xpo = NULL; + char *cpos[20]; + char sstar[SE_MAX_STNAME + 1]; + char fstar[SE_MAX_STNAME + 1]; + static char slast_stardata[AS_MAXCH]; + static char slast_starname[AS_MAXCH]; + char s[AS_MAXCH + 20], *sp, *sp2; /* 20 byte for SE_STARFILE */ + double ra_s, ra_pm, de_pm, ra, de, t, cosra, cosde, sinra, sinde; + double ra_h, ra_m, de_d, de_m, de_s; + char *sde_d; + double epoch, radv, parall, u; + int line = 0; + int fline = 0; + struct plan_data *pedp = &swed.pldat[SEI_EARTH]; + struct plan_data *psdp = &swed.pldat[SEI_SUNBARY]; + struct epsilon *oe = &swed.oec2000; + int retc; + int32 epheflag, iflgsave; + iflag |= SEFLG_SPEED; /* we need this in order to work correctly */ + iflgsave = iflag; + if (serr != NULL) + *serr = '\0'; +#ifdef TRACE + swi_open_trace(serr); + trace_swe_fixstar(1, star, tjd, iflag, xx, serr); +#endif /* TRACE */ + iflag = plaus_iflag(iflag); + if (iflag & SEFLG_SIDEREAL && !swed.ayana_is_set) + swe_set_sid_mode(SE_SIDM_FAGAN_BRADLEY, 0, 0); + epheflag = iflag & SEFLG_EPHMASK; + /****************************************** + * obliquity of ecliptic 2000 and of date * + ******************************************/ + swi_check_ecliptic(tjd); + /****************************************** + * nutation * + ******************************************/ + swi_check_nutation(tjd, iflag); + strncpy(sstar, star, SE_MAX_STNAME); + sstar[SE_MAX_STNAME] = '\0'; + if (*sstar == ',') { + isnomclat = TRUE; + } else if (isdigit((int) *sstar)) { + star_nr = atoi(sstar); + } else { + /* traditional name of star to lower case */ + for (sp = sstar; *sp != '\0'; sp++) + *sp = tolower((int) *sp); + if ((sp = strchr(sstar, ',')) != NULL) + *sp = '\0'; + } + /*swi_right_trim(sstar);*/ + while ((sp = strchr(sstar, ' ')) != NULL) + swi_strcpy(sp, sp+1); + cmplen = strlen(sstar); + if (cmplen == 0) { + if (serr != NULL) + sprintf(serr, "swe_fixstar(): star name empty"); + retc = ERR; + goto return_err; + } + /* star elements from last call: */ + if (*slast_stardata != '\0' && strcmp(slast_starname, sstar) == 0) { + strcpy(s, slast_stardata); + goto found; + } + /****************************************************** + * Star file + * close to the beginning, a few stars selected by Astrodienst. + * These can be accessed by giving their number instead of a name. + * All other stars can be accessed by name. + * Comment lines start with # and are ignored. + ******************************************************/ + if (swed.fixfp == NULL) { + if ((swed.fixfp = swi_fopen(SEI_FILE_FIXSTAR, SE_STARFILE, swed.ephepath, serr)) == NULL) { + swed.is_old_starfile = TRUE; + if ((swed.fixfp = swi_fopen(SEI_FILE_FIXSTAR, SE_STARFILE_OLD, swed.ephepath, NULL)) == NULL) { + retc = ERR; + goto return_err; + } + } + } + rewind(swed.fixfp); + while (fgets(s, AS_MAXCH, swed.fixfp) != NULL) { + fline++; + if (*s == '#') continue; + line++; + if (star_nr == line) + goto found; + else if (star_nr > 0) + continue; + if ((sp = strchr(s, ',')) == NULL) { + if (serr != NULL) + sprintf(serr, "star file %s damaged at line %d", SE_STARFILE, fline); + retc = ERR; + goto return_err; + } + if (isnomclat) { + if (strncmp(sp, sstar, cmplen) == 0) + goto found; + else + continue; + } + *sp = '\0'; /* cut off first field */ + strncpy(fstar, s, SE_MAX_STNAME); + *sp = ','; + fstar[SE_MAX_STNAME] = '\0'; /* force termination */ + /*swi_right_trim(fstar);*/ + while ((sp = strchr(fstar, ' ')) != NULL) + swi_strcpy(sp, sp+1); + i = strlen(fstar); + if (i < (int) cmplen) + continue; + for (sp2 = fstar; *sp2 != '\0'; sp2++) { + *sp2 = tolower((int) *sp2); + } + if (strncmp(fstar, sstar, cmplen) == 0) + goto found; + } + if (serr != NULL && strlen(star) < AS_MAXCH - 20) + sprintf(serr, "star %s not found", star); + retc = ERR; + goto return_err; + found: + strcpy(slast_stardata, s); + strcpy(slast_starname, sstar); + i = swi_cutstr(s, ",", cpos, 20); + swi_right_trim(cpos[0]); + swi_right_trim(cpos[1]); + if (i < 13) { + if (serr != NULL) + sprintf(serr, "data of star '%s,%s' incomplete", cpos[0], cpos[1]); + retc = ERR; + goto return_err; + } + epoch = atof(cpos[2]); + ra_h = atof(cpos[3]); + ra_m = atof(cpos[4]); + ra_s = atof(cpos[5]); + de_d = atof(cpos[6]); + sde_d = cpos[6]; + de_m = atof(cpos[7]); + de_s = atof(cpos[8]); + ra_pm = atof(cpos[9]); + de_pm = atof(cpos[10]); + radv = atof(cpos[11]); + parall = atof(cpos[12]); + /* return trad. name, nomeclature name */ + if (strlen(cpos[0]) > SE_MAX_STNAME) + cpos[0][SE_MAX_STNAME] = '\0'; + if (strlen(cpos[1]) > SE_MAX_STNAME-1) + cpos[1][SE_MAX_STNAME-1] = '\0'; + sprintf(star, "%s,%s", cpos[0], cpos[1]); + /**************************************** + * position and speed (equinox) + ****************************************/ + /* ra and de in degrees */ + ra = (ra_s / 3600.0 + ra_m / 60.0 + ra_h) * 15.0; + if (strchr(sde_d, '-') == NULL) + de = de_s / 3600.0 + de_m / 60.0 + de_d; + else + de = -de_s / 3600.0 - de_m / 60.0 + de_d; + /* speed in ra and de, degrees per century */ + if (swed.is_old_starfile == TRUE) { + ra_pm = ra_pm * 15 / 3600.0; + de_pm = de_pm / 3600.0; + } else { + ra_pm = ra_pm / 10.0 / 3600.0; + de_pm = de_pm / 10.0 / 3600.0; + parall /= 1000.0; + } + /* parallax, degrees */ + if (parall > 1) + parall = (1 / parall / 3600.0); + else + parall /= 3600; + /* radial velocity in AU per century */ + radv *= KM_S_TO_AU_CTY; + /*printf("ra=%.17f,de=%.17f,ma=%.17f,md=%.17f,pa=%.17f,rv=%.17f\n",ra,de,ra_pm,de_pm,parall,radv);*/ + /* radians */ + ra *= DEGTORAD; + de *= DEGTORAD; + ra_pm *= DEGTORAD; + de_pm *= DEGTORAD; + ra_pm /= cos(de); /* catalogues give proper motion in RA as great circle */ + parall *= DEGTORAD; + x[0] = ra; + x[1] = de; + x[2] = 1; /* -> unit vector */ + /* cartesian */ + swi_polcart(x, x); + /*space motion vector */ + cosra = cos(ra); + cosde = cos(de); + sinra = sin(ra); + sinde = sin(de); + x[3] = -ra_pm * cosde * sinra - de_pm * sinde * cosra + + radv * parall * cosde * cosra; + x[4] = ra_pm * cosde * cosra - de_pm * sinde * sinra + + radv * parall * cosde * sinra; + x[5] = de_pm * cosde + radv * parall * sinde; + x[3] /= 36525; + x[4] /= 36525; + x[5] /= 36525; + /****************************************** + * FK5 + ******************************************/ + if (epoch == 1950) { + swi_FK4_FK5(x, B1950); + swi_precess(x, B1950, J_TO_J2000); + swi_precess(x+3, B1950, J_TO_J2000); + } + /* FK5 to ICRS, if jpl ephemeris is referred to ICRS + * With data that are already ICRS, epoch = 0 */ + if (epoch != 0) { + swi_icrs2fk5(x, iflag, TRUE); + /* with ephemerides < DE403, we now convert to J2000 */ + if (swed.jpldenum < 403) + swi_bias(x, iflag, FALSE); + } +#if 0 + if (((iflag & SEFLG_NOGDEFL) == 0 || (iflag & SEFLG_NOABERR) == 0) + && (iflag & SEFLG_HELCTR) == 0 + && (iflag & SEFLG_BARYCTR) == 0 + && (iflag & SEFLG_TRUEPOS) == 0) +#endif + /**************************************************** + * earth/sun + * for parallax, light deflection, and aberration, + ****************************************************/ + if (!(iflag & SEFLG_BARYCTR) && (!(iflag & SEFLG_HELCTR) || !(iflag & SEFLG_MOSEPH))) { + if ((retc = main_planet(tjd, SEI_EARTH, epheflag, iflag, serr)) != OK) { + /*retc = ERR; + goto return_err;*/ + iflag &= ~(SEFLG_TOPOCTR|SEFLG_HELCTR); + /* on error, we provide barycentric position: */ + iflag |= SEFLG_BARYCTR | SEFLG_TRUEPOS | SEFLG_NOGDEFL; + retc = iflag; + } else { + /* iflag (ephemeris bit) may have changed in main_planet() */ + iflag = swed.pldat[SEI_EARTH].xflgs; + } + } + /************************************ + * observer: geocenter or topocenter + ************************************/ + /* if topocentric position is wanted */ + if (iflag & SEFLG_TOPOCTR) { + if (swed.topd.teval != pedp->teval + || swed.topd.teval == 0) { + if (swi_get_observer(pedp->teval, iflag, DO_SAVE, xobs, serr) != OK) + return ERR; + } else { + for (i = 0; i <= 5; i++) + xobs[i] = swed.topd.xobs[i]; + } + /* barycentric position of observer */ + for (i = 0; i <= 5; i++) + xobs[i] = xobs[i] + pedp->x[i]; + } else if (!(iflag & SEFLG_BARYCTR) && (!(iflag & SEFLG_HELCTR) || !(iflag & SEFLG_MOSEPH))) { + /* barycentric position of geocenter */ + for (i = 0; i <= 5; i++) + xobs[i] = pedp->x[i]; + } + /************************************ + * position and speed at tjd * + ************************************/ + if (epoch == 1950) + t= (tjd - B1950); /* days since 1950.0 */ + else /* epoch == 2000 */ + t= (tjd - J2000); /* days since 2000.0 */ + /* for parallax */ + if ((iflag & SEFLG_HELCTR) && (iflag & SEFLG_MOSEPH)) + xpo = NULL; /* no parallax, if moshier and heliocentric */ + else if (iflag & SEFLG_HELCTR) + xpo = psdp->x; + else if (iflag & SEFLG_BARYCTR) + xpo = NULL; /* no parallax, if barycentric */ + else + xpo = xobs; + if (xpo == NULL) { + for (i = 0; i <= 2; i++) + x[i] += t * x[i+3]; + } else { + for (i = 0; i <= 2; i++) { + x[i] += t * x[i+3] - parall * xpo[i]; + x[i+3] -= parall * xpo[i+3]; + } + } + /************************************ + * relativistic deflection of light * + ************************************/ + for (i = 0; i <= 5; i++) + x[i] *= 10000; /* great distance, to allow + * algorithm used with planets */ + if ((iflag & SEFLG_TRUEPOS) == 0 && (iflag & SEFLG_NOGDEFL) == 0) { + swi_deflect_light(x, 0, iflag & SEFLG_SPEED); + } + /********************************** + * 'annual' aberration of light * + * speed is incorrect !!! * + **********************************/ + if ((iflag & SEFLG_TRUEPOS) == 0 && (iflag & SEFLG_NOABERR) == 0) + swi_aberr_light(x, xpo, iflag & SEFLG_SPEED); + /* ICRS to J2000 */ + if (!(iflag & SEFLG_ICRS) && (swed.jpldenum >= 403 || iflag & SEFLG_BARYCTR)) { + swi_bias(x, iflag, FALSE); + }/**/ + /* save J2000 coordinates; required for sidereal positions */ + for (i = 0; i <= 5; i++) + xxsv[i] = x[i]; + /************************************************ + * precession, equator 2000 -> equator of date * + ************************************************/ + /*x[0] = -0.374018403; x[1] = -0.312548592; x[2] = -0.873168719;*/ + if ((iflag & SEFLG_J2000) == 0) { + swi_precess(x, tjd, J2000_TO_J); + if (iflag & SEFLG_SPEED) + swi_precess_speed(x, tjd, J2000_TO_J); + oe = &swed.oec; + } else + oe = &swed.oec2000; + /************************************************ + * nutation * + ************************************************/ + if (!(iflag & SEFLG_NONUT)) + swi_nutate(x, 0, FALSE); +if (0) { + double r = sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]); + printf("%.17f %.17f %f\n", x[0]/r, x[1]/r, x[2]/r); +} + /************************************************ + * unit vector (distance = 1) * + ************************************************/ + u = sqrt(square_sum(x)); + for (i = 0; i <= 5; i++) + x[i] /= u; + u = sqrt(square_sum(xxsv)); + for (i = 0; i <= 5; i++) + xxsv[i] /= u; + /************************************************ + * set speed = 0, because not correct (aberration) + ************************************************/ + for (i = 3; i <= 5; i++) + x[i] = xxsv[i] = 0; + /************************************************ + * transformation to ecliptic. * + * with sidereal calc. this will be overwritten * + * afterwards. * + ************************************************/ + if ((iflag & SEFLG_EQUATORIAL) == 0) { + swi_coortrf2(x, x, oe->seps, oe->ceps); + if (iflag & SEFLG_SPEED) + swi_coortrf2(x+3, x+3, oe->seps, oe->ceps); + if (!(iflag & SEFLG_NONUT)) { + swi_coortrf2(x, x, swed.nut.snut, swed.nut.cnut); + if (iflag & SEFLG_SPEED) + swi_coortrf2(x+3, x+3, swed.nut.snut, swed.nut.cnut); + } + } + /************************************ + * sidereal positions * + ************************************/ + if (iflag & SEFLG_SIDEREAL) { + /* rigorous algorithm */ + if (swed.sidd.sid_mode & SE_SIDBIT_ECL_T0) { + if (swi_trop_ra2sid_lon(xxsv, x, xxsv, iflag, serr) != OK) + return ERR; + if (iflag & SEFLG_EQUATORIAL) + for (i = 0; i <= 5; i++) + x[i] = xxsv[i]; + /* project onto solar system equator */ + } else if (swed.sidd.sid_mode & SE_SIDBIT_SSY_PLANE) { + if (swi_trop_ra2sid_lon_sosy(xxsv, x, xxsv, iflag, serr) != OK) + return ERR; + if (iflag & SEFLG_EQUATORIAL) + for (i = 0; i <= 5; i++) + x[i] = xxsv[i]; + /* traditional algorithm */ + } else { + swi_cartpol_sp(x, x); + x[0] -= swe_get_ayanamsa(tjd) * DEGTORAD; + swi_polcart_sp(x, x); + } + } + /************************************************ + * transformation to polar coordinates * + ************************************************/ + if ((iflag & SEFLG_XYZ) == 0) + swi_cartpol_sp(x, x); + /********************** + * radians to degrees * + **********************/ + if ((iflag & SEFLG_RADIANS) == 0 && (iflag & SEFLG_XYZ) == 0) { + for (i = 0; i < 2; i++) { + x[i] *= RADTODEG; + x[i+3] *= RADTODEG; + } + } + for (i = 0; i <= 5; i++) + xx[i] = x[i]; + /* if no ephemeris has been specified, do not return chosen ephemeris */ + if ((iflgsave & SEFLG_EPHMASK) == 0) + iflag = iflag & ~SEFLG_DEFAULTEPH; + iflag = iflag & ~SEFLG_SPEED; +#ifdef TRACE + trace_swe_fixstar(2, star, tjd, iflag, xx, serr); +#endif + return iflag; + return_err: + for (i = 0; i <= 5; i++) + xx[i] = 0; +#ifdef TRACE + trace_swe_fixstar(2, star, tjd, iflag, xx, serr); +#endif + return retc; +} + +int32 FAR PASCAL_CONV swe_fixstar_ut(char *star, double tjd_ut, int32 iflag, + double *xx, char *serr) +{ + return swe_fixstar(star, tjd_ut + swe_deltat(tjd_ut), iflag, xx, serr); +} + +/********************************************************** + * get fixstar magnitude + * parameters: + * star name of star or line number in star file + * (start from 1, don't count comment). + * If no error occurs, the name of the star is returned + * in the format trad_name, nomeclat_name + * + * mag pointer to a double, for star magnitude + * serr error return string +**********************************************************/ +int32 FAR PASCAL_CONV swe_fixstar_mag(char *star, double *mag, char *serr) +{ + int i; + int star_nr = 0; + AS_BOOL isnomclat = FALSE; + size_t cmplen; + char *cpos[20]; + char sstar[SE_MAX_STNAME + 1]; + char fstar[SE_MAX_STNAME + 1]; + char s[AS_MAXCH + 20], *sp, *sp2; /* 20 byte for SE_STARFILE */ + int line = 0; + int fline = 0; + int retc; + if (serr != NULL) + *serr = '\0'; + /****************************************************** + * Star file + * close to the beginning, a few stars selected by Astrodienst. + * These can be accessed by giving their number instead of a name. + * All other stars can be accessed by name. + * Comment lines start with # and are ignored. + ******************************************************/ + if (swed.fixfp == NULL) { + if ((swed.fixfp = swi_fopen(SEI_FILE_FIXSTAR, SE_STARFILE, swed.ephepath, serr)) == NULL) { + swed.is_old_starfile = TRUE; + if ((swed.fixfp = swi_fopen(SEI_FILE_FIXSTAR, SE_STARFILE_OLD, swed.ephepath, NULL)) == NULL) { + retc = ERR; + goto return_err; + } + } + } + rewind(swed.fixfp); + strncpy(sstar, star, SE_MAX_STNAME); + sstar[SE_MAX_STNAME] = '\0'; + if (*sstar == ',') { + isnomclat = TRUE; + } else if (isdigit((int) *sstar)) { + star_nr = atoi(sstar); + } else { + /* traditional name of star to lower case */ + for (sp = sstar; *sp != '\0'; sp++) + *sp = tolower((int) *sp); + if ((sp = strchr(sstar, ',')) != NULL) + *sp = '\0'; + } + swi_right_trim(sstar); + cmplen = strlen(sstar); + if (cmplen == 0) { + if (serr != NULL) + sprintf(serr, "swe_fixstar_mag(): star name empty"); + retc = ERR; + goto return_err; + } + while (fgets(s, AS_MAXCH, swed.fixfp) != NULL) { + fline++; + if (*s == '#') continue; + line++; + if (star_nr == line) + goto found; + else if (star_nr > 0) + continue; + if ((sp = strchr(s, ',')) == NULL) { + if (serr != NULL) + sprintf(serr, "star file %s damaged at line %d", SE_STARFILE, fline); + retc = ERR; + goto return_err; + } + if (isnomclat) { + if (strncmp(sp, sstar, cmplen) == 0) + goto found; + else + continue; + } + *sp = '\0'; /* cut off first field */ + strncpy(fstar, s, SE_MAX_STNAME); + *sp = ','; + fstar[SE_MAX_STNAME] = '\0'; /* force termination */ + swi_right_trim(fstar); + i = strlen(fstar); + if (i < (int) cmplen) + continue; + for (sp2 = fstar; *sp2 != '\0'; sp2++) { + *sp2 = tolower((int) *sp2); + } + if (strncmp(fstar, sstar, cmplen) == 0) + goto found; + } + if (serr != NULL && strlen(star) < AS_MAXCH - 20) + sprintf(serr, "star %s not found", star); + retc = ERR; + goto return_err; + found: + i = swi_cutstr(s, ",", cpos, 20); + swi_right_trim(cpos[0]); + swi_right_trim(cpos[1]); + if (i < 13) { + if (serr != NULL) + sprintf(serr, "data of star '%s,%s' incomplete", cpos[0], cpos[1]); + retc = ERR; + goto return_err; + } + *mag = atof(cpos[13]); + /* return trad. name, nomeclature name */ + if (strlen(cpos[0]) > SE_MAX_STNAME) + cpos[0][SE_MAX_STNAME] = '\0'; + if (strlen(cpos[1]) > SE_MAX_STNAME-1) + cpos[1][SE_MAX_STNAME-1] = '\0'; + sprintf(star, "%s,%s", cpos[0], cpos[1]); + return OK; + return_err: + *mag = 0; + return retc; +} + +#if 0 +int swe_fixstar(char *star, double tjd, int32 iflag, double *xx, char *serr) +{ + int i, j; + int32 iflgcoor = SEFLG_EQUATORIAL | SEFLG_XYZ | SEFLG_RADIANS; + int retc; + double *xs, x0[6], x2[6]; + double dt; + /* only one speed flag */ + if (iflag & SEFLG_SPEED3) + iflag |= SEFLG_SPEED; + /* cartesian flag excludes radians flag */ + if ((iflag & SEFLG_XYZ) && (iflag & SEFLG_RADIANS)) + iflag = iflag & ~SEFLG_RADIANS; + if ((iflag & SEFLG_SPEED) == 0) { + /* without speed: */ + if ((retc = swecalc(tjd, ipl, iflag, xx, serr)) == ERR) + goto return_error; + } else { + /* with speed from three calls of fixstar() */ + dt = PLAN_SPEED_INTV; + if ((retc = fixstar(star, tjd-dt, iflag, x0, serr)) == ERR) + goto return_error; + if ((retc = fixstar(star, tjd+dt, iflag, x2, serr)) == ERR) + goto return_error; + if ((retc = fixstar(star, tjd, iflag, xx, serr)) == ERR) + goto return_error; + denormalize_positions(x0, xx, x2); /* nonsense !!!!!!!!!!! */ + calc_speed(x0, xx, x2, dt); + } + return retc; + return_error: + for (i = 0; i < 6; i++) + xx[i] = 0; + return ERR; +} + +#endif + + +char *FAR PASCAL_CONV swe_get_planet_name(int ipl, char *s) +{ + int i; + int32 retc; + double xp[6]; +#ifdef TRACE + swi_open_trace(NULL); + trace_swe_get_planet_name(1, ipl, s); +#endif + /* function calls for Pluto with asteroid number 134340 + * are treated as calls for Pluto as main body SE_PLUTO */ + if (ipl == SE_AST_OFFSET + 134340) + ipl = SE_PLUTO; + if (ipl != 0 && ipl == swed.i_saved_planet_name) { + strcpy(s, swed.saved_planet_name); + return s; + } + switch(ipl) { + case SE_SUN: + strcpy(s, SE_NAME_SUN); + break; + case SE_MOON: + strcpy(s, SE_NAME_MOON); + break; + case SE_MERCURY: + strcpy(s, SE_NAME_MERCURY); + break; + case SE_VENUS: + strcpy(s, SE_NAME_VENUS); + break; + case SE_MARS: + strcpy(s, SE_NAME_MARS); + break; + case SE_JUPITER: + strcpy(s, SE_NAME_JUPITER); + break; + case SE_SATURN: + strcpy(s, SE_NAME_SATURN); + break; + case SE_URANUS: + strcpy(s, SE_NAME_URANUS); + break; + case SE_NEPTUNE: + strcpy(s, SE_NAME_NEPTUNE); + break; + case SE_PLUTO: + strcpy(s, SE_NAME_PLUTO); + break; + case SE_MEAN_NODE: + strcpy(s, SE_NAME_MEAN_NODE); + break; + case SE_TRUE_NODE: + strcpy(s, SE_NAME_TRUE_NODE); + break; + case SE_MEAN_APOG: + strcpy(s, SE_NAME_MEAN_APOG); + break; + case SE_OSCU_APOG: + strcpy(s, SE_NAME_OSCU_APOG); + break; + case SE_INTP_APOG: + strcpy(s, SE_NAME_INTP_APOG); + break; + case SE_INTP_PERG: + strcpy(s, SE_NAME_INTP_PERG); + break; + case SE_EARTH: + strcpy(s, SE_NAME_EARTH); + break; + case SE_CHIRON: + case SE_AST_OFFSET + MPC_CHIRON: + strcpy(s, SE_NAME_CHIRON); + break; + case SE_PHOLUS: + case SE_AST_OFFSET + MPC_PHOLUS: + strcpy(s, SE_NAME_PHOLUS); + break; + case SE_CERES: + case SE_AST_OFFSET + MPC_CERES: + strcpy(s, SE_NAME_CERES); + break; + case SE_PALLAS: + case SE_AST_OFFSET + MPC_PALLAS: + strcpy(s, SE_NAME_PALLAS); + break; + case SE_JUNO: + case SE_AST_OFFSET + MPC_JUNO: + strcpy(s, SE_NAME_JUNO); + break; + case SE_VESTA: + case SE_AST_OFFSET + MPC_VESTA: + strcpy(s, SE_NAME_VESTA); + break; + default: + /* fictitious planets */ + if (ipl >= SE_FICT_OFFSET && ipl <= SE_FICT_MAX) { + swi_get_fict_name(ipl - SE_FICT_OFFSET, s); + break; + } + /* asteroids */ + if (ipl > SE_AST_OFFSET) { + /* if name is already available */ + if (ipl == swed.fidat[SEI_FILE_ANY_AST].ipl[0]) + strcpy(s, swed.fidat[SEI_FILE_ANY_AST].astnam); + /* else try to get it from ephemeris file */ + else { + retc = sweph(J2000, ipl, SEI_FILE_ANY_AST, 0, NULL, NO_SAVE, xp, NULL); + if (retc != ERR && retc != NOT_AVAILABLE) + strcpy(s, swed.fidat[SEI_FILE_ANY_AST].astnam); + else + sprintf(s, "%d: not found", ipl - SE_AST_OFFSET); + } + /* If there is a provisional designation only in ephemeris file, + * we look for a name in seasnam.txt, which can be updated by + * the user. + * Some old ephemeris files return a '?' in the first position. + * There are still a couple of unnamed bodies that got their + * provisional designation before 1925, when the current method + * of provisional designations was introduced. They have an 'A' + * as the first character, e.g. A924 RC. + * The file seasnam.txt may contain comments starting with '#'. + * There must be at least two columns: + * 1. asteroid catalog number + * 2. asteroid name + * The asteroid number may or may not be in brackets + */ + if (s[0] == '?' || isdigit((int) s[1])) { + int ipli = (int) (ipl - SE_AST_OFFSET), iplf = 0; + FILE *fp; + char si[AS_MAXCH], *sp, *sp2; + if ((fp = swi_fopen(-1, SE_ASTNAMFILE, swed.ephepath, NULL)) != NULL) { + while(ipli != iplf && (sp = fgets(si, AS_MAXCH, fp)) != NULL) { + while (*sp == ' ' || *sp == '\t' + || *sp == '(' || *sp == '[' || *sp == '{') + sp++; + if (*sp == '#' || *sp == '\r' || *sp == '\n' || *sp == '\0') + continue; + /* catalog number of body of current line */ + iplf = atoi(sp); + if (ipli != iplf) + continue; + /* set pointer after catalog number */ + sp = strpbrk(sp, " \t"); + if (sp == NULL) + continue; /* there is no name */ + while (*sp == ' ' || *sp == '\t') + sp++; + sp2 = strpbrk(sp, "#\r\n"); + if (sp2 != NULL) + *sp2 = '\0'; + if (*sp == '\0') + continue; + swi_right_trim(sp); + strcpy(s, sp); + } + fclose(fp); + } + } + } else { + i = ipl; + sprintf(s, "%d", i); + } + break; + } +#ifdef TRACE + swi_open_trace(NULL); + trace_swe_get_planet_name(2, ipl, s); +#endif + if (strlen(s) < 80) { + swed.i_saved_planet_name = ipl; + strcpy(swed.saved_planet_name, s); + } + return s; +} + +char *FAR PASCAL_CONV swe_get_ayanamsa_name(int32 isidmode) +{ + if (isidmode < SE_NSIDM_PREDEF) + return ayanamsa_name[isidmode]; + return NULL; +} + +#ifdef TRACE +static void trace_swe_calc(int swtch, double tjd, int ipl, int32 iflag, double *xx, char *serr) +{ + if (swi_trace_count >= TRACE_COUNT_MAX) + return; + switch(swtch) { + case 1: + if (swi_fp_trace_c != NULL) { + fputs("\n/*SWE_CALC*/\n", swi_fp_trace_c); + fprintf(swi_fp_trace_c, " tjd = %.9f;", tjd); + fprintf(swi_fp_trace_c, " ipl = %d;", ipl); + fprintf(swi_fp_trace_c, " iflag = %d;\n", iflag); + fprintf(swi_fp_trace_c, " iflgret = swe_calc(tjd, ipl, iflag, xx, serr);"); + fprintf(swi_fp_trace_c, " /* xx = %d */\n", (int32) xx); + fflush(swi_fp_trace_c); + } + break; + case 2: + if (swi_fp_trace_c != NULL) { + fputs(" printf(\"swe_calc: %f\\t%d\\t%d\\t%f\\t%f\\t%f\\t%f\\t%f\\t%f\\t\", ", swi_fp_trace_c); + fputs("\n\ttjd, ipl, iflgret, xx[0], xx[1], xx[2], xx[3], xx[4], xx[5]);\n", swi_fp_trace_c); + fputs(" if (*serr != '\\0')", swi_fp_trace_c); + fputs(" printf(serr);", swi_fp_trace_c); + fputs(" printf(\"\\n\");\n", swi_fp_trace_c); + fflush(swi_fp_trace_c); + } + if (swi_fp_trace_out != NULL) { + fprintf(swi_fp_trace_out, "swe_calc: %f\t%d\t%d\t%f\t%f\t%f\t%f\t%f\t%f\t", + tjd, ipl, iflag, xx[0], xx[1], xx[2], xx[3], xx[4], xx[5]); + if (serr != NULL && *serr != '\0') { + fputs(serr, swi_fp_trace_out); + } + fputs("\n", swi_fp_trace_out); + fflush(swi_fp_trace_out); + } + break; + default: + break; + } +} + +static void trace_swe_fixstar(int swtch, char *star, double tjd, int32 iflag, double *xx, char *serr) +{ + if (swi_trace_count >= TRACE_COUNT_MAX) + return; + switch(swtch) { + case 1: + if (swi_fp_trace_c != NULL) { + fputs("\n/*SWE_FIXSTAR*/\n", swi_fp_trace_c); + fprintf(swi_fp_trace_c, " strcpy(star, \"%s\");", star); + fprintf(swi_fp_trace_c, " tjd = %.9f;", tjd); + fprintf(swi_fp_trace_c, " iflag = %d;\n", iflag); + fprintf(swi_fp_trace_c, " iflgret = swe_fixstar(star, tjd, iflag, xx, serr);"); + fprintf(swi_fp_trace_c, " /* xx = %d */\n", (int32) xx); + fflush(swi_fp_trace_c); + } + break; + case 2: + if (swi_fp_trace_c != NULL) { + fputs(" printf(\"swe_fixstar: %s\\t%f\\t%d\\t%f\\t%f\\t%f\\t%f\\t%f\\t%f\\t\", ", swi_fp_trace_c); + fputs("\n\tstar, tjd, iflgret, xx[0], xx[1], xx[2], xx[3], xx[4], xx[5]);\n", swi_fp_trace_c);/**/ + fputs(" if (*serr != '\\0')", swi_fp_trace_c); + fputs(" printf(serr);", swi_fp_trace_c); + fputs(" printf(\"\\n\");\n", swi_fp_trace_c); + fflush(swi_fp_trace_c); + } + if (swi_fp_trace_out != NULL) { + fprintf(swi_fp_trace_out, "swe_fixstar: %s\t%f\t%d\t%f\t%f\t%f\t%f\t%f\t%f\t", + star, tjd, iflag, xx[0], xx[1], xx[2], xx[3], xx[4], xx[5]); + if (serr != NULL && *serr != '\0') { + fputs(serr, swi_fp_trace_out); + } + fputs("\n", swi_fp_trace_out); + fflush(swi_fp_trace_out); + } + break; + default: + break; + } +} + +static void trace_swe_get_planet_name(int swtch, int ipl, char *s) +{ + if (swi_trace_count >= TRACE_COUNT_MAX) + return; + switch(swtch) { + case 1: + if (swi_fp_trace_c != NULL) { + fputs("\n/*SWE_GET_PLANET_NAME*/\n", swi_fp_trace_c); + fprintf(swi_fp_trace_c, " ipl = %d;\n", ipl); + fprintf(swi_fp_trace_c, " swe_get_planet_name(ipl, s);"); + fprintf(swi_fp_trace_c, " /* s = %d */\n", (int32) s); + fflush(swi_fp_trace_c); + } + break; + case 2: + if (swi_fp_trace_c != NULL) { + fputs(" printf(\"swe_get_planet_name: %d\\t%s\\t\\n\", ", swi_fp_trace_c); + fputs("ipl, s);\n", swi_fp_trace_c);/**/ + fflush(swi_fp_trace_c); + } + if (swi_fp_trace_out != NULL) { + fprintf(swi_fp_trace_out, "swe_get_planet_name: %d\t%s\t\n", ipl, s); + fflush(swi_fp_trace_out); + } + break; + default: + break; + } +} + +#endif + +/* set geographic position and altitude of observer */ +void FAR PASCAL_CONV swe_set_topo(double geolon, double geolat, double geoalt) +{ + swed.topd.geolon = geolon; + swed.topd.geolat = geolat; + swed.topd.geoalt = geoalt; + swed.geopos_is_set = TRUE; + /* to force new calculation of observer position vector */ + swed.topd.teval = 0; + /* to force new calculation of light-time etc. + */ + swi_force_app_pos_etc(); +} + +void swi_force_app_pos_etc() +{ + int i; + for (i = 0; i < SEI_NPLANETS; i++) + swed.pldat[i].xflgs = -1; + for (i = 0; i < SEI_NNODE_ETC; i++) + swed.nddat[i].xflgs = -1; + for (i = 0; i < SE_NPLANETS; i++) { + swed.savedat[i].tsave = 0; + swed.savedat[i].iflgsave = -1; + } +} + +int swi_get_observer(double tjd, int32 iflag, + AS_BOOL do_save, double *xobs, char *serr) +{ + int i; + double sidt, delt, tjd_ut, eps, nut, nutlo[2]; + double f = EARTH_OBLATENESS; + double re = EARTH_RADIUS; + double cosfi, sinfi, cc, ss, cosl, sinl, h; + if (!swed.geopos_is_set) { + if (serr != NULL) + strcpy(serr, "geographic position has not been set"); + return ERR; + } + /* geocentric position of observer depends on sidereal time, + * which depends on UT. + * compute UT from ET. this UT will be slightly different + * from the user's UT, but this difference is extremely small. + */ + delt = swe_deltat(tjd); + tjd_ut = tjd - delt; + if (swed.oec.teps == tjd && swed.nut.tnut == tjd) { + eps = swed.oec.eps; + nutlo[1] = swed.nut.nutlo[1]; + nutlo[0] = swed.nut.nutlo[0]; + } else { + eps = swi_epsiln(tjd); + if (!(iflag & SEFLG_NONUT)) + swi_nutation(tjd, nutlo); + } + if (iflag & SEFLG_NONUT) { + nut = 0; + } else { + eps += nutlo[1]; + nut = nutlo[0]; + } + /* mean or apparent sidereal time, depending on whether or + * not SEFLG_NONUT is set */ + sidt = swe_sidtime0(tjd_ut, eps, nut); + sidt *= 15; /* in degrees */ + /* length of position and speed vectors; + * the height above sea level must be taken into account. + * with the moon, an altitude of 3000 m makes a difference + * of about 2 arc seconds. + * height is referred to the average sea level. however, + * the spheroid (geoid), which is defined by the average + * sea level (or rather by all points of same gravitational + * potential), is of irregular shape and cannot easily + * be taken into account. therefore, we refer height to + * the surface of the ellipsoid. the resulting error + * is below 500 m, i.e. 0.2 - 0.3 arc seconds with the moon. + */ + cosfi = cos(swed.topd.geolat * DEGTORAD); + sinfi = sin(swed.topd.geolat * DEGTORAD); + cc= 1 / sqrt(cosfi * cosfi + (1-f) * (1-f) * sinfi * sinfi); + ss= (1-f) * (1-f) * cc; + /* neglect polar motion (displacement of a few meters), as long as + * we use the earth ellipsoid */ + /* ... */ + /* add sidereal time */ + cosl = cos((swed.topd.geolon + sidt) * DEGTORAD); + sinl = sin((swed.topd.geolon + sidt) * DEGTORAD); + h = swed.topd.geoalt; + xobs[0] = (re * cc + h) * cosfi * cosl; + xobs[1] = (re * cc + h) * cosfi * sinl; + xobs[2] = (re * ss + h) * sinfi; + /* polar coordinates */ + swi_cartpol(xobs, xobs); + /* speed */ + xobs[3] = EARTH_ROT_SPEED; + xobs[4] = xobs[5] = 0; + swi_polcart_sp(xobs, xobs); + /* to AUNIT */ + for (i = 0; i <= 5; i++) + xobs[i] /= AUNIT; + /* subtract nutation, set backward flag */ + if (!(iflag & SEFLG_NONUT)) { + swi_coortrf2(xobs, xobs, -swed.nut.snut, swed.nut.cnut); + if (iflag & SEFLG_SPEED) + swi_coortrf2(xobs+3, xobs+3, -swed.nut.snut, swed.nut.cnut); + swi_nutate(xobs, iflag, TRUE); + } + /* precess to J2000 */ + swi_precess(xobs, tjd, J_TO_J2000); + if (iflag & SEFLG_SPEED) + swi_precess_speed(xobs, tjd, J_TO_J2000); + /* neglect frame bias (displacement of 45cm) */ + /* ... */ + /* save */ + if (do_save) { + for (i = 0; i <= 5; i++) + swed.topd.xobs[i] = xobs[i]; + swed.topd.teval = tjd; + swed.topd.tjd_ut = tjd_ut; /* -> save area */ + } + return OK; +} + +/* Equation of Time + * + * The function returns the difference between + * local apparent and local mean time in days. + * E = LAT - LMT + * Input variable tjd is ET. + * Algorithm according to Meeus, German, p. 190ff. + */ +int FAR PASCAL_CONV swe_time_equ(double tjd, double *E, char *serr) +{ + double L0, dpsi, eps, x[6], nutlo[2]; + double tau = (tjd - J2000) / 365250; + double tau2 = tau * tau; + double tau3 = tau * tau2; + double tau4 = tau * tau3; + double tau5 = tau * tau4; + L0 = 280.4664567 + swe_degnorm(tau * 360007.6982779) + + tau2 * 0.03032028 + + tau3 * 1 / 49931 + - tau4 * 1 / 15299 + - tau5 * 1 / 1988000; + swi_nutation(tjd, nutlo); + eps = (swi_epsiln(tjd) + nutlo[1]) * RADTODEG; + dpsi = nutlo[0] * RADTODEG; + if (swe_calc(tjd, SE_SUN, SEFLG_EQUATORIAL, x, serr) == ERR) + return ERR; + *E = swe_degnorm(L0 - 0.0057183 - x[0] + dpsi * cos(eps * DEGTORAD)); + if (*E > 180) + *E -= 360; + *E *= 4 / 1440.0; + return OK; +} diff --git a/swe/src/sweph.h b/swe/src/sweph.h new file mode 100644 index 0000000..f9c1490 --- /dev/null +++ b/swe/src/sweph.h @@ -0,0 +1,579 @@ +/************************************************************ + $Header: /home/dieter/sweph/RCS/sweph.h,v 1.74 2008/06/16 10:07:20 dieter Exp $ + definitions and constants SWISSEPH + + Authors: Dieter Koch and Alois Treindl, Astrodienst Zurich + +************************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + +/* + * move over from swephexp.h + */ + +#define SE_VERSION "1.79.00" + +#define J2000 2451545.0 /* 2000 January 1.5 */ +#define B1950 2433282.42345905 /* 1950 January 0.923 */ +#define J1900 2415020.0 /* 1900 January 0.5 */ + +#define MPC_CERES 1 +#define MPC_PALLAS 2 +#define MPC_JUNO 3 +#define MPC_VESTA 4 +#define MPC_CHIRON 2060 +#define MPC_PHOLUS 5145 + +#define SE_NAME_SUN "Sun" +#define SE_NAME_MOON "Moon" +#define SE_NAME_MERCURY "Mercury" +#define SE_NAME_VENUS "Venus" +#define SE_NAME_MARS "Mars" +#define SE_NAME_JUPITER "Jupiter" +#define SE_NAME_SATURN "Saturn" +#define SE_NAME_URANUS "Uranus" +#define SE_NAME_NEPTUNE "Neptune" +#define SE_NAME_PLUTO "Pluto" +#define SE_NAME_MEAN_NODE "mean Node" +#define SE_NAME_TRUE_NODE "true Node" +#define SE_NAME_MEAN_APOG "mean Apogee" +#define SE_NAME_OSCU_APOG "osc. Apogee" +#define SE_NAME_INTP_APOG "intp. Apogee" +#define SE_NAME_INTP_PERG "intp. Perigee" +#define SE_NAME_EARTH "Earth" +#define SE_NAME_CERES "Ceres" +#define SE_NAME_PALLAS "Pallas" +#define SE_NAME_JUNO "Juno" +#define SE_NAME_VESTA "Vesta" +#define SE_NAME_CHIRON "Chiron" +#define SE_NAME_PHOLUS "Pholus" + + +#define SE_NAME_CUPIDO "Cupido" +#define SE_NAME_HADES "Hades" +#define SE_NAME_ZEUS "Zeus" +#define SE_NAME_KRONOS "Kronos" +#define SE_NAME_APOLLON "Apollon" +#define SE_NAME_ADMETOS "Admetos" +#define SE_NAME_VULKANUS "Vulkanus" +#define SE_NAME_POSEIDON "Poseidon" +#define SE_NAME_ISIS "Isis" +#define SE_NAME_NIBIRU "Nibiru" +#define SE_NAME_HARRINGTON "Harrington" +#define SE_NAME_NEPTUNE_LEVERRIER "Leverrier" +#define SE_NAME_NEPTUNE_ADAMS "Adams" +#define SE_NAME_PLUTO_LOWELL "Lowell" +#define SE_NAME_PLUTO_PICKERING "Pickering" +#define SE_NAME_VULCAN "Vulcan" +#define SE_NAME_WHITE_MOON "White Moon" + +/* for delta t: intrinsic tidal acceleration in the mean motion of the moon, + * not given in the parameters list of the ephemeris files but computed + * by Chapront/Chapront-Touzé/Francou A&A 387 (2002), p. 705. + */ +#define SE_TIDAL_DE200 (-23.8946) +#define SE_TIDAL_DE403 (-25.580) /* was (-25.8) until V. 1.76.2 */ +#define SE_TIDAL_DE404 (-25.580) /* was (-25.8) until V. 1.76.2 */ +#define SE_TIDAL_DE405 (-25.826) /* was (-25.7376) until V. 1.76.2 */ +#define SE_TIDAL_DE406 (-25.826) /* was (-25.7376) until V. 1.76.2 */ + +#define SE_TIDAL_26 (-26.0) + +#define SE_TIDAL_DEFAULT SE_TIDAL_DE406 + +/* + * earlier content + */ + +#define PI M_PI /* 3.14159265358979323846, math.h */ +#define TWOPI (2.0 * PI) + +#define ENDMARK -99 + +#define SEI_EPSILON -2 +#define SEI_NUTATION -1 +#define SEI_EMB 0 +#define SEI_EARTH 0 +#define SEI_SUN 0 +#define SEI_MOON 1 +#define SEI_MERCURY 2 +#define SEI_VENUS 3 +#define SEI_MARS 4 +#define SEI_JUPITER 5 +#define SEI_SATURN 6 +#define SEI_URANUS 7 +#define SEI_NEPTUNE 8 +#define SEI_PLUTO 9 +#define SEI_SUNBARY 10 /* barycentric sun */ +#define SEI_ANYBODY 11 /* any asteroid */ +#define SEI_CHIRON 12 +#define SEI_PHOLUS 13 +#define SEI_CERES 14 +#define SEI_PALLAS 15 +#define SEI_JUNO 16 +#define SEI_VESTA 17 + +#define SEI_NPLANETS 18 + +#define SEI_MEAN_NODE 0 +#define SEI_TRUE_NODE 1 +#define SEI_MEAN_APOG 2 +#define SEI_OSCU_APOG 3 +#define SEI_INTP_APOG 4 +#define SEI_INTP_PERG 5 + +#define SEI_NNODE_ETC 6 + +#define SEI_FLG_HELIO 1 +#define SEI_FLG_ROTATE 2 +#define SEI_FLG_ELLIPSE 4 +#define SEI_FLG_EMBHEL 8 /* TRUE, if heliocentric earth is given + * instead of barycentric sun + * i.e. bary sun is computed from + * barycentric and heliocentric earth */ + +#define SEI_FILE_PLANET 0 +#define SEI_FILE_MOON 1 +#define SEI_FILE_MAIN_AST 2 +#define SEI_FILE_ANY_AST 3 +#define SEI_FILE_FIXSTAR 4 + +#if 0 +#define SEI_FILE_TEST_ENDIAN (97L * 65536L + 98L * 256L + 99L) /*abc*/ +#endif +#define SEI_FILE_TEST_ENDIAN (0x616263L) /* abc*/ +#define SEI_FILE_BIGENDIAN 0 +#define SEI_FILE_NOREORD 0 +#define SEI_FILE_LITENDIAN 1 +#define SEI_FILE_REORD 2 + +#define SEI_FILE_NMAXPLAN 50 +#define SEI_FILE_EFPOSBEGIN 500 + +#define SE_FILE_SUFFIX "se1" + +#define SEI_NEPHFILES 7 +#define SEI_CURR_FPOS -1 + +/* Chiron's orbit becomes chaotic + * before 720 AD and after 4606 AD, because of close encounters + * with Saturn. Accepting a maximum error of 5 degrees, + * the ephemeris is good between the following dates: + */ +#define CHIRON_START 1958470.5 /* 1.1.650 */ +#define CHIRON_END 3419437.5 /* 1.1.4650 */ + +/* Pholus's orbit is unstable as well, because he sometimes + * approaches Saturn. + * Accepting a maximum error of 5 degrees, + * the ephemeris is good after the following date: + */ +#define PHOLUS_START 314845.5 /* 1.1.-3850 */ + +#define MOSHPLEPH_START 625000.5 +#define MOSHPLEPH_END 2818000.5 +#define MOSHLUEPH_START 625000.5 +#define MOSHLUEPH_END 2818000.5 +#define MOSHNDEPH_START -254900.5 /* 14 Feb -5410 00:00 ET jul.cal.*/ +#define MOSHNDEPH_END 3697000.5 /* 11 Dec 5409 00:00 ET, greg. cal */ +/* +#define MOSHPLEPH_START -225000.5 +#define MOSHPLEPH_END 3600000.5 +#define MOSHLUEPH_START -225000.5 +#define MOSHLUEPH_END 3600000.5 +*/ +#if FALSE /* Alois commented out, not used anywhere */ +#define JPLEPH_START 625307.5 /* about -3000 (DE406) */ +#define JPLEPH_END 2816848.5 /* about 3000 (DE406) */ +#define SWIEPH_START 625614.927151 +#define SWIEPH_END 2813641.5 +#define ALLEPH_START MOSHPLEPH_START +#define ALLEPH_END MOSHPLEPH_END +#define BEG_YEAR (-3000) +#define END_YEAR 3000 +#endif + +#define MAXORD 40 + +#define NCTIES 6.0 /* number of centuries per eph. file */ + +#define OK (0) +#define ERR (-1) +#define NOT_AVAILABLE (-2) +#define BEYOND_EPH_LIMITS (-3) + +#define J_TO_J2000 1 +#define J2000_TO_J -1 + +/* we always use Astronomical Almanac constants, if available */ +#define MOON_MEAN_DIST 384400000.0 /* in m, AA 1996, F2 */ +#define MOON_MEAN_INCL 5.1453964 /* AA 1996, D2 */ +#define MOON_MEAN_ECC 0.054900489 /* AA 1996, F2 */ +/* #define SUN_EARTH_MRAT 328900.561400 Su/(Ea+Mo) AA 2006 K7 */ +#define SUN_EARTH_MRAT 332946.050895 /* Su / (Ea only) AA 2006 K7 */ +#define EARTH_MOON_MRAT (1 / 0.0123000383) /* AA 2006, K7 */ +#if 0 +#define EARTH_MOON_MRAT 81.30056 /* de406 */ +#endif +#define AUNIT 1.49597870691e+11 /* au in meters, AA 2006 K6 */ +#define CLIGHT 2.99792458e+8 /* m/s, AA 1996 K6 */ +#if 0 +#define HELGRAVCONST 1.32712438e+20 /* G * M(sun), m^3/sec^2, AA 1996 K6 */ +#endif +#define HELGRAVCONST 1.32712440017987e+20 /* G * M(sun), m^3/sec^2, AA 2006 K6 */ +#define GEOGCONST 3.98600448e+14 /* G * M(earth) m^3/sec^2, AA 1996 K6 */ +#define KGAUSS 0.01720209895 /* Gaussian gravitational constant K6 */ +#define SUN_RADIUS (959.63 / 3600 * DEGTORAD) /* Meeus germ. p 391 */ +#define EARTH_RADIUS 6378136.6 /* AA 2006 K6 */ +/*#define EARTH_OBLATENESS (1.0/ 298.257223563) * AA 1998 K13 */ +#define EARTH_OBLATENESS (1.0/ 298.25642) /* AA 2006 K6 */ +#define EARTH_ROT_SPEED (7.2921151467e-5 * 86400) /* in rad/day, expl. suppl., p 162 */ + +#define LIGHTTIME_AUNIT (499.0047838061/3600/24) /* 8.3167 minutes (days), AA 2006 K6 */ + +/* node of ecliptic measured on ecliptic 2000 */ +#define SSY_PLANE_NODE_E2000 (107.582569 * DEGTORAD) +/* node of ecliptic measured on solar system rotation plane */ +#define SSY_PLANE_NODE (107.58883388 * DEGTORAD) +/* inclination of ecliptic against solar system rotation plane */ +#define SSY_PLANE_INCL (1.578701 * DEGTORAD) + +#define KM_S_TO_AU_CTY 21.095 /* km/s to AU/century */ +#define MOON_SPEED_INTV 0.00005 /* 4.32 seconds (in days) */ +#define PLAN_SPEED_INTV 0.0001 /* 8.64 seconds (in days) */ +#define MEAN_NODE_SPEED_INTV 0.001 +#define NODE_CALC_INTV 0.0001 +#define NODE_CALC_INTV_MOSH 0.1 +#define NUT_SPEED_INTV 0.0001 +#define DEFL_SPEED_INTV 0.0000005 + +#define SE_LAPSE_RATE 0.0065 /* deg K / m, for refraction */ + +#define square_sum(x) (x[0]*x[0]+x[1]*x[1]+x[2]*x[2]) +#define dot_prod(x,y) (x[0]*y[0]+x[1]*y[1]+x[2]*y[2]) + +#define PNOINT2JPL {J_EARTH, J_MOON, J_MERCURY, J_VENUS, J_MARS, J_JUPITER, J_SATURN, J_URANUS, J_NEPTUNE, J_PLUTO, J_SUN, } + +/* planetary radii in meters */ +#define NDIAM (SE_VESTA + 1) +static const double pla_diam[NDIAM] = {1392000000.0, /* Sun */ + 3476300.0, /* Moon */ + 2439000.0 * 2, /* Mercury */ + 6052000.0 * 2, /* Venus */ + 3397200.0 * 2, /* Mars */ + 71398000.0 * 2, /* Jupiter */ + 60000000.0 * 2, /* Saturn */ + 25400000.0 * 2, /* Uranus */ + 24300000.0 * 2, /* Neptune */ + 2500000.0 * 2, /* Pluto */ + 0, 0, 0, 0, /* nodes and apogees */ + 6378140.0 * 2, /* Earth */ + 0.0, /* Chiron */ + 0.0, /* Pholus */ + 913000.0, /* Ceres */ + 523000.0, /* Pallas */ + 244000.0, /* Juno */ + 501000.0, /* Vesta */ + }; + + +/* Ayanamsas + * For each ayanamsa, there are two values: + * t0 epoch of ayanamsa, TDT (ET) + * ayan_t0 ayanamsa value at epoch + */ +struct aya_init {double t0, ayan_t0;}; +static const struct aya_init ayanamsa[] = { + {2433282.5, 24.042044444}, /* 0: Fagan/Bradley (Default) */ + /*{J1900, 360 - 337.53953}, * 1: Lahiri (Robert Hand) */ + {2435553.5, 23.250182778 - 0.004660222}, /* 1: Lahiri (derived from: + * Indian Astronomical Ephemeris 1989, p. 556; + * the subtracted value is nutation) */ + {J1900, 360 - 333.58695}, /* 2: De Luce (Robert Hand) */ + {J1900, 360 - 338.98556}, /* 3: Raman (Robert Hand) */ + {J1900, 360 - 341.33904}, /* 4: Ushashashi (Robert Hand) */ + {J1900, 360 - 337.636111}, /* 5: Krishnamurti (Robert Hand) */ + {J1900, 360 - 333.0369024}, /* 6: Djwhal Khool; (Graham Dawson) + * Aquarius entered on 1 July 2117 */ + {J1900, 360 - 338.917778}, /* 7: Yukteshwar; (David Cochrane) */ + {J1900, 360 - 338.634444}, /* 8: JN Bhasin; (David Cochrane) */ + {1684532.5, -3.36667}, /* 9: Babylonian, Kugler 1 */ + {1684532.5, -4.76667}, /*10: Babylonian, Kugler 2 */ + {1684532.5, -5.61667}, /*11: Babylonian, Kugler 3 */ + {1684532.5, -4.56667}, /*12: Babylonian, Huber */ + {1673941, -5.079167}, /*13: Babylonian, Mercier; + * eta Piscium culminates with zero point */ + {1684532.5, -4.44088389}, /*14: t0 is defined by Aldebaran at 15 Taurus */ + {1674484, -9.33333}, /*15: Hipparchos */ + {1927135.8747793, 0}, /*16: Sassanian */ + /*{1746443.513, 0}, *17: Galactic Center at 0 Sagittarius */ + {1746447.518, 0}, /*17: Galactic Center at 0 Sagittarius */ + {J2000, 0}, /*18: J2000 */ + {J1900, 0}, /*19: J1900 */ + {B1950, 0}, /*20: B1950 */ + {1903396.8128654, 0}, /*21: Suryasiddhanta, assuming + ingress of mean Sun into Aries at point + of mean equinox of date on + 21.3.499, noon, Ujjain (75.7684565 E) + = 7:30:31.57 UT */ + {1903396.8128654,-0.21463395},/*22: Suryasiddhanta, assuming + ingress of mean Sun into Aries at + true position of mean Sun at same epoch */ + {1903396.7895321, 0}, /*23: Aryabhata, same date, but UT 6:56:55.57 + analogous 21 */ + {1903396.7895321,-0.23763238},/*24: Aryabhata, analogous 22 */ + {0, 0}, /*25: - */ + {0, 0}, /*26: - */ + {0, 0}, /*27: - */ + {0, 0}, /*28: - */ + {0, 0}, /*29: - */ + }; + +#define PLAN_DATA struct plan_data + +/* obliquity of ecliptic */ +struct epsilon { + double teps, eps, seps, ceps; /* jd, eps, sin(eps), cos(eps) */ +}; + +/* +extern struct epsilon oec2000; +extern struct epsilon oec; +*/ + +struct plan_data { + /* the following data are read from file only once, immediately after + * file has been opened */ + int ibdy; /* internal body number */ + int32 iflg; /* contains several bit flags describing the data: + * SEI_FLG_HELIO: true if helio, false if bary + * SEI_FLG_ROTATE: TRUE if coefficients are referred + * to coordinate system of orbital plane + * SEI_FLG_ELLIPSE: TRUE if reference ellipse */ + int ncoe; /* # of coefficients of ephemeris polynomial, + is polynomial order + 1 */ + /* where is the segment index on the file */ + int32 lndx0; /* file position of begin of planet's index */ + int32 nndx; /* number of index entries on file: computed */ + double tfstart; /* file contains ephemeris for tfstart thru tfend */ + double tfend; /* for this particular planet !!! */ + double dseg; /* segment size (days covered by a polynomial) */ + /* orbital elements: */ + double telem; /* epoch of elements */ + double prot; + double qrot; + double dprot; + double dqrot; + double rmax; /* normalisation factor of cheby coefficients */ + /* in addition, if reference ellipse is used: */ + double peri; + double dperi; + double *refep; /* pointer to cheby coeffs of reference ellipse, + * size of data is 2 x ncoe */ + /* unpacked segment information, only updated when a segment is read: */ + double tseg0, tseg1; /* start and end jd of current segment */ + double *segp; /* pointer to unpacked cheby coeffs of segment; + * the size is 3 x ncoe */ + int neval; /* how many coefficients to evaluate. this may + * be less than ncoe */ + /* result of most recent data evaluation for this body: */ + double teval; /* time for which previous computation was made */ + int32 iephe; /* which ephemeris was used */ + double x[6]; /* position and speed vectors equatorial J2000 */ + int32 xflgs; /* hel., light-time, aberr., prec. flags etc. */ + double xreturn[24]; /* return positions: + * xreturn+0 ecliptic polar coordinates + * xreturn+6 ecliptic cartesian coordinates + * xreturn+12 equatorial polar coordinates + * xreturn+18 equatorial cartesian coordinates + */ +}; + +/* + * stuff exported from swemplan.c and swemmoon.c + * and constants used inside these functions. +************************************************************/ + +#define STR 4.8481368110953599359e-6 /* radians per arc second */ + +/* moon, s. moshmoon.c */ +extern int swi_mean_node(double jd, double *x, char *serr); +extern int swi_mean_apog(double jd, double *x, char *serr); +extern int swi_moshmoon(double tjd, AS_BOOL do_save, double *xpm, char *serr) ; +extern int swi_moshmoon2(double jd, double *x); +extern int swi_intp_apsides(double J, double *pol, int ipli); + +/* planets, s. moshplan.c */ +extern int swi_moshplan(double tjd, int ipli, AS_BOOL do_save, double *xpret, double *xeret, char *serr); +extern int swi_moshplan2(double J, int iplm, double *pobj); +extern int swi_osc_el_plan(double tjd, double *xp, int ipl, int ipli, double *xearth, double *xsun, char *serr); +extern FILE *swi_fopen(int ifno, char *fname, char *ephepath, char *serr); + +/* nutation */ +struct nut { + double tnut; + double nutlo[2]; /* nutation in longitude and obliquity */ + double snut, cnut; /* sine and cosine of nutation in obliquity */ + double matrix[3][3]; +}; + +struct plantbl { + char max_harmonic[9]; + char max_power_of_t; + signed char *arg_tbl; + double *lon_tbl; + double *lat_tbl; + double *rad_tbl; + double distance; +}; + +struct file_data { + char fnam[AS_MAXCH]; /* ephemeris file name */ + int fversion; /* version number of file */ + char astnam[50]; /* asteroid name, if asteroid file */ + int32 sweph_denum; /* DE number of JPL ephemeris, which this file + * is derived from. */ + FILE *fptr; /* ephemeris file pointer */ + double tfstart; /* file may be used from this date */ + double tfend; /* through this date */ + int32 iflg; /* byte reorder flag and little/bigendian flag */ + short npl; /* how many planets in file */ + int ipl[SEI_FILE_NMAXPLAN]; /* planet numbers */ +}; + +struct gen_const { + double clight, + aunit, + helgravconst, + ratme, + sunradius; +}; + +struct save_positions { + int ipl; + double tsave; + int32 iflgsave; + /* position at t = tsave, + * in ecliptic polar (offset 0), + * ecliptic cartesian (offset 6), + * equatorial polar (offset 12), + * and equatorial cartesian coordinates (offset 18). + * 6 doubles each for position and speed coordinates. + */ + double xsaves[24]; +}; + +struct node_data { + /* result of most recent data evaluation for this body: */ + double teval; /* time for which last computation was made */ + int32 iephe; /* which ephemeris was used */ + double x[6]; /* position and speed vectors equatorial J2000 */ + int32 xflgs; /* hel., light-time, aberr., prec. flags etc. */ + double xreturn[24]; /* return positions: + * xreturn+0 ecliptic polar coordinates + * xreturn+6 ecliptic cartesian coordinates + * xreturn+12 equatorial polar coordinates + * xreturn+18 equatorial cartesian coordinates + */ +}; + +struct topo_data { + double geolon, geolat, geoalt; + double teval; + double tjd_ut; + double xobs[6]; +}; + +struct sid_data { + int32 sid_mode; + double ayan_t0; + double t0; +}; + +struct swe_data { + AS_BOOL ephe_path_is_set; + short jpl_file_is_open; + FILE *fixfp; /* fixed stars file pointer */ + char ephepath[AS_MAXCH]; + char jplfnam[AS_MAXCH]; + short jpldenum; + AS_BOOL geopos_is_set; + AS_BOOL ayana_is_set; + AS_BOOL is_old_starfile; + struct file_data fidat[SEI_NEPHFILES]; + struct gen_const gcdat; + struct plan_data pldat[SEI_NPLANETS]; +#if 0 + struct node_data nddat[SEI_NNODE_ETC]; +#else + struct plan_data nddat[SEI_NNODE_ETC]; +#endif + struct save_positions savedat[SE_NPLANETS+1]; + struct epsilon oec; + struct epsilon oec2000; + struct nut nut; + struct nut nut2000; + struct nut nutv; + struct topo_data topd; + struct sid_data sidd; + char astelem[AS_MAXCH * 2]; + double ast_G; + double ast_H; + double ast_diam; + int i_saved_planet_name; + char saved_planet_name[80]; +}; + +extern struct swe_data FAR swed; diff --git a/swe/src/swephexp.h b/swe/src/swephexp.h new file mode 100644 index 0000000..7616b96 --- /dev/null +++ b/swe/src/swephexp.h @@ -0,0 +1,778 @@ +/************************************************************ + $Header: /home/dieter/sweph/RCS/swephexp.h,v 1.75 2009/04/08 07:19:08 dieter Exp $ + SWISSEPH: exported definitions and constants + + This file represents the standard application interface (API) + to the Swiss Ephemeris. + + A C programmer needs only to include this file, and link his code + with the SwissEph library. + + The function calls are documented in the Programmer's documentation, + which is online in HTML format. + + Structure of this file: + Public API definitions + Internal developer's definitions + Public API functions. + + Authors: Dieter Koch and Alois Treindl, Astrodienst Zurich + +************************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _SWEPHEXP_INCLUDED /* allow multiple #includes of swephexp.h */ +#define _SWEPHEXP_INCLUDED + +#include "sweodef.h" + +/*********************************************************** + * definitions for use also by non-C programmers + ***********************************************************/ + +/* values for gregflag in swe_julday() and swe_revjul() */ +# define SE_JUL_CAL 0 +# define SE_GREG_CAL 1 + +/* + * planet numbers for the ipl parameter in swe_calc() + */ +#define SE_ECL_NUT -1 + +#define SE_SUN 0 +#define SE_MOON 1 +#define SE_MERCURY 2 +#define SE_VENUS 3 +#define SE_MARS 4 +#define SE_JUPITER 5 +#define SE_SATURN 6 +#define SE_URANUS 7 +#define SE_NEPTUNE 8 +#define SE_PLUTO 9 +#define SE_MEAN_NODE 10 +#define SE_TRUE_NODE 11 +#define SE_MEAN_APOG 12 +#define SE_OSCU_APOG 13 +#define SE_EARTH 14 +#define SE_CHIRON 15 +#define SE_PHOLUS 16 +#define SE_CERES 17 +#define SE_PALLAS 18 +#define SE_JUNO 19 +#define SE_VESTA 20 +#define SE_INTP_APOG 21 +#define SE_INTP_PERG 22 + +#define SE_NPLANETS 23 + +#define SE_AST_OFFSET 10000 +#define SE_VARUNA (SE_AST_OFFSET + 20000) + +#define SE_FICT_OFFSET 40 +#define SE_FICT_OFFSET_1 39 +#define SE_FICT_MAX 999 +#define SE_NFICT_ELEM 15 + +#define SE_COMET_OFFSET 1000 + +#define SE_NALL_NAT_POINTS (SE_NPLANETS + SE_NFICT_ELEM) + +/* Hamburger or Uranian "planets" */ +#define SE_CUPIDO 40 +#define SE_HADES 41 +#define SE_ZEUS 42 +#define SE_KRONOS 43 +#define SE_APOLLON 44 +#define SE_ADMETOS 45 +#define SE_VULKANUS 46 +#define SE_POSEIDON 47 +/* other fictitious bodies */ +#define SE_ISIS 48 +#define SE_NIBIRU 49 +#define SE_HARRINGTON 50 +#define SE_NEPTUNE_LEVERRIER 51 +#define SE_NEPTUNE_ADAMS 52 +#define SE_PLUTO_LOWELL 53 +#define SE_PLUTO_PICKERING 54 +#define SE_VULCAN 55 +#define SE_WHITE_MOON 56 +#define SE_PROSERPINA 57 +#define SE_WALDEMATH 58 + +#define SE_FIXSTAR -10 + +#define SE_ASC 0 +#define SE_MC 1 +#define SE_ARMC 2 +#define SE_VERTEX 3 +#define SE_EQUASC 4 /* "equatorial ascendant" */ +#define SE_COASC1 5 /* "co-ascendant" (W. Koch) */ +#define SE_COASC2 6 /* "co-ascendant" (M. Munkasey) */ +#define SE_POLASC 7 /* "polar ascendant" (M. Munkasey) */ +#define SE_NASCMC 8 + +/* + * flag bits for parameter iflag in function swe_calc() + * The flag bits are defined in such a way that iflag = 0 delivers what one + * usually wants: + * - the default ephemeris (SWISS EPHEMERIS) is used, + * - apparent geocentric positions referring to the true equinox of date + * are returned. + * If not only coordinates, but also speed values are required, use + * flag = SEFLG_SPEED. + * + * The 'L' behind the number indicates that 32-bit integers (Long) are used. + */ +#define SEFLG_JPLEPH 1 /* use JPL ephemeris */ +#define SEFLG_SWIEPH 2 /* use SWISSEPH ephemeris */ +#define SEFLG_MOSEPH 4 /* use Moshier ephemeris */ + +#define SEFLG_HELCTR 8 /* return heliocentric position */ +#define SEFLG_TRUEPOS 16 /* return true positions, not apparent */ +#define SEFLG_J2000 32 /* no precession, i.e. give J2000 equinox */ +#define SEFLG_NONUT 64 /* no nutation, i.e. mean equinox of date */ +#define SEFLG_SPEED3 128 /* speed from 3 positions (do not use it, + SEFLG_SPEED is faster and more precise.) */ +#define SEFLG_SPEED 256 /* high precision speed */ +#define SEFLG_NOGDEFL 512 /* turn off gravitational deflection */ +#define SEFLG_NOABERR 1024 /* turn off 'annual' aberration of light */ +#define SEFLG_EQUATORIAL (2*1024) /* equatorial positions are wanted */ +#define SEFLG_XYZ (4*1024) /* cartesian, not polar, coordinates */ +#define SEFLG_RADIANS (8*1024) /* coordinates in radians, not degrees */ +#define SEFLG_BARYCTR (16*1024) /* barycentric positions */ +#define SEFLG_TOPOCTR (32*1024) /* topocentric positions */ +#define SEFLG_SIDEREAL (64*1024) /* sidereal positions */ +#define SEFLG_ICRS (128*1024) /* ICRS (DE406 reference frame) */ + +#define SE_SIDBITS 256 +/* for projection onto ecliptic of t0 */ +#define SE_SIDBIT_ECL_T0 256 +/* for projection onto solar system plane */ +#define SE_SIDBIT_SSY_PLANE 512 + +/* sidereal modes (ayanamsas) */ +#define SE_SIDM_FAGAN_BRADLEY 0 +#define SE_SIDM_LAHIRI 1 +#define SE_SIDM_DELUCE 2 +#define SE_SIDM_RAMAN 3 +#define SE_SIDM_USHASHASHI 4 +#define SE_SIDM_KRISHNAMURTI 5 +#define SE_SIDM_DJWHAL_KHUL 6 +#define SE_SIDM_YUKTESHWAR 7 +#define SE_SIDM_JN_BHASIN 8 +#define SE_SIDM_BABYL_KUGLER1 9 +#define SE_SIDM_BABYL_KUGLER2 10 +#define SE_SIDM_BABYL_KUGLER3 11 +#define SE_SIDM_BABYL_HUBER 12 +#define SE_SIDM_BABYL_ETPSC 13 +#define SE_SIDM_ALDEBARAN_15TAU 14 +#define SE_SIDM_HIPPARCHOS 15 +#define SE_SIDM_SASSANIAN 16 +#define SE_SIDM_GALCENT_0SAG 17 +#define SE_SIDM_J2000 18 +#define SE_SIDM_J1900 19 +#define SE_SIDM_B1950 20 +#define SE_SIDM_SURYASIDDHANTA 21 +#define SE_SIDM_SURYASIDDHANTA_MSUN 22 +#define SE_SIDM_ARYABHATA 23 +#define SE_SIDM_ARYABHATA_MSUN 24 +#define SE_SIDM_USER 255 + +#define SE_NSIDM_PREDEF 27 + +/* used for swe_nod_aps(): */ +#define SE_NODBIT_MEAN 1 /* mean nodes/apsides */ +#define SE_NODBIT_OSCU 2 /* osculating nodes/apsides */ +#define SE_NODBIT_OSCU_BAR 4 /* same, but motion about solar system barycenter is considered */ +#define SE_NODBIT_FOPOINT 256 /* focal point of orbit instead of aphelion */ + +/* default ephemeris used when no ephemeris flagbit is set */ +#define SEFLG_DEFAULTEPH SEFLG_SWIEPH + +#define SE_MAX_STNAME 256 /* maximum size of fixstar name; + * the parameter star in swe_fixstar + * must allow twice this space for + * the returned star name. + */ + +/* defines for eclipse computations */ + +#define SE_ECL_CENTRAL 1 +#define SE_ECL_NONCENTRAL 2 +#define SE_ECL_TOTAL 4 +#define SE_ECL_ANNULAR 8 +#define SE_ECL_PARTIAL 16 +#define SE_ECL_ANNULAR_TOTAL 32 +#define SE_ECL_PENUMBRAL 64 +#define SE_ECL_ALLTYPES_SOLAR (SE_ECL_CENTRAL|SE_ECL_NONCENTRAL|SE_ECL_TOTAL|SE_ECL_ANNULAR|SE_ECL_PARTIAL|SE_ECL_ANNULAR_TOTAL) +#define SE_ECL_ALLTYPES_LUNAR (SE_ECL_TOTAL|SE_ECL_PARTIAL|SE_ECL_PENUMBRAL) +#define SE_ECL_VISIBLE 128 +#define SE_ECL_MAX_VISIBLE 256 +#define SE_ECL_1ST_VISIBLE 512 +#define SE_ECL_2ND_VISIBLE 1024 +#define SE_ECL_3RD_VISIBLE 2048 +#define SE_ECL_4TH_VISIBLE 4096 +#define SE_ECL_ONE_TRY (32*1024) + /* check if the next conjunction of the moon with + * a planet is an occultation; don't search further */ + +/* for swe_rise_transit() */ +#define SE_CALC_RISE 1 +#define SE_CALC_SET 2 +#define SE_CALC_MTRANSIT 4 +#define SE_CALC_ITRANSIT 8 +#define SE_BIT_DISC_CENTER 256 /* to be or'ed to SE_CALC_RISE/SET, + * if rise or set of disc center is + * required */ +#define SE_BIT_DISC_BOTTOM 8192 /* to be or'ed to SE_CALC_RISE/SET, + * if rise or set of lower limb of + * disc is requried */ +#define SE_BIT_NO_REFRACTION 512 /* to be or'ed to SE_CALC_RISE/SET, + * if refraction is to be ignored */ +#define SE_BIT_CIVIL_TWILIGHT 1024 /* to be or'ed to SE_CALC_RISE/SET */ +#define SE_BIT_NAUTIC_TWILIGHT 2048 /* to be or'ed to SE_CALC_RISE/SET */ +#define SE_BIT_ASTRO_TWILIGHT 4096 /* to be or'ed to SE_CALC_RISE/SET */ +#define SE_BIT_FIXED_DISC_SIZE (16*1024) /* or'ed to SE_CALC_RISE/SET: + * neglect the effect of distance on + * disc size */ + + +/* for swe_azalt() and swe_azalt_rev() */ +#define SE_ECL2HOR 0 +#define SE_EQU2HOR 1 +#define SE_HOR2ECL 0 +#define SE_HOR2EQU 1 + +/* for swe_refrac() */ +#define SE_TRUE_TO_APP 0 +#define SE_APP_TO_TRUE 1 + +/* + * only used for experimenting with various JPL ephemeris files + * which are available at Astrodienst's internal network + */ +#define SE_DE_NUMBER 406 +#define SE_FNAME_DE200 "de200.eph" +#define SE_FNAME_DE403 "de403.eph" +#define SE_FNAME_DE404 "de404.eph" +#define SE_FNAME_DE405 "de405.eph" +#define SE_FNAME_DE406 "de406.eph" +#define SE_FNAME_DFT SE_FNAME_DE406 +#define SE_STARFILE_OLD "fixstars.cat" +#define SE_STARFILE "sefstars.txt" +#define SE_ASTNAMFILE "seasnam.txt" +#define SE_FICTFILE "seorbel.txt" + +/* + * ephemeris path + * this defines where ephemeris files are expected if the function + * swe_set_ephe_path() is not called by the application. + * Normally, every application should make this call to define its + * own place for the ephemeris files. + */ + +#ifndef SE_EPHE_PATH +#if MSDOS +#ifdef PAIR_SWEPH +# define SE_EPHE_PATH "\\pair\\ephe\\" +#else +# define SE_EPHE_PATH "\\sweph\\ephe\\" +#endif +#else +# ifdef MACOS +# define SE_EPHE_PATH ":ephe:" +# else +# define SE_EPHE_PATH ".:/users/ephe2/:/users/ephe/" + /* At Astrodienst, we maintain two ephemeris areas for + the thousands of asteroid files: + the short files in /users/ephe/ast*, + the long file in /users/ephe2/ast*. */ +# endif +#endif +#endif /* SE_EPHE_PATH */ + +/* defines for function swe_split_deg() (in swephlib.c) */ +# define SE_SPLIT_DEG_ROUND_SEC 1 +# define SE_SPLIT_DEG_ROUND_MIN 2 +# define SE_SPLIT_DEG_ROUND_DEG 4 +# define SE_SPLIT_DEG_ZODIACAL 8 +# define SE_SPLIT_DEG_KEEP_SIGN 16 /* don't round to next sign, + * e.g. 29.9999999 will be rounded + * to 29d59'59" (or 29d59' or 29d) */ +# define SE_SPLIT_DEG_KEEP_DEG 32 /* don't round to next degree + * e.g. 13.9999999 will be rounded + * to 13d59'59" (or 13d59' or 13d) */ + +/* for heliacal functions */ +#define SE_HELIACAL_RISING 1 +#define SE_HELIACAL_SETTING 2 +#define SE_MORNING_FIRST SE_HELIACAL_RISING +#define SE_EVENING_LAST SE_HELIACAL_SETTING +#define SE_EVENING_FIRST 3 +#define SE_MORNING_LAST 4 +#define SE_ACRONYCHAL_RISING 5 /* still not implemented */ +#define SE_ACRONYCHAL_SETTING 6 /* still not implemented */ +#define SE_COSMICAL_SETTING SE_ACRONYCHAL_SETTING + +#define SE_HELFLAG_LONG_SEARCH 128 +#define SE_HELFLAG_HIGH_PRECISION 256 +#define SE_HELFLAG_OPTICAL_PARAMS 512 +#define SE_HELFLAG_NO_DETAILS 1024 +#define SE_HELFLAG_SEARCH_1_PERIOD (1 << 11) /* 2048 */ +#define SE_HELFLAG_VISLIM_DARK (1 << 12) /* 4096 */ +#define SE_HELFLAG_VISLIM_NOMOON (1 << 13) /* 8192 */ +#define SE_HELFLAG_VISLIM_PHOTOPIC (1 << 14) /* 16384 */ +#define SE_HELFLAG_AVKIND_VR (1 << 15) /* 32768 */ +#define SE_HELFLAG_AVKIND_PTO (1 << 16) +#define SE_HELFLAG_AVKIND_MIN7 (1 << 17) +#define SE_HELFLAG_AVKIND_MIN9 (1 << 18) +#define SE_HELFLAG_AVKIND (SE_HELFLAG_AVKIND_VR|SE_HELFLAG_AVKIND_PTO|SE_HELFLAG_AVKIND_MIN7|SE_HELFLAG_AVKIND_MIN9) +#define TJD_INVALID 99999999.0 +#define SIMULATE_VICTORVB 1 + +#define SE_HELIACAL_LONG_SEARCH 128 +#define SE_HELIACAL_HIGH_PRECISION 256 +#define SE_HELIACAL_OPTICAL_PARAMS 512 +#define SE_HELIACAL_NO_DETAILS 1024 +#define SE_HELIACAL_SEARCH_1_PERIOD (1 << 11) /* 2048 */ +#define SE_HELIACAL_VISLIM_DARK (1 << 12) /* 4096 */ +#define SE_HELIACAL_VISLIM_NOMOON (1 << 13) /* 8192 */ +#define SE_HELIACAL_VISLIM_PHOTOPIC (1 << 14) /* 16384 */ +#define SE_HELIACAL_AVKIND_VR (1 << 15) /* 32768 */ +#define SE_HELIACAL_AVKIND_PTO (1 << 16) +#define SE_HELIACAL_AVKIND_MIN7 (1 << 17) +#define SE_HELIACAL_AVKIND_MIN9 (1 << 18) +#define SE_HELIACAL_AVKIND (SE_HELFLAG_AVKIND_VR|SE_HELFLAG_AVKIND_PTO|SE_HELFLAG_AVKIND_MIN7|SE_HELFLAG_AVKIND_MIN9) + +#define SE_PHOTOPIC_FLAG 0 +#define SE_SCOTOPIC_FLAG 1 +#define SE_MIXEDOPIC_FLAG 2 + +/* + * by compiling with -DPAIR_SWEPH in the compiler options it + * is possible to create a more compact version of SwissEph which + * contains no code for the JPL ephemeris file and for the builtin + * Moshier ephemeris. + * This is quite useful for MSDOS real mode applications which need to + * run within 640 kb. + * The option is called PAIR_SWEPH because it was introduced for + * Astrodienst's partner software PAIR. + */ +#ifdef PAIR_SWEPH +# define NO_JPL +#endif + +/************************************************************** + * here follow some ugly definitions which are only required + * if SwissEphemeris is compiled on Windows, either to use a DLL + * or to create a DLL. + * Unix users can savely ignore his section + * and skip to the export function decarations below. + ************************************************************/ +#if defined(MAKE_DLL) || defined(USE_DLL) || defined(_WINDOWS) +# include +#endif + +#ifdef USE_DLL +# include "swedll.h" +#endif + +#if defined(DOS32) || !MSDOS || defined(WIN32) + /* use compiler switch to define DOS32 */ +# ifndef FAR +# define FAR +# endif +# define MALLOC malloc +# define CALLOC calloc +# define FREE free +#else +# ifndef FAR +# define FAR far +# endif +# ifdef __BORLANDC__ +# include +# define MALLOC farmalloc +# define CALLOC farcalloc +# define FREE farfree +# else +# define MALLOC _fmalloc +# define CALLOC _fcalloc +# define FREE _ffree +# endif +#endif + +/* DLL defines */ +#ifdef MAKE_DLL + #if defined (PASCAL) + #define PASCAL_CONV PASCAL + #else + #define PASCAL_CONV + #endif + #ifdef MAKE_DLL16 /* 16bit DLL */ + /* We compiled the 16bit DLL for Windows 3.x using Borland C/C++ Ver:3.x + and the -WD or -WDE compiler switch. */ + #define EXP16 __export + #define EXP32 + #else /* 32bit DLL */ + /* To export symbols in the new DLL model of Win32, Microsoft + recommends the following approach */ + #define EXP16 + #define EXP32 __declspec( dllexport ) + #endif +#else + #define PASCAL_CONV + #define EXP16 + #define EXP32 +#endif + +#ifndef _SWEDLL_H + +/*********************************************************** + * exported functions + ***********************************************************/ + +#define ext_def(x) extern EXP32 x FAR PASCAL_CONV EXP16 + /* ext_def(x) evaluates to x on Unix */ + +ext_def(int32) swe_heliacal_ut(double tjdstart_ut, double *geopos, double *datm, double *dobs, char *ObjectName, int32 TypeEvent, int32 iflag, double *dret, char *serr); +ext_def(int32) swe_heliacal_pheno_ut(double tjd_ut, double *geopos, double *datm, double *dobs, char *ObjectName, int32 TypeEvent, int32 helflag, double *darr, char *serr); +ext_def(int32) swe_vis_limit_mag(double tjdut, double *geopos, double *datm, double *dobs, char *ObjectName, int32 helflag, double *dret, char *serr); +/* the following are secret, for Victor Reijs' */ +ext_def(int32) swe_heliacal_angle(double tjdut, double *dgeo, double *datm, double *dobs, int32 helflag, double mag, double azi_obj, double azi_sun, double azi_moon, double alt_moon, double *dret, char *serr); +ext_def(int32) swe_topo_arcus_visionis(double tjdut, double *dgeo, double *datm, double *dobs, int32 helflag, double mag, double azi_obj, double alt_obj, double azi_sun, double azi_moon, double alt_moon, double *dret, char *serr); + +/**************************** + * exports from sweph.c + ****************************/ + +ext_def(char *) swe_version(char *); + +/* planets, moon, nodes etc. */ +ext_def( int32 ) swe_calc( + double tjd, int ipl, int32 iflag, + double *xx, + char *serr); + +ext_def(int32) swe_calc_ut(double tjd_ut, int32 ipl, int32 iflag, + double *xx, char *serr); + +/* fixed stars */ +ext_def( int32 ) swe_fixstar( + char *star, double tjd, int32 iflag, + double *xx, + char *serr); + +ext_def(int32) swe_fixstar_ut(char *star, double tjd_ut, int32 iflag, + double *xx, char *serr); + +ext_def(int32) swe_fixstar_mag(char *star, double *mag, char *serr); + +/* close Swiss Ephemeris */ +ext_def( void ) swe_close(void); + +/* set directory path of ephemeris files */ +ext_def( void ) swe_set_ephe_path(char *path); + +/* set file name of JPL file */ +ext_def( void ) swe_set_jpl_file(char *fname); + +/* get planet name */ +ext_def( char *) swe_get_planet_name(int ipl, char *spname); + +/* set geographic position of observer */ +ext_def (void) swe_set_topo(double geolon, double geolat, double geoalt); + +/* set sidereal mode */ +ext_def(void) swe_set_sid_mode(int32 sid_mode, double t0, double ayan_t0); + +/* get ayanamsa */ +ext_def(double) swe_get_ayanamsa(double tjd_et); + +ext_def(double) swe_get_ayanamsa_ut(double tjd_ut); + +ext_def( char *) swe_get_ayanamsa_name(int32 isidmode); + +/**************************** + * exports from swedate.c + ****************************/ + +ext_def( int ) swe_date_conversion( + int y , int m , int d , /* year, month, day */ + double utime, /* universal time in hours (decimal) */ + char c, /* calendar g[regorian]|j[ulian] */ + double *tjd); + +ext_def( double ) swe_julday( + int year, int month, int day, double hour, + int gregflag); + +ext_def( void ) swe_revjul ( + double jd, + int gregflag, + int *jyear, int *jmon, int *jday, double *jut); + +ext_def(int32) swe_utc_to_jd( + int32 iyear, int32 imonth, int32 iday, + int32 ihour, int32 imin, double dsec, + int32 gregflag, double *dret, char *serr); + +ext_def(void) swe_jdet_to_utc( + double tjd_et, int32 gregflag, + int32 *iyear, int32 *imonth, int32 *iday, + int32 *ihour, int32 *imin, double *dsec); + +ext_def(void) swe_jdut1_to_utc( + double tjd_ut, int32 gregflag, + int32 *iyear, int32 *imonth, int32 *iday, + int32 *ihour, int32 *imin, double *dsec); + +ext_def(void) swe_utc_time_zone( + int32 iyear, int32 imonth, int32 iday, + int32 ihour, int32 imin, double dsec, + double d_timezone, + int32 *iyear_out, int32 *imonth_out, int32 *iday_out, + int32 *ihour_out, int32 *imin_out, double *dsec_out); + +/**************************** + * exports from swehouse.c + ****************************/ + +ext_def( int ) swe_houses( + double tjd_ut, double geolat, double geolon, int hsys, + double *cusps, double *ascmc); + +ext_def( int ) swe_houses_ex( + double tjd_ut, int32 iflag, double geolat, double geolon, int hsys, + double *cusps, double *ascmc); + +ext_def( int ) swe_houses_armc( + double armc, double geolat, double eps, int hsys, + double *cusps, double *ascmc); + +ext_def(double) swe_house_pos( + double armc, double geolat, double eps, int hsys, double *xpin, char *serr); + +/**************************** + * exports from swecl.c + ****************************/ + +ext_def(int32) swe_gauquelin_sector(double t_ut, int32 ipl, char *starname, int32 iflag, int32 imeth, double *geopos, double atpress, double attemp, double *dgsect, char *serr); + +/* computes geographic location and attributes of solar + * eclipse at a given tjd */ +ext_def (int32) swe_sol_eclipse_where(double tjd, int32 ifl, double *geopos, double *attr, char *serr); + +ext_def (int32) swe_lun_occult_where(double tjd, int32 ipl, char *starname, int32 ifl, double *geopos, double *attr, char *serr); + +/* computes attributes of a solar eclipse for given tjd, geolon, geolat */ +ext_def (int32) swe_sol_eclipse_how(double tjd, int32 ifl, double *geopos, double *attr, char *serr); + +/* finds time of next local eclipse */ +ext_def (int32) swe_sol_eclipse_when_loc(double tjd_start, int32 ifl, double *geopos, double *tret, double *attr, int32 backward, char *serr); + +ext_def (int32) swe_lun_occult_when_loc(double tjd_start, int32 ipl, char *starname, int32 ifl, + double *geopos, double *tret, double *attr, int32 backward, char *serr); + +/* finds time of next eclipse globally */ +ext_def (int32) swe_sol_eclipse_when_glob(double tjd_start, int32 ifl, int32 ifltype, + double *tret, int32 backward, char *serr); + +/* finds time of next occultation globally */ +ext_def (int32) swe_lun_occult_when_glob(double tjd_start, int32 ipl, char *starname, int32 ifl, int32 ifltype, + double *tret, int32 backward, char *serr); + +/* computes attributes of a lunar eclipse for given tjd */ +ext_def (int32) swe_lun_eclipse_how( + double tjd_ut, + int32 ifl, + double *geopos, + double *attr, + char *serr); + +ext_def (int32) swe_lun_eclipse_when(double tjd_start, int32 ifl, int32 ifltype, + double *tret, int32 backward, char *serr); + +/* planetary phenomena */ +ext_def (int32) swe_pheno(double tjd, int32 ipl, int32 iflag, double *attr, char *serr); + +ext_def(int32) swe_pheno_ut(double tjd_ut, int32 ipl, int32 iflag, double *attr, char *serr); + +ext_def (double) swe_refrac(double inalt, double atpress, double attemp, int32 calc_flag); + +ext_def (double) swe_refrac_extended(double inalt, double geoalt, double atpress, double attemp, double lapse_rate, int32 calc_flag, double *dret); + +ext_def (void) swe_set_lapse_rate(double lapse_rate); + +ext_def (void) swe_azalt( + double tjd_ut, + int32 calc_flag, + double *geopos, + double atpress, + double attemp, + double *xin, + double *xaz); + +ext_def (void) swe_azalt_rev( + double tjd_ut, + int32 calc_flag, + double *geopos, + double *xin, + double *xout); + +ext_def (int32) swe_rise_trans_true_hor( + double tjd_ut, int32 ipl, char *starname, + int32 epheflag, int32 rsmi, + double *geopos, + double atpress, double attemp, + double horhgt, + double *tret, + char *serr); + +ext_def (int32) swe_rise_trans( + double tjd_ut, int32 ipl, char *starname, + int32 epheflag, int32 rsmi, + double *geopos, + double atpress, double attemp, + double *tret, + char *serr); + +ext_def (int32) swe_nod_aps(double tjd_et, int32 ipl, int32 iflag, + int32 method, + double *xnasc, double *xndsc, + double *xperi, double *xaphe, + char *serr); + +ext_def (int32) swe_nod_aps_ut(double tjd_ut, int32 ipl, int32 iflag, + int32 method, + double *xnasc, double *xndsc, + double *xperi, double *xaphe, + char *serr); + + +/**************************** + * exports from swephlib.c + ****************************/ + +/* delta t */ +ext_def( double ) swe_deltat(double tjd); + +/* equation of time */ +ext_def( int ) swe_time_equ(double tjd, double *te, char *serr); + +/* sidereal time */ +ext_def( double ) swe_sidtime0(double tjd_ut, double eps, double nut); +ext_def( double ) swe_sidtime(double tjd_ut); + +/* coordinate transformation polar -> polar */ +ext_def( void ) swe_cotrans(double *xpo, double *xpn, double eps); +ext_def( void ) swe_cotrans_sp(double *xpo, double *xpn, double eps); + +/* tidal acceleration to be used in swe_deltat() */ +ext_def( double ) swe_get_tid_acc(void); +ext_def( void ) swe_set_tid_acc(double t_acc); + +ext_def( double ) swe_degnorm(double x); +ext_def( double ) swe_radnorm(double x); +ext_def( double ) swe_rad_midp(double x1, double x0); +ext_def( double ) swe_deg_midp(double x1, double x0); + +ext_def( void ) swe_split_deg(double ddeg, int32 roundflag, int32 *ideg, int32 *imin, int32 *isec, double *dsecfr, int32 *isgn); + +/******************************************************* + * other functions from swephlib.c; + * they are not needed for Swiss Ephemeris, + * but may be useful to former Placalc users. + ********************************************************/ + +/* normalize argument into interval [0..DEG360] */ +ext_def( centisec ) swe_csnorm(centisec p); + +/* distance in centisecs p1 - p2 normalized to [0..360[ */ +ext_def( centisec ) swe_difcsn (centisec p1, centisec p2); + +ext_def( double ) swe_difdegn (double p1, double p2); + +/* distance in centisecs p1 - p2 normalized to [-180..180[ */ +ext_def( centisec ) swe_difcs2n(centisec p1, centisec p2); + +ext_def( double ) swe_difdeg2n(double p1, double p2); +ext_def( double ) swe_difrad2n(double p1, double p2); + +/* round second, but at 29.5959 always down */ +ext_def( centisec ) swe_csroundsec(centisec x); + +/* double to int32 with rounding, no overflow check */ +ext_def( int32 ) swe_d2l(double x); + +/* monday = 0, ... sunday = 6 */ +ext_def( int ) swe_day_of_week(double jd); + +ext_def( char *) swe_cs2timestr(CSEC t, int sep, AS_BOOL suppressZero, char *a); + +ext_def( char *) swe_cs2lonlatstr(CSEC t, char pchar, char mchar, char *s); + +ext_def( char *) swe_cs2degstr(CSEC t, char *a); + +#endif /* #ifndef _SWEDLL_H */ + +#endif /* #ifndef _SWEPHEXP_INCLUDED */ + +#ifdef __cplusplus +} /* extern C */ +#endif diff --git a/swe/src/swephlib.c b/swe/src/swephlib.c new file mode 100644 index 0000000..438bd52 --- /dev/null +++ b/swe/src/swephlib.c @@ -0,0 +1,2816 @@ + +/* SWISSEPH + $Header: /home/dieter/sweph/RCS/swephlib.c,v 1.75 2009/11/27 11:00:57 dieter Exp $ + + SWISSEPH modules that may be useful for other applications + e.g. chopt.c, venus.c, swetest.c + + Authors: Dieter Koch and Alois Treindl, Astrodienst Zurich + + coordinate transformations + obliquity of ecliptic + nutation + precession + delta t + sidereal time + setting or getting of tidal acceleration of moon + chebyshew interpolation + ephemeris file name generation + cyclic redundancy checksum CRC + modulo and normalization functions + +**************************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + +#include +#include +#include "swephexp.h" +#include "sweph.h" +#include "swephlib.h" +#if MSDOS +# include +#endif + +#ifdef TRACE +void swi_open_trace(char *serr); +FILE *swi_fp_trace_c = NULL; +FILE *swi_fp_trace_out = NULL; +int32 swi_trace_count = 0; +#endif + +static double tid_acc = SE_TIDAL_DEFAULT; +static AS_BOOL init_dt_done = FALSE; +static void init_crc32(void); +static int init_dt(void); +static double adjust_for_tidacc(double ans, double Y); +static double deltat_espenak_meeus_1620(double tjd); +static double deltat_longterm_morrison_stephenson(double tjd); +static double deltat_stephenson_morrison_1600(double tjd); +static double deltat_aa(double tjd); +static int precess0(double *R, double J, int direction ); + +/* Reduce x modulo 360 degrees + */ +double FAR PASCAL_CONV swe_degnorm(double x) +{ + double y; + y = fmod(x, 360.0); + if (fabs(y) < 1e-13) y = 0; /* Alois fix 11-dec-1999 */ + if( y < 0.0 ) y += 360.0; + return(y); +} + +/* Reduce x modulo TWOPI degrees + */ +double FAR PASCAL_CONV swe_radnorm(double x) +{ + double y; + y = fmod(x, TWOPI); + if (fabs(y) < 1e-13) y = 0; /* Alois fix 11-dec-1999 */ + if( y < 0.0 ) y += TWOPI; + return(y); +} + +double FAR PASCAL_CONV swe_deg_midp(double x1, double x0) +{ + double d, y; + d = swe_difdeg2n(x1, x0); /* arc from x0 to x1 */ + y = swe_degnorm(x0 + d / 2); + return(y); +} + +double FAR PASCAL_CONV swe_rad_midp(double x1, double x0) +{ + return DEGTORAD * swe_deg_midp(x1 * RADTODEG, x0 * RADTODEG); +} + +/* Reduce x modulo 2*PI + */ +double swi_mod2PI(double x) +{ + double y; + y = fmod(x, TWOPI); + if( y < 0.0 ) y += TWOPI; + return(y); +} + + +double swi_angnorm(double x) +{ + if (x < 0.0 ) + return x + TWOPI; + else if (x >= TWOPI) + return x - TWOPI; + else + return x; +} + +void swi_cross_prod(double *a, double *b, double *x) +{ + x[0] = a[1]*b[2] - a[2]*b[1]; + x[1] = a[2]*b[0] - a[0]*b[2]; + x[2] = a[0]*b[1] - a[1]*b[0]; +} + +/* Evaluates a given chebyshev series coef[0..ncf-1] + * with ncf terms at x in [-1,1]. Communications of the ACM, algorithm 446, + * April 1973 (vol. 16 no.4) by Dr. Roger Broucke. + */ +double swi_echeb(double x, double *coef, int ncf) +{ + int j; + double x2, br, brp2, brpp; + x2 = x * 2.; + br = 0.; + brp2 = 0.; /* dummy assign to silence gcc warning */ + brpp = 0.; + for (j = ncf - 1; j >= 0; j--) { + brp2 = brpp; + brpp = br; + br = x2 * brpp - brp2 + coef[j]; + } + return (br - brp2) * .5; +} + +/* + * evaluates derivative of chebyshev series, see echeb + */ +double swi_edcheb(double x, double *coef, int ncf) +{ + double bjpl, xjpl; + int j; + double x2, bf, bj, dj, xj, bjp2, xjp2; + x2 = x * 2.; + bf = 0.; /* dummy assign to silence gcc warning */ + bj = 0.; /* dummy assign to silence gcc warning */ + xjp2 = 0.; + xjpl = 0.; + bjp2 = 0.; + bjpl = 0.; + for (j = ncf - 1; j >= 1; j--) { + dj = (double) (j + j); + xj = coef[j] * dj + xjp2; + bj = x2 * bjpl - bjp2 + xj; + bf = bjp2; + bjp2 = bjpl; + bjpl = bj; + xjp2 = xjpl; + xjpl = xj; + } + return (bj - bf) * .5; +} + +/* + * conversion between ecliptical and equatorial polar coordinates. + * for users of SWISSEPH, not used by our routines. + * for ecl. to equ. eps must be negative. + * for equ. to ecl. eps must be positive. + * xpo, xpn are arrays of 3 doubles containing position. + * attention: input must be in degrees! + */ +void FAR PASCAL_CONV swe_cotrans(double *xpo, double *xpn, double eps) +{ + int i; + double x[6], e = eps * DEGTORAD; + for(i = 0; i <= 1; i++) + x[i] = xpo[i]; + x[0] *= DEGTORAD; + x[1] *= DEGTORAD; + x[2] = 1; + for(i = 3; i <= 5; i++) + x[i] = 0; + swi_polcart(x, x); + swi_coortrf(x, x, e); + swi_cartpol(x, x); + xpn[0] = x[0] * RADTODEG; + xpn[1] = x[1] * RADTODEG; + xpn[2] = xpo[2]; +} + +/* + * conversion between ecliptical and equatorial polar coordinates + * with speed. + * for users of SWISSEPH, not used by our routines. + * for ecl. to equ. eps must be negative. + * for equ. to ecl. eps must be positive. + * xpo, xpn are arrays of 6 doubles containing position and speed. + * attention: input must be in degrees! + */ +void FAR PASCAL_CONV swe_cotrans_sp(double *xpo, double *xpn, double eps) +{ + int i; + double x[6], e = eps * DEGTORAD; + for (i = 0; i <= 5; i++) + x[i] = xpo[i]; + x[0] *= DEGTORAD; + x[1] *= DEGTORAD; + x[2] = 1; /* avoids problems with polcart(), if x[2] = 0 */ + x[3] *= DEGTORAD; + x[4] *= DEGTORAD; + swi_polcart_sp(x, x); + swi_coortrf(x, x, e); + swi_coortrf(x+3, x+3, e); + swi_cartpol_sp(x, xpn); + xpn[0] *= RADTODEG; + xpn[1] *= RADTODEG; + xpn[2] = xpo[2]; + xpn[3] *= RADTODEG; + xpn[4] *= RADTODEG; + xpn[5] = xpo[5]; +} + +/* + * conversion between ecliptical and equatorial cartesian coordinates + * for ecl. to equ. eps must be negative + * for equ. to ecl. eps must be positive + */ +void swi_coortrf(double *xpo, double *xpn, double eps) +{ + double sineps, coseps; + double x[3]; + sineps = sin(eps); + coseps = cos(eps); + x[0] = xpo[0]; + x[1] = xpo[1] * coseps + xpo[2] * sineps; + x[2] = -xpo[1] * sineps + xpo[2] * coseps; + xpn[0] = x[0]; + xpn[1] = x[1]; + xpn[2] = x[2]; +} + +/* + * conversion between ecliptical and equatorial cartesian coordinates + * sineps sin(eps) + * coseps cos(eps) + * for ecl. to equ. sineps must be -sin(eps) + */ +void swi_coortrf2(double *xpo, double *xpn, double sineps, double coseps) +{ + double x[3]; + x[0] = xpo[0]; + x[1] = xpo[1] * coseps + xpo[2] * sineps; + x[2] = -xpo[1] * sineps + xpo[2] * coseps; + xpn[0] = x[0]; + xpn[1] = x[1]; + xpn[2] = x[2]; +} + +/* conversion of cartesian (x[3]) to polar coordinates (l[3]). + * x = l is allowed. + * if |x| = 0, then lon, lat and rad := 0. + */ +void swi_cartpol(double *x, double *l) +{ + double rxy; + double ll[3]; + if (x[0] == 0 && x[1] == 0 && x[2] == 0) { + l[0] = l[1] = l[2] = 0; + return; + } + rxy = x[0]*x[0] + x[1]*x[1]; + ll[2] = sqrt(rxy + x[2]*x[2]); + rxy = sqrt(rxy); + ll[0] = atan2(x[1], x[0]); + if (ll[0] < 0.0) ll[0] += TWOPI; + ll[1] = atan(x[2] / rxy); + l[0] = ll[0]; + l[1] = ll[1]; + l[2] = ll[2]; +} + +/* conversion from polar (l[3]) to cartesian coordinates (x[3]). + * x = l is allowed. + */ +void swi_polcart(double *l, double *x) +{ + double xx[3]; + double cosl1; + cosl1 = cos(l[1]); + xx[0] = l[2] * cosl1 * cos(l[0]); + xx[1] = l[2] * cosl1 * sin(l[0]); + xx[2] = l[2] * sin(l[1]); + x[0] = xx[0]; + x[1] = xx[1]; + x[2] = xx[2]; +} + +/* conversion of position and speed. + * from cartesian (x[6]) to polar coordinates (l[6]). + * x = l is allowed. + * if position is 0, function returns direction of + * motion. + */ +void swi_cartpol_sp(double *x, double *l) +{ + double xx[6], ll[6]; + double rxy, coslon, sinlon, coslat, sinlat; + /* zero position */ + if (x[0] == 0 && x[1] == 0 && x[2] == 0) { + l[0] = l[1] = l[3] = l[4] = 0; + l[5] = sqrt(square_sum((x+3))); + swi_cartpol(x+3, l); + l[2] = 0; + return; + } + /* zero speed */ + if (x[3] == 0 && x[4] == 0 && x[5] == 0) { + l[3] = l[4] = l[5] = 0; + swi_cartpol(x, l); + return; + } + /* position */ + rxy = x[0]*x[0] + x[1]*x[1]; + ll[2] = sqrt(rxy + x[2]*x[2]); + rxy = sqrt(rxy); + ll[0] = atan2(x[1], x[0]); + if (ll[0] < 0.0) ll[0] += TWOPI; + ll[1] = atan(x[2] / rxy); + /* speed: + * 1. rotate coordinate system by longitude of position about z-axis, + * so that new x-axis = position radius projected onto x-y-plane. + * in the new coordinate system + * vy'/r = dlong/dt, where r = sqrt(x^2 +y^2). + * 2. rotate coordinate system by latitude about new y-axis. + * vz"/r = dlat/dt, where r = position radius. + * vx" = dr/dt + */ + coslon = x[0] / rxy; /* cos(l[0]); */ + sinlon = x[1] / rxy; /* sin(l[0]); */ + coslat = rxy / ll[2]; /* cos(l[1]); */ + sinlat = x[2] / ll[2]; /* sin(ll[1]); */ + xx[3] = x[3] * coslon + x[4] * sinlon; + xx[4] = -x[3] * sinlon + x[4] * coslon; + l[3] = xx[4] / rxy; /* speed in longitude */ + xx[4] = -sinlat * xx[3] + coslat * x[5]; + xx[5] = coslat * xx[3] + sinlat * x[5]; + l[4] = xx[4] / ll[2]; /* speed in latitude */ + l[5] = xx[5]; /* speed in radius */ + l[0] = ll[0]; /* return position */ + l[1] = ll[1]; + l[2] = ll[2]; +} + +/* conversion of position and speed + * from polar (l[6]) to cartesian coordinates (x[6]) + * x = l is allowed + * explanation s. swi_cartpol_sp() + */ +void swi_polcart_sp(double *l, double *x) +{ + double sinlon, coslon, sinlat, coslat; + double xx[6], rxy, rxyz; + /* zero speed */ + if (l[3] == 0 && l[4] == 0 && l[5] == 0) { + x[3] = x[4] = x[5] = 0; + swi_polcart(l, x); + return; + } + /* position */ + coslon = cos(l[0]); + sinlon = sin(l[0]); + coslat = cos(l[1]); + sinlat = sin(l[1]); + xx[0] = l[2] * coslat * coslon; + xx[1] = l[2] * coslat * sinlon; + xx[2] = l[2] * sinlat; + /* speed; explanation s. swi_cartpol_sp(), same method the other way round*/ + rxyz = l[2]; + rxy = sqrt(xx[0] * xx[0] + xx[1] * xx[1]); + xx[5] = l[5]; + xx[4] = l[4] * rxyz; + x[5] = sinlat * xx[5] + coslat * xx[4]; /* speed z */ + xx[3] = coslat * xx[5] - sinlat * xx[4]; + xx[4] = l[3] * rxy; + x[3] = coslon * xx[3] - sinlon * xx[4]; /* speed x */ + x[4] = sinlon * xx[3] + coslon * xx[4]; /* speed y */ + x[0] = xx[0]; /* return position */ + x[1] = xx[1]; + x[2] = xx[2]; +} + +double swi_dot_prod_unit(double *x, double *y) +{ + double dop = x[0]*y[0]+x[1]*y[1]+x[2]*y[2]; + double e1 = sqrt(x[0]*x[0]+x[1]*x[1]+x[2]*x[2]); + double e2 = sqrt(y[0]*y[0]+y[1]*y[1]+y[2]*y[2]); + dop /= e1; + dop /= e2; + if (dop > 1) + dop = 1; + if (dop < -1) + dop = -1; + return dop; +} + +/* functions for precession and ecliptic obliquity according to Vondrák et alii, 2011 */ +#define AS2R (DEGTORAD / 3600.0) +#define D2PI TWOPI +#define EPS0 (84381.406 * AS2R) +#define NPOL_PEPS 4 +#define NPER_PEPS 10 +#define NPOL_PECL 4 +#define NPER_PECL 8 +#define NPOL_PEQU 4 +#define NPER_PEQU 14 + +/* for pre_peps(): */ +/* polynomials */ +static double pepol[NPOL_PEPS][2] = { + {+8134.017132, +84028.206305}, + {+5043.0520035, +0.3624445}, + {-0.00710733, -0.00004039}, + {+0.000000271, -0.000000110} +}; + +/* periodics */ +static double peper[5][NPER_PEPS] = { + {+409.90, +396.15, +537.22, +402.90, +417.15, +288.92, +4043.00, +306.00, +277.00, +203.00}, + {-6908.287473, -3198.706291, +1453.674527, -857.748557, +1173.231614, -156.981465, +371.836550, -216.619040, +193.691479, +11.891524}, + {+753.872780, -247.805823, +379.471484, -53.880558, -90.109153, -353.600190, -63.115353, -28.248187, +17.703387, +38.911307}, + {-2845.175469, +449.844989, -1255.915323, +886.736783, +418.887514, +997.912441, -240.979710, +76.541307, -36.788069, -170.964086}, + {-1704.720302, -862.308358, +447.832178, -889.571909, +190.402846, -56.564991, -296.222622, -75.859952, +67.473503, +3.014055} +}; + +/* for pre_pecl(): */ +/* polynomials */ +static double pqpol[NPOL_PECL][2] = { + {+5851.607687, -1600.886300}, + {-0.1189000, +1.1689818}, + {-0.00028913, -0.00000020}, + {+0.000000101, -0.000000437} +}; + +/* periodics */ +static double pqper[5][NPER_PECL] = { + {708.15, 2309, 1620, 492.2, 1183, 622, 882, 547}, + {-5486.751211, -17.127623, -617.517403, 413.44294, 78.614193, -180.732815, -87.676083, 46.140315}, + {-684.66156, 2446.28388, 399.671049, -356.652376, -186.387003, -316.80007, 198.296701, 101.135679}, /* typo in publication fixed */ + {667.66673, -2354.886252, -428.152441, 376.202861, 184.778874, 335.321713, -185.138669, -120.97283}, + {-5523.863691, -549.74745, -310.998056, 421.535876, -36.776172, -145.278396, -34.74445, 22.885731} +}; + +/* for pre_pequ(): */ +/* polynomials */ +static double xypol[NPOL_PEQU][2] = { + {+5453.282155, -73750.930350}, + {+0.4252841, -0.7675452}, + {-0.00037173, -0.00018725}, + {-0.000000152, +0.000000231} +}; + +/* periodics */ +static double xyper[5][NPER_PEQU] = { + {256.75, 708.15, 274.2, 241.45, 2309, 492.2, 396.1, 288.9, 231.1, 1610, 620, 157.87, 220.3, 1200}, + {-819.940624, -8444.676815, 2600.009459, 2755.17563, -167.659835, 871.855056, 44.769698, -512.313065, -819.415595, -538.071099, -189.793622, -402.922932, 179.516345, -9.814756}, + {75004.344875, 624.033993, 1251.136893, -1102.212834, -2660.66498, 699.291817, 153.16722, -950.865637, 499.754645, -145.18821, 558.116553, -23.923029, -165.405086, 9.344131}, + {81491.287984, 787.163481, 1251.296102, -1257.950837, -2966.79973, 639.744522, 131.600209, -445.040117, 584.522874, -89.756563, 524.42963, -13.549067, -210.157124, -44.919798}, + {1558.515853, 7774.939698, -2219.534038, -2523.969396, 247.850422, -846.485643, -1393.124055, 368.526116, 749.045012, 444.704518, 235.934465, 374.049623, -171.33018, -22.899655} +}; + +void swi_ldp_peps(double tjd, double *dpre, double *deps) +{ + int i; + int npol = NPOL_PEPS; + int nper = NPER_PEPS; + double t, p, q, w, a, s, c; + t = (tjd - J2000) / 36525.0; + p = 0; + q = 0; + /* periodic terms */ + for (i = 0; i < nper; i++) { + w = D2PI * t; + a = w / peper[0][i]; + s = sin(a); + c = cos(a); + p += c * peper[1][i] + s * peper[3][i]; + q += c * peper[2][i] + s * peper[4][i]; + } + /* polynomial terms */ + w = 1; + for (i = 0; i < npol; i++) { + p += pepol[i][0] * w; + q += pepol[i][1] * w; + w *= t; + } + /* both to radians */ + p *= AS2R; + q *= AS2R; + /* return */ + if (dpre != NULL) + *dpre = p; + if (deps != NULL) + *deps = q; +} + +/* + * Long term high precision precession, + * according to Vondrak/Capitaine/Wallace, "New precession expressions, valid + * for long time intervals", in A&A 534, A22(2011). + */ +/* precession of the ecliptic */ +static void pre_pecl(double tjd, double *vec) +{ + int i; + int npol = NPOL_PECL; + int nper = NPER_PECL; + double t, p, q, w, a, s, c, z; + t = (tjd - J2000) / 36525.0; + p = 0; + q = 0; + /* periodic terms */ + for (i = 0; i < nper; i++) { + w = D2PI * t; + a = w / pqper[0][i]; + s = sin(a); + c = cos(a); + p += c * pqper[1][i] + s * pqper[3][i]; + q += c * pqper[2][i] + s * pqper[4][i]; + } + /* polynomial terms */ + w = 1; + for (i = 0; i < npol; i++) { + p += pqpol[i][0] * w; + q += pqpol[i][1] * w; + w *= t; + } + /* both to radians */ + p *= AS2R; + q *= AS2R; + /* ecliptic pole vector */ + z = 1 - p * p - q * q; + if (z < 0) + z = 0; + else + z = sqrt(z); + s = sin(EPS0); + c = cos(EPS0); + vec[0] = p; + vec[1] = - q * c - z * s; + vec[2] = - q * s + z * c; +} + +/* precession of the equator */ +static void pre_pequ(double tjd, double *veq) +{ + int i; + int npol = NPOL_PEQU; + int nper = NPER_PEQU; + double t, x, y, w, a, s, c; + t = (tjd - J2000) / 36525.0; + x = 0; + y = 0; + for (i = 0; i < nper; i++) { + w = D2PI * t; + a = w / xyper[0][i]; + s = sin(a); + c = cos(a); + x += c * xyper[1][i] + s * xyper[3][i]; + y += c * xyper[2][i] + s * xyper[4][i]; + } + /* polynomial terms */ + w = 1; + for (i = 0; i < npol; i++) { + x += xypol[i][0] * w; + y += xypol[i][1] * w; + w *= t; + } + x *= AS2R; + y *= AS2R; + /* equator pole vector */ + veq[0] = x; + veq[1] = y; + w = x * x + y * y; + if (w < 1) + veq[2] = sqrt(1 - w); + else + veq[2] = 0; +} + +#if 0 +static void swi_cross_prod(double *a, double *b, double *x) +{ + x[0] = a[1] * b[2] - a[2] * b[1]; + x[1] = a[2] * b[0] - a[0] * b[2]; + x[2] = a[0] * b[1] - a[1] * b[0]; +} +#endif + +/* precession matrix */ +static void pre_pmat(double tjd, double *rp) +{ + double peqr[3], pecl[3], v[3], w, eqx[3]; + /*equator pole */ + pre_pequ(tjd, peqr); + /* ecliptic pole */ + pre_pecl(tjd, pecl); + /* equinox */ + swi_cross_prod(peqr, pecl, v); + w = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); + eqx[0] = v[0] / w; + eqx[1] = v[1] / w; + eqx[2] = v[2] / w; + swi_cross_prod(peqr, eqx, v); + rp[0] = eqx[0]; + rp[1] = eqx[1]; + rp[2] = eqx[2]; + rp[3] = v[0]; + rp[4] = v[1]; + rp[5] = v[2]; + rp[6] = peqr[0]; + rp[7] = peqr[1]; + rp[8] = peqr[2]; +} + +/* Obliquity of the ecliptic at Julian date J + * + * IAU Coefficients are from: + * J. H. Lieske, T. Lederle, W. Fricke, and B. Morando, + * "Expressions for the Precession Quantities Based upon the IAU + * (1976) System of Astronomical Constants," Astronomy and Astrophysics + * 58, 1-16 (1977). + * + * Before or after 200 years from J2000, the formula used is from: + * J. Laskar, "Secular terms of classical planetary theories + * using the results of general theory," Astronomy and Astrophysics + * 157, 59070 (1986). + * + * Bretagnon, P. et al.: 2003, "Expressions for Precession Consistent with + * the IAU 2000A Model". A&A 400,785 + *B03 84381.4088 -46.836051*t -1667*10-7*t2 +199911*10-8*t3 -523*10-9*t4 -248*10-10*t5 -3*10-11*t6 + *C03 84381.406 -46.836769*t -1831*10-7*t2 +20034*10-7*t3 -576*10-9*t4 -434*10-10*t5 + * + * See precess and page B18 of the Astronomical Almanac. + */ +double swi_epsiln(double J) +{ + double T, eps; + T = (J - 2451545.0)/36525.0; + if (PREC_IAU_1976 && fabs(T) <= PREC_IAU_1976_CTIES ) { + eps = (((1.813e-3*T-5.9e-4)*T-46.8150)*T+84381.448)*DEGTORAD/3600; + } else if (PREC_IAU_2003 && fabs(T) <= PREC_IAU_2003_CTIES) { + eps = (((((-4.34e-8 * T -5.76e-7) * T +2.0034e-3) * T -1.831e-4) * T -46.836769) * T + 84381.406) * DEGTORAD / 3600.0; + } else if (PREC_BRETAGNON_2003) { + eps = ((((((-3e-11 * T - 2.48e-8) * T -5.23e-7) * T +1.99911e-3) * T -1.667e-4) * T -46.836051) * T + 84381.40880) * DEGTORAD / 3600.0;/* */ + } else if (PREC_SIMON_1994) { + eps = (((((2.5e-8 * T -5.1e-7) * T +1.9989e-3) * T -1.52e-4) * T -46.80927) * T + 84381.412) * DEGTORAD / 3600.0;/* */ + } else if (PREC_WILLIAMS_1994) { + eps = ((((-1.0e-6 * T +2.0e-3) * T -1.74e-4) * T -46.833960) * T + 84381.409) * DEGTORAD / 3600.0;/* */ + } else if (PREC_LASKAR_1986) { + T /= 10.0; + eps = ((((((((( 2.45e-10*T + 5.79e-9)*T + 2.787e-7)*T + + 7.12e-7)*T - 3.905e-5)*T - 2.4967e-3)*T + - 5.138e-3)*T + 1.99925)*T - 0.0155)*T - 468.093)*T + + 84381.448; + eps *= DEGTORAD/3600; + } else { /* PREC_VONDRAK_2011 */ + swi_ldp_peps(J, NULL, &eps); + } + return(eps); +} + +/* Precession of the equinox and ecliptic + * from epoch Julian date J to or from J2000.0 + * + * Original program by Steve Moshier. + * Changes in program structure and implementation of IAU 2003 (P03) and + * Vondrak 2011 by Dieter Koch. + * + * #define PREC_VONDRAK_2011 1 + * J. Vondrák, N. Capitaine, and P. Wallace, "New precession expressions, + * valid for long time intervals", A&A 534, A22 (2011) + * + * #define PREC_IAU_2003 0 + * N. Capitaine, P.T. Wallace, and J. Chapront, "Expressions for IAU 2000 + * precession quantities", 2003, A&A 412, 567-568 (2003). + * This is a "short" term model, that can be combined with other models + * + * #define PREC_WILLIAMS_1994 0 + * James G. Williams, "Contributions to the Earth's obliquity rate, + * precession, and nutation," Astron. J. 108, 711-724 (1994). + * + * #define PREC_SIMON_1994 0 + * J. L. Simon, P. Bretagnon, J. Chapront, M. Chapront-Touze', G. Francou, + * and J. Laskar, "Numerical Expressions for precession formulae and + * mean elements for the Moon and the planets," Astronomy and Astrophysics + * 282, 663-683 (1994). + * + * #define PREC_IAU_1976 0 + * IAU Coefficients are from: + * J. H. Lieske, T. Lederle, W. Fricke, and B. Morando, + * "Expressions for the Precession Quantities Based upon the IAU + * (1976) System of Astronomical Constants," Astronomy and + * Astrophysics 58, 1-16 (1977). + * This is a "short" term model, that can be combined with other models + * + * #define PREC_LASKAR_1986 0 + * Newer formulas that cover a much longer time span are from: + * J. Laskar, "Secular terms of classical planetary theories + * using the results of general theory," Astronomy and Astrophysics + * 157, 59070 (1986). + * + * See also: + * P. Bretagnon and G. Francou, "Planetary theories in rectangular + * and spherical variables. VSOP87 solutions," Astronomy and + * Astrophysics 202, 309-315 (1988). + * + * Bretagnon and Francou's expansions for the node and inclination + * of the ecliptic were derived from Laskar's data but were truncated + * after the term in T**6. I have recomputed these expansions from + * Laskar's data, retaining powers up to T**10 in the result. + * + */ +/* In WILLIAMS and SIMON, Laskar's terms of order higher than t^4 + have been retained, because Simon et al mention that the solution + is the same except for the lower order terms. */ + +#if (PREC_WILLIAMS_1994 || PREC_VONDRAK_2011) /* Vondrak only added to shut up the compiler */ +static double pAcof[] = { + -8.66e-10, -4.759e-8, 2.424e-7, 1.3095e-5, 1.7451e-4, -1.8055e-3, + -0.235316, 0.076, 110.5407, 50287.70000 }; +static double nodecof[] = { + 6.6402e-16, -2.69151e-15, -1.547021e-12, 7.521313e-12, 1.9e-10, + -3.54e-9, -1.8103e-7, 1.26e-7, 7.436169e-5, + -0.04207794833, 3.052115282424}; +static double inclcof[] = { + 1.2147e-16, 7.3759e-17, -8.26287e-14, 2.503410e-13, 2.4650839e-11, + -5.4000441e-11, 1.32115526e-9, -6.012e-7, -1.62442e-5, + 0.00227850649, 0.0 }; +#endif + +#if PREC_SIMON_1994 +/* Precession coefficients from Simon et al: */ +static double pAcof[] = { + -8.66e-10, -4.759e-8, 2.424e-7, 1.3095e-5, 1.7451e-4, -1.8055e-3, + -0.235316, 0.07732, 111.2022, 50288.200 }; +static double nodecof[] = { + 6.6402e-16, -2.69151e-15, -1.547021e-12, 7.521313e-12, 1.9e-10, + -3.54e-9, -1.8103e-7, 2.579e-8, 7.4379679e-5, + -0.0420782900, 3.0521126906}; +static double inclcof[] = { + 1.2147e-16, 7.3759e-17, -8.26287e-14, 2.503410e-13, 2.4650839e-11, + -5.4000441e-11, 1.32115526e-9, -5.99908e-7, -1.624383e-5, + 0.002278492868, 0.0 }; +#endif + +#if PREC_LASKAR_1986 +/* Precession coefficients taken from Laskar's paper: */ +static double pAcof[] = { + -8.66e-10, -4.759e-8, 2.424e-7, 1.3095e-5, 1.7451e-4, -1.8055e-3, + -0.235316, 0.07732, 111.1971, 50290.966 }; +/* Node and inclination of the earth's orbit computed from + * Laskar's data as done in Bretagnon and Francou's paper. + * Units are radians. + */ +static double nodecof[] = { + 6.6402e-16, -2.69151e-15, -1.547021e-12, 7.521313e-12, 6.3190131e-10, + -3.48388152e-9, -1.813065896e-7, 2.75036225e-8, 7.4394531426e-5, + -0.042078604317, 3.052112654975 }; +static double inclcof[] = { + 1.2147e-16, 7.3759e-17, -8.26287e-14, 2.503410e-13, 2.4650839e-11, + -5.4000441e-11, 1.32115526e-9, -5.998737027e-7, -1.6242797091e-5, + 0.002278495537, 0.0 }; +#endif + +#if PREC_BRETAGNON_2003 +static double pAcof[] = {}; +static double nodecof[] = {}; +static double inclcof[] = {}; +#endif + +/* Subroutine arguments: + * + * R = rectangular equatorial coordinate vector to be precessed. + * The result is written back into the input vector. + * J = Julian date + * direction = + * Precess from J to J2000: direction = 1 + * Precess from J2000 to J: direction = -1 + * Note that if you want to precess from J1 to J2, you would + * first go from J1 to J2000, then call the program again + * to go from J2000 to J2. + */ +int swi_precess(double *R, double J, int direction ) +{ + return precess0(R, J, direction); +} + +static int precess0(double *R, double J, int direction ) +{ + double sinth, costh, sinZ, cosZ, sinz, cosz; + double eps, sineps, coseps; + double A, B, T, Z, z, TH, pA, W; + double x[3], pmat[9]; + double *p; + int i, j; + if( J == J2000 ) + return(0); + /* Each precession angle is specified by a polynomial in + * T = Julian centuries from J2000.0. See AA page B18. + */ + T = (J - J2000)/36525.0; + /* Use IAU formula for a few centuries. */ + if (PREC_IAU_1976 && fabs(T) <= PREC_IAU_1976_CTIES) { + Z = (( 0.017998*T + 0.30188)*T + 2306.2181)*T*DEGTORAD/3600; + z = (( 0.018203*T + 1.09468)*T + 2306.2181)*T*DEGTORAD/3600; + TH = ((-0.041833*T - 0.42665)*T + 2004.3109)*T*DEGTORAD/3600; + } else if (PREC_IAU_2003 && fabs(T) <= PREC_IAU_2003_CTIES) { + Z = (((((- 0.0000003173*T - 0.000005971)*T + 0.01801828)*T + 0.2988499)*T + 2306.083227)*T + 2.650545)*DEGTORAD/3600; + z = (((((- 0.0000002904*T - 0.000028596)*T + 0.01826837)*T + 1.0927348)*T + 2306.077181)*T - 2.650545)*DEGTORAD/3600; + TH = ((((-0.00000011274*T - 0.000007089)*T - 0.04182264)*T - 0.4294934)*T + 2004.191903)*T*DEGTORAD/3600; + /* AA 2006 B28: + Z = (((((- 0.0000002*T - 0.0000327)*T + 0.0179663)*T + 0.3019015)*T + 2306.0809506)*T + 2.5976176)*DEGTORAD/3600; + z = (((((- 0.0000003*T - 0.000047)*T + 0.0182237)*T + 1.0947790)*T + 2306.0803226)*T - 2.5976176)*DEGTORAD/3600; + TH = ((((-0.0000001*T - 0.0000601)*T - 0.0418251)*T - 0.4269353)*T + 2004.1917476)*T*DEGTORAD/3600; + */ + } else if (PREC_BRETAGNON_2003) { + Z = ((((((-0.00000000013*T - 0.0000003040)*T - 0.000005708)*T + 0.01801752)*T + 0.3023262)*T + 2306.080472)*T + 2.72767)*DEGTORAD/3600; + z = ((((((-0.00000000005*T - 0.0000002486)*T - 0.000028276)*T + 0.01826676)*T + 1.0956768)*T + 2306.076070)*T - 2.72767)*DEGTORAD/3600; + TH = ((((((0.000000000009*T + 0.00000000036)*T -0.0000001127)*T - 0.000007291)*T - 0.04182364)*T - 0.4266980)*T + 2004.190936)*T*DEGTORAD/3600; + } else if (PREC_LASKAR_1986) { + goto laskar; + } else { /* PREC_VONDRAK_2011 */ + pre_pmat(J, pmat); + if (direction == -1) { + for (i = 0, j = 0; i <= 2; i++, j = i * 3) { + x[i] = R[0] * pmat[j + 0] + + R[1] * pmat[j + 1] + + R[2] * pmat[j + 2]; + } + } else { + for (i = 0, j = 0; i <= 2; i++, j = i * 3) { + x[i] = R[0] * pmat[i + 0] + + R[1] * pmat[i + 3] + + R[2] * pmat[i + 6]; + } + } + for (i = 0; i < 3; i++) + R[i] = x[i]; + return(0); + } + sinth = sin(TH); + costh = cos(TH); + sinZ = sin(Z); + cosZ = cos(Z); + sinz = sin(z); + cosz = cos(z); + A = cosZ*costh; + B = sinZ*costh; + if( direction < 0 ) { /* From J2000.0 to J */ + x[0] = (A*cosz - sinZ*sinz)*R[0] + - (B*cosz + cosZ*sinz)*R[1] + - sinth*cosz*R[2]; + x[1] = (A*sinz + sinZ*cosz)*R[0] + - (B*sinz - cosZ*cosz)*R[1] + - sinth*sinz*R[2]; + x[2] = cosZ*sinth*R[0] + - sinZ*sinth*R[1] + + costh*R[2]; + } + else { /* From J to J2000.0 */ + x[0] = (A*cosz - sinZ*sinz)*R[0] + + (A*sinz + sinZ*cosz)*R[1] + + cosZ*sinth*R[2]; + x[1] = - (B*cosz + cosZ*sinz)*R[0] + - (B*sinz - cosZ*cosz)*R[1] + - sinZ*sinth*R[2]; + x[2] = - sinth*cosz*R[0] + - sinth*sinz*R[1] + + costh*R[2]; + } + goto done; + laskar: + /* Implementation by elementary rotations using Laskar's expansions. + * First rotate about the x axis from the initial equator + * to the ecliptic. (The input is equatorial.) + */ + if( direction == 1 ) + eps = swi_epsiln(J); /* To J2000 */ + else + eps = swi_epsiln(J2000); /* From J2000 */ + sineps = sin(eps); + coseps = cos(eps); + x[0] = R[0]; + z = coseps*R[1] + sineps*R[2]; + x[2] = -sineps*R[1] + coseps*R[2]; + x[1] = z; + /* Precession in longitude */ + T /= 10.0; /* thousands of years */ + p = pAcof; + pA = *p++; + for( i=0; i<9; i++ ) + pA = pA * T + *p++; + pA *= DEGTORAD/3600 * T; + /* Node of the moving ecliptic on the J2000 ecliptic. + */ + p = nodecof; + W = *p++; + for( i=0; i<10; i++ ) + W = W * T + *p++; + /* Rotate about z axis to the node. + */ + if( direction == 1 ) + z = W + pA; + else + z = W; + B = cos(z); + A = sin(z); + z = B * x[0] + A * x[1]; + x[1] = -A * x[0] + B * x[1]; + x[0] = z; + /* Rotate about new x axis by the inclination of the moving + * ecliptic on the J2000 ecliptic. + */ + p = inclcof; + z = *p++; + for( i=0; i<10; i++ ) + z = z * T + *p++; + if( direction == 1 ) + z = -z; + B = cos(z); + A = sin(z); + z = B * x[1] + A * x[2]; + x[2] = -A * x[1] + B * x[2]; + x[1] = z; + /* Rotate about new z axis back from the node. + */ + if( direction == 1 ) + z = -W; + else + z = -W - pA; + B = cos(z); + A = sin(z); + z = B * x[0] + A * x[1]; + x[1] = -A * x[0] + B * x[1]; + x[0] = z; + /* Rotate about x axis to final equator. + */ + if( direction == 1 ) + eps = swi_epsiln(J2000); + else + eps = swi_epsiln(J); + sineps = sin(eps); + coseps = cos(eps); + z = coseps * x[1] - sineps * x[2]; + x[2] = sineps * x[1] + coseps * x[2]; + x[1] = z; + done: + for( i=0; i<3; i++ ) + R[i] = x[i]; + return(0); +} + +#if NUT_IAU_1980 +/* Nutation in longitude and obliquity + * computed at Julian date J. + * + * References: + * "Summary of 1980 IAU Theory of Nutation (Final Report of the + * IAU Working Group on Nutation)", P. K. Seidelmann et al., in + * Transactions of the IAU Vol. XVIII A, Reports on Astronomy, + * P. A. Wayman, ed.; D. Reidel Pub. Co., 1982. + * + * "Nutation and the Earth's Rotation", + * I.A.U. Symposium No. 78, May, 1977, page 256. + * I.A.U., 1980. + * + * Woolard, E.W., "A redevelopment of the theory of nutation", + * The Astronomical Journal, 58, 1-3 (1953). + * + * This program implements all of the 1980 IAU nutation series. + * Results checked at 100 points against the 1986 AA; all agreed. + * + * + * - S. L. Moshier, November 1987 + * October, 1992 - typo fixed in nutation matrix + * + * - D. Koch, November 1995: small changes in structure, + * Corrections to IAU 1980 Series added from Expl. Suppl. p. 116 + * + * Each term in the expansion has a trigonometric + * argument given by + * W = i*MM + j*MS + k*FF + l*DD + m*OM + * where the variables are defined below. + * The nutation in longitude is a sum of terms of the + * form (a + bT) * sin(W). The terms for nutation in obliquity + * are of the form (c + dT) * cos(W). The coefficients + * are arranged in the tabulation as follows: + * + * Coefficient: + * i j k l m a b c d + * 0, 0, 0, 0, 1, -171996, -1742, 92025, 89, + * The first line of the table, above, is done separately + * since two of the values do not fit into 16 bit integers. + * The values a and c are arc seconds times 10000. b and d + * are arc seconds per Julian century times 100000. i through m + * are integers. See the program for interpretation of MM, MS, + * etc., which are mean orbital elements of the Sun and Moon. + * + * If terms with coefficient less than X are omitted, the peak + * errors will be: + * + * omit error, omit error, + * a < longitude c < obliquity + * .0005" .0100" .0008" .0094" + * .0046 .0492 .0095 .0481 + * .0123 .0880 .0224 .0905 + * .0386 .1808 .0895 .1129 + */ +static short FAR nt[] = { +/* LS and OC are units of 0.0001" + *LS2 and OC2 are units of 0.00001" + *MM,MS,FF,DD,OM, LS, LS2,OC, OC2 */ + 0, 0, 0, 0, 2, 2062, 2,-895, 5, +-2, 0, 2, 0, 1, 46, 0,-24, 0, + 2, 0,-2, 0, 0, 11, 0, 0, 0, +-2, 0, 2, 0, 2,-3, 0, 1, 0, + 1,-1, 0,-1, 0,-3, 0, 0, 0, + 0,-2, 2,-2, 1,-2, 0, 1, 0, + 2, 0,-2, 0, 1, 1, 0, 0, 0, + 0, 0, 2,-2, 2,-13187,-16, 5736,-31, + 0, 1, 0, 0, 0, 1426,-34, 54,-1, + 0, 1, 2,-2, 2,-517, 12, 224,-6, + 0,-1, 2,-2, 2, 217,-5,-95, 3, + 0, 0, 2,-2, 1, 129, 1,-70, 0, + 2, 0, 0,-2, 0, 48, 0, 1, 0, + 0, 0, 2,-2, 0,-22, 0, 0, 0, + 0, 2, 0, 0, 0, 17,-1, 0, 0, + 0, 1, 0, 0, 1,-15, 0, 9, 0, + 0, 2, 2,-2, 2,-16, 1, 7, 0, + 0,-1, 0, 0, 1,-12, 0, 6, 0, +-2, 0, 0, 2, 1,-6, 0, 3, 0, + 0,-1, 2,-2, 1,-5, 0, 3, 0, + 2, 0, 0,-2, 1, 4, 0,-2, 0, + 0, 1, 2,-2, 1, 4, 0,-2, 0, + 1, 0, 0,-1, 0,-4, 0, 0, 0, + 2, 1, 0,-2, 0, 1, 0, 0, 0, + 0, 0,-2, 2, 1, 1, 0, 0, 0, + 0, 1,-2, 2, 0,-1, 0, 0, 0, + 0, 1, 0, 0, 2, 1, 0, 0, 0, +-1, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 2,-2, 0,-1, 0, 0, 0, + 0, 0, 2, 0, 2,-2274,-2, 977,-5, + 1, 0, 0, 0, 0, 712, 1,-7, 0, + 0, 0, 2, 0, 1,-386,-4, 200, 0, + 1, 0, 2, 0, 2,-301, 0, 129,-1, + 1, 0, 0,-2, 0,-158, 0,-1, 0, +-1, 0, 2, 0, 2, 123, 0,-53, 0, + 0, 0, 0, 2, 0, 63, 0,-2, 0, + 1, 0, 0, 0, 1, 63, 1,-33, 0, +-1, 0, 0, 0, 1,-58,-1, 32, 0, +-1, 0, 2, 2, 2,-59, 0, 26, 0, + 1, 0, 2, 0, 1,-51, 0, 27, 0, + 0, 0, 2, 2, 2,-38, 0, 16, 0, + 2, 0, 0, 0, 0, 29, 0,-1, 0, + 1, 0, 2,-2, 2, 29, 0,-12, 0, + 2, 0, 2, 0, 2,-31, 0, 13, 0, + 0, 0, 2, 0, 0, 26, 0,-1, 0, +-1, 0, 2, 0, 1, 21, 0,-10, 0, +-1, 0, 0, 2, 1, 16, 0,-8, 0, + 1, 0, 0,-2, 1,-13, 0, 7, 0, +-1, 0, 2, 2, 1,-10, 0, 5, 0, + 1, 1, 0,-2, 0,-7, 0, 0, 0, + 0, 1, 2, 0, 2, 7, 0,-3, 0, + 0,-1, 2, 0, 2,-7, 0, 3, 0, + 1, 0, 2, 2, 2,-8, 0, 3, 0, + 1, 0, 0, 2, 0, 6, 0, 0, 0, + 2, 0, 2,-2, 2, 6, 0,-3, 0, + 0, 0, 0, 2, 1,-6, 0, 3, 0, + 0, 0, 2, 2, 1,-7, 0, 3, 0, + 1, 0, 2,-2, 1, 6, 0,-3, 0, + 0, 0, 0,-2, 1,-5, 0, 3, 0, + 1,-1, 0, 0, 0, 5, 0, 0, 0, + 2, 0, 2, 0, 1,-5, 0, 3, 0, + 0, 1, 0,-2, 0,-4, 0, 0, 0, + 1, 0,-2, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 1, 0,-4, 0, 0, 0, + 1, 1, 0, 0, 0,-3, 0, 0, 0, + 1, 0, 2, 0, 0, 3, 0, 0, 0, + 1,-1, 2, 0, 2,-3, 0, 1, 0, +-1,-1, 2, 2, 2,-3, 0, 1, 0, +-2, 0, 0, 0, 1,-2, 0, 1, 0, + 3, 0, 2, 0, 2,-3, 0, 1, 0, + 0,-1, 2, 2, 2,-3, 0, 1, 0, + 1, 1, 2, 0, 2, 2, 0,-1, 0, +-1, 0, 2,-2, 1,-2, 0, 1, 0, + 2, 0, 0, 0, 1, 2, 0,-1, 0, + 1, 0, 0, 0, 2,-2, 0, 1, 0, + 3, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 2, 1, 2, 2, 0,-1, 0, +-1, 0, 0, 0, 2, 1, 0,-1, 0, + 1, 0, 0,-4, 0,-1, 0, 0, 0, +-2, 0, 2, 2, 2, 1, 0,-1, 0, +-1, 0, 2, 4, 2,-2, 0, 1, 0, + 2, 0, 0,-4, 0,-1, 0, 0, 0, + 1, 1, 2,-2, 2, 1, 0,-1, 0, + 1, 0, 2, 2, 1,-1, 0, 1, 0, +-2, 0, 2, 4, 2,-1, 0, 1, 0, +-1, 0, 4, 0, 2, 1, 0, 0, 0, + 1,-1, 0,-2, 0, 1, 0, 0, 0, + 2, 0, 2,-2, 1, 1, 0,-1, 0, + 2, 0, 2, 2, 2,-1, 0, 0, 0, + 1, 0, 0, 2, 1,-1, 0, 0, 0, + 0, 0, 4,-2, 2, 1, 0, 0, 0, + 3, 0, 2,-2, 2, 1, 0, 0, 0, + 1, 0, 2,-2, 0,-1, 0, 0, 0, + 0, 1, 2, 0, 1, 1, 0, 0, 0, +-1,-1, 0, 2, 1, 1, 0, 0, 0, + 0, 0,-2, 0, 1,-1, 0, 0, 0, + 0, 0, 2,-1, 2,-1, 0, 0, 0, + 0, 1, 0, 2, 0,-1, 0, 0, 0, + 1, 0,-2,-2, 0,-1, 0, 0, 0, + 0,-1, 2, 0, 1,-1, 0, 0, 0, + 1, 1, 0,-2, 1,-1, 0, 0, 0, + 1, 0,-2, 2, 0,-1, 0, 0, 0, + 2, 0, 0, 2, 0, 1, 0, 0, 0, + 0, 0, 2, 4, 2,-1, 0, 0, 0, + 0, 1, 0, 1, 0, 1, 0, 0, 0, +#if NUT_CORR_1987 +/* corrections to IAU 1980 nutation series by Herring 1987 + * in 0.00001" !!! + * LS OC */ + 101, 0, 0, 0, 1,-725, 0, 213, 0, + 101, 1, 0, 0, 0, 523, 0, 208, 0, + 101, 0, 2,-2, 2, 102, 0, -41, 0, + 101, 0, 2, 0, 2, -81, 0, 32, 0, +/* LC OS !!! */ + 102, 0, 0, 0, 1, 417, 0, 224, 0, + 102, 1, 0, 0, 0, 61, 0, -24, 0, + 102, 0, 2,-2, 2,-118, 0, -47, 0, +#endif + ENDMARK, +}; +#endif + +#if NUT_IAU_1980 +int swi_nutation(double J, double *nutlo) +{ + /* arrays to hold sines and cosines of multiple angles */ + double ss[5][8]; + double cc[5][8]; + double arg; + double args[5]; + double f, g, T, T2; + double MM, MS, FF, DD, OM; + double cu, su, cv, sv, sw, s; + double C, D; + int i, j, k, k1, m, n; + int ns[5]; + short *p; + /* Julian centuries from 2000 January 1.5, + * barycentric dynamical time + */ + T = (J - 2451545.0) / 36525.0; + T2 = T * T; + /* Fundamental arguments in the FK5 reference system. + * The coefficients, originally given to 0.001", + * are converted here to degrees. + */ + /* longitude of the mean ascending node of the lunar orbit + * on the ecliptic, measured from the mean equinox of date + */ + OM = -6962890.539 * T + 450160.280 + (0.008 * T + 7.455) * T2; + OM = swe_degnorm(OM/3600) * DEGTORAD; + /* mean longitude of the Sun minus the + * mean longitude of the Sun's perigee + */ + MS = 129596581.224 * T + 1287099.804 - (0.012 * T + 0.577) * T2; + MS = swe_degnorm(MS/3600) * DEGTORAD; + /* mean longitude of the Moon minus the + * mean longitude of the Moon's perigee + */ + MM = 1717915922.633 * T + 485866.733 + (0.064 * T + 31.310) * T2; + MM = swe_degnorm(MM/3600) * DEGTORAD; + /* mean longitude of the Moon minus the + * mean longitude of the Moon's node + */ + FF = 1739527263.137 * T + 335778.877 + (0.011 * T - 13.257) * T2; + FF = swe_degnorm(FF/3600) * DEGTORAD; + /* mean elongation of the Moon from the Sun. + */ + DD = 1602961601.328 * T + 1072261.307 + (0.019 * T - 6.891) * T2; + DD = swe_degnorm(DD/3600) * DEGTORAD; + args[0] = MM; + ns[0] = 3; + args[1] = MS; + ns[1] = 2; + args[2] = FF; + ns[2] = 4; + args[3] = DD; + ns[3] = 4; + args[4] = OM; + ns[4] = 2; + /* Calculate sin( i*MM ), etc. for needed multiple angles + */ + for (k = 0; k <= 4; k++) { + arg = args[k]; + n = ns[k]; + su = sin(arg); + cu = cos(arg); + ss[k][0] = su; /* sin(L) */ + cc[k][0] = cu; /* cos(L) */ + sv = 2.0*su*cu; + cv = cu*cu - su*su; + ss[k][1] = sv; /* sin(2L) */ + cc[k][1] = cv; + for( i=2; i 100) + j = 0; /* p[0] is a flag */ + if( j ) { + k = j; + if( j < 0 ) + k = -k; + su = ss[m][k-1]; /* sin(k*angle) */ + if( j < 0 ) + su = -su; + cu = cc[m][k-1]; + if( k1 == 0 ) { /* set first angle */ + sv = su; + cv = cu; + k1 = 1; + } + else { /* combine angles */ + sw = su*cv + cu*sv; + cv = cu*cv - su*sv; + sv = sw; + } + } + } + /* longitude coefficient, in 0.0001" */ + f = p[5] * 0.0001; + if( p[6] != 0 ) + f += 0.00001 * T * p[6]; + /* obliquity coefficient, in 0.0001" */ + g = p[7] * 0.0001; + if( p[8] != 0 ) + g += 0.00001 * T * p[8]; + if (*p >= 100) { /* coefficients in 0.00001" */ + f *= 0.1; + g *= 0.1; + } + /* accumulate the terms */ + if (*p != 102) { + C += f * sv; + D += g * cv; + } + else { /* cos for nutl and sin for nuto */ + C += f * cv; + D += g * sv; + } + /* + if (i >= 105) { + printf("%4.10f, %4.10f\n",f*sv,g*cv); + } + */ + } + /* + printf("%4.10f, %4.10f, %4.10f, %4.10f\n",MS*RADTODEG,FF*RADTODEG,DD*RADTODEG,OM*RADTODEG); + printf( "nutation: in longitude %.9f\", in obliquity %.9f\"\n", C, D ); + */ + /* Save answers, expressed in radians */ + nutlo[0] = DEGTORAD * C / 3600.0; + nutlo[1] = DEGTORAD * D / 3600.0; + return(0); +} +#endif + +#if NUT_IAU_2000A || NUT_IAU_2000B +/* Nutation IAU 2000A model + * (MHB2000 luni-solar and planetary nutation, without free core nutation) + * + * Function returns nutation in longitude and obliquity in radians with + * respect to the equinox of date. For the obliquity of the ecliptic + * the calculation of Lieske & al. (1977) must be used. + * + * The precision in recent years is about 0.001 arc seconds. + * + * The calculation includes luni-solar and planetary nutation. + * Free core nutation, which cannot be predicted, is omitted, + * the error being of the order of a few 0.0001 arc seconds. + * + * References: + * + * Capitaine, N., Wallace, P.T., Chapront, J., A & A 432, 366 (2005). + * + * Chapront, J., Chapront-Touze, M. & Francou, G., A & A 387, 700 (2002). + * + * Lieske, J.H., Lederle, T., Fricke, W. & Morando, B., "Expressions + * for the precession quantities based upon the IAU (1976) System of + * Astronomical Constants", A & A 58, 1-16 (1977). + * + * Mathews, P.M., Herring, T.A., Buffet, B.A., "Modeling of nutation + * and precession New nutation series for nonrigid Earth and + * insights into the Earth's interior", J.Geophys.Res., 107, B4, + * 2002. + * + * Simon, J.-L., Bretagnon, P., Chapront, J., Chapront-Touze, M., + * Francou, G., Laskar, J., A & A 282, 663-683 (1994). + * + * Souchay, J., Loysel, B., Kinoshita, H., Folgueira, M., A & A Supp. + * Ser. 135, 111 (1999). + * + * Wallace, P.T., "Software for Implementing the IAU 2000 + * Resolutions", in IERS Workshop 5.1 (2002). + * + * Nutation IAU 2000A series in: + * Kaplan, G.H., United States Naval Observatory Circular No. 179 (Oct. 2005) + * aa.usno.navy.mil/publications/docs/Circular_179.html + * + * MHB2000 code at + * - ftp://maia.usno.navy.mil/conv2000/chapter5/IAU2000A. + * - http://www.iau-sofa.rl.ac.uk/2005_0901/Downloads.html + */ + +#include "swenut2000a.h" +int swi_nutation(double J, double *nutlo) +{ + int i, j, k, inls; + double M, SM, F, D, OM; +#if NUT_IAU_2000A + double AL, ALSU, AF, AD, AOM, APA; + double ALME, ALVE, ALEA, ALMA, ALJU, ALSA, ALUR, ALNE; +#endif + double darg, sinarg, cosarg; + double dpsi = 0, deps = 0; + double T = (J - J2000 ) / 36525.0; + /* luni-solar nutation */ + /* Fundamental arguments, Simon & al. (1994) */ + /* Mean anomaly of the Moon. */ + M = swe_degnorm(( 485868.249036 + + T*( 1717915923.2178 + + T*( 31.8792 + + T*( 0.051635 + + T*( - 0.00024470 ))))) / 3600.0) * DEGTORAD; + /* Mean anomaly of the Sun */ + SM = swe_degnorm((1287104.79305 + + T*( 129596581.0481 + + T*( - 0.5532 + + T*( 0.000136 + + T*( - 0.00001149 ))))) / 3600.0) * DEGTORAD; + /* Mean argument of the latitude of the Moon. */ + F = swe_degnorm(( 335779.526232 + + T*( 1739527262.8478 + + T*( - 12.7512 + + T*( - 0.001037 + + T*( 0.00000417 ))))) / 3600.0) * DEGTORAD; + /* Mean elongation of the Moon from the Sun. */ + D = swe_degnorm((1072260.70369 + + T*( 1602961601.2090 + + T*( - 6.3706 + + T*( 0.006593 + + T*( - 0.00003169 ))))) / 3600.0) * DEGTORAD; + /* Mean longitude of the ascending node of the Moon. */ + OM = swe_degnorm(( 450160.398036 + + T*( - 6962890.5431 + + T*( 7.4722 + + T*( 0.007702 + + T*( - 0.00005939 ))))) / 3600.0) * DEGTORAD; + /* luni-solar nutation series, in reverse order, starting with small terms */ +#if NUT_IAU_2000B + inls = NLS_2000B; +#else + inls = NLS; +#endif + for (i = inls - 1; i >= 0; i--) { + j = i * 5; + darg = swe_radnorm((double) nls[j + 0] * M + + (double) nls[j + 1] * SM + + (double) nls[j + 2] * F + + (double) nls[j + 3] * D + + (double) nls[j + 4] * OM); + sinarg = sin(darg); + cosarg = cos(darg); + k = i * 6; + dpsi += (cls[k+0] + cls[k+1] * T) * sinarg + cls[k+2] * cosarg; + deps += (cls[k+3] + cls[k+4] * T) * cosarg + cls[k+5] * sinarg; + } + nutlo[0] = dpsi * O1MAS2DEG; + nutlo[1] = deps * O1MAS2DEG; +#if NUT_IAU_2000A + /* planetary nutation + * note: The MHB2000 code computes the luni-solar and planetary nutation + * in different routines, using slightly different Delaunay + * arguments in the two cases. This behaviour is faithfully + * reproduced here. Use of the Simon et al. expressions for both + * cases leads to negligible changes, well below 0.1 microarcsecond.*/ + /* Mean anomaly of the Moon.*/ + AL = swe_radnorm(2.35555598 + 8328.6914269554 * T); + /* Mean anomaly of the Sun.*/ + ALSU = swe_radnorm(6.24006013 + 628.301955 * T); + /* Mean argument of the latitude of the Moon. */ + AF = swe_radnorm(1.627905234 + 8433.466158131 * T); + /* Mean elongation of the Moon from the Sun. */ + AD = swe_radnorm(5.198466741 + 7771.3771468121 * T); + /* Mean longitude of the ascending node of the Moon. */ + AOM = swe_radnorm(2.18243920 - 33.757045 * T); + /* General accumulated precession in longitude. */ + APA = (0.02438175 + 0.00000538691 * T) * T; + /* Planetary longitudes, Mercury through Neptune (Souchay et al. 1999). */ + ALME = swe_radnorm(4.402608842 + 2608.7903141574 * T); + ALVE = swe_radnorm(3.176146697 + 1021.3285546211 * T); + ALEA = swe_radnorm(1.753470314 + 628.3075849991 * T); + ALMA = swe_radnorm(6.203480913 + 334.0612426700 * T); + ALJU = swe_radnorm(0.599546497 + 52.9690962641 * T); + ALSA = swe_radnorm(0.874016757 + 21.3299104960 * T); + ALUR = swe_radnorm(5.481293871 + 7.4781598567 * T); + ALNE = swe_radnorm(5.321159000 + 3.8127774000 * T); + /* planetary nutation series (in reverse order).*/ + dpsi = 0; + deps = 0; + for (i = NPL - 1; i >= 0; i--) { + j = i * 14; + darg = swe_radnorm((double) npl[j + 0] * AL + + (double) npl[j + 1] * ALSU + + (double) npl[j + 2] * AF + + (double) npl[j + 3] * AD + + (double) npl[j + 4] * AOM + + (double) npl[j + 5] * ALME + + (double) npl[j + 6] * ALVE + + (double) npl[j + 7] * ALEA + + (double) npl[j + 8] * ALMA + + (double) npl[j + 9] * ALJU + + (double) npl[j +10] * ALSA + + (double) npl[j +11] * ALUR + + (double) npl[j +12] * ALNE + + (double) npl[j +13] * APA); + k = i * 4; + sinarg = sin(darg); + cosarg = cos(darg); + dpsi += (double) icpl[k+0] * sinarg + (double) icpl[k+1] * cosarg; + deps += (double) icpl[k+2] * sinarg + (double) icpl[k+3] * cosarg; + } + nutlo[0] += dpsi * O1MAS2DEG; + nutlo[1] += deps * O1MAS2DEG; +#if 1 + /* changes required by adoption of P03 precession + * according to Capitaine et al. A & A 412, 366 (2005) */ + dpsi = -8.1 * sin(OM) - 0.6 * sin(2 * F - 2 * D + 2 * OM); + dpsi += T * (47.8 * sin(OM) + 3.7 * sin(2 * F - 2 * D + 2 * OM) + 0.6 * sin(2 * F + 2 * OM) - 0.6 * sin(2 * OM)); + deps = T * (-25.6 * cos(OM) - 1.6 * cos(2 * F - 2 * D + 2 * OM)); + nutlo[0] += dpsi / (3600.0 * 1000000.0); + nutlo[1] += deps / (3600.0 * 1000000.0); +#endif +#endif + nutlo[0] *= DEGTORAD; + nutlo[1] *= DEGTORAD; + return 0; +} +#endif + +/* GCRS to J2000 */ +void swi_bias(double *x, int32 iflag, AS_BOOL backward) +{ +#if 0 + double DAS2R = 1.0 / 3600.0 * DEGTORAD; + double dpsi_bias = -0.041775 * DAS2R; + double deps_bias = -0.0068192 * DAS2R; + double dra0 = -0.0146 * DAS2R; + double deps2000 = 84381.448 * DAS2R; +#endif + double xx[6], rb[3][3]; + int i; + rb[0][0] = +0.9999999999999942; + rb[0][1] = +0.0000000707827948; + rb[0][2] = -0.0000000805621738; + rb[1][0] = -0.0000000707827974; + rb[1][1] = +0.9999999999999969; + rb[1][2] = -0.0000000330604088; + rb[2][0] = +0.0000000805621715; + rb[2][1] = +0.0000000330604145; + rb[2][2] = +0.9999999999999962; + if (backward) { + for (i = 0; i <= 2; i++) { + xx[i] = x[0] * rb[i][0] + + x[1] * rb[i][1] + + x[2] * rb[i][2]; + if (iflag & SEFLG_SPEED) + xx[i+3] = x[3] * rb[i][0] + + x[4] * rb[i][1] + + x[5] * rb[i][2]; + } + } else { + for (i = 0; i <= 2; i++) { + xx[i] = x[0] * rb[0][i] + + x[1] * rb[1][i] + + x[2] * rb[2][i]; + if (iflag & SEFLG_SPEED) + xx[i+3] = x[3] * rb[0][i] + + x[4] * rb[1][i] + + x[5] * rb[2][i]; + } + } + for (i = 0; i <= 2; i++) x[i] = xx[i]; + if (iflag & SEFLG_SPEED) + for (i = 3; i <= 5; i++) x[i] = xx[i]; +} + + +/* GCRS to FK5 */ +void swi_icrs2fk5(double *x, int32 iflag, AS_BOOL backward) +{ +#if 0 + double DAS2R = 1.0 / 3600.0 * DEGTORAD; + double dra0 = -0.0229 * DAS2R; + double dxi0 = 0.0091 * DAS2R; + double det0 = -0.0199 * DAS2R; +#endif + double xx[6], rb[3][3]; + int i; + rb[0][0] = +0.9999999999999928; + rb[0][1] = +0.0000001110223287; + rb[0][2] = +0.0000000441180557; + rb[1][0] = -0.0000001110223330; + rb[1][1] = +0.9999999999999891; + rb[1][2] = +0.0000000964779176; + rb[2][0] = -0.0000000441180450; + rb[2][1] = -0.0000000964779225; + rb[2][2] = +0.9999999999999943; + if (backward) { + for (i = 0; i <= 2; i++) { + xx[i] = x[0] * rb[i][0] + + x[1] * rb[i][1] + + x[2] * rb[i][2]; + if (iflag & SEFLG_SPEED) + xx[i+3] = x[3] * rb[i][0] + + x[4] * rb[i][1] + + x[5] * rb[i][2]; + } + } else { + for (i = 0; i <= 2; i++) { + xx[i] = x[0] * rb[0][i] + + x[1] * rb[1][i] + + x[2] * rb[2][i]; + if (iflag & SEFLG_SPEED) + xx[i+3] = x[3] * rb[0][i] + + x[4] * rb[1][i] + + x[5] * rb[2][i]; + } + } + for (i = 0; i <= 5; i++) x[i] = xx[i]; +} + +/* DeltaT = Ephemeris Time - Universal Time, in days. + * + * 1620 - today + a couple of years: + * --------------------------------- + * The tabulated values of deltaT, in hundredths of a second, + * were taken from The Astronomical Almanac 1997, page K8. The program + * adjusts for a value of secular tidal acceleration ndot = -25.7376. + * arcsec per century squared, the value used in JPL's DE403 ephemeris. + * ELP2000 (and DE200) used the value -23.8946. + * To change ndot, one can + * either redefine SE_TIDAL_DEFAULT in swephexp.h + * or use the routine swe_set_tid_acc() before calling Swiss + * Ephemeris. + * Bessel's interpolation formula is implemented to obtain fourth + * order interpolated values at intermediate times. + * + * -1000 - 1620: + * --------------------------------- + * For dates between -500 and 1600, the table given by Morrison & + * Stephenson (2004; p. 332) is used, with linear interpolation. + * This table is based on an assumed value of ndot = -26. + * The program adjusts for ndot = -25.7376. + * For 1600 - 1620, a linear interpolation between the last value + * of the latter and the first value of the former table is made. + * + * before -1000: + * --------------------------------- + * For times before -1100, a formula of Morrison & Stephenson (2004) + * (p. 332) is used: + * dt = 32 * t * t - 20 sec, where t is centuries from 1820 AD. + * For -1100 to -1000, a transition from this formula to the Stephenson + * table has been implemented in order to avoid a jump. + * + * future: + * --------------------------------- + * For the time after the last tabulated value, we use the formula + * of Stephenson (1997; p. 507), with a modification that avoids a jump + * at the end of the tabulated period. A linear term is added that + * makes a slow transition from the table to the formula over a period + * of 100 years. (Need not be updated, when table will be enlarged.) + * + * References: + * + * Stephenson, F. R., and L. V. Morrison, "Long-term changes + * in the rotation of the Earth: 700 B.C. to A.D. 1980," + * Philosophical Transactions of the Royal Society of London + * Series A 313, 47-70 (1984) + * + * Borkowski, K. M., "ELP2000-85 and the Dynamical Time + * - Universal Time relation," Astronomy and Astrophysics + * 205, L8-L10 (1988) + * Borkowski's formula is derived from partly doubtful eclipses + * going back to 2137 BC and uses lunar position based on tidal + * coefficient of -23.9 arcsec/cy^2. + * + * Chapront-Touze, Michelle, and Jean Chapront, _Lunar Tables + * and Programs from 4000 B.C. to A.D. 8000_, Willmann-Bell 1991 + * Their table agrees with the one here, but the entries are + * rounded to the nearest whole second. + * + * Stephenson, F. R., and M. A. Houlden, _Atlas of Historical + * Eclipse Maps_, Cambridge U. Press (1986) + * + * Stephenson, F.R. & Morrison, L.V., "Long-Term Fluctuations in + * the Earth's Rotation: 700 BC to AD 1990", Philosophical + * Transactions of the Royal Society of London, + * Ser. A, 351 (1995), 165-202. + * + * Stephenson, F. Richard, _Historical Eclipses and Earth's + * Rotation_, Cambridge U. Press (1997) + * + * Morrison, L. V., and F.R. Stephenson, "Historical Values of the Earth's + * Clock Error DT and the Calculation of Eclipses", JHA xxxv (2004), + * pp.327-336 + * + * Table from AA for 1620 through today + * Note, Stephenson and Morrison's table starts at the year 1630. + * The Chapronts' table does not agree with the Almanac prior to 1630. + * The actual accuracy decreases rapidly prior to 1780. + * + * Jean Meeus, Astronomical Algorithms, 2nd edition, 1998. + * + * For a comprehensive collection of publications and formulae, see: + * http://www.phys.uu.nl/~vgent/deltat/deltat_modern.htm + * http://www.phys.uu.nl/~vgent/deltat/deltat_old.htm + * + * For future values of delta t, the following data from the + * Earth Orientation Department of the US Naval Observatory can be used: + * (TAI-UTC) from: ftp://maia.usno.navy.mil/ser7/tai-utc.dat + * (UT1-UTC) from: ftp://maia.usno.navy.mil/ser7/finals.all + * file description in: ftp://maia.usno.navy.mil/ser7/readme.finals + * Delta T = TAI-UT1 + 32.184 sec = (TAI-UTC) - (UT1-UTC) + 32.184 sec + * + * Also, there is the following file: + * http://maia.usno.navy.mil/ser7/deltat.data, but it is about 3 months + * behind (on 3 feb 2009) + * + * Last update of table dt[]: Dieter Koch, 27 april 2010. + * ATTENTION: Whenever updating this table, do not forget to adjust + * the macros TABEND and TABSIZ ! + */ +#define TABSTART 1620 +#define TABEND 2017 +#define TABSIZ (TABEND-TABSTART+1) +/* we make the table greater for additional values read from external file */ +#define TABSIZ_SPACE (TABSIZ+100) +static double FAR dt[TABSIZ_SPACE] = { +/* 1620.0 thru 1659.0 */ +124.00, 119.00, 115.00, 110.00, 106.00, 102.00, 98.00, 95.00, 91.00, 88.00, +85.00, 82.00, 79.00, 77.00, 74.00, 72.00, 70.00, 67.00, 65.00, 63.00, +62.00, 60.00, 58.00, 57.00, 55.00, 54.00, 53.00, 51.00, 50.00, 49.00, +48.00, 47.00, 46.00, 45.00, 44.00, 43.00, 42.00, 41.00, 40.00, 38.00, +/* 1660.0 thru 1699.0 */ +37.00, 36.00, 35.00, 34.00, 33.00, 32.00, 31.00, 30.00, 28.00, 27.00, +26.00, 25.00, 24.00, 23.00, 22.00, 21.00, 20.00, 19.00, 18.00, 17.00, +16.00, 15.00, 14.00, 14.00, 13.00, 12.00, 12.00, 11.00, 11.00, 10.00, +10.00, 10.00, 9.00, 9.00, 9.00, 9.00, 9.00, 9.00, 9.00, 9.00, +/* 1700.0 thru 1739.0 */ +9.00, 9.00, 9.00, 9.00, 9.00, 9.00, 9.00, 9.00, 10.00, 10.00, +10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 11.00, 11.00, 11.00, +11.00, 11.00, 11.00, 11.00, 11.00, 11.00, 11.00, 11.00, 11.00, 11.00, +11.00, 11.00, 11.00, 11.00, 12.00, 12.00, 12.00, 12.00, 12.00, 12.00, +/* 1740.0 thru 1779.0 */ +12.00, 12.00, 12.00, 12.00, 13.00, 13.00, 13.00, 13.00, 13.00, 13.00, +13.00, 14.00, 14.00, 14.00, 14.00, 14.00, 14.00, 14.00, 15.00, 15.00, +15.00, 15.00, 15.00, 15.00, 15.00, 16.00, 16.00, 16.00, 16.00, 16.00, +16.00, 16.00, 16.00, 16.00, 16.00, 17.00, 17.00, 17.00, 17.00, 17.00, +/* 1780.0 thru 1799.0 */ +17.00, 17.00, 17.00, 17.00, 17.00, 17.00, 17.00, 17.00, 17.00, 17.00, +17.00, 17.00, 16.00, 16.00, 16.00, 16.00, 15.00, 15.00, 14.00, 14.00, +/* 1800.0 thru 1819.0 */ +13.70, 13.40, 13.10, 12.90, 12.70, 12.60, 12.50, 12.50, 12.50, 12.50, +12.50, 12.50, 12.50, 12.50, 12.50, 12.50, 12.50, 12.40, 12.30, 12.20, +/* 1820.0 thru 1859.0 */ +12.00, 11.70, 11.40, 11.10, 10.60, 10.20, 9.60, 9.10, 8.60, 8.00, +7.50, 7.00, 6.60, 6.30, 6.00, 5.80, 5.70, 5.60, 5.60, 5.60, +5.70, 5.80, 5.90, 6.10, 6.20, 6.30, 6.50, 6.60, 6.80, 6.90, +7.10, 7.20, 7.30, 7.40, 7.50, 7.60, 7.70, 7.70, 7.80, 7.80, +/* 1860.0 thru 1899.0 */ +7.88, 7.82, 7.54, 6.97, 6.40, 6.02, 5.41, 4.10, 2.92, 1.82, +1.61, .10, -1.02, -1.28, -2.69, -3.24, -3.64, -4.54, -4.71, -5.11, +-5.40, -5.42, -5.20, -5.46, -5.46, -5.79, -5.63, -5.64, -5.80, -5.66, +-5.87, -6.01, -6.19, -6.64, -6.44, -6.47, -6.09, -5.76, -4.66, -3.74, +/* 1900.0 thru 1939.0 */ +-2.72, -1.54, -.02, 1.24, 2.64, 3.86, 5.37, 6.14, 7.75, 9.13, +10.46, 11.53, 13.36, 14.65, 16.01, 17.20, 18.24, 19.06, 20.25, 20.95, +21.16, 22.25, 22.41, 23.03, 23.49, 23.62, 23.86, 24.49, 24.34, 24.08, +24.02, 24.00, 23.87, 23.95, 23.86, 23.93, 23.73, 23.92, 23.96, 24.02, +/* 1940.0 thru 1979.0 */ + 24.33, 24.83, 25.30, 25.70, 26.24, 26.77, 27.28, 27.78, 28.25, 28.71, + 29.15, 29.57, 29.97, 30.36, 30.72, 31.07, 31.35, 31.68, 32.18, 32.68, + 33.15, 33.59, 34.00, 34.47, 35.03, 35.73, 36.54, 37.43, 38.29, 39.20, + 40.18, 41.17, 42.23, 43.37, 44.49, 45.48, 46.46, 47.52, 48.53, 49.59, +/* 1980.0 thru 1999.0 */ + 50.54, 51.38, 52.17, 52.96, 53.79, 54.34, 54.87, 55.32, 55.82, 56.30, + 56.86, 57.57, 58.31, 59.12, 59.98, 60.78, 61.63, 62.30, 62.97, 63.47, +/* 2000.0 thru 2009.0 */ + 63.83, 64.09, 64.30, 64.47, 64.57, 64.69, 64.85, 65.15, 65.46, 65.78, +/* 2010.0 thru 2013.0 */ + 66.07, 66.32, 66.60, 66.91, +/* Extrapolated values, 2014 - 2017 */ + 67.50, 68.00, 68.50, 69.00, +}; +#define ESPENAK_MEEUS_2006 TRUE +#define TAB2_SIZ 27 +#define TAB2_START (-1000) +#define TAB2_END 1600 +#define TAB2_STEP 100 +#define LTERM_EQUATION_YSTART 1820 +#define LTERM_EQUATION_COEFF 32 +/* Table for -1000 through 1600, from Morrison & Stephenson (2004). */ +static short FAR dt2[TAB2_SIZ] = { +/*-1000 -900 -800 -700 -600 -500 -400 -300 -200 -100*/ + 25400,23700,22000,21000,19040,17190,15530,14080,12790,11640, +/* 0 100 200 300 400 500 600 700 800 900*/ + 10580, 9600, 8640, 7680, 6700, 5710, 4740, 3810, 2960, 2200, +/* 1000 1100 1200 1300 1400 1500 1600, */ + 1570, 1090, 740, 490, 320, 200, 120, +}; +/* returns DeltaT (ET - UT) in days + * double tjd = julian day in UT + */ +#define DEMO 0 +double FAR PASCAL_CONV swe_deltat(double tjd) +{ + double ans = 0; + double B, Y, Ygreg, dd; + int iy; + /* read additional values from swedelta.txt */ + AS_BOOL use_espenak_meeus = ESPENAK_MEEUS_2006; + Y = 2000.0 + (tjd - J2000)/365.25; + Ygreg = 2000.0 + (tjd - J2000)/365.2425; + /* Before 1633 AD, if the macro ESPENAK_MEEUS_2006 is TRUE: + * Polynomials by Espenak & Meeus 2006, derived from Stephenson & Morrison + * 2004. + * Note, Espenak & Meeus use their formulae only from 2000 BC on. + * However, they use the long-term formula of Morrison & Stephenson, + * which can be used even for the remoter past. + */ + if (use_espenak_meeus && tjd < 2317746.13090277789) { + return deltat_espenak_meeus_1620(tjd); + } + /* If the macro ESPENAK_MEEUS_2006 is FALSE: + * Before 1620, we follow Stephenson & Morrsion 2004. For the tabulated + * values 1000 BC through 1600 AD, we use linear interpolation. + */ + if (Y < TABSTART) { + if (Y < TAB2_END) { + return deltat_stephenson_morrison_1600(tjd); + } else { + /* between 1600 and 1620: + * linear interpolation between + * end of table dt2 and start of table dt */ + if (Y >= TAB2_END) { + B = TABSTART - TAB2_END; + iy = (TAB2_END - TAB2_START) / TAB2_STEP; + dd = (Y - TAB2_END) / B; + /*ans = dt2[iy] + dd * (dt[0] / 100.0 - dt2[iy]);*/ + ans = dt2[iy] + dd * (dt[0] - dt2[iy]); + ans = adjust_for_tidacc(ans, Ygreg); + return ans / 86400.0; + } + } + } + /* 1620 - today + a few years (tabend): + * Besselian interpolation from tabulated values in table dt. + * See AA page K11. + */ + if (Y >= TABSTART) { + return deltat_aa(tjd); + } +#ifdef TRACE + swi_open_trace(NULL); + if (swi_trace_count < TRACE_COUNT_MAX) { + if (swi_fp_trace_c != NULL) { + fputs("\n/*SWE_DELTAT*/\n", swi_fp_trace_c); + fprintf(swi_fp_trace_c, " tjd = %.9f;", tjd); + fprintf(swi_fp_trace_c, " t = swe_deltat(tjd);\n"); + fputs(" printf(\"swe_deltat: %f\\t%f\\t\\n\", ", swi_fp_trace_c); + fputs("tjd, t);\n", swi_fp_trace_c); + fflush(swi_fp_trace_c); + } + if (swi_fp_trace_out != NULL) { + fprintf(swi_fp_trace_out, "swe_deltat: %f\t%f\t\n", tjd, ans); + fflush(swi_fp_trace_out); + } + } +#endif + return ans / 86400.0; +} + +static double deltat_aa(double tjd) +{ + double ans = 0, ans2, ans3; + double p, B, B2, Y, dd; + double d[6]; + int i, iy, k; + /* read additional values from swedelta.txt */ + int tabsiz = init_dt(); + int tabend = TABSTART + tabsiz - 1; + /*Y = 2000.0 + (tjd - J2000)/365.25;*/ + Y = 2000.0 + (tjd - J2000)/365.2425; + if (Y <= tabend) { + /* Index into the table. + */ + p = floor(Y); + iy = (int) (p - TABSTART); + /* Zeroth order estimate is value at start of year + */ + ans = dt[iy]; + k = iy + 1; + if( k >= tabsiz ) + goto done; /* No data, can't go on. */ + /* The fraction of tabulation interval + */ + p = Y - p; + /* First order interpolated value + */ + ans += p*(dt[k] - dt[iy]); + if( (iy-1 < 0) || (iy+2 >= tabsiz) ) + goto done; /* can't do second differences */ + /* Make table of first differences + */ + k = iy - 2; + for( i=0; i<5; i++ ) { + if( (k < 0) || (k+1 >= tabsiz) ) + d[i] = 0; + else + d[i] = dt[k+1] - dt[k]; + k += 1; + } + /* Compute second differences + */ + for( i=0; i<4; i++ ) + d[i] = d[i+1] - d[i]; + B = 0.25*p*(p-1.0); + ans += B*(d[1] + d[2]); + #if DEMO + printf( "B %.4lf, ans %.4lf\n", B, ans ); + #endif + if( iy+2 >= tabsiz ) + goto done; + /* Compute third differences + */ + for( i=0; i<3; i++ ) + d[i] = d[i+1] - d[i]; + B = 2.0*B/3.0; + ans += (p-0.5)*B*d[1]; + #if DEMO + printf( "B %.4lf, ans %.4lf\n", B*(p-0.5), ans ); + #endif + if( (iy-2 < 0) || (iy+3 > tabsiz) ) + goto done; + /* Compute fourth differences + */ + for( i=0; i<2; i++ ) + d[i] = d[i+1] - d[i]; + B = 0.125*B*(p+1.0)*(p-2.0); + ans += B*(d[0] + d[1]); + #if DEMO + printf( "B %.4lf, ans %.4lf\n", B, ans ); + #endif + done: + ans = adjust_for_tidacc(ans, Y); + return ans / 86400.0; + } + /* today - : + * Formula Stephenson (1997; p. 507), + * with modification to avoid jump at end of AA table, + * similar to what Meeus 1998 had suggested. + * Slow transition within 100 years. + */ + B = 0.01 * (Y - 1820); + ans = -20 + 31 * B * B; + /* slow transition from tabulated values to Stephenson formula: */ + if (Y <= tabend+100) { + B2 = 0.01 * (tabend - 1820); + ans2 = -20 + 31 * B2 * B2; + ans3 = dt[tabsiz-1]; + dd = (ans2 - ans3); + ans += dd * (Y - (tabend + 100)) * 0.01; + } + return ans / 86400.0; +} + +static double deltat_longterm_morrison_stephenson(double tjd) +{ + double Ygreg = 2000.0 + (tjd - J2000)/365.2425; + double u = (Ygreg - 1820) / 100.0; + return (-20 + 32 * u * u); +} + +static double deltat_stephenson_morrison_1600(double tjd) +{ + double ans = 0, ans2, ans3; + double p, B, dd; + double tjd0; + int iy; + /* read additional values from swedelta.txt */ + double Y = 2000.0 + (tjd - J2000)/365.2425; + /* double Y = 2000.0 + (tjd - J2000)/365.25;*/ + /* before -1000: + * formula by Stephenson&Morrison (2004; p. 335) but adjusted to fit the + * starting point of table dt2. */ + if( Y < TAB2_START ) { + /*B = (Y - LTERM_EQUATION_YSTART) * 0.01; + ans = -20 + LTERM_EQUATION_COEFF * B * B;*/ + ans = deltat_longterm_morrison_stephenson(tjd); + ans = adjust_for_tidacc(ans, Y); + /* transition from formula to table over 100 years */ + if (Y >= TAB2_START - 100) { + /* starting value of table dt2: */ + ans2 = adjust_for_tidacc(dt2[0], TAB2_START); + /* value of formula at epoch TAB2_START */ + /* B = (TAB2_START - LTERM_EQUATION_YSTART) * 0.01; + ans3 = -20 + LTERM_EQUATION_COEFF * B * B;*/ + tjd0 = (TAB2_START - 2000) * 365.2425 + J2000; + ans3 = deltat_longterm_morrison_stephenson(tjd0); + ans3 = adjust_for_tidacc(ans3, Y); + dd = ans3 - ans2; + B = (Y - (TAB2_START - 100)) * 0.01; + /* fit to starting point of table dt2. */ + ans = ans - dd * B; + } + } + /* between -1000 and 1600: + * linear interpolation between values of table dt2 (Stephenson&Morrison 2004) */ + if (Y >= TAB2_START && Y < TAB2_END) { + double Yjul = 2000 + (tjd - 2451557.5) / 365.25; + p = floor(Yjul); + iy = (int) ((p - TAB2_START) / TAB2_STEP); + dd = (Yjul - (TAB2_START + TAB2_STEP * iy)) / TAB2_STEP; + ans = dt2[iy] + (dt2[iy+1] - dt2[iy]) * dd; + /* correction for tidal acceleration used by our ephemeris */ + ans = adjust_for_tidacc(ans, Y); + } + ans /= 86400.0; + return ans; +} + +static double deltat_espenak_meeus_1620(double tjd) +{ + double ans = 0; + double Ygreg; + double u; + /* double Y = 2000.0 + (tjd - J2000)/365.25;*/ + Ygreg = 2000.0 + (tjd - J2000)/365.2425; + if (Ygreg < -500) { + ans = deltat_longterm_morrison_stephenson(tjd); + } else if (Ygreg < 500) { + u = Ygreg / 100.0; + ans = (((((0.0090316521 * u + 0.022174192) * u - 0.1798452) * u - 5.952053) * u+ 33.78311) * u - 1014.41) * u + 10583.6; + } else if (Ygreg < 1600) { + u = (Ygreg - 1000) / 100.0; + ans = (((((0.0083572073 * u - 0.005050998) * u - 0.8503463) * u + 0.319781) * u + 71.23472) * u - 556.01) * u + 1574.2; + } else if (Ygreg < 1700) { + u = Ygreg - 1600; + ans = 120 - 0.9808 * u - 0.01532 * u * u + u * u * u / 7129.0; + } else if (Ygreg < 1800) { + u = Ygreg - 1700; + ans = (((-u / 1174000.0 + 0.00013336) * u - 0.0059285) * u + 0.1603) * u + 8.83; + } else if (Ygreg < 1860) { + u = Ygreg - 1800; + ans = ((((((0.000000000875 * u - 0.0000001699) * u + 0.0000121272) * u - 0.00037436) * u + 0.0041116) * u + 0.0068612) * u - 0.332447) * u + 13.72; + } else if (Ygreg < 1900) { + u = Ygreg - 1860; + ans = ((((u / 233174.0 - 0.0004473624) * u + 0.01680668) * u - 0.251754) * u + 0.5737) * u + 7.62; + } else if (Ygreg < 1920) { + u = Ygreg - 1900; + ans = (((-0.000197 * u + 0.0061966) * u - 0.0598939) * u + 1.494119) * u -2.79; + } else if (Ygreg < 1941) { + u = Ygreg - 1920; + ans = 21.20 + 0.84493 * u - 0.076100 * u * u + 0.0020936 * u * u * u; + } else if (Ygreg < 1961) { + u = Ygreg - 1950; + ans = 29.07 + 0.407 * u - u * u / 233.0 + u * u * u / 2547.0; + } else if (Ygreg < 1986) { + u = Ygreg - 1975; + ans = 45.45 + 1.067 * u - u * u / 260.0 - u * u * u / 718.0; + } else if (Ygreg < 2005) { + u = Ygreg - 2000; + ans = ((((0.00002373599 * u + 0.000651814) * u + 0.0017275) * u - 0.060374) * u + 0.3345) * u + 63.86; + } + ans = adjust_for_tidacc(ans, Ygreg); + ans /= 86400.0; + return ans; +} + +/* Read delta t values from external file. + * record structure: year(whitespace)delta_t in 0.01 sec. + */ +static int init_dt(void) +{ + FILE *fp; + int year; + int tab_index; + int tabsiz; + int i; + char s[AS_MAXCH]; + char *sp; + if (!init_dt_done) { + init_dt_done = TRUE; + /* no error message if file is missing */ + if ((fp = swi_fopen(-1, "swe_deltat.txt", swed.ephepath, NULL)) == NULL + && (fp = swi_fopen(-1, "sedeltat.txt", swed.ephepath, NULL)) == NULL) + return TABSIZ; + while(fgets(s, AS_MAXCH, fp) != NULL) { + sp = s; + while (strchr(" \t", *sp) != NULL && *sp != '\0') + sp++; /* was *sp++ fixed by Alois 2-jul-2003 */ + if (*sp == '#' || *sp == '\n') + continue; + year = atoi(s); + tab_index = year - TABSTART; + /* table space is limited. no error msg, if exceeded */ + if (tab_index >= TABSIZ_SPACE) + continue; + sp += 4; + while (strchr(" \t", *sp) != NULL && *sp != '\0') + sp++; /* was *sp++ fixed by Alois 2-jul-2003 */ + /*dt[tab_index] = (short) (atof(sp) * 100 + 0.5);*/ + dt[tab_index] = atof(sp); + } + fclose(fp); + } + /* find table size */ + tabsiz = 2001 - TABSTART + 1; + for (i = tabsiz - 1; i < TABSIZ_SPACE; i++) { + if (dt[i] == 0) + break; + else + tabsiz++; + } + tabsiz--; + return tabsiz; +} + +/* Astronomical Almanac table is corrected by adding the expression + * -0.000091 (ndot + 26)(year-1955)^2 seconds + * to entries prior to 1955 (AA page K8), where ndot is the secular + * tidal term in the mean motion of the Moon. + * + * Entries after 1955 are referred to atomic time standards and + * are not affected by errors in Lunar or planetary theory. + */ +static double adjust_for_tidacc(double ans, double Y) +{ + double B; + if( Y < 1955.0 ) { + B = (Y - 1955.0); + ans += -0.000091 * (tid_acc + 26.0) * B * B; + } + return ans; +} + +/* returns tidal acceleration used in swe_deltat() */ +double FAR PASCAL_CONV swe_get_tid_acc() +{ +#if 0 + if (tid_acc == TID_ACC_DE403) + return 403; + if (tid_acc == TID_ACC_DE402) + return 200; +#endif + return tid_acc; +} + +void FAR PASCAL_CONV swe_set_tid_acc(double t_acc) +{ + tid_acc = t_acc; +#if TRACE + swi_open_trace(NULL); + if (swi_trace_count < TRACE_COUNT_MAX) { + if (swi_fp_trace_c != NULL) { + fputs("\n/*SWE_SET_TID_ACC*/\n", swi_fp_trace_c); + fprintf(swi_fp_trace_c, " t = %.9f;\n", t_acc); + fprintf(swi_fp_trace_c, " swe_set_tid_acc(t);\n"); + fputs(" printf(\"swe_set_tid_acc: %f\\t\\n\", ", swi_fp_trace_c); + fputs("t);\n", swi_fp_trace_c); + fflush(swi_fp_trace_c); + } + if (swi_fp_trace_out != NULL) { + fprintf(swi_fp_trace_out, "swe_set_tid_acc: %f\t\n", t_acc); + fflush(swi_fp_trace_out); + } + } +#endif +} + +/* Apparent Sidereal Time at Greenwich with equation of the equinoxes + * AA page B6 + * + * returns sidereal time in hours. + * + * Caution. At epoch J2000.0, the 16 decimal precision + * of IEEE double precision numbers + * limits time resolution measured by Julian date + * to approximately 24 microseconds. + * + * program returns sidereal hours since sidereal midnight + * tjd julian day UT + * eps obliquity of ecliptic, degrees + * nut nutation, degrees + */ +double FAR PASCAL_CONV swe_sidtime0( double tjd, double eps, double nut ) +{ + double jd0; /* Julian day at midnight Universal Time */ + double secs; /* Time of day, UT seconds since UT midnight */ + double eqeq, jd, tu, tt, msday; + double gmst; + /* Julian day at given UT */ + jd = tjd; + jd0 = floor(jd); + secs = tjd - jd0; + if( secs < 0.5 ) { + jd0 -= 0.5; + secs += 0.5; + } else { + jd0 += 0.5; + secs -= 0.5; + } + secs *= 86400.0; + tu = (jd0 - J2000)/36525.0; /* UT1 in centuries after J2000 */ +if (PREC_IAU_2003) { + tt = (jd0 + swe_deltat(jd0) - J2000)/36525.0; /* TT in centuries after J2000 */ + gmst = (((-0.000000002454*tt - 0.00000199708)*tt - 0.0000002926)*tt + 0.092772110)*tt*tt + 307.4771013*(tt-tu) + 8640184.79447825*tu + 24110.5493771; + /* mean solar days per sidereal day at date tu; + * for the derivative of gmst, we can assume UT1 =~ TT */ + msday = 1 + ((((-0.000000012270*tt - 0.00000798832)*tt - 0.0000008778)*tt + 0.185544220)*tt + 8640184.79447825)/(86400.*36525.); +} else { + /* Greenwich Mean Sidereal Time at 0h UT of date */ + gmst = (( -6.2e-6*tu + 9.3104e-2)*tu + 8640184.812866)*tu + 24110.54841; + /* mean solar days per sidereal day at date tu, = 1.00273790934 in 1986 */ + msday = 1.0 + ((-1.86e-5*tu + 0.186208)*tu + 8640184.812866)/(86400.*36525.); +} + /* Local apparent sidereal time at given UT at Greenwich */ + eqeq = 240.0 * nut * cos(eps * DEGTORAD); + gmst = gmst + msday*secs + eqeq /* + 240.0*tlong */; + /* Sidereal seconds modulo 1 sidereal day */ + gmst = gmst - 86400.0 * floor( gmst/86400.0 ); + /* return in hours */ + gmst /= 3600; +#ifdef TRACE + swi_open_trace(NULL); + if (swi_trace_count < TRACE_COUNT_MAX) { + if (swi_fp_trace_c != NULL) { + fputs("\n/*SWE_SIDTIME0*/\n", swi_fp_trace_c); + fprintf(swi_fp_trace_c, " tjd = %.9f;", tjd); + fprintf(swi_fp_trace_c, " eps = %.9f;", eps); + fprintf(swi_fp_trace_c, " nut = %.9f;\n", nut); + fprintf(swi_fp_trace_c, " t = swe_sidtime0(tjd, eps, nut);\n"); + fputs(" printf(\"swe_sidtime0: %f\\tsidt = %f\\teps = %f\\tnut = %f\\t\\n\", ", swi_fp_trace_c); + fputs("tjd, t, eps, nut);\n", swi_fp_trace_c); + fflush(swi_fp_trace_c); + } + if (swi_fp_trace_out != NULL) { + fprintf(swi_fp_trace_out, "swe_sidtime0: %f\tsidt = %f\teps = %f\tnut = %f\t\n", tjd, gmst, eps, nut); + fflush(swi_fp_trace_out); + } + } +#endif + return gmst; +} + +/* sidereal time, without eps and nut as parameters. + * tjd must be UT !!! + * for more informsation, see comment with swe_sidtime0() + */ +double FAR PASCAL_CONV swe_sidtime(double tjd_ut) +{ + int i; + double eps, nutlo[2], tsid; + double tjde = tjd_ut + swe_deltat(tjd_ut); + eps = swi_epsiln(tjde) * RADTODEG; + swi_nutation(tjde, nutlo); + for (i = 0; i < 2; i++) + nutlo[i] *= RADTODEG; + tsid = swe_sidtime0(tjd_ut, eps + nutlo[1], nutlo[0]); +#ifdef TRACE + swi_open_trace(NULL); + if (swi_trace_count < TRACE_COUNT_MAX) { + if (swi_fp_trace_c != NULL) { + fputs("\n/*SWE_SIDTIME*/\n", swi_fp_trace_c); + fprintf(swi_fp_trace_c, " tjd = %.9f;\n", tjd_ut); + fprintf(swi_fp_trace_c, " t = swe_sidtime(tjd);\n"); + fputs(" printf(\"swe_sidtime: %f\\t%f\\t\\n\", ", swi_fp_trace_c); + fputs("tjd, t);\n", swi_fp_trace_c); + fflush(swi_fp_trace_c); + } + if (swi_fp_trace_out != NULL) { + fprintf(swi_fp_trace_out, "swe_sidtime: %f\t%f\t\n", tjd_ut, tsid); + fflush(swi_fp_trace_out); + } + } +#endif + return tsid; +} + +/* SWISSEPH + * generates name of ephemeris file + * file name looks as follows: + * swephpl.m30, where + * + * "sweph" "swiss ephemeris" + * "pl","mo","as" planet, moon, or asteroid + * "m" or "_" BC or AD + * + * "30" start century + * tjd = ephemeris file for which julian day + * ipli = number of planet + * fname = ephemeris file name + */ +void swi_gen_filename(double tjd, int ipli, char *fname) +{ + int icty; + int ncties = (int) NCTIES; + short gregflag; + int jmon, jday, jyear, sgn; + double jut; + char *sform; + switch(ipli) { + case SEI_MOON: + strcpy(fname, "semo"); + break; + case SEI_EMB: + case SEI_MERCURY: + case SEI_VENUS: + case SEI_MARS: + case SEI_JUPITER: + case SEI_SATURN: + case SEI_URANUS: + case SEI_NEPTUNE: + case SEI_PLUTO: + case SEI_SUNBARY: + strcpy(fname, "sepl"); + break; + case SEI_CERES: + case SEI_PALLAS: + case SEI_JUNO: + case SEI_VESTA: + case SEI_CHIRON: + case SEI_PHOLUS: + strcpy(fname, "seas"); + break; + default: /* asteroid */ + sform = "ast%d%sse%05d.%s"; + if (ipli - SE_AST_OFFSET > 99999) + sform = "ast%d%ss%06d.%s"; + sprintf(fname, sform, + (ipli - SE_AST_OFFSET) / 1000, DIR_GLUE, ipli - SE_AST_OFFSET, + SE_FILE_SUFFIX); + return; /* asteroids: only one file 3000 bc - 3000 ad */ + /* break; */ + } + /* century of tjd */ + /* if tjd > 1600 then gregorian calendar */ + if (tjd >= 2305447.5) { + gregflag = TRUE; + swe_revjul(tjd, gregflag, &jyear, &jmon, &jday, &jut); + /* else julian calendar */ + } else { + gregflag = FALSE; + swe_revjul(tjd, gregflag, &jyear, &jmon, &jday, &jut); + } + /* start century of file containing tjd */ + if (jyear < 0) + sgn = -1; + else + sgn = 1; + icty = jyear / 100; + if (sgn < 0 && jyear % 100 != 0) + icty -=1; + while(icty % ncties != 0) + icty--; +#if 0 + if (icty < BEG_YEAR / 100) + icty = BEG_YEAR / 100; + if (icty >= END_YEAR / 100) + icty = END_YEAR / 100 - ncties; +#endif + /* B.C. or A.D. */ + if (icty < 0) + strcat(fname, "m"); + else + strcat(fname, "_"); + icty = abs(icty); + sprintf(fname + strlen(fname), "%02d.%s", icty, SE_FILE_SUFFIX); +#if 0 + printf("fname %s\n", fname); + fflush(stdout); +#endif +} + +/************************************************************** +cut the string s at any char in cutlist; put pointers to partial strings +into cpos[0..n-1], return number of partial strings; +if less than nmax fields are found, the first empty pointer is +set to NULL. +More than one character of cutlist in direct sequence count as one +separator only! cut_str_any("word,,,word2",","..) cuts only two parts, +cpos[0] = "word" and cpos[1] = "word2". +If more than nmax fields are found, nmax is returned and the +last field nmax-1 rmains un-cut. +**************************************************************/ +int swi_cutstr(char *s, char *cutlist, char *cpos[], int nmax) +{ + int n = 1; + cpos [0] = s; + while (*s != '\0') { + if ((strchr(cutlist, (int) *s) != NULL) && n < nmax) { + *s = '\0'; + while (*(s + 1) != '\0' && strchr (cutlist, (int) *(s + 1)) != NULL) s++; + cpos[n++] = s + 1; + } + if (*s == '\n' || *s == '\r') { /* treat nl or cr like end of string */ + *s = '\0'; + break; + } + s++; + } + if (n < nmax) cpos[n] = NULL; + return (n); +} /* cutstr */ + +char *swi_right_trim(char *s) +{ + char *sp = s + strlen(s) - 1; + while (isspace((int)(unsigned char) *sp) && sp >= s) + *sp-- = '\0'; + return s; +} + +/* + * The following C code (by Rob Warnock rpw3@sgi.com) does CRC-32 in + * BigEndian/BigEndian byte/bit order. That is, the data is sent most + * significant byte first, and each of the bits within a byte is sent most + * significant bit first, as in FDDI. You will need to twiddle with it to do + * Ethernet CRC, i.e., BigEndian/LittleEndian byte/bit order. + * + * The CRCs this code generates agree with the vendor-supplied Verilog models + * of several of the popular FDDI "MAC" chips. + */ +static uint32 crc32_table[256]; +/* Initialized first time "crc32()" is called. If you prefer, you can + * statically initialize it at compile time. [Another exercise.] + */ + +uint32 swi_crc32(unsigned char *buf, int len) +{ + unsigned char *p; + uint32 crc; + if (!crc32_table[1]) /* if not already done, */ + init_crc32(); /* build table */ + crc = 0xffffffff; /* preload shift register, per CRC-32 spec */ + for (p = buf; len > 0; ++p, --len) + crc = (crc << 8) ^ crc32_table[(crc >> 24) ^ *p]; + return ~crc; /* transmit complement, per CRC-32 spec */ +} + +/* + * Build auxiliary table for parallel byte-at-a-time CRC-32. + */ +#define CRC32_POLY 0x04c11db7 /* AUTODIN II, Ethernet, & FDDI */ + +static void init_crc32(void) +{ + int32 i, j; + uint32 c; + for (i = 0; i < 256; ++i) { + for (c = i << 24, j = 8; j > 0; --j) + c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : (c << 1); + crc32_table[i] = c; + } +} + +/******************************************************* + * other functions from swephlib.c; + * they are not needed for Swiss Ephemeris, + * but may be useful to former Placalc users. + ********************************************************/ + +/************************************ +normalize argument into interval [0..DEG360] +*************************************/ +centisec FAR PASCAL_CONV swe_csnorm(centisec p) +{ + if (p < 0) + do { p += DEG360; } while (p < 0); + else if (p >= DEG360) + do { p -= DEG360; } while (p >= DEG360); + return (p); +} + +/************************************ +distance in centisecs p1 - p2 +normalized to [0..360[ +**************************************/ +centisec FAR PASCAL_CONV swe_difcsn (centisec p1, centisec p2) +{ + return (swe_csnorm(p1 - p2)); +} + +double FAR PASCAL_CONV swe_difdegn (double p1, double p2) +{ + return (swe_degnorm(p1 - p2)); +} + +/************************************ +distance in centisecs p1 - p2 +normalized to [-180..180[ +**************************************/ +centisec FAR PASCAL_CONV swe_difcs2n(centisec p1, centisec p2) +{ centisec dif; + dif = swe_csnorm(p1 - p2); + if (dif >= DEG180) return (dif - DEG360); + return (dif); +} + +double FAR PASCAL_CONV swe_difdeg2n(double p1, double p2) +{ double dif; + dif = swe_degnorm(p1 - p2); + if (dif >= 180.0) return (dif - 360.0); + return (dif); +} + +double FAR PASCAL_CONV swe_difrad2n(double p1, double p2) +{ double dif; + dif = swe_radnorm(p1 - p2); + if (dif >= TWOPI / 2) return (dif - TWOPI); + return (dif); +} + +/************************************* +round second, but at 29.5959 always down +*************************************/ +centisec FAR PASCAL_CONV swe_csroundsec(centisec x) +{ + centisec t; + t = (x + 50) / 100 *100L; /* round to seconds */ + if (t > x && t % DEG30 == 0) /* was rounded up to next sign */ + t = x / 100 * 100L; /* round last second of sign downwards */ + return (t); +} + +/************************************* +double to int32 with rounding, no overflow check +*************************************/ +int32 FAR PASCAL_CONV swe_d2l(double x) +{ + if (x >=0) + return ((int32) (x + 0.5)); + else + return (- (int32) (0.5 - x)); +} + +/* + * monday = 0, ... sunday = 6 + */ +int FAR PASCAL_CONV swe_day_of_week(double jd) +{ + return (((int) floor (jd - 2433282 - 1.5) %7) + 7) % 7; +} + +char *FAR PASCAL_CONV swe_cs2timestr(CSEC t, int sep, AS_BOOL suppressZero, char *a) +/* does not suppress zeros in hours or minutes */ +{ + /* static char a[9];*/ + centisec h,m,s; + strcpy (a, " "); + a[2] = a [5] = sep; + t = ((t + 50) / 100) % (24L *3600L); /* round to seconds */ + s = t % 60L; + m = (t / 60) % 60L; + h = t / 3600 % 100L; + if (s == 0 && suppressZero) + a[5] = '\0'; + else { + a [6] = (char) (s / 10 + '0'); + a [7] = (char) (s % 10 + '0'); + }; + a [0] = (char) (h / 10 + '0'); + a [1] = (char) (h % 10 + '0'); + a [3] = (char) (m / 10 + '0'); + a [4] = (char) (m % 10 + '0'); + return (a); + } /* swe_cs2timestr() */ + +char *FAR PASCAL_CONV swe_cs2lonlatstr(CSEC t, char pchar, char mchar, char *sp) +{ + char a[10]; /* must be initialized at each call */ + char *aa; + centisec h,m,s; + strcpy (a, " ' "); + /* mask dddEmm'ss" */ + if (t < 0 ) pchar = mchar; + t = (ABS4 (t) + 50) / 100; /* round to seconds */ + s = t % 60L; + m = t / 60 % 60L; + h = t / 3600 % 1000L; + if (s == 0) + a[6] = '\0'; /* cut off seconds */ + else { + a [7] = (char) (s / 10 + '0'); + a [8] = (char) (s % 10 + '0'); + } + a [3] = pchar; + if (h > 99) a [0] = (char) (h / 100 + '0'); + if (h > 9) a [1] = (char) (h % 100 / 10 + '0'); + a [2] = (char) (h % 10 + '0'); + a [4] = (char) (m / 10 + '0'); + a [5] = (char) (m % 10 + '0'); + aa = a; + while (*aa == ' ') aa++; + strcpy(sp, aa); + return (sp); +} /* swe_cs2lonlatstr() */ + +char *FAR PASCAL_CONV swe_cs2degstr(CSEC t, char *a) + /* does suppress leading zeros in degrees */ +{ + /* char a[9]; must be initialized at each call */ + centisec h,m,s; + t = t / 100 % (30L*3600L); /* truncate to seconds */ + s = t % 60L; + m = t / 60 % 60L; + h = t / 3600 % 100L; /* only 0..99 degrees */ + sprintf(a, "%2d%s%02d'%02d", h, ODEGREE_STRING, m, s); + return (a); +} /* swe_cs2degstr() */ + +/********************************************************* + * function for splitting centiseconds into * + * ideg degrees, + * imin minutes, + * isec seconds, + * dsecfr fraction of seconds + * isgn zodiac sign number; + * or +/- sign + * + *********************************************************/ +void FAR PASCAL_CONV swe_split_deg(double ddeg, int32 roundflag, int32 *ideg, int32 *imin, int32 *isec, double *dsecfr, int32 *isgn) +{ + double dadd = 0; + *isgn = 1; + if (ddeg < 0) { + *isgn = -1; + ddeg = -ddeg; + } + if (roundflag & SE_SPLIT_DEG_ROUND_DEG) { + dadd = 0.5; + } else if (roundflag & SE_SPLIT_DEG_ROUND_MIN) { + dadd = 0.5 / 60; + } else if (roundflag & SE_SPLIT_DEG_ROUND_SEC) { + dadd = 0.5 / 3600; + } + if (roundflag & SE_SPLIT_DEG_KEEP_DEG) { + if ((int32) (ddeg + dadd) - (int32) ddeg > 0) + dadd = 0; + } else if (roundflag & SE_SPLIT_DEG_KEEP_SIGN) { + if (fmod(ddeg, 30) + dadd >= 30) + dadd = 0; + } + ddeg += dadd; + if (roundflag & SE_SPLIT_DEG_ZODIACAL) { + *isgn = (int32) (ddeg / 30); + ddeg = fmod(ddeg, 30); + } + *ideg = (int32) ddeg; + ddeg -= *ideg; + *imin = (int32) (ddeg * 60); + ddeg -= *imin / 60.0; + *isec = (int32) (ddeg * 3600); + if (!(roundflag & (SE_SPLIT_DEG_ROUND_DEG | SE_SPLIT_DEG_ROUND_MIN | SE_SPLIT_DEG_ROUND_SEC))) { + *dsecfr = ddeg * 3600 - *isec; + } +} /* end split_deg */ + +double swi_kepler(double E, double M, double ecce) +{ + double dE = 1, E0; + double x; + /* simple formula for small eccentricities */ + if (ecce < 0.4) { + while(dE > 1e-12) { + E0 = E; + E = M + ecce * sin(E0); + dE = fabs(E - E0); + } + /* complicated formula for high eccentricities */ + } else { + while(dE > 1e-12) { + E0 = E; + /* + * Alois 21-jul-2000: workaround an optimizer problem in gcc + * swi_mod2PI sees very small negative argument e-322 and returns +2PI; + * we avoid swi_mod2PI for small x. + */ + x = (M + ecce * sin(E0) - E0) / (1 - ecce * cos(E0)); + dE = fabs(x); + if (dE < 1e-2) { + E = E0 + x; + } else { + E = swi_mod2PI(E0 + x); + dE = fabs(E - E0); + } + } + } + return E; +} + +void swi_FK4_FK5(double *xp, double tjd) +{ + if (xp[0] == 0 && xp[1] == 0 && xp[2] == 0) + return; + swi_cartpol(xp, xp); + /* according to Expl.Suppl., p. 167f. */ + xp[0] += (0.035 + 0.085 * (tjd - B1950) / 36524.2198782) / 3600 * 15 * DEGTORAD; + xp[3] += (0.085 / 36524.2198782) / 3600 * 15 * DEGTORAD; + swi_polcart(xp, xp); +} + +void swi_FK5_FK4(double *xp, double tjd) +{ + if (xp[0] == 0 && xp[1] == 0 && xp[2] == 0) + return; + swi_cartpol(xp, xp); + /* according to Expl.Suppl., p. 167f. */ + xp[0] -= (0.035 + 0.085 * (tjd - B1950) / 36524.2198782) / 3600 * 15 * DEGTORAD; + xp[3] -= (0.085 / 36524.2198782) / 3600 * 15 * DEGTORAD; + swi_polcart(xp, xp); +} + +char *swi_strcpy(char *to, char *from) +{ + char *s; + if (*from == '\0') { + *to = '\0'; + return to; + } + s = strdup(from); + if (s == NULL) { + strcpy(to, from); + return to; + } + strcpy(to, s); + free(s); + return to; +} + +char *swi_strncpy(char *to, char *from, size_t n) +{ + char *s; + if (*from == '\0') { + return to; + } + s = strdup(from); + if (s == NULL) { + strncpy(to, from, n); + return to; + } + strncpy(to, s, n); + free(s); + return to; +} + +#ifdef TRACE +void swi_open_trace(char *serr) +{ + swi_trace_count++; + if (swi_trace_count >= TRACE_COUNT_MAX) { + if (swi_trace_count == TRACE_COUNT_MAX) { + if (serr != NULL) + sprintf(serr, "trace stopped, %d calls exceeded.", TRACE_COUNT_MAX); + if (swi_fp_trace_out != NULL) + fprintf(swi_fp_trace_out, "trace stopped, %d calls exceeded.\n", TRACE_COUNT_MAX); + if (swi_fp_trace_c != NULL) + fprintf(swi_fp_trace_c, "/* trace stopped, %d calls exceeded. */\n", TRACE_COUNT_MAX); + } + return; + } + if (swi_fp_trace_c == NULL) { + char fname[AS_MAXCH]; +#if TRACE == 2 + char *sp, *sp1; + int ipid; +#endif + /* remove(fname_trace_c); */ + strcpy(fname, fname_trace_c); +#if TRACE == 2 + sp = strchr(fname_trace_c, '.'); + sp1 = strchr(fname, '.'); +# if MSDOS + ipid = _getpid(); +# else + ipid = getpid(); +# endif + sprintf(sp1, "_%d%s", ipid, sp); +#endif + if ((swi_fp_trace_c = fopen(fname, FILE_A_ACCESS)) == NULL) { + if (serr != NULL) + sprintf(serr, "could not open trace output file '%s'", fname); + } else { + fputs("#include \"sweodef.h\"\n", swi_fp_trace_c); + fputs("#include \"swephexp.h\"\n\n", swi_fp_trace_c); + fputs("void main()\n{\n", swi_fp_trace_c); + fputs(" double tjd, t, nut, eps; int i, ipl, retc; int32 iflag;\n", swi_fp_trace_c); + fputs(" double armc, geolat, cusp[12], ascmc[10]; int hsys;\n", swi_fp_trace_c); + fputs(" double xx[6]; int32 iflgret;\n", swi_fp_trace_c); + fputs(" char s[AS_MAXCH], star[AS_MAXCH], serr[AS_MAXCH];\n", swi_fp_trace_c); + fflush(swi_fp_trace_c); + } + } + if (swi_fp_trace_out == NULL) { + char fname[AS_MAXCH]; +#if TRACE == 2 + char *sp, *sp1; + int ipid; +#endif + /* remove(fname_trace_out); */ + strcpy(fname, fname_trace_out); +#if TRACE == 2 + sp = strchr(fname_trace_out, '.'); + sp1 = strchr(fname, '.'); +# if MSDOS + ipid = _getpid(); +# else + ipid = getpid(); +# endif + sprintf(sp1, "_%d%s", ipid, sp); +#endif + if ((swi_fp_trace_out = fopen(fname, FILE_A_ACCESS)) == NULL) { + if (serr != NULL) + sprintf(serr, "could not open trace output file '%s'", fname); + } + } +} +#endif diff --git a/swe/src/swephlib.h b/swe/src/swephlib.h new file mode 100644 index 0000000..7a289db --- /dev/null +++ b/swe/src/swephlib.h @@ -0,0 +1,179 @@ + +/************************************************************ + $Header: /home/dieter/sweph/RCS/swephlib.h,v 1.74 2008/06/16 10:07:20 dieter Exp $ + + Authors: Dieter Koch and Alois Treindl, Astrodienst Zurich + +************************************************************/ +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + + +/* Set TRUE, to include Herring's (1987) corrections to IAU 1980 + * nutation series. AA (1996) neglects them. */ +#define NUT_CORR_1987 FALSE + +/* Precession coefficients for remote past and future. + * One of the following four defines must be true. + */ +#define PREC_VONDRAK_2011 TRUE +#define PREC_WILLIAMS_1994 FALSE +#define PREC_SIMON_1994 FALSE +#define PREC_LASKAR_1986 FALSE +#define PREC_BRETAGNON_2003 FALSE +/* IAU precession 1976 or 2003 for recent centuries. + * only one of the following two defines may be TRUE */ +#define PREC_IAU_1976 FALSE +#define PREC_IAU_2003 FALSE /* precession model P03 */ +#define PREC_IAU_1976_CTIES 2.0 /* J2000 +/- two centuries */ +/* we use P03 for whole ephemeris */ +#define PREC_IAU_2003_CTIES 75.0 /* J2000 +/- 75 centuries */ + +/* choose between the following nutation models */ +#define NUT_IAU_1980 FALSE +#define NUT_IAU_2000A FALSE /* very time consuming ! */ +#define NUT_IAU_2000B TRUE /* fast, but precision of milli-arcsec */ + +/* coordinate transformation */ +extern void swi_coortrf(double *xpo, double *xpn, double eps); + +/* coordinate transformation */ +extern void swi_coortrf2(double *xpo, double *xpn, double sineps, double coseps); + +/* cartesian to polar coordinates */ +extern void swi_cartpol(double *x, double *l); + +/* cartesian to polar coordinates with velocity */ +extern void swi_cartpol_sp(double *x, double *l); +extern void swi_polcart_sp(double *l, double *x); + +/* polar to cartesian coordinates */ +extern void swi_polcart(double *l, double *x); + +/* GCRS to J2000 */ +extern void swi_bias(double *x, int32 iflag, AS_BOOL backward); +/* GCRS to FK5 */ +extern void swi_icrs2fk5(double *x, int32 iflag, AS_BOOL backward); + +/* precession */ +extern int swi_precess(double *R, double J, int direction ); +extern void swi_precess_speed(double *xx, double t, int direction); + +/* from sweph.c, light deflection, aberration, etc. */ +extern void swi_deflect_light(double *xx, double dt, int32 iflag); +extern void swi_aberr_light(double *xx, double *xe, int32 iflag); +extern int swi_plan_for_osc_elem(int32 iflag, double tjd, double *xx); +extern int swi_trop_ra2sid_lon(double *xin, double *xout, double *xoutr, int32 iflag, char *serr); +extern int swi_trop_ra2sid_lon_sosy(double *xin, double *xout, double *xoutr, int32 iflag, char *serr); +extern int swi_get_observer(double tjd, int32 iflag, + AS_BOOL do_save, double *xobs, char *serr); +extern void swi_force_app_pos_etc(); + +/* obliquity of ecliptic */ +extern void swi_check_ecliptic(double tjd); +extern double swi_epsiln(double J); +extern void swi_ldp_peps(double J, double *dpre, double *deps); + +/* nutation */ +extern void swi_check_nutation(double tjd, int32 iflag); +extern int swi_nutation(double J, double *nutlo); +extern void swi_nutate(double *xx, int32 iflag, AS_BOOL backward); + +extern void swi_mean_lunar_elements(double tjd, + double *node, double *dnode, + double *peri, double *dperi); +/* */ +extern double swi_mod2PI(double x); + +/* evaluation of chebyshew series and derivative */ +extern double swi_echeb(double x, double *coef, int ncf); +extern double swi_edcheb(double x, double *coef, int ncf); + +/* cross product of vectors */ +extern void swi_cross_prod(double *a, double *b, double *x); +/* dot product of vecotrs */ +extern double swi_dot_prod_unit(double *x, double *y); + +extern double swi_angnorm(double x); + +/* generation of SWISSEPH file names */ +extern void swi_gen_filename(double tjd, int ipli, char *fname); + +/* cyclic redundancy checksum (CRC), 32 bit */ +extern uint32 swi_crc32(unsigned char *buf, int len); + +extern int swi_cutstr(char *s, char *cutlist, char *cpos[], int nmax); +extern char *swi_right_trim(char *s); + +extern double swi_kepler(double E, double M, double ecce); + +extern char *swi_get_fict_name(int32 ipl, char *s); + +extern void swi_FK4_FK5(double *xp, double tjd); + +extern char *swi_strcpy(char *to, char *from); +extern char *swi_strncpy(char *to, char *from, size_t n); + +#ifdef TRACE +# define TRACE_COUNT_MAX 10000 + extern FILE *swi_fp_trace_c; + extern FILE *swi_fp_trace_out; + extern void swi_open_trace(char *serr); + extern int32 swi_trace_count; + static char *fname_trace_c = "swetrace.c"; + static char *fname_trace_out = "swetrace.txt"; +#ifdef FORCE_IFLAG + static char *fname_force_flg = "force.flg"; +#endif +#endif /* TRACE */ diff --git a/swe/src/swetest.c b/swe/src/swetest.c new file mode 100644 index 0000000..6df4ed0 --- /dev/null +++ b/swe/src/swetest.c @@ -0,0 +1,2681 @@ +/* + $Header: /users/dieter/sweph/RCS/swetest.c,v 1.78 2010/06/25 07:22:10 dieter Exp $ + swetest.c A test program + + Authors: Dieter Koch and Alois Treindl, Astrodienst Zuerich + +**************************************************************/ + +/* Copyright (C) 1997 - 2008 Astrodienst AG, Switzerland. All rights reserved. + + License conditions + ------------------ + + This file is part of Swiss Ephemeris. + + Swiss Ephemeris is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. + + Swiss Ephemeris is made available by its authors under a dual licensing + system. The software developer, who uses any part of Swiss Ephemeris + in his or her software, must choose between one of the two license models, + which are + a) GNU public license version 2 or later + b) Swiss Ephemeris Professional License + + The choice must be made before the software developer distributes software + containing parts of Swiss Ephemeris to others, and before any public + service using the developed software is activated. + + If the developer choses the GNU GPL software license, he or she must fulfill + the conditions of that license, which includes the obligation to place his + or her whole software project under the GNU GPL or a compatible license. + See http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + + If the developer choses the Swiss Ephemeris Professional license, + he must follow the instructions as found in http://www.astro.com/swisseph/ + and purchase the Swiss Ephemeris Professional Edition from Astrodienst + and sign the corresponding license contract. + + The License grants you the right to use, copy, modify and redistribute + Swiss Ephemeris, but only under certain conditions described in the License. + Among other things, the License requires that the copyright notices and + this notice be preserved on all copies. + + Authors of the Swiss Ephemeris: Dieter Koch and Alois Treindl + + The authors of Swiss Ephemeris have no control or influence over any of + the derived works, i.e. over software or services created by other + programmers which use Swiss Ephemeris functions. + + The names of the authors or of the copyright holder (Astrodienst) must not + be used for promoting any software, product or service which uses or contains + the Swiss Ephemeris. This copyright notice is the ONLY place where the + names of the authors can legally appear, except in cases where they have + given special permission in writing. + + The trademarks 'Swiss Ephemeris' and 'Swiss Ephemeris inside' may be used + for promoting such software, products or services. +*/ + +/* attention: Microsoft Compiler does not accept strings > 2048 char */ +static char *infocmd0 = "\n\ + Swetest computes a complete set of geocentric planetary positions,\n\ + for a given date or a sequence of dates.\n\ + Input can either be a date or an absolute julian day number.\n\ + 0:00 (midnight).\n\ + With the proper options, swetest can be used to output a printed\n\ + ephemeris and transfer the data into other programs like spreadsheets\n\ + for graphical display.\n\ + Version: $Header: /users/dieter/sweph/RCS/swetest.c,v 1.78 2010/06/25 07:22:10 dieter Exp $\n\ +\n"; +static char *infocmd1 = "\n\ + Command line options:\n\ + help commands:\n\ + -?, -h display whole info\n\ + -hcmd display commands\n\ + -hplan display planet numbers\n\ + -hform display format characters\n\ + -hdate display input date format\n\ + -hexamp display examples\n\ + input time formats:\n\ + -bDATE begin date; e.g. -b1.1.1992 if\n\ + Note: the date format is day month year (European style).\n\ + -bj... begin date as an absolute Julian day number; e.g. -bj2415020.5\n\ + -j... same as -bj\n\ + -tHH.MMSS input time (ephemeris time)\n\ + -ut input date is universal time\n\ + -utHH:MM:SS input time\n\ + -utHH.MMSS input time\n\ + object, number of steps, step with\n\ + -pSEQ planet sequence to be computed.\n\ + See the letter coding below.\n\ + -dX differential ephemeris: print differential ephemeris between\n\ + body X and each body in list given by -p\n\ + example: -p2 -d0 -fJl -n366 -b1.1.1992 prints the longitude\n\ + distance between SUN (planet 0) and MERCURY (planet 2)\n\ + for a full year starting at 1 Jan 1992.\n\ + -DX midpoint ephemeris, works the same way as the differential\n\ + mode -d described above, but outputs the midpoint position.\n\ + -nN output data for N consecutive days; if no -n option\n\ + is given, the default is 1. If the option -n without a\n\ + number is given, the default is 20.\n\ + -sN timestep N days, default 1. This option is only meaningful\n\ + when combined with option -n.\n\ + "; +static char *infocmd2 = "\ + output format:\n\ + -fSEQ use SEQ as format sequence for the output columns;\n\ + default is PLBRS.\n\ + -head don\'t print the header before the planet data. This option\n\ + is useful when you want to paste the output into a\n\ + spreadsheet for displaying graphical ephemeris.\n\ + +head header before every step (with -s..) \n\ + -gPPP use PPP as gap between output columns; default is a single\n\ + blank. -g followed by white space sets the\n\ + gap to the TAB character; which is useful for data entry\n\ + into spreadsheets.\n\ + astrological house system:\n\ + -house[long,lat,hsys] \n\ + include house cusps. The longitude, latitude (degrees with\n\ + DECIMAL fraction) and house system letter can be given, with\n\ + commas separated, + for east and north. If none are given,\n\ + Greenwich UK and Placidus is used: 0.00,51.50,p.\n\ + The output lists 12 house cusps, Asc, MC, ARMC and Vertex.\n\ + Houses can only be computed if option -ut is given.\n\ + -hsy[hsys] \n\ + house system to be used (for house positions of planets)\n\ + for long, lat, hsys, see -house\n\ + -geopos[long,lat,elev] \n\ + Geographic position. Can be used for azimuth and altitude\n\ + or topocentric or house cups calculations.\n\ + The longitude, latitude (degrees with DECIMAL fraction)\n\ + and elevation (meters) can be given, with\n\ + commas separated, + for east and north. If none are given,\n\ + Greenwich is used: 0,51.5,0\n\ + sidereal astrology:\n\ + -ay.. ayanamsa, with number of method, e.g. ay0 for Fagan/Bradley\n\ + -sid.. sidereal, with number of method; 'sid0' for Fagan/Bradley\n\ + 'sid1' for Lahiri\n\ + -sidt0.. sidereal, projection on ecliptic of t0 \n\ + -sidsp.. sidereal, projection on solar system plane \n\ + "; +static char *infocmd3 = "\ + ephemeris specifications:\n\ + -edirPATH change the directory of the ephemeris files \n\ + -eswe swiss ephemeris\n\ + -ejpl jpl ephemeris (DE406), or with ephemeris file name\n\ + -ejplde200.eph \n\ + -emos moshier ephemeris\n\ + -true true positions\n\ + -noaberr no aberration\n\ + -nodefl no gravitational light deflection\n\ + -noaberr -nodefl astrometric positions\n\ + -j2000 no precession (i.e. J2000 positions)\n\ + -icrs ICRS (use Internat. Celestial Reference System)\n\ + -nonut no nutation \n\ + -speed calculate high precision speed \n\ + -speed3 'low' precision speed from 3 positions \n\ + do not use this option. -speed parameter\n\ + is faster and preciser \n\ + -iXX force iflag to value XX\n\ + -testaa96 test example in AA 96, B37,\n\ + i.e. venus, j2450442.5, DE200.\n\ + attention: use precession IAU1976\n\ + and nutation 1980 (s. swephlib.h)\n\ + -testaa95\n\ + -testaa97\n\ + -roundsec round to seconds\n\ + -roundmin round to minutes\n\ + observer position:\n\ + -hel compute heliocentric positions\n\ + -bary compute barycentric positions (bar. earth instead of node) \n\ + -topo[long,lat,elev] \n\ + topocentric positions. The longitude, latitude (degrees with\n\ + DECIMAL fraction) and elevation (meters) can be given, with\n\ + commas separated, + for east and north. If none are given,\n\ + Zuerich is used: 8.55,47.38,400\n\ +\n\ + "; +static char *infocmd4 = "\ + special events:\n\ + -solecl solar eclipse\n\ + output 1st line:\n\ + eclipse date,\n\ + time of maximum (UT),\n\ + core shadow width (negative with total eclipses),\n\ + fraction of solar diameter that is eclipsed\n\ + Julian day number (6-digit fraction) of maximum\n\ + output 2nd line:\n\ + start and end times for partial and total phase\n\ + output 3rd line:\n\ + geographical longitude and latitude of maximum eclipse,\n\ + totality duration at that geographical position,\n\ + output with -local, see below.\n\ + -occult occultation of planet or star by the moon. Use -p to \n\ + specify planet (-pf -xfAldebaran for stars) \n\ + output format same as with -solecl\n\ + -lunecl lunar eclipse\n\ + output 1st line:\n\ + eclipse date,\n\ + time of maximum (UT),\n\ + Julian day number (6-digit fraction) of maximum\n\ + output 2nd line:\n\ + 6 contacts for start and end of penumbral, partial, and\n\ + total phase\n\ + -local only with -solecl or -occult, if the next event of this\n\ + kind is wanted for a given geogr. position.\n\ + Use -geopos[long,lat,elev] to specify that position.\n\ + If -local is not set, the program \n\ + searches for the next event anywhere on earth.\n\ + output 1st line:\n\ + eclipse date,\n\ + time of maximum,\n\ + fraction of solar diameter that is eclipsed\n\ + output 2nd line:\n\ + local eclipse duration,\n\ + local four contacts,\n\ + -hev[type] heliacal events,\n\ + type 1 = heliacal rising\n\ + type 2 = heliacal setting\n\ + type 3 = evening first\n\ + type 4 = morning last\n\ + type 0 or missing = all four events are listed.\n\ + "; +static char *infocmd5 = "\ + -rise rising and setting of a planet or star.\n\ + Use -geopos[long,lat,elev] to specify geographical position.\n\ + -metr southern and northern meridian transit of a planet of star\n\ + Use -geopos[long,lat,elev] to specify geographical position.\n\ + specifications for eclipses:\n\ + -total total eclipse (only with -solecl, -lunecl)\n\ + -partial partial eclipse (only with -solecl, -lunecl)\n\ + -annular annular eclipse (only with -solecl)\n\ + -anntot annular-total (hybrid) eclipse (only with -solecl)\n\ + -penumbral penumbral lunar eclipse (only with -lunecl)\n\ + -central central eclipse (only with -solecl, nonlocal)\n\ + -noncentral non-central eclipse (only with -solecl, nonlocal)\n\ + specifications for risings and settings:\n\ + -norefrac neglect refraction (with option -rise)\n\ + -disccenter find rise of disc center (with option -rise)\n\ + -hindu hindu version of sunrise (with option -rise)\n\ + specifications for heliacal events:\n\ + -at[press,temp,rhum,visr]:\n\ + pressure in hPa\n\ + temperature in degrees Celsius\n\ + relative humidity in %\n\ + visual range, interpreted as follows:\n\ + > 1 : meteorological range in km\n\ + 1>visr>0 : total atmospheric coefficient (ktot)\n\ + = 0 : calculated from press, temp, rhum\n\ + Default values are -at1013.25,15,40,0\n\ + -obs[age,SN] age of observer and Snellen ratio\n\ + Default values are -obs36,1\n\ + -opt[age,SN,binocular,magn,diam,transm]\n\ + age and SN as with -obs\n\ + 0 monocular or 1 binocular\n\ + telescope magnification\n\ + optical aperture in mm\n\ + optical transmission\n\ + Default values: -opt36,1,1,1,0,0 (naked eye)\n\ + backward search:\n\ + -bwd\n"; +/* characters still available: + bcegijklruvxy + */ +static char *infoplan = "\n\ + Planet selection letters:\n\ + planetary lists:\n\ + d (default) main factors 0123456789mtABCcg\n\ + p main factors as above, plus main asteroids DEFGHI\n\ + h ficticious factors J..X\n\ + a all factors\n\ + (the letters above can only appear as a single letter)\n\n\ + single planet letters:\n\ + 0 Sun (character zero)\n\ + 1 Moon (character 1)\n\ + 2 Mercury\n\ + ....\n\ + 9 Pluto\n\ + m mean lunar node\n\ + t true lunar node\n\ + n nutation\n\ + o obliquity of ecliptic\n\ + q delta t\n\ + A mean lunar apogee (Lilith, Black Moon) \n\ + B osculating lunar apogee \n\ + c intp. lunar apogee \n\ + g intp. lunar perigee \n\ + C Earth (in heliocentric or barycentric calculation)\n\ + dwarf planets, plutoids\n\ + F Ceres\n\ + 9 Pluto\n\ + s -xs136199 Eris\n\ + s -xs136472 Makemake\n\ + s -xs136108 Haumea\n\ + some minor planets:\n\ + D Chiron\n\ + E Pholus\n\ + G Pallas \n\ + H Juno \n\ + I Vesta \n\ + s minor planet, with MPC number given in -xs\n\ + fixed stars:\n\ + f fixed star, with name or number given in -xf option\n\ + f -xfSirius Sirius\n\ + fictitious objects:\n\ + J Cupido \n\ + K Hades \n\ + L Zeus \n\ + M Kronos \n\ + N Apollon \n\ + O Admetos \n\ + P Vulkanus \n\ + Q Poseidon \n\ + R Isis (Sevin) \n\ + S Nibiru (Sitchin) \n\ + T Harrington \n\ + U Leverrier's Neptune\n\ + V Adams' Neptune\n\ + W Lowell's Pluto\n\ + X Pickering's Pluto\n\ + Y Vulcan\n\ + Z White Moon\n\ + w Waldemath's dark Moon\n\ + z hypothetical body, with number given in -xz\n\ + e print a line of labels\n\ + \n"; +/* characters still available + cgjv +*/ +static char *infoform = "\n\ + Output format SEQ letters:\n\ + In the standard setting five columns of coordinates are printed with\n\ + the default format PLBRS. You can change the default by providing an\n\ + option like -fCCCC where CCCC is your sequence of columns.\n\ + The coding of the sequence is like this:\n\ + y year\n\ + Y year.fraction_of_year\n\ + p planet index\n\ + P planet name\n\ + J absolute juldate\n\ + T date formatted like 23.02.1992 \n\ + t date formatted like 920223 for 1992 february 23\n\ + L longitude in degree ddd mm'ss\"\n\ + l longitude decimal\n\ + Z longitude ddsignmm'ss\"\n\ + S speed in longitude in degree ddd:mm:ss per day\n\ + SS speed for all values specified in fmt\n\ + s speed longitude decimal (degrees/day)\n\ + ss speed for all values specified in fmt\n\ + B latitude degree\n\ + b latitude decimal\n\ + R distance decimal in AU\n\ + r distance decimal in AU, Moon in seconds parallax\n\ + relative distance (1000=nearest, 0=furthest)\n\ + A right ascension in hh:mm:ss\n\ + a right ascension hours decimal\n\ + D declination degree\n\ + d declination decimal\n\ + I Azimuth degree\n\ + i Azimuth decimal\n\ + H Height degree\n\ + h Height decimal\n\ + K Height (with refraction) degree\n\ + k Height (with refraction) decimal\n\ + G house position in degrees\n\ + g house position in degrees decimal\n\ + j house number 1.0 - 12.99999\n\ + X x-, y-, and z-coordinates ecliptical\n\ + x x-, y-, and z-coordinates equatorial\n\ + U unit vector ecliptical\n\ + u unit vector equatorial\n\ + Q l, b, r, dl, db, dr, a, d, da, dd\n\ + n nodes (mean): ascending/descending (Me - Ne); longitude decimal\n\ + N nodes (osculating): ascending/descending, longitude; decimal\n\ + f apsides (mean): perihel, aphel, second focal point; longitude dec.\n\ + F apsides (osc.): perihel, aphel, second focal point; longitude dec.\n\ + + phase angle\n\ + - phase\n\ + * elongation\n\ + / apparent diameter of disc (without refraction)\n\ + = magnitude\n"; +static char *infoform2 = "\ + v (reserved)\n\ + V (reserved)\n\ + "; +static char *infodate = "\n\ + Date entry:\n\ + In the interactive mode, when you are asked for a start date,\n\ + you can enter data in one of the following formats:\n\ +\n\ + 1.2.1991 three integers separated by a nondigit character for\n\ + day month year. Dates are interpreted as Gregorian\n\ + after 4.10.1582 and as Julian Calendar before.\n\ + Time is always set to midnight.\n\ + If the three letters jul are appended to the date,\n\ + the Julian calendar is used even after 1582.\n\ + If the four letters greg are appended to the date,\n\ + the Gregorian calendar is used even before 1582.\n\ +\n\ + j2400123.67 the letter j followed by a real number, for\n\ + the absolute Julian daynumber of the start date.\n\ + Fraction .5 indicates midnight, fraction .0\n\ + indicates noon, other times of the day can be\n\ + chosen accordingly.\n\ +\n\ + repeat the last entry\n\ + \n\ + . stop the program\n\ +\n\ + +20 advance the date by 20 days\n\ +\n\ + -10 go back in time 10 days\n"; +static char *infoexamp = "\n\ +\n\ + Examples:\n\ +\n\ + swetest -p2 -b1.12.1900 -n15 -s2\n\ + ephemeris of Mercury (-p2) starting on 1 Dec 1900,\n\ + 15 positions (-n15) in two-day steps (-s2)\n\ +\n\ + swetest -p2 -b1.12.1900 -n15 -s2 -fTZ -roundsec -g, -head\n\ + same, but output format = date and zodiacal position (-fTZ),\n\ + separated by comma (-g,) and rounded to seconds (-roundsec),\n\ + without header (-head).\n\ +\n\ + swetest -ps -xs433 -b1.12.1900\n\ + position of asteroid 433 Eros (-ps -xs433)\n\ +\n\ + swetest -pf -xfAldebaran -b1.1.2000\n\ + position of fixed star Aldebaran \n\ +\n\ + swetest -p1 -d0 -b1.12.1900 -n10 -fPTl -head\n\ + angular distance of moon (-p1) from sun (-d0) for 10\n\ + consecutive days (-n10).\n\ +\n\ + swetest -p6 -DD -b1.12.1900 -n100 -s5 -fPTZ -head -roundmin\n\ + Midpoints between Saturn (-p6) and Chiron (-DD) for 100\n\ + consecutive steps (-n100) with 5-day steps (-s5) with\n\ + longitude in degree-sign format (-f..Z) rounded to minutes (-roundmin)\n\ +\n\ + swetest -b5.1.2002 -p -house12.05,49.50,k -ut12:30\n\ + Koch houses for a location in Germany at a given date and time\n"; +/**************************************************************/ + +#include "swephexp.h" /* this includes "sweodef.h" */ + +/* + * programmers warning: It looks much worse than it is! + * Originally swetest.c was a small and simple test program to test + * the main functions of the Swiss Ephemeris and to demonstrate + * its precision. + * It compiles on Unix, on MSDOS and as a non-GUI utility on 16-bit + * and 32-bit windows. + * This portability has forced us into some clumsy constructs, which + * end to hide the actual simplicity of the use of Swiss Ephemeris. + * For example, the mechanism implemented here in swetest.c to find + * the binary ephemeris files overrides the much simpler mechanism + * inside the SwissEph library. This was necessary because we wanted + * swetest.exe to run directly off the CDROM and search with some + * intelligence for ephemeris files already installed on a system. + */ + +#if MSDOS +# include +# include +# ifdef _MSC_VER +# include +# endif +# include +#else +# ifdef MACOS +# include +# else +# include +# endif +#endif + +#define J2000 2451545.0 /* 2000 January 1.5 */ +#define square_sum(x) (x[0]*x[0]+x[1]*x[1]+x[2]*x[2]) +#define SEFLG_EPHMASK (SEFLG_JPLEPH|SEFLG_SWIEPH|SEFLG_MOSEPH) + +#define BIT_ROUND_SEC 1 +#define BIT_ROUND_MIN 2 +#define BIT_ZODIAC 4 +#define BIT_LZEROES 8 +#define PLSEL_D "0123456789mtA" +#define PLSEL_P "0123456789mtABCcgDEFGHI" +#define PLSEL_H "JKLMNOPQRSTUVWXYZw" +#define PLSEL_A "0123456789mtABCcgDEFGHIJKLMNOPQRSTUVWXYZw" + +#define DIFF_DIFF 'd' +#define DIFF_MIDP 'D' +#define MODE_HOUSE 1 +#define MODE_LABEL 2 + +static char se_pname[AS_MAXCH]; +static char *zod_nam[] = {"ar", "ta", "ge", "cn", "le", "vi", + "li", "sc", "sa", "cp", "aq", "pi"}; + +static char star[AS_MAXCH] = "algol", star2[AS_MAXCH]; +static char sastno[AS_MAXCH] = "433"; +static char shyp[AS_MAXCH] = "1"; +static char *dms(double x, int32 iflag); +static int make_ephemeris_path(int32 iflag, char *argv0); +static int letter_to_ipl(int letter); +static int print_line(int mode); +static int do_special_event(double tjd, int32 ipl, char *star, int32 special_event, int32 special_mode, double *geopos, double *datm, double *dobs, char *serr) ; +static char *hms_from_tjd(double x); +static void do_printf(char *info); +static char *hms(double x, int32 iflag); +#if MSDOS +static int cut_str_any(char *s, char *cutlist, char *cpos[], int nmax); +#endif + +/* globals shared between main() and print_line() */ +static char *fmt = "PLBRS"; +static char *gap = " "; +static double t, te, tut, jut = 0; +static int jmon, jday, jyear; +static int ipl = SE_SUN, ipldiff = SE_SUN, nhouses = 12; +static char spnam[AS_MAXCH], spnam2[AS_MAXCH], serr[AS_MAXCH]; +static char serr_save[AS_MAXCH], serr_warn[AS_MAXCH]; +static int gregflag = SE_GREG_CAL; +static int diff_mode = 0; +static AS_BOOL universal_time = FALSE; +static int32 round_flag = 0; +static AS_BOOL short_output = FALSE; +static int32 special_event = 0; +static int32 special_mode = 0; +static AS_BOOL hel_using_AV = FALSE; +static double x[6], x2[6], xequ[6], xcart[6], xcartq[6], xobl[6], xaz[6], xt[6], hpos, hpos2, hposj, armc, xsv[6]; +static int hpos_meth = 0; +static double attr[20], tret[20], geopos[3], datm[4], dobs[6]; +static int32 iflag = 0, iflag2; /* external flag: helio, geo... */ +static char *hs_nam[] = {"undef", + "Ascendant", "MC", "ARMC", "Vertex"}; +static int direction = 1; +static AS_BOOL direction_flag = FALSE; +static int32 helflag = 0; +static double tjd = 2415020.5; +static int32 nstep = 1, istep; +static int32 search_flag = 0; +static char sout[AS_MAXCH]; +static int32 whicheph = SEFLG_SWIEPH; +static char *psp; +static int32 norefrac = 0; +static int32 disccenter = 0; + +#define SP_LUNAR_ECLIPSE 1 +#define SP_SOLAR_ECLIPSE 2 +#define SP_OCCULTATION 3 +#define SP_RISE_SET 4 +#define SP_MERIDIAN_TRANSIT 5 +#define SP_HELIACAL 6 + +# define SP_MODE_HOW 2 /* an option for Lunar */ +# define SP_MODE_LOCAL 8 /* an option for Solar */ +# define SP_MODE_HOCAL 4096 + +# define ECL_LUN_PENUMBRAL 1 /* eclipse types for hocal list */ +# define ECL_LUN_PARTIAL 2 +# define ECL_LUN_TOTAL 3 +# define ECL_SOL_PARTIAL 4 +# define ECL_SOL_ANNULAR 5 +# define ECL_SOL_TOTAL 6 + +int main(int argc, char *argv[]) +{ + char sdate_save[AS_MAXCH]; + char s1[AS_MAXCH], s2[AS_MAXCH]; + char *sp, *sp2; + char *spno; + char *plsel = PLSEL_D; +#if HPUNIX + char hostname[80]; +#endif + int i, j, n, iflag_f = -1, iflgt; + int line_count, line_limit = 32000; + double daya; + double top_long = 0.0; /* Greenwich UK */ + double top_lat = 51.5; + double top_elev = 0; + AS_BOOL have_geopos = FALSE; + int ihsy = 'p'; + AS_BOOL do_houses = FALSE; + char ephepath[AS_MAXCH]; + char fname[AS_MAXCH]; + char sdate[AS_MAXCH]; + char *begindate = NULL; + int32 iflgret; + AS_BOOL with_header = TRUE; + AS_BOOL with_header_always = FALSE; + AS_BOOL do_ayanamsa = FALSE; + int32 sid_mode = SE_SIDM_FAGAN_BRADLEY; + double t2, tstep = 1, thour = 0; + double delt; + datm[0] = 0; datm[1] = 0; datm[2] = 0; datm[3] = 0; + dobs[0] = 0; dobs[1] = 0; + dobs[2] = 0; dobs[3] = 0; dobs[4] = 0; dobs[5] = 0; +/* swe_set_tid_acc(-25.858); * to test delta t output */ + serr[0] = serr_save[0] = serr_warn[0] = sdate_save[0] = '\0'; +# ifdef MACOS + argc = ccommand(&argv); /* display the arguments window */ +# endif + strcpy(ephepath, ""); + strcpy(fname, SE_FNAME_DE406); + for (i = 1; i < argc; i++) { + if (strncmp(argv[i], "-ut", 3) == 0) { + universal_time = TRUE; + if (strlen(argv[i]) > 3) { + strcpy(s1, argv[i] + 3); + if ((sp = strchr(s1, ':')) != NULL) { + *sp = '.'; + if ((sp = strchr(s1, ':')) != NULL) { + strcpy(s2, sp + 1); + strcpy(sp, s2); + } + } + thour = atof(s1); + /* h.mmss -> decimal */ + t = fmod(thour, 1) * 100 + 1e-10; + j = (int) t; + t = fmod(t, 1) * 100 + 1e-10; + thour = (int) thour + j / 60.0 + t / 3600.0; + } + } else if (strncmp(argv[i], "-head", 5) == 0) { + with_header = FALSE; + } else if (strncmp(argv[i], "+head", 5) == 0) { + with_header_always = TRUE; + } else if (strcmp(argv[i], "-j2000") == 0) { + iflag |= SEFLG_J2000; + } else if (strcmp(argv[i], "-icrs") == 0) { + iflag |= SEFLG_ICRS; + } else if (strncmp(argv[i], "-ay", 3) == 0) { + do_ayanamsa = TRUE; + sid_mode = atol(argv[i]+3); + swe_set_sid_mode(sid_mode, 0, 0); + } else if (strncmp(argv[i], "-sidt0", 6) == 0) { + iflag |= SEFLG_SIDEREAL; + sid_mode = atol(argv[i]+6); + if (sid_mode == 0) + sid_mode = SE_SIDM_FAGAN_BRADLEY; + sid_mode |= SE_SIDBIT_ECL_T0; + swe_set_sid_mode(sid_mode, 0, 0); + } else if (strncmp(argv[i], "-sidsp", 6) == 0) { + iflag |= SEFLG_SIDEREAL; + sid_mode = atol(argv[i]+6); + if (sid_mode == 0) + sid_mode = SE_SIDM_FAGAN_BRADLEY; + sid_mode |= SE_SIDBIT_SSY_PLANE; + swe_set_sid_mode(sid_mode, 0, 0); + } else if (strncmp(argv[i], "-sid", 4) == 0) { + iflag |= SEFLG_SIDEREAL; + sid_mode = atol(argv[i]+4); + if (sid_mode > 0) + swe_set_sid_mode(sid_mode, 0, 0); + } else if (strncmp(argv[i], "-j", 2) == 0) { + begindate = argv[i] + 1; + } else if (strncmp(argv[i], "-ejpl", 5) == 0) { + whicheph = SEFLG_JPLEPH; + if (*(argv[i]+5) != '\0') + strcpy(fname, argv[i]+5); + } else if (strncmp(argv[i], "-edir", 5) == 0) { + if (*(argv[i]+5) != '\0') + strcpy(ephepath, argv[i]+5); + } else if (strcmp(argv[i], "-eswe") == 0) { + whicheph = SEFLG_SWIEPH; + } else if (strcmp(argv[i], "-emos") == 0) { + whicheph = SEFLG_MOSEPH; + } else if (strncmp(argv[i], "-helflag", 8) == 0) { + helflag = atoi(argv[i]+8); + fprintf(stderr, "hier %d\n", helflag); + } else if (strcmp(argv[i], "-hel") == 0) { + iflag |= SEFLG_HELCTR; + } else if (strcmp(argv[i], "-bary") == 0) { + iflag |= SEFLG_BARYCTR; + } else if (strncmp(argv[i], "-house", 6) == 0) { + *sout = '\0'; + sscanf(argv[i] + 6, "%lf,%lf,%s", &top_long, &top_lat, sout); + top_elev = 0; + if (*sout) ihsy = sout[0]; + do_houses = TRUE; + have_geopos = TRUE; + } else if (strncmp(argv[i], "-hsy", 4) == 0) { + ihsy = *(argv[i] + 4); + if (ihsy == '\0') ihsy = 'p'; + if (strlen(argv[i]) > 5) + hpos_meth = atoi(argv[i] + 5); + have_geopos = TRUE; + } else if (strncmp(argv[i], "-topo", 5) == 0) { + iflag |= SEFLG_TOPOCTR; + sscanf(argv[i] + 5, "%lf,%lf,%lf", &top_long, &top_lat, &top_elev); + have_geopos = TRUE; + } else if (strncmp(argv[i], "-geopos", 7) == 0) { + sscanf(argv[i] + 7, "%lf,%lf,%lf", &top_long, &top_lat, &top_elev); + have_geopos = TRUE; + } else if (strcmp(argv[i], "-true") == 0) { + iflag |= SEFLG_TRUEPOS; + } else if (strcmp(argv[i], "-noaberr") == 0) { + iflag |= SEFLG_NOABERR; + } else if (strcmp(argv[i], "-nodefl") == 0) { + iflag |= SEFLG_NOGDEFL; + } else if (strcmp(argv[i], "-nonut") == 0) { + iflag |= SEFLG_NONUT; + } else if (strcmp(argv[i], "-speed3") == 0) { + iflag |= SEFLG_SPEED3; + } else if (strcmp(argv[i], "-speed") == 0) { + iflag |= SEFLG_SPEED; + } else if (strncmp(argv[i], "-testaa", 7) == 0) { + whicheph = SEFLG_JPLEPH; + strcpy(fname, SE_FNAME_DE200); + if (strcmp(argv[i]+7, "95") == 0) + begindate = "j2449975.5"; + if (strcmp(argv[i]+7, "96") == 0) + begindate = "j2450442.5"; + if (strcmp(argv[i]+7, "97") == 0) + begindate = "j2450482.5"; + fmt = "PADRu"; + universal_time = FALSE; + plsel="3"; + } else if (strcmp(argv[i], "-lunecl") == 0) { + special_event = SP_LUNAR_ECLIPSE; + } else if (strcmp(argv[i], "-solecl") == 0) { + special_event = SP_SOLAR_ECLIPSE; + have_geopos = TRUE; + } else if (strcmp(argv[i], "-short") == 0) { + short_output = TRUE; + } else if (strcmp(argv[i], "-occult") == 0) { + special_event = SP_OCCULTATION; + have_geopos = TRUE; + } else if (strcmp(argv[i], "-hocal") == 0) { + /* used to create a listing for inclusion in hocal.c source code */ + special_mode |= SP_MODE_HOCAL; + } else if (strcmp(argv[i], "-how") == 0) { + special_mode |= SP_MODE_HOW; + } else if (strcmp(argv[i], "-total") == 0) { + search_flag |= SE_ECL_TOTAL|SE_ECL_CENTRAL|SE_ECL_NONCENTRAL; + } else if (strcmp(argv[i], "-annular") == 0) { + search_flag |= SE_ECL_ANNULAR|SE_ECL_CENTRAL|SE_ECL_NONCENTRAL; + } else if (strcmp(argv[i], "-anntot") == 0) { + search_flag |= SE_ECL_ANNULAR_TOTAL|SE_ECL_CENTRAL|SE_ECL_NONCENTRAL; + } else if (strcmp(argv[i], "-partial") == 0) { + search_flag |= SE_ECL_PARTIAL|SE_ECL_CENTRAL|SE_ECL_NONCENTRAL; + } else if (strcmp(argv[i], "-penumbral") == 0) { + search_flag |= SE_ECL_PENUMBRAL; + } else if (strcmp(argv[i], "-noncentral") == 0) { + search_flag &= ~SE_ECL_CENTRAL; + search_flag |= SE_ECL_NONCENTRAL; + } else if (strcmp(argv[i], "-central") == 0) { + search_flag &= ~SE_ECL_NONCENTRAL; + search_flag |= SE_ECL_CENTRAL; + } else if (strcmp(argv[i], "-local") == 0) { + special_mode |= SP_MODE_LOCAL; + } else if (strcmp(argv[i], "-rise") == 0) { + special_event = SP_RISE_SET; + have_geopos = TRUE; + } else if (strcmp(argv[i], "-norefrac") == 0) { + norefrac = 1; + } else if (strcmp(argv[i], "-disccenter") == 0) { + disccenter = 1; + } else if (strcmp(argv[i], "-hindu") == 0) { + norefrac = 1; + disccenter = 1; + } else if (strcmp(argv[i], "-metr") == 0) { + special_event = SP_MERIDIAN_TRANSIT; + have_geopos = TRUE; + } else if (strncmp(argv[i], "-hev", 4) == 0) { + special_event = SP_HELIACAL; + search_flag = 0; + if (strlen(argv[i]) > 4) + search_flag = atoi(argv[i] + 4); + have_geopos = TRUE; + if (strstr(argv[i], "AV")) hel_using_AV = TRUE; + } else if (strncmp(argv[i], "-at", 3) == 0) { + sscanf(argv[i]+3, "%lf,%lf,%lf,%lf", &(datm[0]), &(datm[1]), &(datm[2]), &(datm[3])); + } else if (strncmp(argv[i], "-obs", 4) == 0) { + sscanf(argv[i]+4, "%lf,%lf", &(dobs[0]), &(dobs[1])); + } else if (strncmp(argv[i], "-opt", 4) == 0) { + sscanf(argv[i]+4, "%lf,%lf,%lf,%lf,%lf,%lf", &(dobs[0]), &(dobs[1]), &(dobs[2]), &(dobs[3]), &(dobs[4]), &(dobs[5])); + } else if (strcmp(argv[i], "-bwd") == 0) { + direction = -1; + direction_flag = TRUE; + } else if (strncmp(argv[i], "-p", 2) == 0) { + spno = argv[i]+2; + switch (*spno) { + case 'd': + /* + case '\0': + case ' ': + */ + plsel = PLSEL_D; break; + case 'p': plsel = PLSEL_P; break; + case 'h': plsel = PLSEL_H; break; + case 'a': plsel = PLSEL_A; break; + default: plsel = spno; + } + } else if (strncmp(argv[i], "-xs", 3) == 0) { + /* number of asteroid */ + strcpy(sastno, argv[i] + 3); + } else if (strncmp(argv[i], "-xf", 3) == 0) { + /* name or number of fixed star */ + strcpy(star, argv[i] + 3); + } else if (strncmp(argv[i], "-xz", 3) == 0) { + /* number of hypothetical body */ + strcpy(shyp, argv[i] + 3); + } else if (strncmp(argv[i], "-x", 2) == 0) { + /* name or number of fixed star */ + strcpy(star, argv[i] + 2); + } else if (strncmp(argv[i], "-n", 2) == 0) { + nstep = atoi(argv[i]+2); + if (nstep == 0) + nstep = 20; + } else if (strncmp(argv[i], "-i", 2) == 0) { + iflag_f = atoi(argv[i]+2); + if (iflag_f & SEFLG_XYZ) + fmt = "PX"; + } else if (strncmp(argv[i], "-s", 2) == 0) { + tstep = atof(argv[i]+2); + } else if (strncmp(argv[i], "-b", 2) == 0) { + begindate = argv[i] + 2; + } else if (strncmp(argv[i], "-f", 2) == 0) { + fmt = argv[i] + 2; + } else if (strncmp(argv[i], "-g", 2) == 0) { + gap = argv[i] + 2; + if (*gap == '\0') gap = "\t"; + } else if (strncmp(argv[i], "-d", 2) == 0 + || strncmp(argv[i], "-D", 2) == 0) { + diff_mode = *(argv[i] + 1); /* 'd' or 'D' */ + sp = argv[i]+2; + ipldiff = letter_to_ipl((int) *sp); + if (ipldiff <0) ipldiff = SE_SUN; + swe_get_planet_name(ipldiff, spnam2); + } else if (strcmp(argv[i], "-roundsec") == 0) { + round_flag |= BIT_ROUND_SEC; + } else if (strcmp(argv[i], "-roundmin") == 0) { + round_flag |= BIT_ROUND_MIN; + } else if (strncmp(argv[i], "-t", 2) == 0) { + if (strlen(argv[i]) > 2) { + strcpy(s1, argv[i] + 2); + if ((sp = strchr(s1, ':')) != NULL) { + *sp = '.'; + if ((sp = strchr(s1, ':')) != NULL) { + strcpy(s2, sp + 1); + strcpy(sp, s2); + } + } + thour = atof(s1); + /* h.mmss -> decimal */ + t = fmod(thour, 1) * 100 + 1e-10; + j = (int) t; + t = fmod(t, 1) * 100 + 1e-10; + thour = (int) thour + j / 60.0 + t / 3600.0; + } + } else if (strncmp(argv[i], "-h", 2) == 0 + || strncmp(argv[i], "-?", 2) == 0) { + sp = argv[i]+2; + if (*sp == 'c' || *sp == '\0') { + printf(infocmd0); + printf(infocmd1); + printf(infocmd2); + printf(infocmd3); + printf(infocmd4); + printf(infocmd5); + } + if (*sp == 'p' || *sp == '\0') + printf(infoplan); + if (*sp == 'f' || *sp == '\0') { + printf(infoform); + printf(infoform2); + } + if (*sp == 'd' || *sp == '\0') + printf(infodate); + if (*sp == 'e' || *sp == '\0') + printf(infoexamp); + goto end_main; + } else { + sprintf(sout, "illegal option %s\n", argv[i]); + printf(sout); + exit(1); + } + } + if (special_event == SP_OCCULTATION || + special_event == SP_RISE_SET || + special_event == SP_MERIDIAN_TRANSIT || + special_event == SP_HELIACAL + ) { + ipl = letter_to_ipl(*plsel); + if (*plsel == 'f') + ipl = SE_FIXSTAR; + else + *star = '\0'; + if (special_event == SP_OCCULTATION && ipl == 1) + ipl = 2; /* no occultation of moon by moon */ + } + geopos[0] = top_long; + geopos[1] = top_lat; + geopos[2] = top_elev; + swe_set_topo(top_long, top_lat, top_elev); +#if HPUNIX + gethostname (hostname, 80); + if (strstr(hostname, "as10") != NULL) + line_limit = 1000; +#endif + if (with_header) { + for (i = 0; i < argc; i++) { + printf(argv[i]); + printf(" "); + } + } + iflag = (iflag & ~SEFLG_EPHMASK) | whicheph; + if (strpbrk(fmt, "SsQ") != NULL) + iflag |= SEFLG_SPEED; + if (*ephepath != '\0') + swe_set_ephe_path(ephepath); + else if (make_ephemeris_path(iflag, argv[0]) == ERR) { + iflag = (iflag & ~SEFLG_EPHMASK) | SEFLG_MOSEPH; + whicheph = SEFLG_MOSEPH; + } + if (whicheph & SEFLG_JPLEPH) + swe_set_jpl_file(fname); + while (TRUE) { + serr[0] = serr_save[0] = serr_warn[0] = '\0'; + if (begindate == NULL) { + printf("\nDate ?"); + sdate[0] = '\0'; + if( !fgets(sdate, AS_MAXCH, stdin) ) goto end_main; + } else { + strcpy(sdate, begindate); + begindate = "."; /* to exit afterwards */ + } + if (strcmp(sdate, "-bary") == 0) { + iflag = iflag & ~SEFLG_HELCTR; + iflag |= SEFLG_BARYCTR; + *sdate = '\0'; + } else if (strcmp(sdate, "-hel") == 0) { + iflag = iflag & ~SEFLG_BARYCTR; + iflag |= SEFLG_HELCTR; + *sdate = '\0'; + } else if (strcmp(sdate, "-geo") == 0) { + iflag = iflag & ~SEFLG_BARYCTR; + iflag = iflag & ~SEFLG_HELCTR; + *sdate = '\0'; + } else if (strcmp(sdate, "-ejpl") == 0) { + iflag &= ~SEFLG_EPHMASK; + iflag |= SEFLG_JPLEPH; + *sdate = '\0'; + } else if (strcmp(sdate, "-eswe") == 0) { + iflag &= ~SEFLG_EPHMASK; + iflag |= SEFLG_SWIEPH; + *sdate = '\0'; + } else if (strcmp(sdate, "-emos") == 0) { + iflag &= ~SEFLG_EPHMASK; + iflag |= SEFLG_MOSEPH; + *sdate = '\0'; + } else if (strncmp(sdate, "-xs",3) == 0) { + /* number of asteroid */ + strcpy(sastno, sdate + 3); + *sdate = '\0'; + } + sp = sdate; + if (*sp == '.') { + goto end_main; + } else if (*sp == '\0' || *sp == '\n' || *sp == '\r') { + strcpy (sdate, sdate_save); + } else { + strcpy (sdate_save, sdate); + } + if (*sdate == '\0') + sprintf(sdate, "j%f", tjd); + if (*sp == 'j') { /* it's a day number */ + if ((sp2 = strchr(sp, ',')) != NULL) + *sp2 = '.'; + sscanf(sp+1,"%lf", &tjd); + if (tjd < 2299160.5) + gregflag = SE_JUL_CAL; + else + gregflag = SE_GREG_CAL; + if (strstr(sp, "jul") != NULL) + gregflag = SE_JUL_CAL; + else if (strstr(sp, "greg") != NULL) + gregflag = SE_GREG_CAL; + swe_revjul(tjd, gregflag, &jyear, &jmon, &jday, &jut); + } else if (*sp == '+') { + n = atoi(sp); + if (n == 0) n = 1; + tjd += n; + swe_revjul(tjd, gregflag, &jyear, &jmon, &jday, &jut); + } else if (*sp == '-') { + n = atoi(sp); + if (n == 0) n = -1; + tjd += n; + swe_revjul(tjd, gregflag, &jyear, &jmon, &jday, &jut); + } else { + if (sscanf (sp, "%d%*c%d%*c%d", &jday,&jmon,&jyear) < 1) exit(1); + if ((int32) jyear * 10000L + (int32) jmon * 100L + (int32) jday < 15821015L) + gregflag = SE_JUL_CAL; + else + gregflag = SE_GREG_CAL; + if (strstr(sp, "jul") != NULL) + gregflag = SE_JUL_CAL; + else if (strstr(sp, "greg") != NULL) + gregflag = SE_GREG_CAL; + jut = 0; + tjd = swe_julday(jyear,jmon,jday,jut,gregflag); + tjd += thour / 24.0; + } + if (special_event > 0) { + do_special_event(tjd, ipl, star, special_event, special_mode, geopos, datm, dobs, serr) ; + swe_close(); + return OK; + } + line_count = 0; + for (t = tjd, istep = 1; istep <= nstep; t += tstep, istep++) { + if (t < 2299160.5) + gregflag = SE_JUL_CAL; + else + gregflag = SE_GREG_CAL; + if (strstr(sdate, "jul") != NULL) + gregflag = SE_JUL_CAL; + else if (strstr(sdate, "greg") != NULL) + gregflag = SE_GREG_CAL; + t2 = t; + swe_revjul(t2, gregflag, &jyear, &jmon, &jday, &jut); + if (with_header) { + sprintf(sout, "\ndate (dmy) %d.%d.%d", jday, jmon, jyear); + printf(sout); + if (gregflag) + printf(" greg."); + else + printf(" jul."); + t2 = jut; + sprintf(sout, " % 2d:", (int) t2); + printf(sout); + t2 = (t2 - (int32) t2) * 60; + sprintf(sout, "%02d:", (int) t2); + printf(sout); + t2 = (t2 - (int32) t2) * 60; + sprintf(sout, "%02d", (int) t2); + printf(sout); + if (universal_time) + printf(" UT"); + else + printf(" ET"); + printf("\t\tversion %s", swe_version(sout)); + } + delt = swe_deltat(t); + if (universal_time) { + if (with_header) { + sprintf(sout, "\nUT: %.11f", t); + printf(sout); + } + if (with_header) { + sprintf(sout, " delta t: %f sec", delt * 86400.0); + printf(sout); + } + te = t + delt; + tut = t; + } else { + te = t; + tut = t - delt; + } + iflgret = swe_calc(te, SE_ECL_NUT, iflag, xobl, serr); + if (with_header) { + sprintf(sout, "\nET: %.11f", te); + printf(sout); + if (iflag & SEFLG_SIDEREAL) { + daya = swe_get_ayanamsa(te); + sprintf(sout, " ayanamsa = %s", dms(daya, round_flag)); + printf(sout); + } + if (have_geopos) { + printf("\ngeo. long %f, lat %f, alt %f", geopos[0], geopos[1], geopos[2]); + } + if (iflag_f >=0) + iflag = iflag_f; + if (strchr(plsel, 'o') == NULL) { + sprintf(sout, "\n%-15s %s", "Epsilon (true)", dms(xobl[0],round_flag)); + printf(sout); + } + if (strchr(plsel, 'n') == NULL) { + strcpy(s1, dms(xobl[2], round_flag)); + strcpy(s2, dms(xobl[3], round_flag)); + sprintf(sout, "\n%-15s %s%s%s", "Nutation", s1, gap, s2); + printf(sout); + } + printf("\n"); + if (do_houses) { + if (!universal_time) { + do_houses = FALSE; + printf("option -house requires option -ut for Universal Time\n"); + } else { + strcpy(s1, dms(top_long, round_flag)); + strcpy(s2, dms(top_lat, round_flag)); + sprintf(sout, "Houses system %c for long=%s, lat=%s\n", ihsy, s1, s2); + printf(sout); + } + } + } + if (with_header && !with_header_always) + with_header = FALSE; + if (do_ayanamsa) { + daya = swe_get_ayanamsa(te); + printf("Ayanamsa%s%s\n", gap, dms(daya, round_flag)); + continue; + } + if (strchr(plsel, 'e')) + print_line(MODE_LABEL); + for (psp = plsel; *psp != '\0'; psp++) { + if (*psp == 'e') continue; + ipl = letter_to_ipl((int) *psp); + if (ipl == -2) { + printf("illegal parameter -p%s\n", plsel); + exit(1); + } + if (*psp == 'f') + ipl = SE_FIXSTAR; + else if (*psp == 's') + ipl = atoi(sastno) + 10000; + else if (*psp == 'z') + ipl = atoi(shyp) + SE_FICT_OFFSET_1; + if (iflag & SEFLG_HELCTR) { + if (ipl == SE_SUN + || ipl == SE_MEAN_NODE || ipl == SE_TRUE_NODE + || ipl == SE_MEAN_APOG || ipl == SE_OSCU_APOG) + continue; + } else if (iflag & SEFLG_BARYCTR) { + if (ipl == SE_MEAN_NODE || ipl == SE_TRUE_NODE + || ipl == SE_MEAN_APOG || ipl == SE_OSCU_APOG) + continue; + } else /* geocentric */ + if (ipl == SE_EARTH) + continue; + /* ecliptic position */ + if (iflag_f >=0) + iflag = iflag_f; + if (ipl == SE_FIXSTAR) { + iflgret = swe_fixstar(star, te, iflag, x, serr); + /* magnitude, etc. */ + if (iflgret != ERR && strpbrk(fmt, "=") != NULL) { + double mag; + iflgret = swe_fixstar_mag(star, &mag, serr); + attr[4] = mag; + } + strcpy(se_pname, star); + } else { + iflgret = swe_calc(te, ipl, iflag, x, serr); + /* phase, magnitude, etc. */ + if (iflgret != ERR && strpbrk(fmt, "+-*/=") != NULL) + iflgret = swe_pheno(te, ipl, iflag, attr, serr); + swe_get_planet_name(ipl, se_pname); + } + if (*psp == 'q') {/* delta t */ + x[0] = swe_deltat(te) * 86400; + x[1] = x[2] = x[3] = 0; + strcpy(se_pname, "Delta T"); + } + if (*psp == 'o') {/* ecliptic is wanted, remove nutation */ + x[2] = x[3] = 0; + strcpy(se_pname, "Ecl. Obl."); + } + if (*psp == 'n') {/* nutation is wanted, remove ecliptic */ + x[0] = x[2]; + x[1] = x[3]; + x[2] = x[3] = 0; + strcpy(se_pname, "Nutation"); + } + if (iflgret < 0) { + if (strcmp(serr, serr_save) != 0 + && (ipl == SE_SUN || ipl == SE_MOON + || ipl == SE_MEAN_NODE || ipl == SE_TRUE_NODE + || ipl == SE_CHIRON || ipl == SE_PHOLUS || ipl == SE_CUPIDO + || ipl >= SE_AST_OFFSET || ipl == SE_FIXSTAR)) { + sprintf(sout, "error: %s\n", serr); + printf(sout); + } + strcpy(serr_save, serr); + } else if (*serr != '\0' && *serr_warn == '\0') { + if (strstr(serr, "'seorbel.txt' not found") == NULL) + strcpy(serr_warn, serr); + } + if (diff_mode) { + iflgret = swe_calc(te, ipldiff, iflag, x2, serr); + if (iflgret < 0) { + sprintf(sout, "error: %s\n", serr); + printf(sout); + } + if (diff_mode == DIFF_DIFF) { + for (i = 1; i < 6; i++) + x[i] -= x2[i]; + if ((iflag & SEFLG_RADIANS) == 0) + x[0] = swe_difdeg2n(x[0], x2[0]); + else + x[0] = swe_difrad2n(x[0], x2[0]); + } else { /* DIFF_MIDP */ + for (i = 1; i < 6; i++) + x[i] = (x[i] + x2[i]) / 2; + if ((iflag & SEFLG_RADIANS) == 0) + x[0] = swe_deg_midp(x[0], x2[0]); + else + x[0] = swe_rad_midp(x[0], x2[0]); + } + } + /* equator position */ + if (strpbrk(fmt, "aADdQ") != NULL) { + iflag2 = iflag | SEFLG_EQUATORIAL; + if (ipl == SE_FIXSTAR) + iflgret = swe_fixstar(star, te, iflag2, xequ, serr); + else + iflgret = swe_calc(te, ipl, iflag2, xequ, serr); + if (diff_mode) { + iflgret = swe_calc(te, ipldiff, iflag2, x2, serr); + if (diff_mode == DIFF_DIFF) { + for (i = 1; i < 6; i++) + xequ[i] -= x2[i]; + if ((iflag & SEFLG_RADIANS) == 0) + xequ[0] = swe_difdeg2n(xequ[0], x2[0]); + else + xequ[0] = swe_difrad2n(xequ[0], x2[0]); + } else { /* DIFF_MIDP */ + for (i = 1; i < 6; i++) + xequ[i] = (xequ[i] + x2[i]) / 2; + if ((iflag & SEFLG_RADIANS) == 0) + xequ[0] = swe_deg_midp(xequ[0], x2[0]); + else + xequ[0] = swe_rad_midp(xequ[0], x2[0]); + } + } + } + /* azimuth and height */ + if (strpbrk(fmt, "IiHhKk") != NULL) { + /* first, get topocentric equatorial positions */ + iflgt = whicheph | SEFLG_EQUATORIAL | SEFLG_TOPOCTR; + if (ipl == SE_FIXSTAR) + iflgret = swe_fixstar(star, te, iflgt, xt, serr); + else + iflgret = swe_calc(te, ipl, iflgt, xt, serr); + /* to azimuth/height */ + /* atmospheric pressure "0" has the effect that a value + * of 1013.25 mbar is assumed at 0 m above sea level. + * If the altitude of the observer is given (in geopos[2]) + * pressure is estimated according to that */ + swe_azalt(tut, SE_EQU2HOR, geopos, 0, 10, xt, xaz); + if (diff_mode) { + iflgret = swe_calc(te, ipldiff, iflgt, xt, serr); + swe_azalt(tut, SE_EQU2HOR, geopos, 0, 10, xt, x2); + if (diff_mode == DIFF_DIFF) { + for (i = 1; i < 3; i++) + xaz[i] -= x2[i]; + if ((iflag & SEFLG_RADIANS) == 0) + xaz[0] = swe_difdeg2n(xaz[0], x2[0]); + else + xaz[0] = swe_difrad2n(xaz[0], x2[0]); + } else { /* DIFF_MIDP */ + for (i = 1; i < 3; i++) + xaz[i] = (xaz[i] + x2[i]) / 2; + if ((iflag & SEFLG_RADIANS) == 0) + xaz[0] = swe_deg_midp(xaz[0], x2[0]); + else + xaz[0] = swe_rad_midp(xaz[0], x2[0]); + } + } + } + /* ecliptic cartesian position */ + if (strpbrk(fmt, "XU") != NULL) { + iflag2 = iflag | SEFLG_XYZ; + if (ipl == SE_FIXSTAR) + iflgret = swe_fixstar(star, te, iflag2, xcart, serr); + else + iflgret = swe_calc(te, ipl, iflag2, xcart, serr); + if (diff_mode) { + iflgret = swe_calc(te, ipldiff, iflag2, x2, serr); + if (diff_mode == DIFF_DIFF) { + for (i = 0; i < 6; i++) + xcart[i] -= x2[i]; + } else { + xcart[i] = (xcart[i] + x2[i]) / 2; + } + } + } + /* equator cartesian position */ + if (strpbrk(fmt, "xu") != NULL) { + iflag2 = iflag | SEFLG_XYZ | SEFLG_EQUATORIAL; + if (ipl == SE_FIXSTAR) + iflgret = swe_fixstar(star, te, iflag2, xcartq, serr); + else + iflgret = swe_calc(te, ipl, iflag2, xcartq, serr); + if (diff_mode) { + iflgret = swe_calc(te, ipldiff, iflag2, x2, serr); + if (diff_mode == DIFF_DIFF) { + for (i = 0; i < 6; i++) + xcartq[i] -= x2[i]; + } else { + xcartq[i] = (xcart[i] + x2[i]) / 2; + } + } + } + /* house position */ + if (strpbrk(fmt, "gGj") != NULL) { + armc = swe_degnorm(swe_sidtime(tut) * 15 + geopos[0]); + for (i = 0; i < 6; i++) + xsv[i] = x[i]; + if (hpos_meth == 1) + xsv[1] = 0; + if (ipl == SE_FIXSTAR) + strcpy(star2, star); + else + *star2 = '\0'; + if (hpos_meth >= 2 && tolower(ihsy) == 'g') { + swe_gauquelin_sector(tut, ipl, star2, iflag, hpos_meth, geopos, 0, 0, &hposj, serr); + } else { + hposj = swe_house_pos(armc, geopos[1], xobl[0], ihsy, xsv, serr); + } + if (tolower(ihsy) == 'g') + hpos = (hposj - 1) * 10; + else + hpos = (hposj - 1) * 30; + if (diff_mode) { + for (i = 0; i < 6; i++) + xsv[i] = x2[i]; + if (hpos_meth == 1) + xsv[1] = 0; + hpos2 = swe_house_pos(armc, geopos[1], xobl[0], ihsy, xsv, serr); + if (tolower(ihsy) == 'g') + hpos2 = (hpos2 - 1) * 10; + else + hpos2 = (hpos2 - 1) * 30; + if (diff_mode == DIFF_DIFF) { + if ((iflag & SEFLG_RADIANS) == 0) + hpos = swe_difdeg2n(hpos, hpos2); + else + hpos = swe_difrad2n(hpos, hpos2); + } else { /* DIFF_MIDP */ + if ((iflag & SEFLG_RADIANS) == 0) + hpos = swe_deg_midp(hpos, hpos2); + else + hpos = swe_rad_midp(hpos, hpos2); + } + } + } + strcpy(spnam, se_pname); + print_line(0); + line_count++; + if (line_count >= line_limit) { + sprintf(sout, "****** line count %d was exceeded\n", line_limit); + printf(sout); + break; + } + } /* for psp */ + if (do_houses) { + double cusp[100]; + int iofs; + if (tolower(ihsy) == 'g') + nhouses = 36; + iofs = nhouses + 1; + iflgret = swe_houses_ex(t,iflag, top_lat, top_long, ihsy, cusp, cusp+iofs); + if (iflgret < 0) { + if (strcmp(serr, serr_save) != 0 ) { + sprintf(sout, "error: %s\n", serr); + printf(sout); + } + strcpy(serr_save, serr); + } else { + for (ipl = 1; ipl < iofs+4; ipl++) { + x[0] = cusp[ipl]; + x[1] = 0; /* latitude */ + x[2] = 1.0; /* pseudo radius vector */ + if (strpbrk(fmt, "aADdQ") != NULL) { + swe_cotrans(x, xequ, -xobl[0]); + } + print_line(MODE_HOUSE); + line_count++; + } + } + } + if (line_count >= line_limit) + break; + } /* for tjd */ + if (*serr_warn != '\0') { + printf("\nwarning: "); + printf(serr_warn); + printf("\n"); + } + } /* while 1 */ + /* close open files and free allocated space */ + end_main: + swe_close(); + return OK; +} + +/* + * The string fmt contains a sequence of format specifiers; + * each character in fmt creates a column, the columns are + * sparated by the gap string. + */ +static int print_line(int mode) +{ + char *sp, *sp2, sout[AS_MAXCH]; + double t2, ju2 = 0; + double y_frac; + double ar, sinp; + double dret[20]; + AS_BOOL is_house = ((mode & MODE_HOUSE) != 0); + AS_BOOL is_label = ((mode & MODE_LABEL) != 0); + int32 iflgret; + for (sp = fmt; *sp != '\0'; sp++) { + if (is_house && strchr("bBsSrRxXuUQnNfF+-*/=", *sp) != NULL) continue; + if (sp != fmt) + printf(gap); + switch(*sp) { + case 'y': + if (is_label) { printf("year"); break; } + sprintf(sout, "%d", jyear); + printf(sout); + break; + case 'Y': + if (is_label) { printf("year"); break; } + t2 = swe_julday(jyear,1,1,ju2,gregflag); + y_frac = (t - t2) / 365.0; + sprintf(sout, "%.2f", jyear + y_frac); + printf(sout); + break; + case 'p': + if (is_label) { printf("obj.nr"); break; } + if (! is_house && diff_mode == DIFF_DIFF) + sprintf(sout, "%d-%d", ipl, ipldiff); + else if (! is_house && diff_mode == DIFF_MIDP) + sprintf(sout, "%d/%d", ipl, ipldiff); + else + sprintf(sout, "%d", ipl); + printf(sout); + break; + case 'P': + if (is_label) { printf("%-15s", "name"); break; } + if (is_house) { + if (ipl <= nhouses) + sprintf(sout, "house %2d ", ipl); + else + sprintf(sout, "%-15s", hs_nam[ipl - nhouses]); + } else if (diff_mode == DIFF_DIFF) + sprintf(sout, "%.3s-%.3s", spnam, spnam2); + else if (diff_mode == DIFF_MIDP) + sprintf(sout, "%.3s/%.3s", spnam, spnam2); + else + sprintf(sout, "%-15s", spnam); + printf(sout); + break; + case 'J': + if (is_label) { printf("julday"); break; } + y_frac = (t - floor(t)) * 100; + if (floor(y_frac) != y_frac) + sprintf(sout, "%.5f", t); + else + sprintf(sout, "%.2f", t); + printf(sout); + break; + case 'T': + if (is_label) { printf("date"); break; } + sprintf(sout, "%02d.%02d.%d", jday, jmon, jyear); + if (jut != 0) { + int h, m, s; + s = (int) (jut * 3600 + 0.5); + h = (int) (s / 3600.0); + m = (int) ((s % 3600) / 60.0); + s %= 60; + sprintf(sout + strlen(sout), " %d:%02d:%02d", h, m, s); + if (universal_time) + strcat(sout, " UT"); + else + strcat(sout, " ET"); + } + printf(sout); + break; + case 't': + if (is_label) { printf("date"); break; } + sprintf(sout, "%02d%02d%02d", jyear % 100, jmon, jday); + printf(sout); + break; + case 'L': + if (is_label) { printf("long."); break; } + if (*psp == 'q') /* delta t */ + goto ldec; + printf(dms(x[0], round_flag)); + break; + case 'l': + if (is_label) { printf("long"); break; } + ldec: + sprintf(sout, "%# 11.7f", x[0]); + printf(sout); + break; + case 'G': + if (is_label) { printf("housPos"); break; } + printf(dms(hpos, round_flag)); + break; + case 'g': + if (is_label) { printf("housPos"); break; } + sprintf(sout, "%# 11.7f", hpos); + printf(sout); + break; + case 'j': + if (is_label) { printf("houseNr"); break; } + sprintf(sout, "%# 11.7f", hposj); + printf(sout); + break; + case 'Z': + if (is_label) { printf("long"); break; } + printf(dms(x[0], round_flag|BIT_ZODIAC)); + break; + case 'S': + case 's': + if (*(sp+1) == 'S' || *(sp+1) == 's' || strpbrk(fmt, "XUxu") != NULL) { + for (sp2 = fmt; *sp2 != '\0'; sp2++) { + if (sp2 != fmt) + printf(gap); + switch(*sp2) { + case 'L': /* speed! */ + case 'Z': /* speed! */ + if (is_label) { printf("lon/day"); break; } + printf(dms(x[3], round_flag)); + break; + case 'l': /* speed! */ + if (is_label) { printf("lon/day"); break; } + sprintf(sout, "%11.7f", x[3]); + printf(sout); + break; + case 'B': /* speed! */ + if (is_label) { printf("lat/day"); break; } + printf(dms(x[4], round_flag)); + break; + case 'b': /* speed! */ + if (is_label) { printf("lat/day"); break; } + sprintf(sout, "%11.7f", x[4]); + printf(sout); + break; + case 'A': /* speed! */ + if (is_label) { printf("RA/day"); break; } + printf(dms(xequ[3]/15, round_flag|SEFLG_EQUATORIAL)); + break; + case 'a': /* speed! */ + if (is_label) { printf("RA/day"); break; } + sprintf(sout, "%11.7f", xequ[3]); + printf(sout); + break; + case 'D': /* speed! */ + if (is_label) { printf("dcl/day"); break; } + printf(dms(xequ[4], round_flag)); + break; + case 'd': /* speed! */ + if (is_label) { printf("dcl/day"); break; } + sprintf(sout, "%11.7f", xequ[4]); + printf(sout); + break; + case 'R': /* speed! */ + case 'r': /* speed! */ + if (is_label) { printf("AU/day"); break; } + sprintf(sout, "%# 14.9f", x[5]); + printf(sout); + break; + case 'U': /* speed! */ + case 'X': /* speed! */ + if (is_label) { printf("speed_0%sspeed_1%sspeed_2",gap,gap); break; } + if (*sp =='U') + ar = sqrt(square_sum(xcart)); + else + ar = 1; + sprintf(sout, "%# 14.9f%s", xcart[3]/ar, gap); + printf(sout); + sprintf(sout, "%# 14.9f%s", xcart[4]/ar, gap); + printf(sout); + sprintf(sout, "%# 14.9f", xcart[5]/ar); + printf(sout); + break; + case 'u': /* speed! */ + case 'x': /* speed! */ + if (is_label) { printf("speed_0%sspeed_1%sspeed_2",gap,gap); break; } + if (*sp =='u') + ar = sqrt(square_sum(xcartq)); + else + ar = 1; + sprintf(sout, "%# 14.9f%s", xcartq[3]/ar, gap); + printf(sout); + sprintf(sout, "%# 14.9f%s", xcartq[4]/ar, gap); + printf(sout); + sprintf(sout, "%# 14.9f", xcartq[5]/ar); + printf(sout); + break; + default: + break; + } + } + if (*(sp+1) == 'S' || *(sp+1) == 's') + sp++; + } else if (*sp == 'S') { + if (is_label) { printf("deg/day"); break; } + printf(dms(x[3], round_flag)); + } else { + if (is_label) { printf("deg/day"); break; } + printf("%# 11.7f", x[3]); + } + break; + case 'B': + if (is_label) { printf("lat"); break; } + printf(dms(x[1], round_flag)); + break; + case 'b': + if (is_label) { printf("lat"); break; } + sprintf(sout, "%# 11.7f", x[1]); + printf(sout); + break; + case 'A': /* right ascension */ + if (is_label) { printf("RA"); break; } + printf(dms(xequ[0]/15, round_flag|SEFLG_EQUATORIAL)); + break; + case 'a': /* right ascension */ + if (is_label) { printf("RA"); break; } + sprintf(sout, "%# 11.7f", xequ[0]); + printf(sout); + break; + case 'D': /* declination */ + if (is_label) { printf("decl"); break; } + printf(dms(xequ[1], round_flag)); + break; + case 'd': /* declination */ + if (is_label) { printf("decl"); break; } + sprintf(sout, "%# 11.7f", xequ[1]); + printf(sout); + break; + case 'I': /* azimuth */ + if (is_label) { printf("azimuth"); break; } + printf(dms(xaz[0], round_flag)); + break; + case 'i': /* azimuth */ + if (is_label) { printf("azimuth"); break; } + sprintf(sout, "%# 11.7f", xaz[0]); + printf(sout); + break; + case 'H': /* height */ + if (is_label) { printf("height"); break; } + printf(dms(xaz[1], round_flag)); + break; + case 'h': /* height */ + if (is_label) { printf("height"); break; } + sprintf(sout, "%# 11.7f", xaz[1]); + printf(sout); + break; + case 'K': /* height (apparent) */ + if (is_label) { printf("hgtApp"); break; } + printf(dms(xaz[2], round_flag)); + break; + case 'k': /* height (apparent) */ + if (is_label) { printf("hgtApp"); break; } + sprintf(sout, "%# 11.7f", xaz[2]); + printf(sout); + break; + case 'R': + if (is_label) { printf("distAU"); break; } + sprintf(sout, "%# 14.9f", x[2]); + printf(sout); + break; + case 'r': + if (is_label) { printf("dist"); break; } + if ( ipl == SE_MOON ) { /* for moon print parallax */ + /* geocentric horizontal parallax: */ + if (0) { + sinp = 8.794 / x[2]; /* in seconds of arc */ + ar = sinp * (1 + sinp * sinp * 3.917402e-12); + /* the factor is 1 / (3600^2 * (180/pi)^2 * 6) */ + sprintf(sout, "%# 13.5f\" %# 13.5f'", ar, ar/60.0); + } + swe_pheno(te, ipl, iflag, dret, serr); + sprintf(sout + strlen(sout), "%# 13.5f\"", dret[5] * 3600); + } else { + sprintf(sout, "%# 14.9f", x[2]); + } + printf(sout); + break; + case 'U': + case 'X': + if (*sp =='U') + ar = sqrt(square_sum(xcart)); + else + ar = 1; + sprintf(sout, "%# 14.9f%s", xcart[0]/ar, gap); + printf(sout); + sprintf(sout, "%# 14.9f%s", xcart[1]/ar, gap); + printf(sout); + sprintf(sout, "%# 14.9f", xcart[2]/ar); + printf(sout); + break; + case 'u': + case 'x': + if (is_label) { printf("x0%sx1%sx2",gap,gap); break; } + if (*sp =='u') + ar = sqrt(square_sum(xcartq)); + else + ar = 1; + sprintf(sout, "%# 14.9f%s", xcartq[0]/ar, gap); + printf(sout); + sprintf(sout, "%# 14.9f%s", xcartq[1]/ar, gap); + printf(sout); + sprintf(sout, "%# 14.9f", xcartq[2]/ar); + printf(sout); + break; + case 'Q': + if (is_label) { printf("Q"); break; } + sprintf(sout, "%-15s", spnam); + printf(sout); + printf(dms(x[0], round_flag)); + printf(dms(x[1], round_flag)); + sprintf(sout, " %# 14.9f", x[2]); + printf(sout); + printf(dms(x[3], round_flag)); + printf(dms(x[4], round_flag)); + sprintf(sout, " %# 14.9f\n", x[5]); + printf(sout); + sprintf(sout, " %s", dms(xequ[0], round_flag)); + printf(sout); + printf(dms(xequ[1], round_flag)); + sprintf(sout, " %s", dms(xequ[3], round_flag)); + printf(sout); + printf(dms(xequ[4], round_flag)); + break; + case 'N': + case 'n': { + double xasc[6], xdsc[6]; + int imeth = (*sp == tolower(*sp))?SE_NODBIT_MEAN:SE_NODBIT_OSCU; + iflgret = swe_nod_aps(te, ipl, iflag, imeth, xasc, xdsc, NULL, NULL, serr); + if (iflgret >= 0 && (ipl <= SE_NEPTUNE || *sp == 'N') ) { + if (is_label) { printf("nodAsc%snodDesc", gap); break; } + printf("%# 11.7f", xasc[0]); + printf(gap); + printf("%# 11.7f", xdsc[0]); + } + }; + break; + case 'F': + case 'f': + if (! is_house) { + double xfoc[6], xaph[6], xper[6]; + int imeth = (*sp == tolower(*sp))?SE_NODBIT_MEAN:SE_NODBIT_OSCU; + iflgret = swe_nod_aps(te, ipl, iflag, imeth, NULL, NULL, xper, xaph, serr); + if (iflgret >= 0 && (ipl <= SE_NEPTUNE || *sp == 'F') ) { + if (is_label) { printf("peri%sapo", gap); break; } + printf("%# 11.7f", xper[0]); + printf(gap); + printf("%# 11.7f", xaph[0]); + } + imeth |= SE_NODBIT_FOPOINT; + iflgret = swe_nod_aps(te, ipl, iflag, imeth, NULL, NULL, xper, xfoc, serr); + if (iflgret >= 0 && (ipl <= SE_NEPTUNE || *sp == 'F') ) { + if (is_label) { printf("%sfocus", gap); break; } + printf(gap); + printf("%# 11.7f", xfoc[0]); + } + }; + break; + case '+': + if (is_house) break; + if (is_label) { printf("phase"); break; } + printf(dms(attr[0], round_flag)); + break; + case '-': + if (is_label) { printf("phase"); break; } + if (is_house) break; + printf(" %# 14.9f", attr[1]); + break; + case '*': + if (is_label) { printf("elong"); break; } + if (is_house) break; + printf(dms(attr[2], round_flag)); + break; + case '/': + if (is_label) { printf("diamet"); break; } + if (is_house) break; + printf(dms(attr[3], round_flag)); + break; + case '=': + if (is_label) { printf("magn"); break; } + if (is_house) break; + printf(" %# 6.1fm", attr[4]); + break; + case 'V': /* human design gates */ + case 'v': { + double xhds; + int igate, iline, ihex; + static int hexa[64] = {1, 43, 14, 34, 9, 5, 26, 11, 10, 58, 38, 54, 61, 60, 41, 19, 13, 49, 30, 55, 37, 63, 22, 36, 25, 17, 21, 51, 42, 3, 27, 24, 2, 23, 8, 20, 16, 35, 45, 12, 15, 52, 39, 53, 62, 56, 31, 33, 7, 4, 29, 59, 40, 64, 47, 6, 46, 18, 48, 57, 32, 50, 28, 44}; + if (is_label) { printf("hds"); break; } + if (is_house) break; + xhds = swe_degnorm(x[0] - 223.25); + ihex = (int) floor(xhds / 5.625); + iline = ((int) (floor(xhds / 0.9375))) % 6 + 1 ; + igate = hexa[ihex]; + printf("%2d.%d", igate, iline); + if (*sp == 'V') + printf(" %2d%%", swe_d2l(100 * fmod(xhds / 0.9375, 1))); + break; + } + } /* switch */ + } /* for sp */ + printf("\n"); + return OK; +} + +static char *dms(double xv, int32 iflg) +{ + int izod; + int32 k, kdeg, kmin, ksec; + char *c = ODEGREE_STRING; + char *sp, s1[50]; + static char s[50]; + int sgn; + *s = '\0'; + if (iflg & SEFLG_EQUATORIAL) + c = "h"; + if (xv < 0) { + xv = -xv; + sgn = -1; + } else + sgn = 1; + if (iflg & BIT_ROUND_MIN) + xv = swe_degnorm(xv + 0.5/60); + if (iflg & BIT_ROUND_SEC) + xv = swe_degnorm(xv + 0.5/3600); + if (iflg & BIT_ZODIAC) { + izod = (int) (xv / 30); + xv = fmod(xv, 30); + kdeg = (int32) xv; + sprintf(s, "%2d %s ", kdeg, zod_nam[izod]); + } else { + kdeg = (int32) xv; + sprintf(s, " %3d%s", kdeg, c); + } + xv -= kdeg; + xv *= 60; + kmin = (int32) xv; + if ((iflg & BIT_ZODIAC) && (iflg & BIT_ROUND_MIN)) + sprintf(s1, "%2d", kmin); + else + sprintf(s1, "%2d'", kmin); + strcat(s, s1); + if (iflg & BIT_ROUND_MIN) + goto return_dms; + xv -= kmin; + xv *= 60; + ksec = (int32) xv; + if (iflg & BIT_ROUND_SEC) + sprintf(s1, "%2d\"", ksec); + else + sprintf(s1, "%2d", ksec); + strcat(s, s1); + if (iflg & BIT_ROUND_SEC) + goto return_dms; + xv -= ksec; + k = (int32) (xv * 10000); + sprintf(s1, ".%04d", k); + strcat(s, s1); +return_dms:; + if (sgn < 0) { + sp = strpbrk(s, "0123456789"); + *(sp-1) = '-'; + } + if (iflg & BIT_LZEROES) { + while ((sp = strchr(s+2, ' ')) != NULL) *sp = '0'; + } + return(s); +} + +static int letter_to_ipl(int letter) +{ + if (letter >= '0' && letter <= '9') + return letter - '0' + SE_SUN; + if (letter >= 'A' && letter <= 'I') + return letter - 'A' + SE_MEAN_APOG; + if (letter >= 'J' && letter <= 'Z') + return letter - 'J' + SE_CUPIDO; + switch (letter) { + case 'm': return SE_MEAN_NODE; + case 'c': return SE_INTP_APOG; + case 'g': return SE_INTP_PERG; + case 'n': + case 'o': return SE_ECL_NUT; + case 't': return SE_TRUE_NODE; + case 'f': return SE_FIXSTAR; + case 'w': return SE_WALDEMATH; + case 'e': /* swetest: a line of labels */ + case 'q': /* swetest: delta t */ + case 's': /* swetest: an asteroid, with number given in -xs[number] */ + case 'z': /* swetest: a fictitious body, number given in -xz[number] */ + case 'd': /* swetest: default (main) factors 0123456789mtABC */ + case 'p': /* swetest: main factors ('d') plus main asteroids DEFGHI */ + case 'h': /* swetest: fictitious factors JKLMNOPQRSTUVWXYZw */ + case 'a': /* swetest: all factors, like 'p'+'h' */ + return -1; + } + return -2; +} + +static int32 call_rise_set(double t_ut, int32 ipl, char *star, int32 whicheph, int32 special_mode, double *geopos, char *serr) +{ + int ii; + int32 rsmi = 0; + double tret[10]; + swe_set_topo(geopos[0], geopos[1], geopos[2]); + do_printf("\n"); + /* loop over days */ + for (ii = 0; ii < nstep; ii++, t_ut = tret[1] + 0.1) { + *sout = '\0'; + /* swetest -rise + * calculate and print rising and setting */ + if (special_event == SP_RISE_SET) { + /* rising */ + rsmi = SE_CALC_RISE; + if (norefrac) rsmi |= SE_BIT_NO_REFRACTION; + if (disccenter) rsmi |= SE_BIT_DISC_CENTER; + if (swe_rise_trans(t_ut, ipl, star, whicheph, rsmi, geopos, 1013.25, 10, &(tret[0]), serr) != OK) { + do_printf(serr); + exit(0); + } + /* setting */ + rsmi = SE_CALC_SET; + if (norefrac) rsmi |= SE_BIT_NO_REFRACTION; + if (disccenter) rsmi |= SE_BIT_DISC_CENTER; + if (swe_rise_trans(t_ut, ipl, star, whicheph, rsmi, geopos, 1013.25, 10, &(tret[1]), serr) != OK) { + do_printf(serr); + exit(0); + } + strcpy(sout, "rise "); + if (tret[0] == 0 || tret[0] > tret[1]) { + strcat(sout, " - "); + } else { + swe_revjul(tret[0], gregflag, &jyear, &jmon, &jday, &jut); + sprintf(sout + strlen(sout), "%2d.%02d.%04d\t%s ", + jday, jmon, jyear, hms(jut,BIT_LZEROES)); + } + strcat(sout, "set "); + if (tret[1] == 0) { + strcat(sout, " - \n"); + } else { + swe_revjul(tret[1], gregflag, &jyear, &jmon, &jday, &jut); + sprintf(sout + strlen(sout), "%2d.%02d.%04d\t%s\n", + jday, jmon, jyear, hms(jut,BIT_LZEROES)); + } + do_printf(sout); + } + /* swetest -metr + * calculate and print transits over meridian (midheaven and lower + * midheaven */ + if (special_event == SP_MERIDIAN_TRANSIT) { + /* transit over midheaven */ + if (swe_rise_trans(t_ut, ipl, star, whicheph, SE_CALC_MTRANSIT, geopos, 1013.25, 10, &(tret[0]), serr) != OK) { + do_printf(serr); + return ERR; + } + /* transit over lower midheaven */ + if (swe_rise_trans(t_ut, ipl, star, whicheph, SE_CALC_ITRANSIT, geopos, 1013.25, 10, &(tret[1]), serr) != OK) { + do_printf(serr); + return ERR; + } + strcpy(sout, "mtransit "); + if (tret[0] == 0) strcat(sout, " - "); + else { + swe_revjul(tret[0], gregflag, &jyear, &jmon, &jday, &jut); + sprintf(sout + strlen(sout), "%2d.%02d.%04d\t%s ", + jday, jmon, jyear, hms(jut,BIT_LZEROES)); + } + strcat(sout, "itransit "); + if (tret[1] == 0) strcat(sout, " - \n"); + else { + swe_revjul(tret[1], gregflag, &jyear, &jmon, &jday, &jut); + sprintf(sout + strlen(sout), "%2d.%02d.%04d\t%s\n", + jday, jmon, jyear, hms(jut,BIT_LZEROES)); + } + do_printf(sout); + } + } + return OK; +} + +static int32 call_lunar_eclipse(double t_ut, int32 whicheph, int32 special_mode, double *geopos, char *serr) +{ + int ii, eclflag, ecl_type = 0; + int ihou, imin, isec, isgn; + double dfrc, attr[30], dt; + char s1[AS_MAXCH], sout_short[AS_MAXCH]; + /* no selective eclipse type set, set all */ + if ((search_flag & SE_ECL_ALLTYPES_LUNAR) == 0) + search_flag |= SE_ECL_ALLTYPES_LUNAR; + do_printf("\n"); + for (ii = 0; ii < nstep; ii++, t_ut += direction) { + *sout = '\0'; + /* swetest -lunecl -how + * type of lunar eclipse and percentage for a given time: */ + if (special_mode & SP_MODE_HOW) { + if ((eclflag = swe_lun_eclipse_how(t_ut, whicheph, geopos, attr, serr)) == +ERR) { + do_printf(serr); + return ERR; + } else { + if (eclflag & SE_ECL_TOTAL) { + sprintf(sout, "total lunar eclipse: %f o/o \n", attr[0]); + ecl_type = ECL_LUN_TOTAL; + } else if (eclflag & SE_ECL_PARTIAL) { + sprintf(sout, "partial lunar eclipse: %f o/o \n", attr[0]); + ecl_type = ECL_LUN_PARTIAL; + } else if (eclflag & SE_ECL_PENUMBRAL) { + sprintf(sout, "penumbral lunar eclipse: %f o/o \n", attr[0]); + ecl_type = ECL_LUN_PENUMBRAL; + } else { + sprintf(sout, "no lunar eclipse \n"); + } + do_printf(sout); + } + } + /* swetest -lunecl + * find next lunar eclipse: */ + if (!(special_mode & SP_MODE_HOW)) { + if ((eclflag = swe_lun_eclipse_when(t_ut, whicheph, search_flag, + tret, direction_flag, serr)) == ERR) { + do_printf(serr); + return ERR; + } + t_ut = tret[0]; + if ((eclflag & SE_ECL_TOTAL)) { + strcpy(sout, "total "); + ecl_type = ECL_LUN_TOTAL; + } + if ((eclflag & SE_ECL_PENUMBRAL)) { + strcpy(sout, "penumb. "); + ecl_type = ECL_LUN_PENUMBRAL; + } + if ((eclflag & SE_ECL_PARTIAL)) { + strcpy(sout, "partial "); + ecl_type = ECL_LUN_PARTIAL; + } + strcat(sout, "lunar eclipse\t"); + swe_revjul(t_ut, gregflag, &jyear, &jmon, &jday, &jut); + if ((eclflag = swe_lun_eclipse_how(t_ut, whicheph, geopos, attr, serr)) == +ERR) { + do_printf(serr); + return ERR; + } + dt = (tret[3] - tret[2]) * 24 * 60; + sprintf(s1, "%d min %4.2f sec", + (int) dt, fmod(dt, 1) * 60); + /* short output: + * date, time of day, umbral magnitude, umbral duration, saros series, member number */ + sprintf(sout_short, "%s\t%2d.%2d.%4d\t%s\t%.3f\t%s\t%d\t%d\n", + sout, jday, jmon, jyear, hms(jut,0), attr[8],s1, (int) attr[9], (int) attr[10]); + /* long output: + * eclipse maximum, percentage, saros series/member no. */ + sprintf(sout + strlen(sout), "%2d.%02d.%04d\t%s\t%.4f/%.4f\tsaros %d/%d\t%.6f\n", + jday, jmon, jyear, hms(jut,BIT_LZEROES), attr[0],attr[1], (int) attr[9], (int) attr[10], t_ut); + /* sprintf(sout + strlen(sout), "%2d.%02d.%04d\t%s\t%f o/o\t%.6f\n", + jday, jmon, jyear, hms(jut,BIT_LZEROES), attr[0], t_ut); */ + /* second line: + * eclipse times, penumbral, partial, total begin and end */ + sprintf(sout + strlen(sout), " %s ", hms_from_tjd(tret[6])); + if (tret[2] != 0) + sprintf(sout + strlen(sout), "%s ", hms_from_tjd(tret[2])); + else + strcat(sout, " - "); + if (tret[4] != 0) + sprintf(sout + strlen(sout), "%s ", hms_from_tjd(tret[4])); + else + strcat(sout, " - "); + if (tret[5] != 0) + sprintf(sout + strlen(sout), "%s ", hms_from_tjd(tret[5])); + else + strcat(sout, " - "); + if (tret[3] != 0) + sprintf(sout + strlen(sout), "%s ", hms_from_tjd(tret[3])); + else + strcat(sout, " - "); + sprintf(sout + strlen(sout), "%s\n", hms_from_tjd(tret[7])); + /*{int i; + for (i = 0; i < 6; i++) {fprintf(stderr, "%f\n", tret[i]);}}*/ + if (special_mode & SP_MODE_HOCAL) { + swe_split_deg(jut, SE_SPLIT_DEG_ROUND_MIN, &ihou, &imin, &isec, &dfrc, &isgn); + sprintf(sout, "\"%04d %02d %02d %02d.%02d %d\",\n", jyear, jmon, jday, ihou, imin, ecl_type); + } + if (short_output) + do_printf(sout_short); + else + do_printf(sout); + } + } + return OK; +} + +static int32 call_solar_eclipse(double t_ut, int32 whicheph, int32 special_mode, double *geopos, char *serr) +{ + int ii, eclflag, ecl_type = 0; + double dt, tret[30], attr[30]; + char s1[AS_MAXCH], s2[AS_MAXCH], sout_short[AS_MAXCH]; + AS_BOOL has_found = FALSE; + /* no selective eclipse type set, set all */ + if ((search_flag & SE_ECL_ALLTYPES_SOLAR) == 0) + search_flag |= SE_ECL_ALLTYPES_SOLAR; + /* for local eclipses: set geographic position of observer */ + if (special_mode & SP_MODE_LOCAL) + swe_set_topo(geopos[0], geopos[1], geopos[2]); + do_printf("\n"); + for (ii = 0; ii < nstep; ii++, t_ut += direction) { + *sout = '\0'; + /* swetest -solecl -local -geopos... + * find next solar eclipse observable from a given geographic position */ + if (special_mode & SP_MODE_LOCAL) { + if ((eclflag = swe_sol_eclipse_when_loc(t_ut, whicheph, geopos, tret, +attr, direction_flag, serr)) == ERR) { + do_printf(serr); + return ERR; + } else { + has_found = FALSE; + t_ut = tret[0]; + if ((search_flag & SE_ECL_TOTAL) && (eclflag & SE_ECL_TOTAL)) { + strcpy(sout, "total "); + has_found = TRUE; + ecl_type = ECL_SOL_TOTAL; + } + if ((search_flag & SE_ECL_ANNULAR) && (eclflag & SE_ECL_ANNULAR)) { + strcpy(sout, "annular "); + has_found = TRUE; + ecl_type = ECL_SOL_ANNULAR; + } + if ((search_flag & SE_ECL_PARTIAL) && (eclflag & SE_ECL_PARTIAL)) { + strcpy(sout, "partial "); + has_found = TRUE; + ecl_type = ECL_SOL_PARTIAL; + } + if (!has_found) { + ii--; + } else { + swe_calc(t_ut + swe_deltat(t_ut), SE_ECL_NUT, 0, x, serr); + swe_revjul(t_ut, gregflag, &jyear, &jmon, &jday, &jut); + sprintf(sout + strlen(sout), "%2d.%02d.%04d\t%s\t%.4f/%.4f/%.4f\tsaros %d/%d\t%.6f\n", + jday, jmon, jyear, hms(jut,BIT_LZEROES), attr[8], attr[0], attr[2], (int) attr[9], (int) attr[10], t_ut); + /* sprintf(sout + strlen(sout), "%2d.%02d.%04d\t%s\t%fo/o\t%.6f\n", jday, jmon, jyear, hms(jut,BIT_LZEROES), attr[0], t_ut); */ + dt = (tret[3] - tret[2]) * 24 * 60; + sprintf(sout + strlen(sout), "\t%d min %4.2f sec\t", + (int) dt, fmod(dt, 1) * 60); + if (eclflag & SE_ECL_1ST_VISIBLE) + sprintf(sout + strlen(sout), "%s ", hms_from_tjd(tret[1])); + else + strcat(sout, " - "); + if (eclflag & SE_ECL_2ND_VISIBLE) + sprintf(sout + strlen(sout), "%s ", hms_from_tjd(tret[2])); + else + strcat(sout, " - "); + if (eclflag & SE_ECL_3RD_VISIBLE) + sprintf(sout + strlen(sout), "%s ", hms_from_tjd(tret[3])); + else + strcat(sout, " - "); + if (eclflag & SE_ECL_4TH_VISIBLE) + sprintf(sout + strlen(sout), "%s ", hms_from_tjd(tret[4])); + else + strcat(sout, " - "); +#if 0 + sprintf(sout + strlen(sout), "\t%d min %4.2f sec %s %s %s %s", + (int) dt, fmod(dt, 1) * 60, + strcpy(s1, hms(fmod(tret[1] + 0.5, 1) * 24, BIT_LZEROES)), + strcpy(s3, hms(fmod(tret[2] + 0.5, 1) * 24, BIT_LZEROES)), + strcpy(s4, hms(fmod(tret[3] + 0.5, 1) * 24, BIT_LZEROES)), + strcpy(s2, hms(fmod(tret[4] + 0.5, 1) * 24, BIT_LZEROES))); +#endif + strcat(sout, "\n"); + do_printf(sout); + } + } + } /* endif search_local */ + /* swetest -solecl + * find next solar eclipse observable from anywhere on earth */ + if (!(special_mode & SP_MODE_LOCAL)) { + if ((eclflag = swe_sol_eclipse_when_glob(t_ut, whicheph, search_flag, + tret, direction_flag, serr)) == ERR) { + do_printf(serr); + return ERR; + } + t_ut = tret[0]; + if ((eclflag & SE_ECL_TOTAL)) { + strcpy(sout, "total "); + ecl_type = ECL_SOL_TOTAL; + } + if ((eclflag & SE_ECL_ANNULAR)) { + strcpy(sout, "annular "); + ecl_type = ECL_SOL_ANNULAR; + } + if ((eclflag & SE_ECL_ANNULAR_TOTAL)) { + strcpy(sout, "ann-tot "); + ecl_type = ECL_SOL_ANNULAR; /* by Alois: what is this ? */ + } + if ((eclflag & SE_ECL_PARTIAL)) { + strcpy(sout, "partial "); + ecl_type = ECL_SOL_PARTIAL; + } + if ((eclflag & SE_ECL_NONCENTRAL) && !(eclflag & SE_ECL_PARTIAL)) + strcat(sout, "non-central "); + swe_sol_eclipse_where(t_ut, whicheph, geopos, attr, serr); + swe_revjul(t_ut, gregflag, &jyear, &jmon, &jday, &jut); + sprintf(sout_short, "%s\t%2d.%2d.%4d\t%s\t%.3f", + sout, jday, jmon, jyear, hms(jut,0), attr[8]); + sprintf(sout + strlen(sout), "%2d.%02d.%04d\t%s\t%f km\t%.4f/%.4f/%.4f\tsaros %d/%d\t%.6f\n", + jday, jmon, jyear, hms(jut,0), attr[3], attr[8], attr[0], attr[2], (int) attr[9], (int) attr[10], t_ut); + /* sprintf(sout + strlen(sout), "%2d.%02d.%04d\t%s\t%f km\t%f o/o\t%.6f\n", + jday, jmon, jyear, hms(jut,BIT_LZEROES), attr[3], attr[0], t_ut); */ + sprintf(sout + strlen(sout), "\t%s ", hms_from_tjd(tret[2])); + if (tret[4] != 0) + sprintf(sout + strlen(sout), "%s ", hms_from_tjd(tret[4])); + else + strcat(sout, " - "); + if (tret[5] != 0) + sprintf(sout + strlen(sout), "%s ", hms_from_tjd(tret[5])); + else + strcat(sout, " - "); + sprintf(sout + strlen(sout), "%s\n", hms_from_tjd(tret[3])); +#if 0 + swe_revjul(tret[1], gregflag, &jyear, &jmon, &jday, &jut); + sprintf(sout + strlen(sout), "%2d.%02d.%04d\t%s\t%f km\n", + jday, jmon, jyear, hms(jut,BIT_LZEROES), attr[3]); +#endif + sprintf(sout + strlen(sout), "\t%s\t%s", + strcpy(s1, dms(geopos[0], BIT_ROUND_MIN)), + strcpy(s2, dms(geopos[1], BIT_ROUND_MIN))); + strcat(sout, "\t"); + strcat(sout_short, "\t"); + if (!(eclflag & SE_ECL_PARTIAL) && !(eclflag & SE_ECL_NONCENTRAL)) { + if ((eclflag = swe_sol_eclipse_when_loc(t_ut - 10, whicheph, +geopos, tret, attr, 0, serr)) == ERR) { + do_printf(serr); + return ERR; + } + if (fabs(tret[0] - t_ut) > 1) + do_printf("when_loc returns wrong date\n"); + dt = (tret[3] - tret[2]) * 24 * 60; + sprintf(s1, "%d min %4.2f sec", + (int) dt, fmod(dt, 1) * 60); + strcat(sout, s1); + strcat(sout_short, s1); + } + sprintf(sout_short + strlen(sout_short), "\t%d\t%d", (int) attr[9], (int) attr[10]); + strcat(sout, "\n"); + strcat(sout_short, "\n"); + if (special_mode & SP_MODE_HOCAL) { + int ihou, imin, isec, isgn; + double dfrc; + swe_split_deg(jut, SE_SPLIT_DEG_ROUND_MIN, &ihou, &imin, &isec, &dfrc, &isgn); + sprintf(sout, "\"%04d %02d %02d %02d.%02d %d\",\n", jyear, jmon, jday, ihou, imin, ecl_type); + } + if (short_output) + do_printf(sout_short); + else + do_printf(sout); + } + } + return OK; +} + +static int32 call_lunar_occultation(double t_ut, int32 ipl, char *star, int32 whicheph, int32 special_mode, double *geopos, char *serr) +{ + int ii, ecl_type = 0, eclflag; + double dt, tret[30], attr[30]; + char s1[AS_MAXCH], s2[AS_MAXCH]; + AS_BOOL has_found = FALSE; + /* no selective eclipse type set, set all */ + if ((search_flag & SE_ECL_ALLTYPES_SOLAR) == 0) + search_flag |= SE_ECL_ALLTYPES_SOLAR; + /* for local occultations: set geographic position of observer */ + if (special_mode & SP_MODE_LOCAL) + swe_set_topo(geopos[0], geopos[1], geopos[2]); + do_printf("\n"); + for (ii = 0; ii < nstep; ii++) { + *sout = '\0'; + if (special_mode & SP_MODE_LOCAL) { + if ((eclflag = swe_lun_occult_when_loc(t_ut, ipl, star, whicheph, geopos, tret, attr, direction_flag, serr)) == ERR) { + do_printf(serr); + return ERR; + } else { + has_found = FALSE; + t_ut = tret[0]; + if ((search_flag & SE_ECL_TOTAL) && (eclflag & SE_ECL_TOTAL)) { + strcpy(sout, "total "); + has_found = TRUE; + ecl_type = ECL_SOL_TOTAL; + } + if ((search_flag & SE_ECL_ANNULAR) && (eclflag & SE_ECL_ANNULAR)) { + strcpy(sout, "annular "); + has_found = TRUE; + ecl_type = ECL_SOL_ANNULAR; + } + if ((search_flag & SE_ECL_PARTIAL) && (eclflag & SE_ECL_PARTIAL)) { + strcpy(sout, "partial "); + has_found = TRUE; + ecl_type = ECL_SOL_PARTIAL; + } + if (!has_found) { + ii--; + } else { + swe_calc(t_ut + swe_deltat(t_ut), SE_ECL_NUT, 0, x, serr); + swe_revjul(t_ut, gregflag, &jyear, &jmon, &jday, &jut); + sprintf(sout + strlen(sout), "%2d.%02d.%04d\t%s\t%fo/o\n", jday, jmon, jyear, hms(jut,BIT_LZEROES), attr[0]); + dt = (tret[3] - tret[2]) * 24 * 60; + sprintf(sout + strlen(sout), "\t%d min %4.2f sec\t", + (int) dt, fmod(dt, 1) * 60); + if (eclflag & SE_ECL_1ST_VISIBLE) + sprintf(sout + strlen(sout), "%s ", hms_from_tjd(tret[1])); + else + strcat(sout, " - "); + if (eclflag & SE_ECL_2ND_VISIBLE) + sprintf(sout + strlen(sout), "%s ", hms_from_tjd(tret[2])); + else + strcat(sout, " - "); + if (eclflag & SE_ECL_3RD_VISIBLE) + sprintf(sout + strlen(sout), "%s ", hms_from_tjd(tret[3])); + else + strcat(sout, " - "); + if (eclflag & SE_ECL_4TH_VISIBLE) + sprintf(sout + strlen(sout), "%s ", hms_from_tjd(tret[4])); + else + strcat(sout, " - "); +#if 0 + sprintf(sout + strlen(sout), "\t%d min %4.2f sec %s %s %s %s", + (int) dt, fmod(dt, 1) * 60, + strcpy(s1, hms(fmod(tret[1] + 0.5, 1) * 24, BIT_LZEROES)), + strcpy(s3, hms(fmod(tret[2] + 0.5, 1) * 24, BIT_LZEROES)), + strcpy(s4, hms(fmod(tret[3] + 0.5, 1) * 24, BIT_LZEROES)), + strcpy(s2, hms(fmod(tret[4] + 0.5, 1) * 24, BIT_LZEROES))); +#endif + strcat(sout, "\n"); + do_printf(sout); + } + } + } /* endif search_local */ + if (!(special_mode & SP_MODE_LOCAL)) { + /* * global search for occultations */ + if ((eclflag = swe_lun_occult_when_glob(t_ut, ipl, star, whicheph, search_flag, tret, direction_flag, serr)) == ERR) { + do_printf(serr); + return ERR; + } + t_ut = tret[0]; + if ((eclflag & SE_ECL_TOTAL)) { + strcpy(sout, "total "); + ecl_type = ECL_SOL_TOTAL; + } + if ((eclflag & SE_ECL_ANNULAR)) { + strcpy(sout, "annular "); + ecl_type = ECL_SOL_ANNULAR; + } + if ((eclflag & SE_ECL_ANNULAR_TOTAL)) { + strcpy(sout, "ann-tot "); + ecl_type = ECL_SOL_ANNULAR; /* by Alois: what is this ? */ + } + if ((eclflag & SE_ECL_PARTIAL)) { + strcpy(sout, "partial "); + ecl_type = ECL_SOL_PARTIAL; + } + if ((eclflag & SE_ECL_NONCENTRAL) && !(eclflag & SE_ECL_PARTIAL)) + strcat(sout, "non-central "); + swe_lun_occult_where(t_ut, ipl, star, whicheph, geopos, attr, serr); + swe_revjul(t_ut, gregflag, &jyear, &jmon, &jday, &jut); + sprintf(sout + strlen(sout), "%2d.%02d.%04d\t%s\t%f km\t%f o/o\n", + jday, jmon, jyear, hms(jut,BIT_LZEROES), attr[3], attr[0]); + sprintf(sout + strlen(sout), "\t%s ", hms_from_tjd(tret[2])); + if (tret[4] != 0) + sprintf(sout + strlen(sout), "%s ", hms_from_tjd(tret[4])); + else + strcat(sout, " - "); + if (tret[5] != 0) + sprintf(sout + strlen(sout), "%s ", hms_from_tjd(tret[5])); + else + strcat(sout, " - "); + sprintf(sout + strlen(sout), "%s\n", hms_from_tjd(tret[3])); +#if 0 + swe_revjul(tret[1], gregflag, &jyear, &jmon, &jday, &jut); + sprintf(sout + strlen(sout), "%2d.%02d.%04d\t%s\t%f km\n", + jday, jmon, jyear, hms(jut,BIT_LZEROES), attr[3]); +#endif + sprintf(sout + strlen(sout), "\t%s\t%s", + strcpy(s1, dms(geopos[0], BIT_ROUND_MIN)), + strcpy(s2, dms(geopos[1], BIT_ROUND_MIN))); + if (!(eclflag & SE_ECL_PARTIAL) && !(eclflag & SE_ECL_NONCENTRAL)) { + if ((eclflag = swe_lun_occult_when_loc(t_ut - 10, ipl, star, whicheph, geopos, tret, attr, 0, serr)) == ERR) { + do_printf(serr); + return ERR; + } + if (fabs(tret[0] - t_ut) > 1) + do_printf("when_loc returns wrong date\n"); + dt = (tret[3] - tret[2]) * 24 * 60; + sprintf(sout + strlen(sout), "\t%d min %4.2f sec\t", + (int) dt, fmod(dt, 1) * 60); + } + strcat(sout, "\n"); + if (special_mode & SP_MODE_HOCAL) { + int ihou, imin, isec, isgn; + double dfrc; + swe_split_deg(jut, SE_SPLIT_DEG_ROUND_MIN, &ihou, &imin, &isec, &dfrc, &isgn); + sprintf(sout, "\"%04d %02d %02d %02d.%02d %d\",\n", jyear, jmon, jday, ihou, imin, ecl_type); + } + do_printf(sout); + } + t_ut += direction; + } + return OK; +} + +static void do_print_heliacal(double *dret, int32 event_type, char *obj_name) +{ + char *sevtname[] = {"", "heliacal rising ", "heliacal setting", "evening first ", "morning last ", "evening rising ", "morning setting ",}; + *sout = '\0'; + swe_revjul(dret[0], gregflag, &jyear, &jmon, &jday, &jut); + if (event_type <= 4) + sprintf(sout + strlen(sout), "%s %s: %d/%02d/%02d %sUT (%f), visible for: %#4.1f min\n", obj_name, sevtname[event_type], jyear, jmon, jday, hms_from_tjd(dret[0]), dret[0], (dret[2] - dret[0]) * 1440); + else + sprintf(sout + strlen(sout), "%s %s: %d/%02d/%02d %sUT (%f)\n", obj_name, sevtname[event_type], jyear, jmon, jday, hms_from_tjd(dret[0]), dret[0]); + do_printf(sout); +} + +static int32 call_heliacal_event(double t_ut, int32 ipl, char *star, int32 whicheph, int32 special_mode, double *geopos, double *datm, double *dobs, char *serr) +{ + int ii, event_type = 0, retflag; + double dret[40], tsave1, tsave2 = 0; + char obj_name[AS_MAXCH]; + helflag |= whicheph; + /* if invalid heliacal event type was required, set 0 for any type */ + if (search_flag < 0 || search_flag > 6) + search_flag = 0; + /* optical instruments used: */ + if (dobs[3] > 0) + helflag |= SE_HELFLAG_OPTICAL_PARAMS; + if (hel_using_AV) + helflag |= SE_HELFLAG_AVKIND_VR; + if (ipl == SE_FIXSTAR) + strcpy(obj_name, star); + else + swe_get_planet_name(ipl, obj_name); + do_printf("\n"); + for (ii = 0; ii < nstep; ii++, t_ut = dret[0] + 1) { + *sout = '\0'; + if (search_flag > 0) + event_type = search_flag; + else if (ipl == SE_MOON) + event_type = SE_EVENING_FIRST; + else + event_type = SE_HELIACAL_RISING; + retflag = swe_heliacal_ut(t_ut, geopos, datm, dobs, obj_name, event_type, helflag, dret, serr); + if (retflag == ERR) { + do_printf(serr); + return ERR; + } + do_print_heliacal(dret, event_type, obj_name); + /* list all events within synodic cycle */ + if (search_flag == 0) { + if (ipl == SE_VENUS || ipl == SE_MERCURY) { + /* we have heliacal rising (morning first), now find morning last */ + event_type = SE_MORNING_LAST; + retflag = swe_heliacal_ut(dret[0], geopos, datm, dobs, obj_name, event_type, helflag, dret, serr); + if (retflag == ERR) { + do_printf(serr); + return ERR; + } + do_print_heliacal(dret, event_type, obj_name); + tsave1 = dret[0]; + /* mercury can have several evening appearances without any morning + * appearances in betweeen. We have to find out when the next + * morning appearance is and then find all evening appearances + * that take place before that */ + if (ipl == SE_MERCURY) { + event_type = SE_HELIACAL_RISING; + retflag = swe_heliacal_ut(dret[0], geopos, datm, dobs, obj_name, event_type, helflag, dret, serr); + if (retflag == ERR) { + do_printf(serr); + return ERR; + } + tsave2 = dret[0]; + } +repeat_mercury: + /* evening first */ + event_type = SE_EVENING_FIRST; + retflag = swe_heliacal_ut(tsave1, geopos, datm, dobs, obj_name, event_type, helflag, dret, serr); + if (retflag == ERR) { + do_printf(serr); + return ERR; + } + if (ipl == SE_MERCURY && dret[0] > tsave2) + continue; + do_print_heliacal(dret, event_type, obj_name); + } + if (ipl == SE_MOON) { + /* morning last */ + event_type = SE_MORNING_LAST; + retflag = swe_heliacal_ut(dret[0], geopos, datm, dobs, obj_name, event_type, helflag, dret, serr); + if (retflag == ERR) { + do_printf(serr); + return ERR; + } + do_print_heliacal(dret, event_type, obj_name); + } else { + /* heliacal setting (evening last) */ + event_type = SE_HELIACAL_SETTING; + retflag = swe_heliacal_ut(dret[0], geopos, datm, dobs, obj_name, event_type, helflag, dret, serr); + if (retflag == ERR) { + do_printf(serr); + return ERR; + } + do_print_heliacal(dret, event_type, obj_name); + if (0 && ipl == SE_MERCURY) { + tsave1 = dret[0]; + goto repeat_mercury; + } + } + } + } + return OK; +} + +static int do_special_event(double tjd, int32 ipl, char *star, int32 special_event, int32 special_mode, double *geopos, double *datm, double *dobs, char *serr) +{ + int retc; + /* risings, settings, meridian transits */ + if (special_event == SP_RISE_SET || + special_event == SP_MERIDIAN_TRANSIT) + retc = call_rise_set(tjd, ipl, star, whicheph, special_mode, geopos, serr); + /* lunar eclipses */ + if (special_event == SP_LUNAR_ECLIPSE) + retc = call_lunar_eclipse(tjd, whicheph, special_mode, geopos, serr); + /* solar eclipses */ + if (special_event == SP_SOLAR_ECLIPSE) + retc = call_solar_eclipse(tjd, whicheph, special_mode, geopos, serr); + /* occultations by the moon */ + if (special_event == SP_OCCULTATION) + retc = call_lunar_occultation(tjd, ipl, star, whicheph, special_mode, geopos, serr); + /* heliacal event */ + if (special_event == SP_HELIACAL) + retc = call_heliacal_event(tjd, ipl, star, whicheph, special_mode, geopos, datm, dobs, serr); + return retc; +} + +static char *hms_from_tjd(double x) +{ + static char s[AS_MAXCH]; + sprintf(s, "%s ", hms(fmod(x + 1000000.5, 1) * 24, BIT_LZEROES)); + return s; +} + +static char *hms(double x, int32 iflag) +{ + static char s[AS_MAXCH], s2[AS_MAXCH], *sp; + char *c = ODEGREE_STRING; + x += 0.5 / 36000.0; /* round to 0.1 sec */ + strcpy(s, dms(x, iflag)); + sp = strstr(s, c); + if (sp != NULL) { + *sp = ':'; + strcpy(s2, sp + strlen(ODEGREE_STRING)); + strcpy(sp + 1, s2); + *(sp + 3) = ':'; + *(sp + 8) = '\0'; + } + return s; +} + +static void do_printf(char *info) +{ +#ifdef _WINDOWS + fprintf(fp, info); +#else + printf(info); +#endif +} + +/* make_ephemeris_path(). + * ephemeris path includes + * current working directory + * + program directory + * + default path from swephexp.h on current drive + * + on program drive + * + on drive C: + */ +static int make_ephemeris_path(int32 iflg, char *argv0) +{ + char path[AS_MAXCH], s[AS_MAXCH]; + char *sp; + char *dirglue = DIR_GLUE; + size_t pathlen = 0; + /* moshier needs no ephemeris path */ + if (iflg & SEFLG_MOSEPH) + return OK; + /* current working directory */ + sprintf(path, ".%c", *PATH_SEPARATOR); + /* program directory */ + sp = strrchr(argv0, *dirglue); + if (sp != NULL) { + pathlen = sp - argv0; + if (strlen(path) + pathlen < AS_MAXCH-1) { + strcpy(s, argv0); + *(s+pathlen) = '\0'; + sprintf(path + strlen(path), "%s%c", s, *PATH_SEPARATOR); + } + } +#if MSDOS +{ + char *cpos[20]; + char s[2 * AS_MAXCH], *s1 = s + AS_MAXCH; + char *sp[3]; + int i, j, np; + strcpy(s1, SE_EPHE_PATH); + np = cut_str_any(s1, PATH_SEPARATOR, cpos, 20); + /* + * default path from swephexp.h + * - current drive + * - program drive + * - drive C + */ + *s = '\0'; + /* current working drive */ + sp[0] = getcwd(NULL, 0); + if (sp[0] == NULL) { + printf("error in getcwd()\n"); + exit(1); + } + if (*sp[0] == 'C') + sp[0] = NULL; + /* program drive */ + if (*argv0 != 'C' && (sp[0] == NULL || *sp[0] != *argv0)) + sp[1] = argv0; + else + sp[1] = NULL; + /* drive C */ + sp[2] = "C"; + for (i = 0; i < np; i++) { + strcpy(s, cpos[i]); + if (*s == '.') /* current directory */ + continue; + if (s[1] == ':') /* drive already there */ + continue; + for (j = 0; j < 3; j++) { + if (sp[j] != NULL && strlen(path) + 2 + strlen(s) < AS_MAXCH-1) + sprintf(path + strlen(path), "%c:%s%c", *sp[j], s, *PATH_SEPARATOR); + } + } +} +#else + if (strlen(path) + pathlen < AS_MAXCH-1) + strcat(path, SE_EPHE_PATH); +#endif + return OK; +} + +#if MSDOS +/************************************************************** +cut the string s at any char in cutlist; put pointers to partial strings +into cpos[0..n-1], return number of partial strings; +if less than nmax fields are found, the first empty pointer is +set to NULL. +More than one character of cutlist in direct sequence count as one +separator only! cut_str_any("word,,,word2",","..) cuts only two parts, +cpos[0] = "word" and cpos[1] = "word2". +If more than nmax fields are found, nmax is returned and the +last field nmax-1 rmains un-cut. +**************************************************************/ +static int cut_str_any(char *s, char *cutlist, char *cpos[], int nmax) +{ + int n = 1; + cpos [0] = s; + while (*s != '\0') { + if ((strchr(cutlist, (int) *s) != NULL) && n < nmax) { + *s = '\0'; + while (*(s + 1) != '\0' && strchr (cutlist, (int) *(s + 1)) != NULL) s++; + cpos[n++] = s + 1; + } + if (*s == '\n' || *s == '\r') { /* treat nl or cr like end of string */ + *s = '\0'; + break; + } + s++; + } + if (n < nmax) cpos[n] = NULL; + return (n); +} /* cutstr */ +#endif +

+ +

SWISS EPHEMERIS. 3

+ +

Computer ephemeris for developers of +astrological software. 3

+ +

Introduction. 4

+ +

1.     Licensing. 4

+ +

2.     Descripition of the ephemerides. 5

+ +

2.1          Planetary and lunar ephemerides. 5

+ +

2.1.1             Three ephemerides. 5

+ +

1.           The Swiss Ephemeris  5

+ +

2.    The Moshier Ephemeris  6

+ +

3.    The full JPL Ephemeris  6

+ +

2.1.2.1             Swiss Ephemeris and the Astronomical +Almanac  7

+ +

2.1.2.2             Swiss Ephemeris and JPL Horizons +System   8

+ +

2.1.2.3             Differences between Swiss Ephemeris +1.70 and older versions  8

+ +

2.1.2.4             Differences between Swiss Ephemeris +1.78 and 1.77. 9

+ +

2.1.3             The details of coordinate +transformation  10

+ +

2.1.4             The Swiss Ephemeris compression +mechanism   11

+ +

2.1.5             The extension of the time range to +10'800 years. 12

+ +

2.2      Lunar and Planetary Nodes and +Apsides  13

+ +

2.2.1             Mean Lunar Node and Mean Lunar +Apogee ('Lilith', 'Black Moon')13

+ +

2.2.2             The 'True' Node  13

+ +

2.2.3             The Osculating Apogee (so-called +'True Lilith' or 'True Dark Moon')14

+ +

2.2.4             The Interpolated or Natural Apogee +and Perigee (Lilith and Priapus)15

+ +

2.2.5              Planetary Nodes and Apsides  15

+ +

2.3.          Asteroids  18

+ +

Asteroid ephemeris files. 18

+ +

How the asteroids were computed. 19

+ +

Ceres, Pallas, Juno, Vesta. 20

+ +

Chiron. 20

+ +

Pholus. 20

+ +

”Ceres” - an application program for asteroid +astrology. 20

+ +

2.4      Comets. 20

+ +

2.5      Fixed stars and Galactic Center20

+ +

2.6          ‚Hypothetical' bodies. 20

+ +

Uranian Planets (Hamburg Planets: Cupido, Hades, +Zeus, Kronos, Apollon, Admetos, Vulkanus, Poseidon)21

+ +

Transpluto (Isis)21

+ +

Harrington. 21

+ +

Nibiru. 22

+ +

Vulcan. 22

+ +

Selena/White Moon. 22

+ +

Dr. Waldemath’s Black Moon. 22

+ +

The Planets X of Leverrier, Adams, Lowell and +Pickering. 22

+ +

2.7 Sidereal Ephemerides. 23

+ +

Sidereal Calculations. 23

+ +

The problem of defining the zodiac. 23

+ +

The Babylonian tradition and the Fagan/Bradley +ayanamsha. 23

+ +

The Hipparchan tradition. 24

+ +

The Spica/Citra tradition and the Lahiri ayanamsha. 26

+ +

The sidereal zodiac and the Galactic Center26

+ +

Other ayanamshas. 26

+ +

Conclusions. 27

+ +

In search of correct algorithms. 27

+ +

More benefits from our new sidereal algorithms: +standard equinoxes and precession-corrected transits. 30

+ +

3.        Apparent versus true planetary +positions. 30

+ +

4.           Geocentric versus topocentric and +heliocentric positions. 30

+ +

5. Heliacal Events, Eclipses, Occultations, and +Other Planetary Phenomena. 31

+ +

5.1. Heliacal Events of the Moon, Planets and +Stars. 31

+ +

5.1.1. Introduction. 31

+ +

5.1.2. Aspect determining visibility. 32

+ +

5.1.2.1. Position of celestial objects. 32

+ +

5.1.2.2. Geographic location. 32

+ +

5.1.2.3. Optical properties of observer32

+ +

5.1.2.4. Meteorological circumstances. 32

+ +

5.1.2.5. Contrast between object and sky +background. 32

+ +

5.1.3. Functions to determine the heliacal +events. 32

+ +

5.1.3.1. Determining the contrast threshold +(swe_vis_limit_magn)32

+ +

5.1.3.2. Iterations to determine when the +studied object is really visible (swe_heliacal_ut)32

+ +

5.1.3.3. Geographic limitations of +swe_heliacal_ut() and strange behavior of planets in high geographic latitudes. 33

+ +

5.1.3.4. Visibility of Venus and the Moon +during day. 33

+ +

5.1.4. Future developments. 33

+ +

5.1.5. References. 33

+ +

5.2. Eclipses, occultations, risings, settings, +and other planetary phenomena. 34

+ +

6.        AC, MC, Houses, Vertex. 34

+ +

6.1.      House Systems  34

+ +

6.1.1. Placidus. 34

+ +

6.1.2. Koch/GOH.. 34

+ +

6.1.3. Regiomontanus. 34

+ +

6.1.4. Campanus. 35

+ +

6.1.5. Equal System.. 35

+ +

6.1.6 Vehlow-equal System.. 35

+ +

6.1.7. Axial Rotation System.. 35

+ +

6.1.8. The Morinus System.. 35

+ +

6.1.9. Horizontal system.. 35

+ +

6.1.10. The Polich-Page (“topocentric”) system.. 35

+ +

6.1.11. Alcabitus system.. 35

+ +

6.1.12. Gauquelin sectors. 35

+ +

6.1.13. Krusinski/Pisa/Goelzer system.. 36

+ +

6.2. Vertex, Antivertex, East Point and +Equatorial Ascendant, etc.36

+ +

6.3.          House cusps beyond the polar circle. 37

+ +

6.3.1.             Implementation in other calculation +modules:37

+ +

6.4.      House position of a planet38

+ +

6.5.          Gauquelin sector position of a +planet38

+ +

7.     DT (Delta T)39

+ +

8.       Programming Environment41

+ +

9.        Swiss Ephemeris Functions. 41

+ +

9.1      Swiss Ephemeris API41

+ +

Calculation of planets and stars. 41

+ +

Date and time conversion. 41

+ +

Initialization, setup, and closing functions. 42

+ +

House calculation. 42

+ +

Auxiliary functions. 42

+ +

Other functions that may be useful43

+ +

9.2      Placalc API44

+ +

Appendix. 44

+ +

A. The gravity deflection for a planet passing +behind the Sun. 44

+ +

B. The list of asteroids. 45

+ +

+ +