Exemple #1
0
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);
}
Exemple #2
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);
}