int main( const int argc, const char **argv) { char buff[100]; FILE *ifile; time_t t0 = time( NULL); if( argc != 2) { printf( "'jsattest' needs a command-line argument from 1 to 4,\n"); printf( "corresponding to the number of the Galilean satellite\n"); printf( "that is being tested.\n"); return( -1); } sprintf( buff, "j%s.txt", argv[1]); ifile = fopen( buff, "rb"); if( !ifile) { printf( "%s not opened\n", buff); return( -1); } printf( "All data in kilometers, in J2000 ecliptic coords\n"); printf( "Compiled %s %s; run %s", __DATE__, __TIME__, ctime( &t0)); printf( " JDE dx dy dz "); printf( "x y z radial along\n"); while( fgets( buff, sizeof( buff), ifile)) if( strlen( buff) > 56 && !memcmp( buff + 37, "00:00:00.0000 (CT)", 18)) { const double jd = atof( buff ); double loc[15], *tptr = loc + atoi( argv[1]) * 3 - 3; double precess_matrix[9]; double j2000_loc[3], x, y, z, r; if( !fgets( buff, sizeof( buff), ifile)) { printf( "Read error"); return( -2); } x = atof( buff); y = atof( buff + 24); z = atof( buff + 47); setup_ecliptic_precession( precess_matrix, 2000. + (jd - 2451545.) / 365., 2000.); calc_jsat_loc( jd, loc, 15, 0L); precess_vector( precess_matrix, tptr, j2000_loc); j2000_loc[0] *= JRADIUS_IN_KM; j2000_loc[1] *= JRADIUS_IN_KM; j2000_loc[2] *= JRADIUS_IN_KM; j2000_loc[0] -= x; j2000_loc[1] -= y; j2000_loc[2] -= z; r = sqrt( x * x + y * y); printf( "%10.2f %10.3f%10.3f%10.3f %11.2f%11.2f%11.2f %10.2f %10.2f\n", jd, j2000_loc[0], j2000_loc[1], j2000_loc[2], x, y, z, (j2000_loc[0] * x + j2000_loc[1] * y) / r, (j2000_loc[1] * x - j2000_loc[0] * y) / r); } fclose( ifile); return( 0); }
int find_events( int sat_no, double t1, double t2, int viewpoint, EVENT *e) { double t, lon_j, lat_j, rad_j, lon_e, lat_e, rad_e; double loc[9], tloc[18], *tptr, step, delta_lat, prev_delta_lat; double tc, lon_s, lat_s, rad_s, prev_delta = 0., delta; int i, rval = 0; t = t1; step = 10. / speeds[sat_no - 1]; while( t < t2) { tc = (t - 2451545.) / 36525.; /* re-cvt to julian centuries */ lon_j = calc_vsop_loc( vsop_data, 5, 0, tc, 0.); lat_j = calc_vsop_loc( vsop_data, 5, 1, tc, 0.); rad_j = calc_vsop_loc( vsop_data, 5, 2, tc, 0.); lon_e = calc_vsop_loc( vsop_data, 3, 0, tc, 0.); lat_e = calc_vsop_loc( vsop_data, 3, 1, tc, 0.); rad_e = calc_vsop_loc( vsop_data, 3, 2, tc, 0.); loc[0] = rad_j * cos( lat_j) * cos( lon_j); loc[1] = rad_j * cos( lat_j) * sin( lon_j); loc[2] = rad_j * sin( lat_j); loc[6] = rad_e * cos( lat_e) * cos( lon_e); loc[7] = rad_e * cos( lat_e) * sin( lon_e); loc[8] = rad_e * sin( lat_e); calc_jsat_loc( t, tloc, 1 << (sat_no - 1), 0L); tptr = tloc + (sat_no - 1) * 3; loc[3] = loc[0] + tptr[0] * AU_PER_JRAD; loc[4] = loc[1] + tptr[1] * AU_PER_JRAD; loc[5] = loc[2] + tptr[2] * AU_PER_JRAD; if( viewpoint) { for( i = 0; i < 9; i++) loc[i] -= loc[6 + i % 3]; lon_j = atan2( loc[1], loc[0]); lat_j = atan( loc[2] / sqrt( loc[0] * loc[0] + loc[1] * loc[1])); } rad_s = sqrt( loc[3] * loc[3] + loc[4] * loc[4] + loc[5] * loc[5]); lon_s = atan2( loc[4], loc[3]); while( lon_s - lon_j > PI) lon_s -= PI + PI; while( lon_s - lon_j <-PI) lon_s += PI + PI; lat_s = asin( loc[5] / rad_s); delta = (lon_s - lon_j) * rad_s / AU_PER_JRAD; delta_lat = (lat_s - lat_j) * rad_s / AU_PER_JRAD; delta_lat *= 1.071374; /* stretch for jup's oblateness */ if( delta * prev_delta < 0.) /* zero crossed */ { double t_crossing, diff, a, b, c, dx, dy, dist = 0.; dx = prev_delta - delta; dy = prev_delta_lat - delta_lat; a = dx * dx + dy * dy; /* quadratic for intercept */ b = 2. * (dx * delta + dy * delta_lat); c = delta_lat * delta_lat + delta * delta - 1.; diff = b * b - 4. * a * c; t_crossing = t + b * step / (2. * a); t = t_crossing + (180. / speeds[sat_no - 1]) * .9; if( diff > 0.) /* if real solution, ie, sat doesn't miss */ { diff = sqrt( diff) * step / (2. * a); diff = fabs( diff); for( i = 0; i < 3; i++) dist += (loc[i + 6] - loc[i]) * (loc[i + 6] - loc[i]); t_crossing += sqrt( dist) / AU_PER_DAY; e[0].t = t_crossing - diff; e[0].sat = sat_no; e[0].event_type = (prev_delta > 0.); if( !viewpoint) e[0].event_type |= FROM_SUN; e[1].t = t_crossing + diff; e[1].sat = sat_no; e[1].event_type = e[0].event_type; e[0].event_type |= EVENT_START; if( !quiet) { show_event( stdout, e); show_event( stdout, e + 1); } e += 2; rval += 2; } delta = 0.; } prev_delta = delta; prev_delta_lat = delta_lat; t += step; } return( rval); }