chiark / gitweb /
fixed XBITS==4
[moebius2.git] / minimise.c
index d07af5e4e5549f429a28445febb6fdc77ff1f4ba..60f2d646e08d5495f72829ee8513dfaba3011ffd 100644 (file)
@@ -62,6 +62,12 @@ static void badusage(void) {
   exit(8);
 }
 
+static sig_atomic_t quit_requested;
+
+static void sigint_handler(int ignored) {
+  quit_requested= 1;
+}
+
 int main(int argc, const char *const *argv) {
   gsl_multimin_function multimin_function;
   double size;
@@ -69,7 +75,8 @@ int main(int argc, const char *const *argv) {
   double initial_half[DIM], step_size[DIM];
   FILE *initial_f;
   gsl_vector initial_gsl, step_size_gsl;
-  int r, i;
+  int r, i, size_check_counter= 0;
+  struct sigaction sa;
 
   if (argc==3) {
     input_file= argv[1];
@@ -88,6 +95,13 @@ int main(int argc, const char *const *argv) {
   if (final_file)
     if (asprintf(&final_file_tmp,"%s.new",final_file) <= 0) diee("asprintf");
 
+  memset(&sa,0,sizeof(sa));
+  sa.sa_handler= sigint_handler;
+  sa.sa_flags= SA_RESETHAND;
+  r= sigaction(SIGINT,&sa,0);
+  if (r) diee("sigaction SIGINT");
+
+  mgraph_prepare();
   graph_layout_prepare();
   printing_init();
   energy_init();
@@ -124,17 +138,24 @@ int main(int argc, const char *const *argv) {
                                  &initial_gsl, &step_size_gsl) );
 
   for (;;) {
+    if (quit_requested) {
+      fprintf(stderr,"SIGINT caught.\n");
+      exit(1);
+    }
+
     GA( gsl_multimin_fminimizer_iterate(minimiser) );
 
-    size= gsl_multimin_fminimizer_size(minimiser);
-    r= gsl_multimin_test_size(size, stop_epsilon);
+    if (!(size_check_counter++ % DIM)) {
+      size= gsl_multimin_fminimizer_size(minimiser);
+      r= gsl_multimin_test_size(size, stop_epsilon);
 
-    if (printing_check(pr_size,215))
-      printf("r=%2d, size %# e\n", r, size);
-    flushoutput();
+      if (printing_check(pr_size,215))
+       printf("r=%2d, size %# e\n", r, size);
+      flushoutput();
 
-    if (r==GSL_SUCCESS) break;
-    assert(r==GSL_CONTINUE);
+      if (r==GSL_SUCCESS) break;
+      assert(r==GSL_CONTINUE);
+    }
   }
 
   if (final_file) {