Index: trunk/Ohana/src/gcompare/Makefile
===================================================================
--- trunk/Ohana/src/gcompare/Makefile	(revision 30972)
+++ trunk/Ohana/src/gcompare/Makefile	(revision 30983)
@@ -24,5 +24,6 @@
 $(SRC)/compare.$(ARCH).o 			$(SRC)/sort.$(ARCH).o      		\
 $(SRC)/count_neighbors.$(ARCH).o                $(SRC)/nextline.$(ARCH).o		\
-$(SRC)/nextword.$(ARCH).o			$(SRC)/gcompare.$(ARCH).o
+$(SRC)/nextword.$(ARCH).o			$(SRC)/gcompare.$(ARCH).o               \
+$(SRC)/gc_compare.$(ARCH).o
 
 $(GCOMPARE): $(INC)/gcompare.h
Index: trunk/Ohana/src/gcompare/include/gcompare.h
===================================================================
--- trunk/Ohana/src/gcompare/include/gcompare.h	(revision 30972)
+++ trunk/Ohana/src/gcompare/include/gcompare.h	(revision 30983)
@@ -26,4 +26,5 @@
 data_type          input             PROTO((char *, int, int, int));
 match_type        *compare           PROTO((data_type, data_type, int *, double, double, double, double));
+match_type        *gc_compare        PROTO((data_type, data_type, int *, double, double, double, double));
 int                get_argument      PROTO((int, char **, char *));
 int                remove_argument   PROTO((int, int *, char **));
Index: trunk/Ohana/src/gcompare/src/gc_compare.c
===================================================================
--- trunk/Ohana/src/gcompare/src/gc_compare.c	(revision 30983)
+++ trunk/Ohana/src/gcompare/src/gc_compare.c	(revision 30983)
@@ -0,0 +1,58 @@
+# include "gcompare.h"
+# define D_NMATCH 500;
+
+double gcdist (double r1, double d1, double r2, double d2) {
+  double num,den;
+  r1 *= M_PI / 180;
+  d1 *= M_PI / 180;
+  r2 *= M_PI / 180;
+  d2 *= M_PI / 180;
+
+  num = sqrt(pow((cos(d2) * sin(r2 - r1)),2) +
+	     pow((cos(d1) * sin(d2) -
+		  sin(d1) * cos(d2) * cos(r2 - r1)),2));
+  den = (sin(d1) * sin(d2) + cos(d1) * cos(d2) * cos(r2 - r1));
+  return(atan2(num,den) * (180 / M_PI));
+}
+  
+
+match_type *gc_compare (data_type data1, data_type data2, int *Nmatches, double radius, double DX, double DY, double noauto) {
+
+  int i, j, Nmatch, NMATCH;
+  double dR;
+  match_type *match;
+  fprintf (stderr, "using gc_compare\n");
+  fprintf (stderr, "%f  %f\n", DX, DY);
+  Nmatch = 0;
+  NMATCH = D_NMATCH;
+  ALLOCATE (match, match_type, NMATCH);
+
+  for (i = 0; i < data1.Nvalues ;i++) {
+    if (!(i % 100))
+      fprintf (stderr, ".");
+
+    for (j = 0; j < data2.Nvalues ; j++) {
+      dR = gcdist(data1.values[i].X,data1.values[i].Y,
+		  data2.values[j].X,data2.values[j].Y);
+/*       fprintf(stderr,"%g %g %g %g => %g\n", */
+/* 	      data1.values[i].X,data1.values[i].Y,data2.values[j].X,data2.values[j].Y, */
+/* 	      dR); */
+      if ((dR < radius) && ((noauto == 0) || (dR > noauto))) {
+	match [Nmatch].line1 = data1.values[i].line;
+	match [Nmatch].line2 = data2.values[j].line;
+	match [Nmatch].dX = data1.values[i].X - data2.values[j].X - DX;
+	match [Nmatch].dY = data1.values[i].Y - data2.values[j].Y - DY;
+	data1.values[i].match = TRUE;
+	data2.values[j].match = TRUE;
+	Nmatch ++;
+	if (Nmatch == NMATCH - 1) {
+	  NMATCH += D_NMATCH;
+	  REALLOCATE (match, match_type, NMATCH);
+	}
+      }
+    }
+  }
+  *Nmatches = Nmatch;
+  return (match);
+}
+
Index: trunk/Ohana/src/gcompare/src/gcompare.c
===================================================================
--- trunk/Ohana/src/gcompare/src/gcompare.c	(revision 30972)
+++ trunk/Ohana/src/gcompare/src/gcompare.c	(revision 30983)
@@ -6,5 +6,5 @@
   
   int Nskip1, Nskip2, Nmatches, N;
-  int X1, X2, Y1, Y2, deltas, match, nomatch1, nomatch2;
+  int X1, X2, Y1, Y2, deltas, match, nomatch1, nomatch2, greatcircle;
   data_type data1, data2;
   match_type *matches;
@@ -12,5 +12,5 @@
 
   DX = DY = Nskip1 = Nskip2 = 0;
-  noauto = match = nomatch1 = nomatch2 = deltas = FALSE;
+  noauto = match = nomatch1 = nomatch2 = deltas = greatcircle = FALSE;
 
   if (remove_argument(get_argument (argc, argv, "-d"), &argc, argv))
@@ -26,4 +26,6 @@
   if (remove_argument(get_argument (argc, argv, "-n2"), &argc, argv))
     nomatch2 = TRUE;
+  if (remove_argument(get_argument (argc, argv, "-C"), &argc, argv))
+    greatcircle = TRUE;
   if (!(match || deltas || nomatch1 || nomatch2)) {
     fprintf (stderr, "no output mode, use at least one of -d, -m, -n1, or -n2\n");
@@ -75,5 +77,11 @@
 
   fprintf (stderr, "noauto: %e\n", noauto);
-  matches = compare (data1, data2, &Nmatches, radius, DX, DY, noauto);
+  if (greatcircle) {
+    matches = gc_compare (data1, data2, &Nmatches, radius, DX, DY, noauto);
+  }
+  else {
+    matches = compare (data1, data2, &Nmatches, radius, DX, DY, noauto);
+  }
+
 
   output (data1, data2, matches, Nmatches, match, deltas, nomatch1, nomatch2);
@@ -90,4 +98,5 @@
   fprintf (stderr, "  -d      return delta coords\n");
   fprintf (stderr, "  -m      return matched lines\n");
+  fprintf (stderr, "  -C      uses great circle calculation\n");
   fprintf (stderr, "  -n1     return unmatched lines, file 1\n");
   fprintf (stderr, "  -n2     return unmatched lines, file 2\n");
