IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jan 14, 2016, 11:33:56 AM (11 years ago)
Author:
eugene
Message:

pre-compute sines and cosines for gcompare -C

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20151113/Ohana/src/gcompare/src/gc_compare.c

    r30983 r39316  
    22# define D_NMATCH 500;
    33
    4 double gcdist (double r1, double d1, double r2, double d2) {
     4typedef struct {
     5  double sn_r;
     6  double cs_r;
     7  double sn_d;
     8  double cs_d;
     9} gc_data_type;
     10
     11gc_data_type *gcdist_init (data_type data) {
     12
     13  gc_data_type *gcdata;
     14  ALLOCATE (gcdata, gc_data_type, data.Nvalues);
     15
     16  int i;
     17  for (i = 0; i < data.Nvalues; i++) {
     18    gcdata[i].sn_r = sin(RAD_DEG*data.values[i].X);
     19    gcdata[i].cs_r = cos(RAD_DEG*data.values[i].X);
     20    gcdata[i].sn_d = sin(RAD_DEG*data.values[i].Y);
     21    gcdata[i].cs_d = cos(RAD_DEG*data.values[i].Y);
     22  }
     23  return gcdata;
     24}
     25
     26double gcdist_new (gc_data_type v1, gc_data_type v2) {
     27
     28  double t1 = SQ(v2.cs_d*(v2.sn_r*v1.cs_r - v1.sn_r*v2.cs_r));
     29
     30  double t2 = v1.cs_d*v2.sn_d;
     31
     32  double cs_dr = (v1.cs_r*v2.cs_r + v1.sn_r*v2.sn_r); // cos(r2 - r1)
     33  double t3 = v1.sn_d*v2.cs_d * cs_dr;
     34
     35  double t4 = SQ(t2 - t3);
     36
     37  double y = sqrt(t1 + t4);
     38
     39  double x = v1.sn_d * v2.sn_d + v1.cs_d * v2.cs_d * cs_dr;
     40
     41  /*
     42  fprintf (stderr, "t1: %f\n", t1);
     43  fprintf (stderr, "t2: %f\n", t2);
     44  fprintf (stderr, "t3: %f\n", t3);
     45  fprintf (stderr, "t4: %f\n", t4);
     46  fprintf (stderr, "cs: %f\n", cs_dr);
     47
     48  fprintf (stderr, "x: %f\n", x);
     49  fprintf (stderr, "y: %f\n", y);
     50  */
     51
     52  return(DEG_RAD*atan2(y,x));
     53}
     54
     55double gcdist_old (double r1, double d1, double r2, double d2) {
    556  double num,den;
    657  r1 *= M_PI / 180;
     
    960  d2 *= M_PI / 180;
    1061
    11   num = sqrt(pow((cos(d2) * sin(r2 - r1)),2) +
     62# if (0) 
     63  double t1 = pow((cos(d2) * sin(r2 - r1)),2);
     64
     65  double t2 = cos(d1) * sin(d2);
     66 
     67  double cs_dr = cos(r2 - r1);
     68  double t3 = sin(d1) * cos(d2) * cs_dr;
     69
     70  double t4 = pow((t2 - t3), 2);
     71
     72  double y = sqrt(t1 + t4);
     73# endif
     74
     75  num = sqrt(pow((cos(d2) * sin(r2 - r1)),2) +
    1276             pow((cos(d1) * sin(d2) -
    1377                  sin(d1) * cos(d2) * cos(r2 - r1)),2));
    1478  den = (sin(d1) * sin(d2) + cos(d1) * cos(d2) * cos(r2 - r1));
     79
     80# if (0)
     81  fprintf (stderr, "t1: %f\n", t1);
     82  fprintf (stderr, "t2: %f\n", t2);
     83  fprintf (stderr, "t3: %f\n", t3);
     84  fprintf (stderr, "t4: %f\n", t4);
     85  fprintf (stderr, "cs: %f\n", cs_dr);
     86
     87  fprintf (stderr, "y: %f\n", y);
     88
     89  fprintf (stderr, "%f %f\n", num, den);
     90# endif
     91
    1592  return(atan2(num,den) * (180 / M_PI));
    1693}
    17  
    1894
    1995match_type *gc_compare (data_type data1, data_type data2, int *Nmatches, double radius, double DX, double DY, double noauto) {
     
    28104  ALLOCATE (match, match_type, NMATCH);
    29105
     106  gc_data_type *gcdata1 = gcdist_init (data1);
     107  gc_data_type *gcdata2 = gcdist_init (data2);
     108
    30109  for (i = 0; i < data1.Nvalues ;i++) {
    31110    if (!(i % 100))
     
    33112
    34113    for (j = 0; j < data2.Nvalues ; j++) {
    35       dR = gcdist(data1.values[i].X,data1.values[i].Y,
    36                   data2.values[j].X,data2.values[j].Y);
     114
     115      if (1) {
     116        dR = gcdist_new(gcdata1[i], gcdata2[j]);
     117      } else {
     118        dR = gcdist_old(data1.values[i].X, data1.values[i].Y, data2.values[j].X, data2.values[j].Y);
     119      }
     120
     121      /*
     122      double dR1 = gcdist_new(gcdata1[i], gcdata2[j]);
     123      double dR2 = gcdist_old(data1.values[i].X, data1.values[i].Y, data2.values[j].X, data2.values[j].Y);
     124      fprintf (stderr, "%f %f\n", dR1, dR2);
     125      dR = dR1;
     126      */
     127
    37128/*       fprintf(stderr,"%g %g %g %g => %g\n", */
    38129/*            data1.values[i].X,data1.values[i].Y,data2.values[j].X,data2.values[j].Y, */
Note: See TracChangeset for help on using the changeset viewer.