sandbox/acastillo/output_fields/output_gnuplot.h

    /*
    This function is an extension of output_matrix() inside "output.h" which allows
    to write 2D fields in a gnuplot-complatible format when running in MPI by
    performing a MPI_Reduce.
    */
    void output_matrix_mpi (struct OutputMatrix p)
    {
      if (p.n == 0) p.n = N;
      if (!p.fp) p.fp = stdout;
      float fn = p.n, Delta = L0/fn;
      float ** field = matrix_new (p.n, p.n, sizeof(float));
    
      for (int i = 0; i < p.n; i++) {
        float xp = Delta*i + X0 + Delta/2.;
        for (int j = 0; j < p.n; j++) {
          float yp = Delta*j + Y0 + Delta/2.;
          if (p.linear) {
            field[i][j] = interpolate (p.f, xp, yp);
          }
          else {
            Point point = locate (xp, yp);
            field[i][j] = point.level >= 0 ? val(p.f) : nodata;
          }
        }
      }
    
      if (pid() == 0) { // master
    @if _MPI
        MPI_Reduce (MPI_IN_PLACE, field[0], p.n*p.n, MPI_FLOAT, MPI_MIN, 0,MPI_COMM_WORLD);
    @endif
    
    
        fwrite (&fn, sizeof(float), 1, p.fp);
        for (int j = 0; j < p.n; j++) {
          float yp = Delta*j + Y0 + Delta/2.;
          fwrite (&yp, sizeof(float), 1, p.fp);
        }
    
        for (int i = 0; i < p.n; i++){
          float xp = Delta*i + X0 + Delta/2.;
          fwrite (&xp, sizeof(float), 1, p.fp);
          for (int j = 0; j < p.n; j++) {
            fwrite (&field[i][j], sizeof(float), 1, p.fp);
          }
        }
        fflush (p.fp);
      }
    @if _MPI
      else // slave
      MPI_Reduce (field[0], NULL, p.n*p.n, MPI_FLOAT, MPI_MIN, 0,MPI_COMM_WORLD);
    @endif
    
      matrix_free (field);
    }