sandbox/BOYD/src/outputs/progress.h

    //
    #include <math.h>
    #include <stdio.h>
    #include <time.h>
    //
    #include "my_log.h"
    
    void progress_print(double time) {
      int hours_ = (int)time;
      double minutesRemainder = (time - hours_) * 60.0;
      int minutes_ = (int)minutesRemainder;
      if (hours_ == 0) {
        fprintf(stdout, "%d minutes\n", minutes_);
      } else {
        fprintf(stdout, "%d hours & %d minutes\n", hours_, minutes_);
      }
      fflush(stdout);
    }
    
    clock_t start_time;
    static int progress_last = 0;
    double time_last = 0.;
    int WARN = 0;
    double time_per_percent_last = 1.0e6;
    double t_prev_progress = 0.;
    
    static void progress_check(int i, double t, double tend) {
      if (i == 0) {
        progress_last = 0;
        time_last = 0.;
        WARN = 0;
        time_per_percent_last = 1.0e6;
        t_prev_progress = 0.;
    #if _OPENMP
        start_time = omp_get_wtime();
    #else
        start_time = clock();
    #endif
      }
      double dt1 = t - t_prev_progress;
    #if _OPENMP
      double time = (double)(omp_get_wtime() - start_time) / 3600.0;
    #else
      double time = (double)(clock() - start_time) / CLOCKS_PER_SEC / 3600.0;
    #endif
      int triggered = 0;
      int triggered_global = 0;
    
      /// time might not be exactly the same for all processes, 
      // hence the use of the MPI reduced 
      double time_per_percent = time - time_last;
      if (time_per_percent > 2.0 * time_per_percent_last && WARN == 1) {
        triggered = 1;
      }
    
    #if _MPI
      MPI_Allreduce (&triggered, &triggered_global, 1, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
    #endif
    
      triggered_global = max(triggered_global, triggered);
    
      if (triggered_global==1){
        fprintf(stderr, "triggered %d triggered_global %d pid %d\n",triggered, triggered_global, pid());
    #ifdef SLOW_DUMP
        dump(file = "dump_slow");
    #endif
        WARN = 0;
        fprintf(stderr, "pid %d\n",pid());
        if (pid()==0){
          fprintf(stdout, "Warning: solver has slowed down a lot\n");
          fflush(stdout);
        }
      }
    
      int progress = (int)(floor(100.0 * t / (tend - dt1)));
      if (t > (tend - 1.5 * dt1)) {
        progress = 100;
      }
      if (progress != progress_last) {
    #if _OPENMP
        double time = (double)(omp_get_wtime() - start_time) / 3600.0;
    #else
        double time = (double)(clock() - start_time) / CLOCKS_PER_SEC / 3600.0;
    #endif
        double time_est = ((time - time_last) / 1.0 * (100.0 - progress));
        fprintf(stdout, "%d %%, ETR ", progress);
        fflush(stdout);
        progress_print(time_est);
        fflush(stdout);
    
        progress_last = progress;
        time_last = time;
        if (progress == 100) {
          fprintf(stdout, "Total duration: ");
          fflush(stdout);
          progress_print(time);
        }
        time_per_percent_last = time_per_percent;
        WARN = 1;
      }
      fflush(stdout);
      t_prev_progress = t;
    }