awpaeth@watcgl.UUCP (Alan W. Paeth) (01/13/87)
# This is a shell archive. Remove anything before this line, # then unpack it by saving it in a file and typing "sh file". # # Wrapped by watcgl!awpaeth on Mon Jan 12 22:04:40 EST 1987 # Contents: README Makefile moonphase.c planet.c echo x - README sed 's/^@//' > "README" <<'@//E*O*F README//' These are two ancillary programs for use with the "starchart" family recently posted to the net. Type "Make all" to compile them, a/o consider adding the lines to the Makefile used for the "starchart" software. [1] planet.c: contributed to the net by Fred Mendenhall. It is a C language transcription of work by the famed Dutch astronomer Meesus. To run, type "planet" and enter date and time zone information. Precise planetary position are computed, based on the reckoned Julian time. I have made two additions: [a] executing with at least one (dummy) command line parameter causes the prompting to be bypassed. The current GMT is used instead. [b] output is also placed in "planet.star" in a format identical to "yale.star". Thus, charts may be overlayed with planetary locations for any calendar date. [2] moonphase.c: reposted software which gives the current phase of the moon. @//E*O*F README// chmod u=rw,g=rw,o=r README echo x - Makefile sed 's/^@//' > "Makefile" <<'@//E*O*F Makefile//' CFLAGS = -O moonphase: moonphase.c cc $(CFLAGS) moonphase.c -lm -o ./moonphase planet: planet.c cc $(CFLAGS) planet.c -lm -o ./planet all: moonphase\ planet @//E*O*F Makefile// chmod u=rw,g=rw,o=r Makefile echo x - moonphase.c sed 's/^@//' > "moonphase.c" <<'@//E*O*F moonphase.c//' /**************************************************************************** pom.c Phase of the Moon. Calculates the current phase of the moon. Based on routines from `Practical Astronomy with Your Calculator', by Duffett-Smith. Comments give the section from the book that particular piece of code was adapted from. -- Keith E. Brandt VIII 1984 ****************************************************************************/ #include <stdio.h> #include <sys/time.h> #include <math.h> #define PI 3.141592654 #define EPOCH 1983 #define EPSILONg 279.103035 /* solar ecliptic long at EPOCH */ #define RHOg 282.648015 /* solar ecliptic long of perigee at EPOCH */ #define e 0.01671626 /* solar orbit eccentricity */ #define lzero 106.306091 /* lunar mean long at EPOCH */ #define Pzero 111.481526 /* lunar mean long of perigee at EPOCH */ #define Nzero 93.913033 /* lunar mean long of node at EPOCH */ main() { double dtor(); double adj360(); double potm(); long *lo = (long *) calloc (1, sizeof(long)); /* used by time calls */ struct tm *pt; /* ptr to time structure */ double days; /* days since EPOCH */ double phase; /* percent of lunar surface illuminated */ double phase2; /* percent of lunar surface illuminated one day later */ int i = EPOCH; time (lo); /* get system time */ pt = gmtime(lo); /* get ptr to gmt time struct */ cfree(lo); /* calculate days since EPOCH */ days = (pt->tm_yday +1) + ((pt->tm_hour + (pt->tm_min / 60.0) + (pt->tm_sec / 3600.0)) / 24.0); while (i < pt->tm_year + 1900) days = days + 365 + ly(i++); phase = potm(days); printf("The Moon is "); if ((int)(phase + .5) == 100) { printf("Full\n"); } else if ((int)(phase + 0.5) == 0) printf("New\n"); else if ((int)(phase + 0.5) == 50) { phase2 = potm(++days); if (phase2 > phase) printf("at the First Quarter\n"); else printf("at the Last Quarter\n"); } else if ((int)(phase + 0.5) > 50) { phase2 = potm(++days); if (phase2 > phase) printf("Waxing "); else printf("Waning "); printf("Gibbous (%1.0f%% of Full)\n", phase); } else if ((int)(phase + 0.5) < 50) { phase2 = potm(++days); if (phase2 > phase) printf("Waxing "); else printf("Waning "); printf("Crescent (%1.0f%% of Full)\n", phase); } } double potm(days) double days; { double N; double Msol; double Ec; double LambdaSol; double l; double Mm; double Ev; double Ac; double A3; double Mmprime; double A4; double lprime; double V; double ldprime; double D; double Nm; N = 360 * days / 365.2422; /* sec 42 #3 */ adj360(&N); Msol = N + EPSILONg - RHOg; /* sec 42 #4 */ adj360(&Msol); Ec = 360 / PI * e * sin(dtor(Msol)); /* sec 42 #5 */ LambdaSol = N + Ec + EPSILONg; /* sec 42 #6 */ adj360(&LambdaSol); l = 13.1763966 * days + lzero; /* sec 61 #4 */ adj360(&l); Mm = l - (0.1114041 * days) - Pzero; /* sec 61 #5 */ adj360(&Mm); Nm = Nzero - (0.0529539 * days); /* sec 61 #6 */ adj360(&Nm); Ev = 1.2739 * sin(dtor(2*(l - LambdaSol) - Mm)); /* sec 61 #7 */ Ac = 0.1858 * sin(dtor(Msol)); /* sec 61 #8 */ A3 = 0.37 * sin(dtor(Msol)); Mmprime = Mm + Ev - Ac - A3; /* sec 61 #9 */ Ec = 6.2886 * sin(dtor(Mmprime)); /* sec 61 #10 */ A4 = 0.214 * sin(dtor(2 * Mmprime)); /* sec 61 #11 */ lprime = l + Ev + Ec - Ac + A4; /* sec 61 #12 */ V = 0.6583 * sin(dtor(2 * (lprime - LambdaSol))); /* sec 61 #13 */ ldprime = lprime + V; /* sec 61 #14 */ D = ldprime - LambdaSol; /* sec 63 #2 */ return (50 * (1 - cos(dtor(D)))); /* sec 63 #3 */ } ly(yr) int yr; { /* returns 1 if leapyear, 0 otherwise */ return (yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0); } double dtor(deg) double deg; { /* convert degrees to radians */ return (deg * PI / 180); } double adj360(deg) double *deg; { /* adjust value so 0 <= deg <= 360 */ do if (*deg < 0) *deg += 360; else if (*deg > 360) *deg -= 360; while (*deg < 0 || *deg > 360); } @//E*O*F moonphase.c// chmod u=rw,g=rw,o=r moonphase.c echo x - planet.c sed 's/^@//' > "planet.c" <<'@//E*O*F planet.c//' /* Planets * A program to determine the position of * the Sun., Mer., Ven., Mars, Jup, Sat & Ura * reference Jean Meesus's book, " Astronomical Formulae for * Calculators * program by * * F.T. Mendenhall * ihnp4!inuxe!fred * * Copyright 1985 by F.T. Mendenhall * all rights reserved * * (This copyright prevents you from selling the program - the * author grants anyone the right to copy and install the program * on any machine it will run on) ! ! Modified by Alan Paeth, awpaeth@watcgl, January 1987 for ! (1) non-interactive mode (uses current GMT) ! (2) output in simplified Yale format for use with star charter software ! */ #include <stdio.h> #include <math.h> #include <sys/time.h> /* for getting current GMT */ #define LOGFILE "planet.star" /* crude magnitudes of planets (x100) for output filtering by brightness */ #define MAGSOL 0 #define MAGMER 150 #define MAGVEN 0 #define MAGMAR 100 #define MAGJUP 0 #define MAGSAT 100 #define MAGURA 590 #define MAGNEP 800 double pie, rad, kepler(), truean(), longi(), lati(), poly(), aint(), range(); int cls(), trans(), speak(); FILE *logfile; double usertime() { int mm,dd,yy,time,tz,aa1,bb1; double jd,year,month,day; char *zonestr; printf("DATE AND TIME FOR DESIRED PLANETARY POSITION?\n"); printf("What is the month (1-12)? "); scanf("%d",&mm); printf("\nWhat is the day (1-31)? "); scanf("%d",&dd); printf("\nWhat is the year (xxxx)? "); scanf("%d",&yy); printf("\n\nWhat is the time in the 24 hour clock?"); printf("\n (note 8:21 AM = 0821; 2:45 PM = 1445) \n\n"); printf(" RECALL 1pm = 1300 2pm = 1400 3pm = 1500 \n"); printf(" 4pm = 1600 5pm = 1700 6pm = 1800 \n"); printf(" 7pm = 1900 8pm = 2000 9pm = 2100 \n"); printf(" 10pm = 2200 11pm = 2300 12pm = 2400 \n"); printf("\n What is the time of interest?"); scanf("%d",&time); printf("\n\nWhat is the time zone correction, local to UT?"); printf("\nInput 0 for Universal time -\n"); printf("Input 5 for EST - \n"); printf("Input 6 for CST - \n"); printf("Input 7 for MST - \n"); printf("Input 8 for PST - \n"); printf("What is the time zone? "); scanf("%d",&tz); cls(); printf("For the date %d/%d/%d\n",mm,dd,yy); printf(" At %d ",time); switch(tz) { case 0: zonestr = "Universal Time"; break; case 5: zonestr = "EST"; break; case 6: zonestr = "CST"; break; case 7: zonestr = "PST"; break; default: zonestr = "LOCAL TIME"; break; } printf("%s\n", zonestr); /* Calculate the Julian date for the time of observation */ day = ((float)dd + ((float)time +(float)tz*100.0)/2400.0); if (mm > 2) { year = yy; month = mm; } else { year = yy - 1; month = mm + 12; } aa1 = (int) (year/100); bb1 = 2 - aa1 + (int)(aa1/4); jd = aint(365.25*year) + aint(30.6001*(month + 1)); jd = jd + day + 1720994.5; if (year < 0) { cls(); printf("Negative year not allowed- abort"); exit(1); } if((year + month/100) > 1582.10) jd = jd + bb1; return(jd); } double currenttime() { #define GMT1970 2440587.5 #define SECSPERDAY (60.0*60.0*24.0) struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); return(GMT1970 + tv.tv_sec/SECSPERDAY); } main(argc) int argc; { double jd, T0; double l,a,e,i,w1,w2,M,M0,M1,M2,M4,M5,M6,M7,M8; double a0,a1,a2,a3,RA,DEC; double ECC,nu,r,u,ll,b,lonpert,radpert; double esun,Lsun,Cen,Stheta,Snu,Sr; double N,D,epli,thapp,omeg; double nu2,P,Q,S,V,W,ze,l1pert,epert,w1pert,apert; double psi,H,G,eta,th; #define WRITEMODE "w" #define OPENFAIL 0 if ((logfile = fopen(LOGFILE, WRITEMODE)) == OPENFAIL) { fprintf(stderr, "fail on opening log file %s\n", LOGFILE); exit(1); } cls(); pie = 3.1415926535898; rad = pie/180.0; /* calculate time T0 from 1900 January 0.5 ET */ jd = (argc == 1) ? usertime() : currenttime(); printf("Julian date: %f\n", jd); T0 = (jd - 2415020.0)/36525.0; /* Calculate orbital elements for Mercury */ a0=178.179078; a1=149474.07078; a2=0.0003011; a3=0.0; l = poly(a0,a1,a2,a3,T0); l = range(l); a = 0.3870986; a0 = 0.20561421; a1 = 0.00002046; a2 = -0.000000030; e = poly(a0,a1,a2,a3,T0); a0 = 7.002881; a1 = 0.0018608; a2 = -0.0000183; i = poly(a0,a1,a2,a3,T0); a0 = 28.753753; a1 = 0.3702806; a2 = 0.0001208; w1 = poly(a0,a1,a2,a3,T0); w1 = range(w1); a0 = 47.145944; a1 = 1.1852083; a2= 0.0001739; w2 = poly(a0,a1,a2,a3,T0); w2 = range(w2); M1 = 102.27938 + 149472.51529*T0 + 0.000007*T0*T0; M1 = range(M1); /* solving Kepler find the eccentric anomaly ECC */ ECC =kepler(e,M1); nu = truean(e,ECC); r = a*(1.0 - e * cos(ECC*pie/180.0)); u = l + nu - M1 - w2; ll = longi(w2,i,u); b = lati(u,i); /* Now make corrections due to perturbations */ M2 = 212.60322 + 58517.80387*T0 +0.001286*T0*T0; M2 = range(M2); M4 = 319.51913 + 19139.85475*T0 + 0.000181*T0*T0; M4 = range(M4); M5 = 225.32833 + 3034.69202*T0 - 0.000722*T0*T0; M5 = range(M5); M6 = 175.46622 +1221.55147*T0 - 0.000502*T0*T0; M6 = range(M6); lonpert = 0.00204*cos((5*M2-2*M1+12.220)*rad) +0.00103*cos((2*M2-M1-160.692)*rad) +0.00091*cos((2*M5-M1-37.003)*rad) +0.00078*cos((5*M2-3*M1+10.137)*rad); radpert = 0.000007525*cos((2*M5-M1+53.013)*rad) +0.000006802*cos((5*M2-3*M1-259.918)*rad) +0.000005457*cos((2*M2-2*M1-71.188)*rad) +0.000003569*cos((5*M2-M1-77.75)*rad); r = r + radpert; ll = ll + lonpert; /* Now find the Longi and radius vector of the sun */ M= 358.47583 + 35999.04975*T0 - 0.000150*T0*T0 -0.0000033*T0*T0*T0; M = range(M); esun = 0.01675104 - 0.0000418*T0 -0.000000126*T0*T0; Lsun = 279.69668 + 36000.76892*T0 + 0.0003025*T0*T0; Lsun = range(Lsun); Cen= (1.919460-0.004789*T0-0.000014*T0*T0)*sin(M*rad) +(0.020094 - 0.000100*T0)*sin(2*M*rad) +0.000293*sin(3*M*rad); Stheta= Lsun + Cen; Stheta = range(Stheta); Snu = M + Cen; Sr = 1.0000002*(1.0 - esun*esun)/(1.0 + esun*cos(Snu*rad)); omeg= 259.18 - 1934.142*T0; thapp = Stheta - 0.00569 - 0.00479* sin(omeg*rad); epli = 23.452294 - 0.0130125*T0 -0.00000164*T0*T0 + 0.000000503*T0*T0*T0 +0.00256*cos(omeg*rad); printf("\nOBJECT R.A. DEC \t DISTANCE\n"); N = cos(epli*rad)*sin(thapp*rad); D = cos(thapp*rad); RA = atan2(N,D)/rad; DEC = asin(sin(epli*rad)*sin(thapp*rad))/rad; speak(RA,DEC,Sr, MAGSOL, "PS", "Sol"); /* tansformation of coordinates on Mercury and output */ trans(r,b,ll,Stheta,Sr,epli, MAGMER, "PM", "Mercury"); /* Now start on Venus */ a0 = 342.767053; a1 = 58519.21191; a2 = 0.0003097; a3 = 0.0; l = poly(a0,a1,a2,a3,T0); l = range(l); a = 0.7233316; a0 = 0.00682069; a1 = -0.00004774; a2 = 0.000000091; e = poly(a0,a1,a2,a3,T0); a0 = 3.393631; a1 = 0.0010058; a2 = -0.0000010; i = poly(a0,a1,a2,a3,T0); a0 = 54.384186; a1 = 0.5081861; a2 = -0.0013864; w1 = poly(a0,a1,a2,a3,T0); w1 = range(w1); a0 = 75.779647; a1 = 0.8998500; a2 = 0.0004100; w2 = poly(a0,a1,a2,a3,T0); w2 = range(w2); /* Venus has a long period pert that needs to be added before Kelper */ lonpert = 0.00077 *sin((237.24 + 150.27*T0)*rad); l = l + lonpert; M0 = M2 + lonpert; ECC = kepler(e,M0); nu = truean(e,ECC); r = a*(1.0 - e * cos(ECC*rad)); u = l + nu - M0- w2; ll = longi(w2,i,u); b = lati(u,i); /* now Venus perturbations */ lonpert = 0.00313*cos((2*M-2*M2 -148.225)*rad) +0.00198*cos((3*M-3*M2 +2.565)*rad) +0.00136*cos((M-M2-119.107)*rad) +0.00096*cos((3*M-2*M2-135.912)*rad) +0.00082*cos((M5-M2-208.087)*rad); ll = ll + lonpert; radpert = 0.000022501 * cos((2*M-2*M2-58.208)*rad) +0.000019045 * cos((3*M-3*M2+92.577)*rad) +0.000006887 * cos((M5-M2-118.090)*rad) +0.000005172 * cos((M-M2-29.110)*rad) +0.000003620 * cos((5*M-4*M2-104.208)*rad) +0.000003283 * cos((4*M-4*M2+63.513)*rad) +0.000003074 * cos((2*M5-2*M2-55.167)*rad); r = r + radpert; trans(r,b,ll,Stheta,Sr,epli, MAGVEN, "PV", "Venus"); /* Now start the planet Mars */ a0 = 293.737334; a1 = 19141.69551; a2 = 0.0003107; a3 = 0.0; l = poly(a0,a1,a2,a3,T0); l = range(l); a = 1.5236883; a0 = 0.09331290; a1 = 0.000092064; a2 = -0.000000077; e = poly(a0,a1,a2,a3,T0); a0 = 1.850333; a1 = -0.0006750; a2 = 0.0000126; i = poly(a0,a1,a2,a3,T0); a0 = 285.431761; a1 = 1.0697667; a2 = 0.0001313; a3 = 0.00000414; w1 = poly(a0,a1,a2,a3,T0); w1 = range(w1); a0 = 48.786442; a1 = 0.7709917; a2 = -0.0000014; a3 = -0.00000533; w2 = poly(a0,a1,a2,a3,T0); w2 = range(w2); /* Mars has a long period perturbation */ lonpert = -0.01133*sin((3*M5-8*M4 +4*M)*rad) -0.00933*cos((3*M5-8*M4 +4*M)*rad); l = l + lonpert; M0 = M4 + lonpert; ECC = kepler(e,M0); nu = truean(e,ECC); r = a*(1.0 - e * cos(ECC*rad)); u = l + nu - M0- w2; ll = longi(w2,i,u); b = lati(u,i); /* Now Mars Perturbations */ lonpert = 0.00705*cos((M5-M4-48.958)*rad) +0.00607*cos((2*M5-M4-188.350)*rad) +0.00445*cos((2*M5-2*M4-191.897)*rad) +0.00388*cos((M-2*M4+20.495)*rad) +0.00238*cos((M-M4+35.097)*rad) +0.00204*cos((2*M-3*M4+158.638)*rad) +0.00177*cos((3*M4-M2-57.602)*rad) +0.00136*cos((2*M-4*M4+154.093)*rad) +0.00104*cos((M5+17.618)*rad); ll = ll + lonpert; radpert = 0.000053227*cos((M5-M4+41.1306)*rad) +0.000050989*cos((2*M5-2*M4-101.9847)*rad) +0.000038278*cos((2*M5-M4-98.3292)*rad) +0.000015996*cos((M-M4-55.555)*rad) +0.000014764*cos((2*M-3*M4+68.622)*rad) +0.000008966*cos((M5-2*M4+43.615)*rad) +0.000007914*cos((3*M5-2*M4-139.737)*rad) +0.000007004*cos((2*M5-3*M4-102.888)*rad) +0.000006620*cos((M-2*M4+113.202)*rad) +0.000004930*cos((3*M5-3*M4-76.243)*rad) +0.000004693*cos((3*M-5*M4+190.603)*rad) +0.000004571*cos((2*M-4*M4+244.702)*rad) +0.000004409*cos((3*M5-M4-115.828)*rad); r = r + radpert; trans(r,b,ll,Stheta,Sr,epli, MAGMAR, "PM", "Mars"); /* Now start Jupiter */ a0 = 238.049257; a1 = 3036.301986; a2 = 0.0003347; a3 = -0.00000165; l = poly(a0,a1,a2,a3,T0); l = range(l); a = 5.202561; a0 = 0.04833475; a1 = 0.000164180; a2 = -0.0000004676; a3 = -0.0000000017; e = poly(a0,a1,a2,a3,T0); a0 = 1.308736; a1 = -0.0056961; a2 = 0.0000039; a3 = 0.0; i = poly(a0,a1,a2,a3,T0); a0 = 273.277558; a1 = 0.5994317; a2 = 0.00070405; a3 = 0.00000508; w1 = poly(a0,a1,a2,a3,T0); w1 = range(w1); a0 = 99.443414; a1 = 1.0105300; a2 = 0.00035222; a3 = -0.00000851; w2 = poly(a0,a1,a2,a3,T0); w2 = range(w2); /* Now start perturbation calclations */ nu2 = T0/5.0 +0.1; P = 237.47555 +3034.9061*T0; Q = 265.91650 + 1222.1139*T0; S = 243.51721 + 428.4677*T0; V = 5.0*Q -2.0*P; W = 2.0*P - 6.0*Q +3.0*S; ze = Q - P; psi = S - Q; P = range(P)*rad; Q = range(Q)*rad; S = range(S)*rad; V = range(V)*rad; W = range(W)*rad; ze = range(ze)*rad; psi = range(psi)*rad; l1pert = (0.331364 - 0.010281*nu2 - 0.004692*nu2*nu2)*sin(V) +(0.003228 - 0.064436*nu2 + 0.002075*nu2*nu2)*cos(V) -(0.003083 + 0.000275*nu2 - 0.000489*nu2*nu2)*sin(2*V) +0.002472*sin(W) +0.013619*sin(ze) +0.018472*sin(2*ze) +0.006717*sin(3*ze) +0.002775*sin(4*ze) +(0.007275 - 0.001253*nu2)*sin(ze)*sin(Q) +0.006417*sin(2*ze)*sin(Q) +0.002439*sin(3*ze)*sin(Q); l1pert = l1pert -(0.033839 + 0.001125*nu2)*cos(ze)*sin(Q) -0.003767*cos(2*ze)*sin(Q) -(0.035681 + 0.001208*nu2)*sin(ze)*cos(Q) -0.004261*sin(2*ze)*cos(Q) +0.002178*cos(Q) +(-0.006333 + 0.001161*nu2)*cos(ze)*cos(Q) -0.006675*cos(2*ze)*cos(Q) -0.002664*cos(3*ze)*cos(Q) -0.002572*sin(ze)*sin(2*Q) -0.003567*sin(2*ze)*sin(2*Q) +0.002094*cos(ze)*cos(2*Q) +0.003342*cos(2*ze)*cos(2*Q); epert = (.0003606 + .0000130*nu2 - .0000043*nu2*nu2)*sin(V) +(.0001289 - .0000580*nu2)*cos(V) -.0006764*sin(ze)*sin(Q) -.0001110*sin(2*ze)*sin(Q) -.0000224*sin(3*ze)*sin(Q) -.0000204*sin(Q) +(.0001284 + .0000116*nu2)*cos(ze)*sin(Q) +.0000188*cos(2*ze)*sin(Q) +(.0001460 + .0000130*nu2)*sin(ze)*cos(Q) +.0000224*sin(2*ze)*cos(Q) -.0000817*cos(Q); epert = epert +.0006074*cos(ze)*cos(Q) +.0000992*cos(2*ze)*cos(Q) +.0000508*cos(3*ze)*cos(Q) +.0000230*cos(4*ze)*cos(Q) +.0000108*cos(5*ze)*cos(Q) -(.0000956 + .0000073*nu2)*sin(ze)*sin(2*Q) +.0000448*sin(2*ze)*sin(2*Q) +.0000137*sin(3*ze)*sin(2*Q) +(-.0000997 + .0000108*nu2)*cos(ze)*sin(2*Q) +.0000480*cos(2*ze)*sin(2*Q); epert = epert +.0000148*cos(3*ze)*sin(2*Q) +(-.0000956 +.0000099*nu2)*sin(ze)*cos(2*Q) +.0000490*sin(2*ze)*cos(2*Q) +.0000158*sin(3*ze)*cos(2*Q) +.0000179*cos(2*Q) +(.0001024 + .0000075*nu2)*cos(ze)*cos(2*Q) -.0000437*cos(2*ze)*cos(2*Q) -.0000132*cos(3*ze)*cos(2*Q); w1pert = (0.007192 - 0.003147*nu2)*sin(V) +(-0.020428 - 0.000675*nu2 + 0.000197*nu2*nu2)*cos(V) +(0.007269 + 0.000672*nu2)*sin(ze)*sin(Q) -0.004344*sin(Q) +0.034036*cos(ze)*sin(Q) +0.005614*cos(2*ze)*sin(Q) +0.002964*cos(3*ze)*sin(Q) +0.037761*sin(ze)*cos(Q); w1pert = w1pert +0.006158*sin(2*ze)*cos(Q) -0.006603*cos(ze)*cos(Q) -0.005356*sin(ze)*sin(2*Q) +0.002722*sin(2*ze)*sin(2*Q) +0.004483*cos(ze)*sin(2*Q) -0.002642*cos(2*ze)*sin(2*Q) +0.004403*sin(ze)*cos(2*Q) -0.002536*sin(2*ze)*cos(2*Q) +0.005547*cos(ze)*cos(2*Q) -0.002689*cos(2*ze)*cos(2*Q); lonpert = l1pert -(w1pert/e); l = l + l1pert; M0 = M5 + lonpert; e = e + epert; w1 = w1 + w1pert; apert = -.000263*cos(V) +.000205*cos(ze) +.000693*cos(2*ze) +.000312*cos(3*ze) +.000147*cos(4*ze) +.000299*sin(ze)*sin(Q) +.000181*cos(2*ze)*sin(Q) +.000204*sin(2*ze)*cos(Q) +.000111*sin(3*ze)*cos(Q) -.000337*cos(ze)*cos(Q) -.000111*cos(2*ze)*cos(Q); a = a + apert; ECC = kepler(e,M0); nu = truean(e,ECC); r = a*(1.0 - e * cos(ECC*rad)); u = l + nu - M0 - w2; ll = longi(w2,i,u); b = lati(u,i); trans(r,b,ll,Stheta,Sr,epli, MAGJUP, "PJ", "Jupiter"); /* Now start Saturn */ a0 = 266.564377; a1 = 1223.509884; a2 = 0.0003245; a3 = -0.0000058; l = poly(a0,a1,a2,a3,T0); l = range(l); a = 9.554747; a0 = 0.05589232; a1 = -0.00034550; a2 = -0.000000728; a3 = 0.00000000074; e = poly(a0,a1,a2,a3,T0); a0 = 2.492519; a1 = -0.0039189; a2 = -0.00001549; a3 = 0.00000004; i = poly(a0,a1,a2,a3,T0); a0 = 338.307800; a1 = 1.0852207; a2 = 0.00097854; a3 = 0.00000992; w1 = poly(a0,a1,a2,a3,T0); w1 = range(w1); a0 = 112.790414; a1 = 0.8731951; a2 = -0.00015218; a3 = -0.00000531; w2 = poly(a0,a1,a2,a3,T0); w2 = range(w2); /* Now Saturn's perturbations */ l1pert = (-0.814181 + 0.018150*nu2 + 0.016714*nu2*nu2)*sin(V) +(-0.010497 + 0.160906*nu2 - 0.004100*nu2*nu2)*cos(V) +0.007581*sin(2*V) -0.007986*sin(W) -0.148811*sin(ze) -0.040786*sin(2*ze) -0.015208*sin(3*ze) -0.006339*sin(4*ze) -0.006244*sin(Q); l1pert = l1pert +(0.008931 + 0.002728*nu2)*sin(ze)*sin(Q) -0.016500*sin(2*ze)*sin(Q) -0.005775*sin(3*ze)*sin(Q) +(0.081344 + 0.003206*nu2)*cos(ze)*sin(Q) +0.015019*cos(2*ze)*sin(Q) +(0.085581 + 0.002494*nu2)*sin(ze)*cos(Q) +(0.025328 - 0.003117*nu2)*cos(ze)*cos(Q); l1pert = l1pert +0.014394*cos(2*ze)*cos(Q) +0.006319*cos(3*ze)*cos(Q) +0.006369*sin(ze)*sin(2*Q) +0.009156*sin(2*ze)*sin(2*Q) +0.007525*sin(3*psi)*sin(2*Q) -0.005236*cos(ze)*cos(2*Q) -0.007736*cos(2*ze)*cos(2*Q) -0.007528*cos(3*psi)*cos(2*Q); epert = (-.0007927 + .0002548*nu2 +.0000091*nu2*nu2)*sin(V) +(.0013381 + .0001226*nu2 -.0000253*nu2*nu2)*cos(V) +(.0000248 - .0000121*nu2)*sin(2*V) -(.0000305 + .0000091*nu2)*cos(2*V) +.0000412*sin(2*ze) +.0012415*sin(Q) +(.0000390 -.0000617*nu2)*sin(ze)*sin(Q) +(.0000165 - .0000204*nu2)*sin(2*ze)*sin(Q) +.0026599*cos(ze)*sin(Q) -.0004687*cos(2*ze)*sin(Q); epert = epert -.0001870*cos(3*ze)*sin(Q) -.0000821*cos(4*ze)*sin(Q) -.0000377*cos(5*ze)*sin(Q) +.0000497*cos(2*psi)*sin(Q) +(.0000163 - .0000611*nu2)*cos(Q) -.0012696*sin(ze)*cos(Q) -.0004200*sin(2*ze)*cos(Q) -.0001503*sin(3*ze)*cos(Q) -.0000619*sin(4*ze)*cos(Q) -.0000268*sin(5*ze)*cos(Q); epert = epert -(.0000282 + .0001306*nu2)*cos(ze)*cos(Q) +(-.0000086 + .0000230*nu2)*cos(2*ze)*cos(Q) +.0000461*sin(2*psi)*cos(Q) -.0000350*sin(2*Q) +(.0002211 - .0000286*nu2)*sin(ze)*sin(2*Q) -.0002208*sin(2*ze)*sin(2*Q) -.0000568*sin(3*ze)*sin(2*Q) -.0000346*sin(4*ze)*sin(2*Q) -(.0002780 + .0000222*nu2)*cos(ze)*sin(2*Q) +(.0002022 + .0000263*nu2)*cos(2*ze)*sin(2*Q); epert = epert +.0000248*cos(3*ze)*sin(2*Q) +.0000242*sin(3*psi)*sin(2*Q) +.0000467*cos(3*psi)*sin(2*Q) -.0000490*cos(2*Q) -(.0002842 + .0000279*nu2)*sin(ze)*cos(2*Q) +(.0000128 + .0000226*nu2)*sin(2*ze)*cos(2*Q) +.0000224*sin(3*ze)*cos(2*Q) +(-.0001594 + .0000282*nu2)*cos(ze)*cos(2*Q) +(.0002162 - .0000207*nu2)*cos(2*ze)*cos(2*Q) +.0000561*cos(3*ze)*cos(2*Q); epert = epert +.0000343*cos(4*ze)*cos(2*Q) +.0000469*sin(3*psi)*cos(2*Q) -.0000242*cos(3*psi)*cos(2*Q) -.0000205*sin(ze)*sin(3*Q) +.0000262*sin(3*ze)*sin(3*Q) +.0000208*cos(ze)*cos(3*Q) -.0000271*cos(3*ze)*cos(3*Q) -.0000382*cos(3*ze)*sin(4*Q) -.0000376*sin(3*ze)*cos(4*Q); w1pert = (0.077108 + 0.007186*nu2 - 0.001533*nu2*nu2)*sin(V) +(0.045803 - 0.014766*nu2 - 0.000536*nu2*nu2)*cos(V) -0.007075*sin(ze) -0.075825*sin(ze)*sin(Q) -0.024839*sin(2*ze)*sin(Q) -0.008631*sin(3*ze)*sin(Q) -0.072586*cos(Q) -0.150383*cos(ze)*cos(Q) +0.026897*cos(2*ze)*cos(Q) +0.010053*cos(3*ze)*cos(Q); w1pert = w1pert -(0.013597 +0.001719*nu2)*sin(ze)*sin(2*Q) +(-0.007742 + 0.001517*nu2)*cos(ze)*sin(2*Q) +(0.013586 - 0.001375*nu2)*cos(2*ze)*sin(2*Q) +(-0.013667 + 0.001239*nu2)*sin(ze)*cos(2*Q) +0.011981*sin(2*ze)*cos(2*Q) +(0.014861 + 0.001136*nu2)*cos(ze)*cos(2*Q) -(0.013064 + 0.001628*nu2)*cos(2*ze)*cos(2*Q); lonpert = l1pert -(w1pert/e); l = l + l1pert; M0 = M6 + lonpert; e = e + epert; w1 = w1 + w1pert; apert = .000572*sin(V) -.001590*sin(2*ze)*cos(Q) +.002933*cos(V) -.000647*sin(3*ze)*cos(Q) +.033629*cos(ze) -.000344*sin(4*ze)*cos(Q) -.003081*cos(2*ze) +.002885*cos(ze)*cos(Q) -.001423*cos(3*ze) +(.002172 + .000102*nu2)*cos(2*ze)*cos(Q) -.000671*cos(4*ze) +.000296*cos(3*ze)*cos(Q) -.000320*cos(5*ze) -.000267*sin(2*ze)*sin(2*Q); apert = apert +.001098*sin(Q) -.000778*cos(ze)*sin(2*Q) -.002812*sin(ze)*sin(Q) +.000495*cos(2*ze)*sin(2*Q) +.000688*sin(2*ze)*sin(Q) +.000250*cos(3*ze)*sin(2*Q); apert = apert -.000393*sin(3*ze)*sin(Q) -.000228*sin(4*ze)*sin(Q) +.002138*cos(ze)*sin(Q) -.000999*cos(2*ze)*sin(Q) -.000642*cos(3*ze)*sin(Q) -.000325*cos(4*ze)*sin(Q) -.000890*cos(Q) +.002206*sin(ze)*cos(Q); apert = apert -.000856*sin(ze)*cos(2*Q) +.000441*sin(2*ze)*cos(2*Q) +.000296*cos(2*ze)*cos(2*Q) +.000211*cos(3*ze)*cos(2*Q) -.000427*sin(ze)*sin(3*Q) +.000398*sin(3*ze)*sin(3*Q) +.000344*cos(ze)*cos(3*Q) -.000427*cos(3*ze)*cos(3*Q); a = a + apert; ECC = kepler(e,M0); nu = truean(e,ECC); r = a*(1.0 - e * cos(ECC*rad)); u = l + nu - M0 - w2; ll = longi(w2,i,u); b = lati(u,i); b = b +0.000747*cos(ze)*sin(Q) +0.001069*cos(ze)*cos(Q) +0.002108*sin(2*ze)*sin(2*Q) +0.001261*cos(2*ze)*sin(2*Q) +0.001236*sin(2*ze)*cos(2*Q) -0.002075*cos(2*ze)*cos(2*Q); trans(r,b,ll,Stheta,Sr,epli, MAGSAT, "PS", "Saturn"); /* Now Start on Uranus */ a0 = 244.197470; a1 = 429.863546; a2 = 0.0003160; a3 = -0.00000060; l = poly(a0,a1,a2,a3,T0); l = range(l); a = 19.21814; a0 = 0.0463444; a1 = -0.00002658; a2 = 0.000000077; a3 = 0.0; e = poly(a0,a1,a2,a3,T0); a0 = 0.772464; a1 = 0.0006253; a2 = 0.0000395; i = poly(a0,a1,a2,a3,T0); a0 = 98.071581; a1 = 0.9857650; a2 = -0.0010745; a3 = -0.00000061; w1 = poly(a0,a1,a2,a3,T0); w1 = range(w1); a0 = 73.477111; a1 = 0.4986678; a2 = 0.0013117; a3 = 0.0; w2 = poly(a0,a1,a2,a3,T0); w2 = range(w2); M7 = 72.64878 + 428.37911*T0 + 0.000079*T0*T0; M7 = range(M7); /* now perturbation corrections for Uranus */ G = 83.76922 + 218.4901*T0; S = S/rad; P = P/rad; Q = Q/rad; H = 2.0*G - S; ze = S - P; eta = S - Q; th = G - S; S = S*rad; G = range(G)*rad; P = P*rad; Q = Q*rad; H = range(H)*rad; ze = range(ze)*rad; eta = range(eta)*rad; th = range(th)*rad; l1pert = (0.864319 - 0.001583*nu2)*sin(H) +(0.082222 - 0.006833*nu2)*cos(H) +0.036017*sin(2*H) -0.003019*cos(2*H) +0.008122*sin(W); epert = (-.0003349 + .0000163*nu2)*sin(H) +.0020981*cos(H) +.0001311*cos(H); w1pert = 0.120303*sin(H) +(0.019472 - 0.000947*nu2)*cos(H) +0.006197*sin(2*H); lonpert = l1pert -(w1pert/e); l = l + l1pert; M0 = M7 + lonpert; e = e + epert; w1 = w1 + w1pert; a = a - 0.003825*cos(H); ECC = kepler(e,M0); nu = truean(e,ECC); r = a*(1.0 - e * cos(ECC*rad)); u = l + nu - M0 - w2; ll = longi(w2,i,u); b = lati(u,i); ll = ll +(0.010122 - 0.000988*nu2)*sin(S+eta) +(-0.038581 + 0.002031*nu2 - 0.001910*nu2*nu2)*cos(S+eta) +(0.034964 - 0.001038*nu2 + 0.000868*nu2*nu2)*cos(2*S+eta) +0.005594*sin(S +3*th); ll = ll -0.014808*sin(ze) -0.005794*sin(eta) +0.002347*cos(eta) +0.009872*sin(th) +0.008803*sin(2*th) -0.004308*sin(3*th); b = b +(0.000458*sin(eta) - 0.000642*cos(eta) - 0.000517*cos(4*th)) *sin(S) -(0.000347*sin(eta) + 0.000853*cos(eta) + 0.000517*sin(4*eta)) *cos(S) +0.000403*(cos(2*th)*sin(2*S) + sin(2*th)*cos(2*S)); r = r -.025948 +.004985*cos(ze) -.001230*cos(S) +.003354*cos(eta) +(.005795*cos(S) - .001165*sin(S) + .001388*cos(2*S))*sin(eta) +(.001351*cos(S) + .005702*sin(S) + .001388*sin(2*S))*cos(eta) +.000904*cos(2*th) +.000894*(cos(th) - cos(3*th)); trans(r,b,ll,Stheta,Sr,epli, MAGURA, "PU", "Uranus"); /* Now start Neptune */ a0 = 84.457994; a1 = 219.885914; a2 = 0.0003205; a3 = -0.00000060; l = poly(a0,a1,a2,a3,T0); l = range(l); a = 30.10957; a0 = 0.00899704; a1 = 0.000006330; a2 = -0.000000002; a3 = 0.0; e = poly(a0,a1,a2,a3,T0); a0 = 1.779242; a1 = -0.0095436; a2 = -0.0000091; i = poly(a0,a1,a2,a3,T0); a0 = 276.045975; a1 = 0.3256394; a2 = 0.00014095; a3 = 0.000004113; w1 = poly(a0,a1,a2,a3,T0); w1 = range(w1); a0 = 130.681389; a1 = 1.0989350; a2 = 0.00024987; a3 = -0.000004718; w2 = poly(a0,a1,a2,a3,T0); w2 = range(w2); M8 = 37.73063 + 218.46134*T0 -0.000070*T0*T0; /* now perturbation corrections for neptune */ G = G/rad; P = P/rad; Q = Q/rad; S = S/rad; ze = G - P; eta = G - Q; th = G - S; G = G*rad; P = P*rad; Q = Q*rad; S = S*rad; ze = range(ze)*rad; eta = range(eta)*rad; th = range(th)*rad; l1pert = (-0.589833 + 0.001089*nu2)*sin(H) +(-0.056094 + 0.004658*nu2)*cos(H) -0.024286*sin(2*H); epert = .0004389*sin(H) +.0004262*cos(H) +.0001129*sin(2*H) +.0001089*cos(2*H); w1pert = 0.024039*sin(H) -0.025303*cos(H) +0.006206*sin(2*H) -0.005992*cos(2*H); lonpert = l1pert -(w1pert/e); l = l + l1pert; M0 = M8 + lonpert; e = e + epert; w1 = w1 + w1pert; a = a - 0.000817*sin(H) +0.008189*cos(H) +0.000781*cos(2*H); ECC = kepler(e,M0); nu = truean(e,ECC); r = a*(1.0 - e * cos(ECC*rad)); u = l + nu - M0 - w2; ll = longi(w2,i,u); b = lati(u,i); ll = ll -0.009556*sin(ze) -0.005178*sin(eta) +0.002572*sin(2*th) -0.002972*cos(2*th)*sin(G) -0.002833*sin(2*th)*cos(G); b = b +0.000336*cos(2*th)*sin(G) +0.000364*sin(2*th)*cos(G); r = r -.040596 +.004992*cos(ze) +.002744*cos(eta) +.002044*cos(th) +.001051*cos(2*th); trans(r,b,ll,Stheta,Sr,epli, MAGNEP, "PN", "Neptune"); putchar('\n'); close(logfile); exit(0); } /* end of program main */ int cls() { #define CLEARCNT 1 int i; for (i=0; i < CLEARCNT; i++) putchar('\n'); } double poly(a0,a1,a2,a3,t) double a0,a1,a2,a3,t; { return(a0+a1*t+a2*t*t+a3*t*t*t); } double aint(z) double z; { int trunk; trunk = (int)z; z = (double) trunk; return(z); } double kepler(e,M) double e,M; { double corr,e0,E0,E1; e0 = e /rad; corr = 1; E0=M; while (corr > 0.000001) { corr = (M + e0* sin(E0*rad) -E0)/(1-e*cos(E0*rad)); E1 = E0 + corr; if (corr < 0) { corr = -1.0* corr ; } E0 = E1; } return(E1); } double truean(e,E) double e,E; { double nu; nu = 2.0 * atan(sqrt((1+e)/(1-e))*tan(E*rad/2)); nu = nu/rad; if (nu < 0.0) { nu = nu + 360.0; } if (fabs(nu-E) > 90.0) { if (nu > 180.0) { nu = nu - 180.0; } else { nu = nu + 180.0; } } return(nu); } double longi(w2,i,u) double w2,i,u; { double x,y,l; y=cos(i*rad)*sin(u*rad); x=cos(u*rad); l = atan2(y,x); l = l/rad; if (l < 0.0) { l = l + 360.0; } return(l+ w2); } double lati(u,i) double u,i; { double b; b = asin(sin(u*rad)*sin(i*rad))/rad; return(b); } int speak(ra,dec,dis, mag, sym, str) double ra,dec,dis; char *sym, *str; { int h,m,s,deg; if ( ra < 0) { ra = ra + 360.0; } ra = ra /15.0; /* convert from degs to hours */ h = (int) aint(ra); m = (int)((ra-h)*60); s = (int) (((ra-h)*60-m)*60); printf("%s\t%2dh %2dm %2ds ",str, h,m,s); fprintf(logfile, "%02d%02d%02d", h, m, s); deg = (int)aint(dec); m =(int)((dec - deg)*60); s = (int) (((dec - deg)*60 - m)*60); if ( m < 0) { m = m * -1; } if (s < 0) { s = s * -1; } printf(" %+3ddeg %2dm %2ds ",deg,m,s); printf("\t %.3f\n",dis); fprintf(logfile, "%+03d%02d+%03d%s%s\n", deg, m, mag, sym, str); return(0); } double range(val) double val; { while (val < 0.0) { val = val + 360.0; } if (val > 360.0) { val = val - (aint(val/360.0)*360.0); } return(val); } int trans(r,b,ll,Stheta,Sr,epli, mag, sym, str) double r,b,ll,Stheta,Sr,epli; char *sym, *str; { double N,D,lambda,delta,beta,RA,DEC; N = r * cos(b*rad) * sin((ll - Stheta)*rad); D = r * cos(b*rad) * cos((ll - Stheta)*rad) + Sr; lambda = atan2(N,D)/rad; if (lambda < 0.0) { lambda = lambda + 360.0; } lambda = range(lambda+Stheta); delta = sqrt(N*N + D*D + (r*sin(b*rad))*(r*sin(b*rad))); beta = asin(r*sin(b*rad)/delta)/rad; N = sin(lambda*rad)*cos(epli*rad) - tan(beta*rad)*sin(epli*rad); D = cos(lambda*rad); RA = atan2(N,D)/rad; DEC = asin(sin(beta*rad)*cos(epli*rad) +cos(beta*rad)*sin(epli*rad)*sin(lambda*rad))/rad; speak(RA,DEC,delta, mag, sym, str); return(0); } @//E*O*F planet.c// chmod u=rw,g=rw,o=r planet.c exit 0
sns@tybalt.caltech.edu (Samuel N. Southard) (01/14/87)
I seem to have missed the main StarChart program. Could someone please send me a copy of it. Thanks.
bob@wheaton.UUCP (01/17/87)
In article <1493@cit-vax.Caltech.Edu>, sns@tybalt.caltech.edu (Samuel N. Southard) writes: > I seem to have missed the main StarChart program. Could someone please send > me a copy of it? > > Thanks. Me too! Bob Mauriello ihnp4!wheaton!bob