Reorganisation of the source tree
[ghc-hetmet.git] / ghc / utils / parallel / gran-extr.pl
diff --git a/ghc/utils/parallel/gran-extr.pl b/ghc/utils/parallel/gran-extr.pl
deleted file mode 100644 (file)
index 509da49..0000000
+++ /dev/null
@@ -1,2114 +0,0 @@
-#!/usr/local/bin/perl
-##############################################################################
-# Last modified: Time-stamp: <Sat Oct 28 1995 23:49:48 Stardate: [-31]6509.75 hwloidl>
-#                                                      (C) Hans Wolfgang Loidl
-#
-# Usage: gran-extr [options] [<sim-file>]
-#
-# Takes a file <sim-file> generated by running the GrAnSim simulator and 
-# produces data files that should be used as input for gnuplot.
-# This script produces figures for:
-#   runtime of tasks
-#   percentage of communication
-#   heap allocation
-#   number of created sparks
-#   cumulative no. of tasks over runtime
-# Furthermore, it computes the correlation between runtime and heap allocation.
-#
-# Options:
-#  -g <file>  ... filename of granularity file to be produced; should end with
-#                .dat; -global and -local will be automatically inserted for 
-#                other versions. 
-#  -c <file> ... filename of communication file to be produced; should end with
-#                .dat; -global and -local will be automatically inserted for 
-#                other versions. 
-#  -s <file> ... filename of sparked-threads file to be produced; should end w/
-#                .dat; -global and -local will be automatically inserted for 
-#                other versions. 
-#  -a <file> ... filename of heap alloc. file to be produced; should end with
-#                .dat;
-#  -f <file> ... filename of communication time file to be produced; 
-#                should end with .dat;
-#  -p <file> ... filename of GNUPLOT file that is prouced and executed.
-#  -G <LIST> ... provide a list of boundaries for the Intervals used in the 
-#                granularity figure; must be a Perl list e.g. (10, 20, 50)
-#                this is interpreted as being open to left and right.
-#  -C <LIST> ... provide a list of boundaries for the Intervals used in the 
-#                communication figure; must be a Perl list e.g. (10, 20, 50)
-#                this is interpreted as being closed to left and right.
-#  -S <LIST> ... provide a list of boundaries for the Intervals used in the 
-#                sparked-threads figure; must be a Perl list e.g. (10, 20, 50)
-#                this is interpreted as being closed to left and right.
-#  -A <LIST> ... provide a list of boundaries for the Intervals used in the 
-#                heap alloc figure; must be a Perl list e.g. (10, 20, 50)
-#                this is interpreted as being closed to left and right.
-#  -F <LIST> ... provide a list of boundaries for the Intervals used in the 
-#                comm. time figure; must be a Perl list e.g. (10, 20, 50)
-#                this is interpreted as being open to left and right.
-#  -l <int>  ... left margin in the produced figures.
-#  -r <int>  ... right margin in the produced figures.
-#  -x <int>  ... enlargement of figure along x-axis.
-#  -y <int>  ... enlargement of figure along y-axis.
-#  -e <int>  ... thickness of impulses in figure.
-#  -i <rat>  ... set the gray level of the impulses to <rat>; <rat> must be
-#                between 0 and 1 with 0 meaning black. 
-#  -k <n>    ... number of klusters (oops, clusters, I mean ;)
-#  -P        ... print percentage of threads rather than absolute number of 
-#                threads on the y axis
-#  -t <file> ... use template <file> for interval settings and file names
-#                Syntax of a line in the template file:
-#                 <flag>: <arg>
-#  -T        ... use smart xtics rather than GNUPLOT default x-axis naming.
-#  -L        ... use logarithmic scale for all figures.
-#  -W        ... print warnings
-#  -m        ... generate monchrome output
-#  -h        ... help; print this text.
-#  -v        ... verbose mode.
-#
-##############################################################################
-
-# ----------------------------------------------------------------------------
-# Command line processing and initialization
-# ----------------------------------------------------------------------------
-
-require "getopts.pl";
-
-&Getopts('hvWTPDmt:L:g:f:c:s:a:p:G:F:C:S:A:l:r:x:y:e:i:k:');  
-
-do process_options();
-
-$OPEN_INT = 1;
-$CLOSED_INT = 0;
-
-if ( $opt_v ) {
-    do print_verbose_message ();
-}
-
-# ----------------------------------------------------------------------------
-# The real thing
-# ----------------------------------------------------------------------------
-
-open(INPUT,"<$input") || die "Couldn't open input file $input";
-
-do skip_header();
-
-$tot_total_rt = 0;
-$tot_rt = 0;
-$tot_bt = 0;
-$tot_ft = 0;
-$tot_it = 0;
-$gum_style_gr = 0;
-
-$line_no = 0;
-while (<INPUT>) {
-    next                     if /^--/;     # Comment lines start with --
-    next                    if /^\s*$/;   # Skip empty lines
-    $line_no++;
-    @fields = split(/[:,]/,$_);
-    $has_end = 0;
-
-    foreach $elem (@fields) {
-      foo : {
-        $pe = $1, $end = $2 , last foo   if $elem =~ /^\s*PE\s+(\d+)\s+\[(\d+)\].*$/;
-        $tn = $1, $has_end = 1  , last foo   if $elem =~ /^\s*END\s+(\w+).*$/;
-       # $tn = $1      , last foo   if $elem =~ /^\s*TN\s+(\w+).*$/;
-       $sn = $1        , last foo   if $elem =~ /^\s*SN\s+(\d+).*$/;
-        $start = $1     , last foo   if $elem =~ /^\s*ST\s+(\d+).*$/;
-        $is_global = $1 , last foo   if $elem =~ /^\s*EXP\s+(T|F).*$/;
-        $bbs = $1       , last foo   if $elem =~ /^\s*BB\s+(\d+).*$/;
-        $ha = $1        , last foo   if $elem =~ /^\s*HA\s+(\d+).*$/;
-        $rt = $1        , last foo   if $elem =~ /^\s*RT\s+(\d+).*$/;
-        $bt = $1, $bc = $2 , last foo if $elem =~ /^\s*BT\s+(\d+)\s+\((\d+)\).*$/;
-        $ft = $1, $fc = $2 , last foo if $elem =~ /^\s*FT\s+(\d+)\s+\((\d+)\).*$/;
-        $lsp = $1        , last foo   if $elem =~ /^\s*LS\s+(\d+).*$/;
-        $gsp = $1        , last foo   if $elem =~ /^\s*GS\s+(\d+).*$/;
-        $my = $1        , last foo   if $elem =~ /^\s*MY\s+(T|F).*$/;
-      }
-    }
-
-    next unless $has_end == 1;
-
-    $total_rt = $end - $start;
-    $ready_time = $total_rt - $rt - $bt - $ft;
-
-    # ------------------------------------------------------------------------
-    # Accumulate runtime, block time, fetch time and ready time over all threads
-    # ------------------------------------------------------------------------
-
-    $tot_total_rt += $total_rt;
-    $tot_rt += $rt;
-    $tot_bt += $bt;
-    $tot_ft += $ft;
-    $tot_it += $ready_time;
-
-    # ------------------------------------------------------------------------
-    # Gather statistics about `load' on the PEs
-    # ------------------------------------------------------------------------
-
-    print "WARNING: ready time of thread is <0: $ready_time\n" if $pedantic && ($ready_time <0);
-    $pe_load[$pe] += $ready_time;
-
-    if ( $opt_D ) {
-       print "Adding $ready_time to the load time of PE no. $pe yielding $pe_load[$pe]\n";
-    }
-
-    # ------------------------------------------------------------------------
-    # Gather statistics about the size of a spark site
-    # ------------------------------------------------------------------------
-
-    $site_size[$sn] += $rt;
-
-    if ( $opt_D ) {
-       print "Adding $rt to the size of site $sn yielding $site_size[$sn]\n";
-    }
-
-    # ------------------------------------------------------------------------
-    # Gather statistics about pure exec time
-    # ------------------------------------------------------------------------
-
-    push(@all_rts,$rt);
-    $sum_rt += $rt;
-    $max_rt = $rt  if $rt > $max_rt;
-
-    $index = do get_index_open_int($rt,@exec_times);
-    $exec_class[$index]++;
-
-    if ( $is_global eq 'T' ) {
-       $exec_global_class[$index]++;
-    } else {
-       $exec_local_class[$index]++;
-    }
-
-    # ------------------------------------------------------------------------
-    # Gather statistics about communication time (absolute time rather than %)
-    # ------------------------------------------------------------------------
-    
-    # Note: Communicatin time is fetch time
-
-    push(@all_fts,$ft);
-    $sum_ft += $ft;
-    $max_ft = $ft  if $ft > $max_ft;
-
-    $index = do get_index_open_int($ft,@fetch_times);
-    $fetch_class[$index]++;
-
-    if ( $is_global eq 'T' ) {
-       $fetch_global_class[$index]++;
-    } else {
-       $fetch_local_class[$index]++;
-    }
-
-    # ------------------------------------------------------------------------
-    # Gather statistics about communication percentage
-    # ------------------------------------------------------------------------
-
-    $comm_perc = ( $total_rt == 0 ? 100 : (100 * $ft)/$total_rt );
-
-    push(@all_comm_percs,$comm_perc); 
-    $sum_comm_perc += $comm_perc;
-    $max_comm_perc = $comm_perc  if $comm_perc > $max_comm_perc;
-
-    $index = do get_index_closed_int( $comm_perc, @comm_percs );
-    if ( $index != -1 ) {
-      $comm_class[$index]++;
-    } else {
-      print "WARNING: value " . $comm_perc . " not in range (t_rt=$total_rt; ft=$ft)\n" if $pedantic;
-      $outside++;
-    }
-
-    if ( $is_global eq 'T' ) {
-      if ( $index != -1 ) {
-       $comm_global_class[$index]++;
-      } else {
-        $outside_global++;
-      }
-    } else {
-      if ( $index != -1 ) {
-       $comm_local_class[$index]++;
-      } else {
-        $outside_local++;
-      }
-    }
-
-    # ------------------------------------------------------------------------
-    # Gather statistics about locally sparked threads
-    # ------------------------------------------------------------------------
-
-    push(@all_local_sparks,$lsp);
-    $sum_local_sp += $lsp;
-    $max_local_sp = $lsp  if $lsp > $max_local_sp;
-
-    $index = do get_index_open_int($lsp,@sparks);
-    $spark_local_class[$index]++;
-
-    # ------------------------------------------------------------------------
-    # Gather statistics about globally sparked threads
-    # ------------------------------------------------------------------------
-
-    push(@all_global_sparks,$gsp);
-    $sum_global_sp += $gsp;
-    $max_global_sp = $gsp  if $gsp > $max_global_sp;
-
-    $index = do get_index_open_int($gsp,@sparks);
-    $spark_global_class[$index]++;
-
-    # ------------------------------------------------------------------------
-    # Add the above two entries to get the total number of sparks
-    # ------------------------------------------------------------------------
-
-    $sp = $lsp + $gsp;
-
-    push(@all_sparks,$sp);
-    $sum_sp += $sp;
-    $max_sp = $sp  if $sp > $max_sp;
-
-    $index = do get_index_open_int($sp,@sparks);
-    $spark_class[$index]++;
-
-    # ------------------------------------------------------------------------
-    # Gather statistics about heap allocations
-    # ------------------------------------------------------------------------
-
-    push(@all_has,$ha);
-    $sum_ha += $ha;
-    $max_ha = $ha  if $ha > $max_ha;
-
-    $index = do get_index_open_int($ha,@has);
-    $ha_class[$index]++;
-
-    # do print_line($start,$end,$is_global,$bbs,$ha,$rt,$bt,$bc,$ft,$fc,$my);
-}
-
-print STDERR "You don't want to engage me for a file with just $line_no lines, do you?(N)\n" , exit (-1)         if $line_no <= 1;
-
-# ----------------------------------------------------------------------------
-
-do write_pie_chart();
-
-# ----------------------------------------------------------------------------
-# Statistics
-# ----------------------------------------------------------------------------
-
-if ( $opt_D ) {
-  print "Lengths:\n" .
-        "   all_rts: $#all_rts;\n" .
-        "   all_comm_percs: $#all_comm_percs;\n" .
-        "   all_sparks: $#all_sparks; \n" . 
-        "   all_local_sparks: $#all_local_sparks; \n" .
-        "   all_global_sparks: $#all_global_sparks; \n" . 
-        "   all_has: $#all_has\n" .
-       "   all_fts: $#all_fts;\n";
-
-
-  print "No of elems in all_rts: $#all_rts with sum $sum_rt\n";
-  print "No of elems in all_comm_percs: $#all_rts with sum $sum_comm_perc\n";
-  print "No of elems in all_has: $#all_has with sum $sum_ha\n";
-  print "No of elems in all_fts: $#all_fts with sum $sum_ft\n";
-
-}
-
-do do_statistics($line_no);
-
-# Just for debugging
-# ..................
-
-if ( $opt_D ) {
-  open(FILE,">LOG") || die "Couldn't open file LOG\n";
-  printf FILE "All total runtimes (\@all_rts:)\n";
-  printf FILE "[";
-  printf FILE join(", ",@all_rts);
-  printf FILE "]\n";
-  printf FILE "  Mean, std. dev: $mean_rt, $std_dev_rt\n";
-  printf FILE 70 x "-" . "\n";
-  printf FILE "All  communication times (\@all_fts:)\n";
-  printf FILE "[";
-  printf FILE join(", ",@all_fts);
-  printf FILE "]\n";
-  printf FILE "  Mean, std. dev: $mean_ft, $std_dev_ft\n";
-  printf FILE 70 x "-" . "\n";
-  printf FILE "All communication percentages (\@all_comm_percs:)\n";
-  printf FILE "[";
-  printf FILE join(", ",@all_comm_percs);
-  printf FILE "]\n";
-  printf FILE "  Mean, std. dev: $mean_comm_perc,$std_dev_comm_perc\n";
-  printf FILE 70 x "-" . "\n";
-  printf FILE "All  sparks  (\@all_sparks:)\n";
-  printf FILE "[";
-  printf FILE join(", ",@all_sparks);
-  printf FILE "]\n";
-  printf FILE "  Mean, std. dev: $mean_spark,$std_dev_spark\n";
-  printf FILE 70 x "-" . "\n";
-  printf FILE "All local sparks  (\@all_local_sparks:)\n";
-  printf FILE "[";
-  printf FILE join(", ",@all_local_sparks);
-  printf FILE "]\n";
-  printf FILE "  Mean, std. dev: $mean_local_spark,$std_dev_local_spark\n";
-  printf FILE 70 x "-" . "\n";
-  printf FILE "All global sparks  (\@all_global_sparks:)\n";
-  printf FILE "[";
-  printf FILE join(", ",@all_global_sparks);
-  printf FILE "]\n";
-  printf FILE "  Mean, std. dev: $mean_global_spark,$std_dev_global_spark\n";
-  printf FILE 70 x "-" . "\n";
-  printf FILE "All local sparks  (\@all_has:)\n";
-  printf FILE "[";
-  printf FILE join(", ",@all_has);
-  printf FILE "]\n";
-  printf FILE "  Mean, std. dev: $mean_ha,$std_dev_ha\n";
-  printf FILE 70 x "-" . "\n";
-
-
-  printf FILE ("CORR of runtime and heap alloc:  %f\n",$c_exec_ha);
-  printf FILE ("CORR of runtime and no. of sparks:  %f\n",$c_exec_sp);
-  printf FILE ("CORR of heap alloc and no. sparks:  %f\n",$c_ha_sp);
-  printf FILE ("CORR of runtime and local sparks:  %f\n",$c_exec_lsp);
-  printf FILE ("CORR of runtime and global sparks:  %f\n",$c_exec_gsp);
-  printf FILE ("CORR of heap alloc and local sparks:  %f\n",$c_ha_lsp);
-  printf FILE ("CORR of heap alloc and global sparks:  %f\n",$c_ha_gsp);
-  printf FILE ("CORR of runtime and communication time:  %f\n",$c_exec_ft);
-  printf FILE ("CORR of heap alloc and communication time:  %f\n",$c_ha_ft);
-  printf FILE ("CORR of local sparks and communication time:  %f\n",$c_lsp_ft);
-  printf FILE ("CORR of global_sparks and communication time:  %f\n",$c_gsp_ft);
-  close FILE;
-}
-
-if ( $opt_P ) {
-  do percentify($line_no,*exec_class);
-  do percentify($line_no,*exec_global_class);
-  do percentify($line_no,*exec_local_class);
-  do percentify($line_no,*comm_class);
-  do percentify($line_no,*comm_global_class);
-  do percentify($line_no,*comm_local_class);
-  do percentify($line_no,*spark_local_class);
-  do percentify($line_no,*spark_global_class);
-  do percentify($line_no,*ha_class);
-  do percentify($line_no,*ft_class);
-}
-
-# Produce cumulative RT graph and other (more or less) nice graphs
-# ................................................................
-
-do sort_and_cum();
-
-# ----------------------------------------------------------------------------
-
-open(IV,">INTERVALS") || die "Couldn't open file INTERVALS\n";
-do write_interval(IV, 'G', &guess_interval(@all_rts));
-do write_interval(IV, 'C', 0, int($mean_comm_perc), 
-                           int($mean_comm_perc+$std_dev_comm_perc), 50);
-do write_interval(IV, 'S', &guess_interval(@all_sparks));
-do write_interval(IV, 'A', &guess_interval(@all_has));
-close(IV);
-
-# ----------------------------------------------------------------------------
-# Print results to STDOUT (mainly for testing)
-# ----------------------------------------------------------------------------
-
-if ( $opt_v ) {
-    do print_general_info();
-}
-
-# ----------------------------------------------------------------------------
-# Write results to data files to be processed by GNUPLOT
-# ----------------------------------------------------------------------------
-
-do write_data($gran_file_name, $OPEN_INT, $logscale{'g'}, $#exec_times+1,
-              @exec_times, @exec_class);
-
-do write_data($gran_global_file_name, $OPEN_INT, $logscale{'g'}, $#exec_times+1,
-              @exec_times, @exec_global_class);
-
-do write_data($gran_local_file_name, $OPEN_INT, $logscale{'g'}, $#exec_times+1,
-              @exec_times, @exec_local_class);
-
-do write_data($comm_file_name, $CLOSED_INT, $logscale{'c'}, $#comm_percs+1,
-              @comm_percs, @comm_class);
-
-do write_data($comm_global_file_name, $CLOSED_INT, $logscale{'c'}, $#comm_percs+1,
-              @comm_percs, @comm_global_class);
-
-do write_data($comm_local_file_name, $CLOSED_INT, $logscale{'c'}, $#comm_percs+1,
-              @comm_percs, @comm_local_class);
-
-do write_data($spark_file_name, $OPEN_INT, $logscale{'s'}, $#sparks+1,
-              @sparks, @spark_class);
-
-do write_data($spark_local_file_name, $OPEN_INT, $logscale{'s'}, $#sparks+1,
-              @sparks, @spark_local_class);
-
-do write_data($spark_global_file_name, $OPEN_INT, $logscale{'s'}, $#sparks+1,
-              @sparks, @spark_global_class);
-
-do write_data($ha_file_name, $OPEN_INT, $logscale{'a'}, $#has+1,
-              @has, @ha_class);
-
-do write_data($ft_file_name, $OPEN_INT, $logscale{'g'}, $#fetch_times+1,
-              @fetch_times, @fetch_class);
-
-
-# ----------------------------------------------------------------------------
-# Run GNUPLOT over the data files and create figures
-# ----------------------------------------------------------------------------
-
-do gnu_plotify($gp_file_name); 
-
-print "Script finished successfully!\n";
-
-exit 0;
-
-# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-# ----------------------------------------------------------------------------
-# Basic Operations on the intervals
-# ----------------------------------------------------------------------------
-
-sub get_index_open_int {
-    local ($value,@list) = @_;
-    local ($index,$right);
-
-    # print "get_index: searching for index of" . $value;
-    # print " in " . join(':',@list);
-
-      $index = 0;
-      $right = $list[$index];
-      while ( ($value >= $right) && ($index < $#list) ) {
-       $index++;
-        $right = $list[$index];
-      }
-    
-      return ( ($index == $#list) && ($value > $right) ) ? $index+1 : $index;
-}
-
-# ----------------------------------------------------------------------------
-
-sub get_index_closed_int {
-    local ($value,@list) = @_;
-    local ($index,$right);
-
-      if ( ($value < $list[0]) || ($value > $list[$#list]) ) {
-         return ( -1 );
-      }
-
-      $index = 0;
-      $left = $list[$index];
-      while ( ($left <= $value) && ($index < $#list) ) {
-       $index++;
-        $left = $list[$index];
-      }
-      return ( $index-1 );
-}
-
-# ----------------------------------------------------------------------------
-# Write operations
-# ----------------------------------------------------------------------------
-
-sub write_data {
-    local ($file_name, $open_int, $logaxes, $n, @rest) = @_;
-    local (@times) = splice(@rest,0,$n);
-    local (@class) = @rest;
-
-    open(GRAN,">$file_name") || die "Couldn't open file $file_name for output";
-
-    if ( $open_int == $OPEN_INT ) {
-
-      for ($i=0, 
-           $left = ( index($logaxes,"x") != -1 ? int($times[0]/2) : 0 ), 
-           $right = 0; 
-           $i < $n; 
-           $i++, $left = $right) {
-         $right = $times[$i];
-         print GRAN int(($left+$right)/2) . "  " . 
-                    ($class[$i] eq "" ? "0" : $class[$i]) . "\n"; 
-      }
-      print GRAN $times[$n-1]+(($times[$n-1]-$times[$n-2])/2) . "  " . 
-                 ($class[$n] eq "" ? "0" : $class[$n]) . "\n";
-
-     } else {
-
-      print GRAN ( (index($logaxes,"x") != -1) && ($times[0] == 0 ? int($times[1]/2) : ($times[$1] + $times[0])/2 ) .  "  " . $class[0] . "\n");
-      for ($i=1; $i < $n-2; $i++) {
-         $left = $times[$i];
-         $right = $times[$i+1];
-         print(GRAN ($left+$right)/2 . "  " . 
-                    ($class[$i] eq "" ? "0" : $class[$i]) . "\n"); 
-      }
-      print GRAN ($times[$n-1]+$times[$n-2])/2 . "  " . $class[$n-2]  if $n >= 2;
-    }
-
-    close(GRAN);
-}
-
-# ----------------------------------------------------------------------------
-
-sub write_array {
-    local ($file_name,$n,@list) = @_;
-
-    open(FILE,">$file_name") || die "$file_name: $!";
-    for ($i=0; $i<=$#list; $i++) {
-       print FILE $i . "  " .  ( $list[$i] eq "" ? "0" : $list[$i] ) . "\n";
-    }
-
-    if ( $opt_D ) {
-       print "write_array: (" . join(", ",1 .. $#list) . ")\n for file $file_name returns: \n (0, $#list, &list_max(@list)\n";
-    } 
-
-    return ( (0, $#list, &list_max(@list), 
-              "(" . join(", ",1 .. $#list) . ")\n") );
-}
-
-# ----------------------------------------------------------------------------
-
-sub write_cumulative_data {
-    local ($file_name1,$file_name2,@list) = @_;
-    local (@ns, @elems, @xtics, $i, $j, $n, $elem, $max_clust, $xtics_str,
-           $xstart, $xend, $file_name0);
-    local ($CLUST_SZ) = $no_of_clusters;
-
-    @ns = ();
-    @elems = ();
-    $file_name0 = $file_name1;
-    $file_name0 =~ s/\.dat$//;
-    $file_name0 .= "0.dat";
-    open(CUMM,">$file_name1") || die "Couldn't open file $file_name1 (error $!)\n";
-    open(CUMM0,">$file_name0") || die "Couldn't open file $file_name0 (error $!)\n";
-
-    print CUMM "1  0\n" unless $list[0] <= 1;
-    print CUMM0 "1  0\n" unless $list[0] <= 1;;
-
-    for ($i=0; $i <= $#list; $i++) {
-       $elem = $list[$i];
-        print CUMM ($elem) . "  " . int( (100 * ($i)) / ($#list+1) ) . "\n"  unless $elem == 0;
-        print CUMM0 ($elem) . "  " . $i . "\n" unless $elem == 0;;
-       for ($n=1; $i < $#list && $list[$i+1] == $elem; $i++, $n++) { }
-
-        print CUMM "$elem  " . int( (100 * ($i+1)) / ($#list+1) ) . "\n";
-        print CUMM0 "$elem  " . ($i+1) . "\n";
-       
-
-        if ( $opt_D ) {
-           print "\n--> Insert: n:  $n (elem $elem) in the above lists yields: \n  ";
-        }
-
-        # inlined version of do insert_elem($elem, $n, $#exs, @exs, @ns)
-       for ($j=0; $j<=$#ns && $ns[$j]>$n; $j++) { }
-       if ( $j > $#ns ) {
-           push(@ns,$n);
-           push(@elems,$elem);
-       } else {
-           splice(@ns,$j,0,$n);           # insert $n at pos $j and move the
-           splice(@elems,$j,0,$elem);     # rest of the array to the right
-       }
-
-        if ( $opt_D ) {
-           print "[" . join(", ",@ns) . "]" . "\n and \n" . 
-                 "[" . join(", ",@elems) . "]\n";
-        }
-      
-    }
-
-    close(CUMM);
-    close(CUMM0);
-
-    open(CLUSTERS_ALL,">" . (&dirname($file_name2)) . "CL-" .
-                     &basename($file_name2)) 
-        || die "Couldn't open file CL-$file_name2 (error $!)\n";
-    for ($i=0; $i <= $#ns; $i++) {
-       print CLUSTERS_ALL "$elems[$i]  $ns[$i]\n";
-    }
-    close(CLUSTERS_ALL);
-
-    # Interesting are only the first parts of the list (clusters!)
-    splice(@elems, $CLUST_SZ);
-    splice(@ns, $CLUST_SZ);
-
-    open(CLUSTERS,">$file_name2") || die "Couldn't open file $file_name2 (error $!)\n";
-
-    $xstart = &list_min(@elems);
-    $xend =   &list_max(@elems);
-    $step = ($xend - $xstart) / ( $CLUST_SZ == 1 ? 1 : ($CLUST_SZ-1));
-
-    @xtics = ();
-    for ($i=0, $x=$xstart; $i <= $#ns; $i++, $x+=$step) {
-       print CLUSTERS "$x  $ns[$i]\n";
-       push(@xtics,"\"$elems[$i]\" $x");
-    }
-    close(CLUSTERS);
-
-    $max_clust = $ns[0];
-    $xtics_str = "(" . join(", ",@xtics) . ")\n";
-
-    return ( ($xstart, $xend, $max_clust, $xtics_str) );
-}
-
-# ----------------------------------------------------------------------------
-
-sub get_xtics {
-    local ($open_int, @list) = @_;
-
-    local ($str);
-
-    if ( $open_int == $OPEN_INT ) { 
-      $last = pop(@list);
-      $str = "( \">0\" 0";
-      foreach $x (@list) {
-         $str .= ", \">$x\" $x";
-      }
-      $str .= ", \"Large\" $last)\n";
-    } else { 
-      $left = shift(@list);
-      $right = shift(@list)  if $#list >= 0;
-      $last  = pop(@list)    if $#list >= 0;
-      $str = "( \"$left-$right\" " . $left;
-      $left = $right;
-      foreach $right (@list) {
-         $str .= ", \"$left-$right\" " . ($left+$right)/2;
-         $left = $right;
-      }
-      $str .= ", \"$left-$last\" " . $last .")\n"   unless $last eq "";
-    }
-    return $str;
-}
-
-# ----------------------------------------------------------------------------
-
-sub print_line {
-    local ($start,$end,$is_global,$bbs,$ha,$rt,$bt,$bc,$ft,$fc,$my) = @_;
-
-    printf("START: %u, END: %u  ==> tot_exec: %u\n",
-           $start,$end,$end-$start);
-    printf("  BASIC_BLOCKS: %u, HEAP_ALLOCATIONS: %u \n",$bbs,$ha);
-    printf("  TOT_EXEC: %u = RUN_TIME %u + BLOCK_TIME %u + FETCH_TIME %u\n",
-           $end-$start,$rt,$bt,$ft);
-    printf("  BLOCK_TIME %u / BLOCK_COUNT %u; FETCH_TIME %u / FETCH_COUNT %u\n",
-          $bt,$bc,$ft,$fc);
-    printf("  %s  %s\n",
-           $is_global eq 'T' ? "GLOBAL" : "LOCAL",
-           $my eq 'T' ? "MANDATORY" : "NOT MANDATORY"); 
-}
-           
-# ----------------------------------------------------------------------------
-
-sub gnu_plotify {
-  local ($gp_file_name) = @_;
-
-  local (@open_xrange,@closed_xrang,@spark_xrange,@ha_xrange, @ft_range,
-         $exec_xtics,$comm_perc_xtics,$spark_xtics,$has_xtics,
-        $cumu0_rts_file, $cumu0_has_file, $cumu0_fts_file);
-
- $cumu0_rts_file = $cumulat_rts_file_name;
- $cumu0_rts_file =~ s/\.dat$//;
- $cumu0_rts_file .= "0.dat";
-
- $cumu0_has_file = $cumulat_has_file_name;
- $cumu0_has_file =~ s/\.dat$//;
- $cumu0_has_file .= "0.dat";
-
- $cumu0_fts_file = $cumulat_fts_file_name;
- $cumu0_fts_file =~ s/\.dat$//;
- $cumu0_fts_file .= "0.dat";
-
- $cumu0_cps_file = $cumulat_cps_file_name;
- $cumu0_cps_file =~ s/\.dat$//;
- $cumu0_cps_file .= "0.dat";
-
-  @open_xrange = &range($OPEN_INT,$logscale{'g'},@exec_times);
-  @closed_xrange = &range($CLOSED_INT,$logscale{'c'},@comm_percs);
-  @spark_xrange = &range($OPEN_INT,$logscale{'s'},@sparks);
-  @ha_xrange = &range($OPEN_INT,$logscale{'a'},@has);
-  @ft_xrange = &range($OPEN_INT,$logscale{'f'},@fts);
-
-  $exec_xtics = $opt_T ? &get_xtics($OPEN_INT,@exec_times) : "" ;
-  $comm_perc_xtics = $opt_T ? &get_xtics($CLOSED_INT,@comm_percs) : "";
-  $spark_xtics = $opt_T ? &get_xtics($OPEN_INT,@sparks) : "";
-  $has_xtics = $opt_T ? &get_xtics($OPEN_INT,@has) : "";
-  $fts_xtics = $opt_T ? &get_xtics($OPEN_INT,@fts) : "";
-
-  open(GP_FILE,">$gp_file_name") || 
-      die "Couldn't open gnuplot file $gp_file_name for output\n";
-
-  if ( $opt_m ) {
-      print GP_FILE "set term postscript \"Roman\" 20\n";
-  } else {
-      print GP_FILE "set term postscript color \"Roman\" 20\n";
-  }
-
-  do write_gp_record(GP_FILE,
-                     $gran_file_name, &dat2ps_name($gran_file_name),
-                     "Granularity (pure exec. time)", $ylabel, $logscale{'g'},
-                     @open_xrange,$max_rt_class,$exec_xtics);
-  do write_gp_record(GP_FILE,
-                     $gran_global_file_name, &dat2ps_name($gran_global_file_name),
-                     "Granularity (pure exec. time) of exported threads",
-                     $ylabel, $logscale{'g'},
-                     @open_xrange,$max_rt_global_class,$exec_xtics);
-  do write_gp_record(GP_FILE,
-                     $gran_local_file_name, &dat2ps_name($gran_local_file_name),
-                     "Granularity (pure exec. time) of not exported threads",
-                     $ylabel,$logscale{'g'},
-                     @open_xrange,$max_rt_local_class,$exec_xtics);
-
-  do write_gp_record(GP_FILE,
-                     $comm_file_name, &dat2ps_name($comm_file_name),
-                     "% of communication",$ylabel,$logscale{'c'},
-                     @closed_xrange,$max_comm_perc_class,$comm_perc_xtics);
-  do write_gp_record(GP_FILE,
-                     $comm_global_file_name, &dat2ps_name($comm_global_file_name),
-                     "% of communication of exported threads",$ylabel,$logscale{'c'},
-                     @closed_xrange,$max_comm_perc_global_class,$comm_perc_xtics);
-  do write_gp_record(GP_FILE,
-                     $comm_local_file_name, &dat2ps_name($comm_local_file_name),
-                     "% of communication of not exported threads",$ylabel,$logscale{'c'},
-                     @closed_xrange,$max_comm_perc_local_class,$comm_perc_xtics);
-  do write_gp_record(GP_FILE,
-                     $ft_file_name, &dat2ps_name($ft_file_name),
-                     "Communication time", $ylabel, $logscale{'g'},
-                     @open_xrange,$max_ft_class,$fts_xtics);
-
-
-  do write_gp_record(GP_FILE,
-                     $spark_file_name, &dat2ps_name($spark_file_name),
-                     "No. of sparks created", $ylabel, $logscale{'s'},
-                     @spark_xrange,$max_spark_class,$spark_xtics);
-
-  do write_gp_record(GP_FILE,
-                     $spark_local_file_name, &dat2ps_name($spark_local_file_name),
-                     "No. of sparks created (parLocal)", $ylabel, $logscale{'s'},
-                     @spark_xrange,$max_spark_local_class,$spark_xtics);
-
-  do write_gp_record(GP_FILE,
-                     $spark_global_file_name, &dat2ps_name($spark_global_file_name),
-                     "No. of sparks created (parGlobal)", $ylabel, $logscale{'s'},
-                     @spark_xrange,$max_spark_global_class,$spark_xtics);
-
-  do write_gp_record(GP_FILE,
-                     $ha_file_name, &dat2ps_name($ha_file_name),
-                     "Heap Allocations (words)", $ylabel, $logscale{'a'},
-                     @ha_xrange,$max_ha_class,$has_xtics);
-
-  do write_gp_lines_record(GP_FILE,
-                           $cumulat_rts_file_name, &dat2ps_name($cumulat_rts_file_name),
-                           "Cumulative pure exec. times","% of threads",
-                          $logscale{'Cg'},
-                           $xend_cum_rts, $yend_cum_rts,""); 
-                           # $xtics_cluster_rts as last arg?
-
-  do write_gp_lines_record(GP_FILE,
-                           $cumulat_has_file_name, &dat2ps_name($cumulat_has_file_name),
-                           "Cumulative heap allocations","% of threads",
-                          $logscale{'Ca'},
-                           $xend_cum_has, $yend_cum_has,"");
-                           #  $xtics_cluster_has as last arg?
-
-  do write_gp_lines_record(GP_FILE,
-                           $cumu0_rts_file, &dat2ps_name($cumu0_rts_file),
-                           "Cumulative pure exec. times","Number of threads",
-                          $logscale{'Cg'},
-                           $xend_cum_rts, $yend_cum0_rts,""); 
-                           # $xtics_cluster_rts as last arg?
-
-  do write_gp_lines_record(GP_FILE,
-                           $cumu0_has_file, &dat2ps_name($cumu0_has_file),
-                           "Cumulative heap allocations","Number of threads",
-                          $logscale{'Ca'},
-                           $xend_cum_has, $yend_cum0_has,"");
-                           #  $xtics_cluster_has as last arg?
-
-  do write_gp_lines_record(GP_FILE,
-                           $cumulat_fts_file_name, &dat2ps_name($cumulat_fts_file_name),
-                           "Cumulative communication times","% of threads",
-                          $logscale{'Cg'},
-                           $xend_cum_fts, $yend_cum_fts,""); 
-                           # $xtics_cluster_rts as last arg?
-
-  do write_gp_lines_record(GP_FILE,
-                           $cumu0_fts_file, &dat2ps_name($cumu0_fts_file),
-                           "Cumulative communication times","Number of threads",
-                          $logscale{'Cg'},
-                           $xend_cum_fts, $yend_cum0_fts,""); 
-                           # $xtics_cluster_rts as last arg?
-
-  do write_gp_lines_record(GP_FILE,
-                           $cumulat_cps_file_name, &dat2ps_name($cumulat_cps_file_name),
-                           "Cumulative communication percentages","% of threads",
-                          "",  # No logscale here !
-                           $xend_cum_cps, $yend_cum_cps,""); 
-                           # $xtics_cluster_rts as last arg?
-
-  do write_gp_lines_record(GP_FILE,
-                           $cumu0_cps_file, &dat2ps_name($cumu0_cps_file),
-                           "Cumulative communication percentages","Number of threads",
-                          "",  # No logscale here !
-                           $xend_cum_cps, $yend_cum0_cps,""); 
-                           # $xtics_cluster_rts as last arg?
-
-  do write_gp_record(GP_FILE,
-                     $clust_rts_file_name, &dat2ps_name($clust_rts_file_name),
-                     "Pure exec. time", "No. of threads", $logscale{'CG'},
-                     $xstart_cluster_rts,$xend_cluster_rts,$max_cluster_rts,$xtics_cluster_rts);
-
-  do write_gp_record(GP_FILE,
-                     $clust_has_file_name, &dat2ps_name($clust_has_file_name),
-                     "Pure exec. time", "No. of threads", $logscale{'CA'},
-                     $xstart_cluster_has,$xend_cluster_has,$max_cluster_has,$xtics_cluster_has);
-
-  do write_gp_record(GP_FILE,
-                     $clust_fts_file_name, &dat2ps_name($clust_fts_file_name),
-                     "Communication time", "No. of threads", $logscale{'CG'},
-                     $xstart_cluster_fts,$xend_cluster_fts,$max_cluster_fts,$xtics_cluster_rts);
-
-
-  do write_gp_simple_record(GP_FILE,
-                     $pe_file_name, &dat2ps_name($pe_file_name),
-                     "Processing Elements (PEs)", "Ready Time (not running)", 
-                     $logscale{'Yp'},$xstart_pe,$xend_pe,$max_pe,$xtics_pe);
-
-  do write_gp_simple_record(GP_FILE,
-                     $sn_file_name, &dat2ps_name($sn_file_name),
-                     "Spark sites", "Pure exec. time", 
-                     $logscale{'Ys'},$xstart_sn,$xend_sn,$max_sn,$xtics_sn);
-
-  close GP_FILE;
-
-  print "Gnu plotting figures ...\n";
-  system "gnuplot $gp_file_name";
-
-  print "Extending thickness of impulses ...\n";
-  do gp_ext($gran_file_name,
-            $gran_global_file_name,
-           $gran_local_file_name,
-           $comm_file_name,
-           $comm_global_file_name,
-           $comm_local_file_name,
-           $spark_file_name,
-           $spark_local_file_name,
-           $spark_global_file_name,
-           $ha_file_name,
-           $ft_file_name,
-           $clust_fts_file_name,
-           $clust_rts_file_name,
-           $clust_has_file_name,
-            $pe_file_name,
-           $sn_file_name
-  );
-
-
-}
-
-# ----------------------------------------------------------------------------
-
-sub gp_ext {
-    local (@file_names) = @_;
-    local ($file_name);
-    local ($ps_file_name);
-    local ($prg);
-
-    #$prg = system "which gp-ext-imp";
-    #print "  Using script $prg for impuls extension\n";
-    $prg = $ENV{GRANDIR} ? $ENV{GRANDIR} . "/bin/gp-ext-imp" 
-                        : $ENV{HOME} . "/bin/gp-ext-imp" ;
-    if ( $opt_v ) {
-       print "    (using script $prg)\n";
-    }
-
-    foreach $file_name (@file_names) {
-       $ps_file_name = &dat2ps_name($file_name);
-        system "$prg -w $ext_size -g $gray " . 
-               $ps_file_name  . " " . 
-               $ps_file_name . "2" ;
-        system "mv " . $ps_file_name . "2 " . $ps_file_name;
-    }
-}
-
-# ----------------------------------------------------------------------------
-
-sub write_gp_record {
-    local ($file,$in_file,$out_file,$xlabel,$ylabel,$logaxes,
-           $xstart,$xend,$ymax,$xtics) = @_;
-
-    if ( $xstart >= $xend ) {
-       print ("WARNING: empty xrange [$xstart:$xend] changed to [$xstart:" . $xstart+1 . "]\n")        if ( $pedantic || $opt_v );
-       $xend = $xstart + 1;    
-    }
-
-    if ( $ymax <=0 ) {
-       $ymax = 2;
-       print "WARNING: empty yrange changed to [0:$ymax]\n"   if ( $pedantic || $opt_v );
-    }
-
-    $str = "set size " . $xsize . "," . $ysize . "\n" .
-           "set xlabel \"" . $xlabel . "\"\n" .
-           "set ylabel \"" . $ylabel . "\"\n" .
-           ($xstart eq "" ? "" 
-                          : "set xrange [" . int($xstart) .":" . int($xend) . "]\n") .
-           ($ymax eq "" ? "" 
-                        : "set yrange [" . (index($logaxes,"y") != -1 ? 1 : 0) . 
-                          ":" . &list_max(2,int($ymax+$ymax/5)) . "]\n") .
-           ($xtics ne "" ? "set xtics $xtics" : "") . 
-          "set tics out\n" .
-           "set border\n" .
-           "set title \"$nPEs PEs\"\n" .
-          "set nokey \n" .
-           "set nozeroaxis\n" .
-          "set format xy \"%g\"\n" .
-           (index($logaxes,"x") != -1 ? 
-               "set logscale x\n" : 
-               "set nologscale x\n") .
-           (index($logaxes,"y") != -1 ? 
-               "set logscale y\n" : 
-               "set nologscale y\n") .
-           "set output \"" . $out_file . "\"\n" .
-          "plot \"" . $in_file . "\" with impulses\n\n";
-    print $file $str;
-}
-
-# ----------------------------------------------------------------------------
-
-sub write_gp_lines_record {
-    local ($file,$in_file,$out_file,$xlabel,$ylabel,$logaxes,
-           $xend,$yend,$xtics) = @_;
-
-    local ($str);
-
-    $str = "set xlabel \"" . $xlabel . "\"\n" .
-           "set ylabel \"" . $ylabel . "\"\n" .
-          "set xrange [" . ( index($logaxes,"x") != -1 ? 1 : 0 ) . ":$xend]\n" .
-          "set yrange [" . ( index($logaxes,"y") != -1 ? 1 : 0 ) . ":$yend]\n" .
-           "set border\n" .
-           "set nokey\n" .
-           ( $xtics ne "" ? "set xtics $xtics" : "" ) .
-           (index($logaxes,"x") != -1 ? 
-               "set logscale x\n" : 
-               "set nologscale x\n") .
-           (index($logaxes,"y") != -1 ? 
-               "set logscale y\n" : 
-               "set nologscale y\n") .
-           "set nozeroaxis\n" .
-          "set format xy \"%g\"\n" .
-           "set output \"" . $out_file . "\"\n" .
-          "plot \"" . $in_file . "\" with lines\n\n";
-    print $file $str;
-}
-
-
-# ----------------------------------------------------------------------------
-
-sub write_gp_simple_record {
-    local ($file,$in_file,$out_file,$xlabel,$ylabel,$logaxes,
-           $xstart,$xend,$ymax,$xtics) = @_;
-
-    $str = "set size " . $xsize . "," . $ysize . "\n" .
-           "set xlabel \"" . $xlabel . "\"\n" .
-           "set ylabel \"" . $ylabel . "\"\n" .
-           ($xstart eq "" ? "" 
-                          : "set xrange [" . int($xstart) .":" . int($xend) . "]\n") .
-           ($ymax eq "" ? "" 
-                        : "set yrange [" . (index($logaxes,"y") != -1 ? 1 : 0) . 
-                          ":" . &list_max(2,int($ymax+$ymax/5)) . "]\n") .
-           ($xtics ne "" ? "set xtics $xtics" : "") . 
-           "set border\n" .
-           "set nokey\n" .
-          "set tics out\n" .
-           "set nozeroaxis\n" .
-          "set format xy \"%g\"\n" .
-           (index($logaxes,"x") != -1 ? 
-               "set logscale x\n" : 
-               "set nologscale x\n") .
-           (index($logaxes,"y") != -1 ? 
-               "set logscale y\n" : 
-               "set nologscale y\n") .
-           "set output \"" . $out_file . "\"\n" .
-          "plot \"" . $in_file . "\" with impulses\n\n";
-    print $file $str;
-}
-
-# ----------------------------------------------------------------------------
-
-sub dat2ps_name {
-    local ($dat_name) = @_;
-
-    $dat_name =~ s/\.dat$/\.ps/;
-    return ($dat_name);
-}
-
-# ----------------------------------------------------------------------------
-
-sub range {
-    local ($open_int, $logaxes, @ints) = @_;
-
-    local ($range, $left_margin, $right_margin);
-
-    $range = $ints[$#ints]-$ints[0];
-    $left_margin = 0; # $range/10;
-    $right_margin = 0; # $range/10;
-
-    if ( $opt_D ) {
-       print "\n==> Range: logaxes are $logaxes i.e. " . 
-          (index($logaxes,"x") != -1 ? "matches x axis\n" 
-                                     : "DOESN'T match x axis\n"); 
-    }
-    if ( index($logaxes,"x") != -1 ) {
-       if ( $open_int == $OPEN_INT ) {
-           return ( ($ints[0]/2-$left_margin, 
-                     $ints[$#ints]+($ints[$#ints]-$ints[$#ints-1])/2+$right_margin) );
-       } else {
-           return ( ( &list_max(1,$ints[0]-$left_margin), 
-                      $ints[$#ints]+($ints[$#ints]-$ints[$#ints-1])/2+$right_margin) );
-       }
-    } else {
-       if ( $open_int == $OPEN_INT ) {
-           return ( ($ints[0]/2-$left_margin, 
-                     $ints[$#ints]+($ints[$#ints]-$ints[$#ints-1])/2+$right_margin) );
-       } else {
-           return ( ($ints[0]-$left_margin, 
-                     $ints[$#ints]+($ints[$#ints]-$ints[$#ints-1])/2+$right_margin) );
-       }
-    }
-}
-
-# ----------------------------------------------------------------------------
-
-sub percentify {
-    local ($sum,*classes) = @_;
-
-    for ($i=0; $i<=$#classes; $i++) {
-       $classes[$i] = (100 * $classes[$i]) / $sum;
-    }
-}
-
-# ----------------------------------------------------------------------------
-# ToDo: get these statistics functions from "stat.pl"
-# ----------------------------------------------------------------------------
-
-sub mean_std_dev {
-    local ($sum,@list) = @_;
-
-    local ($n, $s, $s_);
-
-    #print "\nmean_std_dev: sum is $sum ; list has length $#list";
-
-    $n = $#list+1;
-    $mean_value = $sum/$n;
-
-    $s_ = 0;
-    foreach $x (@list) {
-       $s_ += $x;
-        $s += ($mean_value - $x) ** 2;  
-    }
-    if ( $sum != $s_ ) {
-      print "ERROR in mean_std_dev: provided sum is wrong  " .
-            "(provided: $sum; computed: $s_)\n"; 
-      print " list_sum: " . &list_sum(@list) . "\n";
-      exit (2);
-    }
-
-    return ( ($mean_value, sqrt($s / ($n - 1)) ) );
-}
-
-# ----------------------------------------------------------------------------
-
-sub _mean_std_dev {
-    return ( &mean_std_dev(&list_sum(@_), @_) );
-}
-
-# ----------------------------------------------------------------------------
-# Compute covariance of 2 vectors, having their sums precomputed.
-# Input: $n   ... number of all elements in @list_1 as well as in @list_2
-#                 (i.e. $n = $#list_1+1 = $#list_2+1).
-#        $mean_1 ... mean value of all elements in @list_1
-#        @list_1 ... list of integers; first vector
-#        $mean_2 ... mean value of all elements in @list_2
-#        @list_2 ... list of integers; first vector
-# Output: covariance of @list_1 and @list_2 
-# ----------------------------------------------------------------------------
-
-sub cov {
-    local ($n, $mean_1, @rest) = @_;
-    local (@list_1) = splice(@rest,0,$n);
-    local ($mean_2, @list_2) = @rest;
-
-    local ($i,$s,$s_1,$s_2);
-
-    for ($i=0; $i<$n; $i++) {
-       $s_1 += $list_1[$i];
-       $s_2 += $list_2[$i];
-       $s += ($mean_1 - $list_1[$i]) * ($mean_2 - $list_2[$i]);
-    }
-    if ( $mean_1 != ($s_1/$n) ) {
-      print "ERROR in cov: provided mean value is wrong " . 
-            "(provided: $mean_1; computed: " . ($s_1/$n) . ")\n"; 
-      exit (2);
-    }
-    if ( $mean_2 != ($s_2/$n) ) {
-      print "ERROR in cov: provided mean value is wrong " .
-            "(provided: $mean_2; computed: " . ($s_2/$n) . ")\n"; 
-      exit (2);
-    }
-    return ( $s / ($n - 1) ) ;
-}
-
-# ----------------------------------------------------------------------------
-# Compute correlation of 2 vectors, having their sums precomputed.
-# Input: $n   ... number of all elements in @list_1 as well as in @list_2
-#                 (i.e. $n = $#list_1+1 = $#list_2+1).
-#        $sum_1 ... sum of all elements in @list_1
-#        @list_1 ... list of integers; first vector
-#        $sum_2 ... sum of all elements in @list_2
-#        @list_2 ... list of integers; first vector
-# Output: correlation of @list_1 and @list_2 
-# ----------------------------------------------------------------------------
-
-sub corr {
-    local ($n, $sum_1, @rest) = @_;
-    local (@list_1) = splice(@rest,0,$n);
-    local ($sum_2, @list_2) = @rest;
-       
-    local ($mean_1,$mean_2,$std_dev_1,$std_dev_2);
-
-    if ( $opt_D ) {
-      print "\ncorr: n=$n  sum_1=$sum_1  sum_2=$sum_2\n";
-      print "     list_sum of list_1=" . &list_sum(@list_1) . 
-              "   list_sum of list_2=" . &list_sum(@list_2) . "\n";
-      print "     len of list_1=$#list_1  len of list_2=$#list_2\n";
-    }
-
-    ($mean_1, $std_dev_1) = &mean_std_dev($sum_1,@list_1);
-    ($mean_2, $std_dev_2) = &mean_std_dev($sum_2,@list_2);
-
-    if ( $opt_D ) {
-      print "corr: $mean_1, $std_dev_1; $mean_2, $std_dev_2\n";
-    }
-
-    return ( ($std_dev_1 * $std_dev_2) == 0  ?
-               0 : 
-               &cov($n, $mean_1, @list_1, $mean_2, @list_2) / 
-              ( $std_dev_1 * $std_dev_2 ) );
-}
-
-# ----------------------------------------------------------------------------
-
-sub list_sum {
-    local (@list) = @_;
-
-    local ($sum);
-
-    foreach $x (@list) {
-       $sum += $x;
-    }
-
-    return ($sum);
-}
-
-# ----------------------------------------------------------------------------
-
-sub list_max {
-    local (@list) = @_;
-
-    local ($max) = shift;
-
-    foreach $x (@list) {
-       $max = $x  if $x > $max;
-    }
-
-    return ($max);
-}
-
-# ----------------------------------------------------------------------------
-
-sub list_min {
-    local (@list) = @_;
-
-    local ($min) = shift;
-
-    foreach $x (@list) {
-       $min = $x  if $x < $min;
-    }
-
-    return ($min);
-}
-
-# ----------------------------------------------------------------------------
-
-sub guess_interval {
-    local (@list) = @_ ;
-
-    local ($min,$max,$sum,$mean,$std_dev,@intervals);
-
-    $min = &list_min(@list);
-    $max = &list_max(@list);
-    $sum = &list_sum(@list);
-    ($mean, $std_dev) = &mean_std_dev($sum,@list);
-
-    @intervals = (int($mean-$std_dev),int($mean-$std_dev/2),int($mean),
-                  int($mean+$std_dev/2),int($mean+$std_dev));
-
-    while ($#intervals>=0 && $intervals[0]<0) {
-       shift(@intervals);
-    }
-
-    return (@intervals);
-}
-
-# ----------------------------------------------------------------------------
-
-sub write_interval {
-    local ($file,$flag,@intervals) = @_;
-
-    printf $file "$flag: (" . join(", ",@intervals) . ")\n";
-}
-# ----------------------------------------------------------------------------
-
-sub read_template {
-
-    if ( $opt_v ) {
-       print "Reading settings from template file $templ_file_name ...\n";
-    }
-
-    open(TEMPLATE,$templ_file_name) || die "Couldn't open file $templ_file_name";
-    while (<TEMPLATE>) {
-      next if /^\s*$/ || /^--/;
-      if (/^\s*G[:,;.\s]+([^\n]+)$/) {
-         $list_str = $1;
-          $list_str =~ s/[\(\)\[\]]//g;
-          @exec_times = split(/[,;. ]+/, $list_str);
-      } elsif (/^\s*F[:,;.\s]+([^\n]+)$/) {
-         $list_str = $1;
-          $list_str =~ s/[\(\)\[\]]//g;
-          @fetch_times = split(/[,;. ]+/, $list_str);
-      } elsif (/^\s*A[:,;.\s]+([^\n]+)$/) {
-         $list_str = $1;
-          $list_str =~ s/[\(\)\[\]]//g;
-          @has = split(/[,;. ]+/, $list_str);
-      } elsif (/^\s*C[:,;.\s]+([^\n]+)$/) {
-         $list_str = $1;
-          $list_str =~ s/[\(\)\[\]]//g;
-          @comm_percs = split(/[,;. ]+/, $list_str);
-      } elsif (/^\s*S[:,;.\s]+([^\n]+)$/) {
-         $list_str = $1;
-          $list_str =~ s/[\(\)\[\]]//g;
-          @sparks = split(/[,;. ]+/, $list_str);
-      } elsif (/^\s*g[:,;.\s]+([\S]+)$/) {
-         ($gran_file_name,$gran_global_file_name, $gran_local_file_name) = 
-           &mk_global_local_names($1);
-      } elsif (/^\s*f[:,;.\s]+([\S]+)$/) {
-         ($ft_file_name,$ft_global_file_name, $ft_local_file_name) = 
-           &mk_global_local_names($1);
-      } elsif (/^\s*c[:,;.\s]+([\S]+)$/) {
-         ($comm_file_name, $comm_global_file_name, $comm_local_file_name) = 
-           &mk_global_local_names($1);
-      } elsif (/^\s*s[:,;.\s]+([\S]+)$/) {
-         ($spark_file_name, $spark_global_file_name, $spark_local_file_name) = 
-           &mk_global_local_names($1);
-      } elsif (/^\s*a[:,;.\s]+([\S]+)$/) {
-         ($ha_file_name, $ha_global_file_name, $ha_local_file_name) = 
-           &mk_global_local_names($1);
-      } elsif (/^\s*p[:,;.\s]+([\S]+)$/) {
-         $gp_file_name = $1;
-        $ps_file_name = &dat2ps_name($gp_file_name);
-
-      } elsif (/^\s*Xcorr[:,;.\s]+([\S]+)$/) {
-         $corr_file_name = $1;
-      } elsif (/^\s*Xcumulat-rts[:,;.\s]+([\S]+)$/) {
-         $cumulat_rts_file_name = $1;
-      } elsif (/^\s*Xcumulat-has[:,;.\s]+([\S]+)$/) {
-         $cumulat_has_file_name = $1;
-      } elsif (/^\s*Xcumulat-fts[:,;.\s]+([\S]+)$/) {
-         $cumulat_fts_file_name = $1;
-      } elsif (/^\s*Xcumulat-cps[:,;.\s]+([\S]+)$/) {
-         $cumulat_cps_file_name = $1;
-      } elsif (/^\s*Xclust-rts[:,;.\s]+([\S]+)$/) {
-         $clust_rts_file_name = $1;
-      } elsif (/^\s*Xclust-has[:,;.\s]+([\S]+)$/) {
-         $clust_has_file_name = $1;
-      } elsif (/^\s*Xclust-fts[:,;.\s]+([\S]+)$/) {
-         $clust_fts_file_name = $1;
-      } elsif (/^\s*Xclust-cps[:,;.\s]+([\S]+)$/) {
-         $clust_cps_file_name = $1;
-      } elsif (/^\s*Xpe[:,;.\s]+([\S]+)$/) {
-         $pe_file_name = $1;
-      } elsif (/^\s*Xsn[:,;.\s]+([\S]+)$/) {
-         $sn_file_name = $1;
-
-      } elsif (/^\s*XRTS[:,;.\s]+([\S]+)$/) {
-         $rts_file_name = $1;
-      } elsif (/^\s*XHAS[:,;.\s]+([\S]+)$/) {
-         $has_file_name = $1;
-      } elsif (/^\s*XFTS[:,;.\s]+([\S]+)$/) {
-         $fts_file_name = $1;
-      } elsif (/^\s*XLSPS[:,;.\s]+([\S]+)$/) {
-         $lsps_file_name = $1;
-      } elsif (/^\s*XGSPS[:,;.\s]+([\S]+)$/) {
-         $gsps_file_name = $1;
-      } elsif (/^\s*XCPS[:,;.\s]+([\S]+)$/) {
-         $cps_file_name = $1;
-      } elsif (/^\s*XCCPS[:,;.\s]+([\S]+)$/) {
-         $ccps_file_name = $1;
-
-      } elsif (/^\s*\-[:,;.\s]+([\S]+)$/) {
-         $input = $1;
-      } elsif (/^\s*L[:,;\s]+(.*)$/) {
-        $str = $1;
-        %logscale = ('g',"xy",'a',"xy",'Cg',"xy",'Ca',"xy",'Yp',"y",'Ys',"y") , next  if $str eq ".";
-         $str =~ s/[\(\)\[\]]//g;
-         %logscale = split(/[,;. ]+/, $str);
-      } elsif (/^\s*i[:,;.\s]+([\S]+)$/) {
-        $gray = $1;
-      } elsif (/^\s*k[:,;.\s]+([\S]+)$/) {
-        $no_of_clusters = $1;
-      } elsif (/^\s*e[:,;.\s]+([\S]+)$/) {
-        $ext_size = $1;
-      } elsif (/^\s*v.*$/) {
-        $verbose = 1;
-      } elsif (/^\s*T.*$/) {
-        $opt_T = 1;
-      } elsif (/^\s*m.*$/) {
-        $opt_m = 1;
-     }
-  }
-  close(TEMPLATE);
-}      
-
-# ----------------------------------------------------------------------------
-
-sub mk_global_local_names { 
-    local ($file_name) = @_;
-
-    $file_name .= ".dat" unless $file_name =~ /\.dat$/;
-    $global_file_name = $file_name; 
-    $global_file_name =~ s/\.dat/\-global\.dat/ ;
-    $local_file_name = $file_name; 
-    $local_file_name =~ s/\.dat/\-local\.dat/ ;
-
-    return ( ($file_name, $global_file_name, $local_file_name) );
-}
-
-# ----------------------------------------------------------------------------
-
-# ----------------------------------------------------------------------------
-
-sub pre_process {
-    local ($lines) = @_;
-
-    local (@all_rts, @all_comm_percs, @all_sparks, @all_local_sparks, 
-           @all_global_sparks, @all_has, @fields,
-           $line_no, $elem, $total_rt, $comm_perc,
-           $pe, $start, $end, $is_global, $bbs, $ha, $rt, $bt, $ft, 
-           $lsp, $gsp, $my);
-
-    if ( $opt_v ) {
-       print "Preprocessing file $input ... \n";
-    }
-
-    open(INPUT,"<$input") || die "Couldn't open input file $input";
-
-    do skip_header();
-
-    $line_no = 0;
-    while (<INPUT>) {
-       $line_no++;
-       last  if $line_no > $lines;
-       
-       @fields = split(/,/,$_);
-       
-       foreach $elem (@fields) {
-           foo : {
-               $pe = $1        , last foo   if $elem =~ /^\s*PE\s+(\d+).*$/;
-               $start = $1     , last foo   if $elem =~ /^\s*ST\s+(\d+).*$/;
-               $end = $1       , last foo   if $elem =~ /^\s*END\s+(\d+).*$/;
-               $is_global = $1 , last foo   if $elem =~ /^\s*GBL\s+(T|F).*$/;
-               $bbs = $1       , last foo   if $elem =~ /^\s*BB\s+(\d+).*$/;
-               $ha = $1        , last foo   if $elem =~ /^\s*HA\s+(\d+).*$/;
-               $rt = $1        , last foo   if $elem =~ /^\s*RT\s+(\d+).*$/;
-               $bt = $1, $bc = $2 , last foo if $elem =~ /^\s*BT\s+(\d+)\s+\((\d+)\).*$/;
-               $ft = $1, $fc = $2 , last foo if $elem =~ /^\s*FT\s+(\d+)\s+\((\d+)\).*$/;
-               $lsp = $1        , last foo   if $elem =~ /^\s*LS\s+(\d+).*$/;
-               $gsp = $1        , last foo   if $elem =~ /^\s*GS\s+(\d+).*$/;
-               $my = $1        , last foo   if $elem =~ /^\s*MY\s+(T|F).*$/;
-           }
-       }
-
-       $total_rt = $end - $start;
-       $comm_perc = ( $total_rt == 0 ? 100 : (100 * $ft)/$total_rt );
-       $sp = $lsp + $gsp;
-       
-       push(@all_rts,$rt);
-       
-       push(@all_comm_percs,$comm_perc); 
-       
-       push(@all_sparks,$sp);
-       push(@all_local_sparks,$lsp);
-       push(@all_global_sparks,$gsp);
-       
-       push(@all_has,$ha);
-    }
-
-    close(INPUT);
-
-    @exec_times = &guess_interval(@all_rts);
-    @sparks     = &guess_interval(@all_sparks);
-    @has        = &guess_interval(@all_has);
-
-    ($m,$std_dev) = &_mean_std_dev(@all_comm_percs);
-    @comm_percs = (0, int($m), int($std_dev), 100)       unless int($m) == 0;
-    @comm_percs = (0, 1, 2, 5, 10, 50, 100)              if     int($m) == 0;
-}
-
-# ----------------------------------------------------------------------------
-
-sub process_options {
-    if ( $opt_h ) {                      
-       open(ME,$0) || die "Can't open myself ($0)";
-       $n = 0;
-       while (<ME>) {
-           last if $_ =~ /^$/;
-           print $_;
-           $n++;
-       }
-       close(ME);
-       
-       # system "cat $0 | awk 'BEGIN { n = 0; } \
-       #                             /^$/ { print n; \
-       #                                    exit; } \
-       #                                  { n++; }'"
-       exit ;
-    }
-
-    if ( $opt_W ) {
-       $pedantic = 1;
-    } else {
-       $pedantic = 0;
-    }
-
-    $input = $#ARGV == -1 ? "-" : $ARGV[0] ;
-    
-    if ( $#ARGV != 0 ) {
-       #print "Usage: gran-extr [options] <sim-file>\n";
-       #print "Use -h option to get details\n";
-       #exit 1;
-       
-    }
-    
-    
-    if ( ! $opt_t ) {
-       do pre_process(20);
-    }
-    
-    if ( $opt_g ) {
-       ($gran_file_name, $gran_global_file_name, $gran_local_file_name) =       
-           do mk_global_local_names($opt_g);
-    } else {
-       $gran_file_name = "gran.dat";
-       $gran_global_file_name = "gran-global.dat";
-       $gran_local_file_name = "gran-local.dat";
-    }
-    
-    if ( $opt_c ) {
-       ($comm_file_name, $comm_global_file_name, $comm_local_file_name) =       
-           do mk_global_local_names($opt_c);
-    } else {
-       $comm_file_name = "comm.dat";
-       $comm_global_file_name = "comm-global.dat";
-       $comm_local_file_name = "comm-local.dat";
-    }
-    
-    if ( $opt_f ) {
-       ($ft_file_name, $ft_global_file_name, $ft_local_file_name) =       
-           do mk_global_local_names($opt_c);
-    } else {
-       $ft_file_name = "ft.dat";
-       $ft_global_file_name = "ft-global.dat";
-       $ft_local_file_name = "ft-local.dat";
-    }
-    
-    if ( $opt_s ) {
-       ($spark_file_name, $spark_global_file_name, $spark_local_file_name) =  
-           do mk_global_local_names($opt_s);
-    } else {
-       $spark_file_name = "spark.dat";
-       $spark_global_file_name = "spark-global.dat";
-       $spark_local_file_name = "spark-local.dat";
-    }
-    
-    if ( $opt_a ) {
-       ($ha_file_name, $ha_global_file_name, $ha_local_file_name) =       
-           do mk_global_local_names($opt_a);
-    } else {
-       $ha_file_name = "ha.dat";
-    }
-    
-    if ( $opt_p ) {
-       $gp_file_name = $opt_p;
-    } else {
-       $gp_file_name = "gran.gp";
-    }
-    
-    $ps_file_name = &dat2ps_name($gp_file_name);
-    
-    $corr_file_name = "CORR";
-    $cumulat_rts_file_name = "cumulative-rts.dat";
-    $cumulat_has_file_name = "cumulative-has.dat";
-    $cumulat_fts_file_name = "cumulative-fts.dat";
-    $cumulat_cps_file_name = "cumulative-cps.dat";
-    $clust_rts_file_name = "clusters-rts.dat";
-    $clust_has_file_name = "clusters-has.dat";
-    $clust_fts_file_name = "clusters-fts.dat";
-    $clust_cps_file_name = "clusters-cps.dat";
-    $pe_file_name = "pe.dat";
-    $sn_file_name = "sn.dat";
-
-    $pie_file_name = "Pie.ps";
-
-    $cps_file_name = "CPS";
-    $fts_file_name = "FTS";
-    $rts_file_name = "RTS";
-    $has_file_name = "HAS";
-    $lsps_file_name = "LSPS";
-    $gsps_file_name = "GSPS";
-    $ccps_file_name = "CCPS";
-
-    if ( $opt_l ) {
-       $left_margin = $opt_l; 
-    } else {
-       $left_margin = 0; 
-    }
-    $left_perc_margin = 0;
-    
-    if ( $opt_r ) {
-       $right_margin = $opt_r; 
-    } else {
-       $right_margin = 0; 
-    }
-    $right_perc_margin = 0;
-    
-    if ( $opt_x ) {
-       $xsize = $opt_x;
-    } else {
-       $xsize = 1;
-    }
-    
-    if ( $opt_y ) {
-       $ysize = $opt_y;
-    } else {
-       $ysize = 1;
-    }
-    
-    if ( $opt_e ) {
-       $ext_size = $opt_e; 
-    } else {
-       $ext_size = 200; 
-    }
-    
-    if ( $opt_i ) {
-       $gray = $opt_i; 
-    } else {
-       $gray = 0; 
-    }
-    
-    if ( $opt_k ) {
-       $no_of_clusters = $opt_k; 
-    } else {
-       $no_of_clusters = 5; 
-    }
-    
-    if ( $opt_L ) {
-        $str = $opt_L;
-        $str =~ s/[\(\)\[\]]//g;
-        %logscale = split(/[,;. ]+/, $str);
-       # $logscale = $opt_L;
-    } else {
-       %logscale = ();        # ('g',"xy",'a',"xy",'Cg',"xy",'Ca',"xy");
-    }
-    
-# $delta = do compute_delta(@exec_times);
-# $no_of_exec_times = $#exec_times;
-    
-    if ( $opt_G ) {
-       $opt_G =~ s/[\(\)\[\]]//g;
-       @exec_times = split(/[,;. ]+/, $opt_G);
-       # @exec_times = split(/[,;. ]+/, ($opt_G =~ s/[\(\)]//g));
-    } else {
-       # @exec_times = (50, 100, 200, 300, 400, 500, 700);
-    }
-    
-    if ( $opt_F ) {
-       $opt_F =~ s/[\(\)\[\]]//g;
-       @fetch_times = split(/[,;. ]+/, $opt_F);
-       # @fetch_times = split(/[,;. ]+/, ($opt_F =~ s/[\(\)]//g));
-    } else {
-       # @fetch_times = (50, 100, 200, 300, 400, 500, 700);
-    }
-    
-    if ( $opt_C ) {
-       $opt_C =~ s/[\(\)\[\]]//g;
-       @comm_percs = split(/[,;. ]+/, $opt_C);
-    } else { 
-       # @comm_percs = (0,10,20,30,50,100);
-    } 
-    
-    if ( $opt_S ) {
-       $opt_S =~ s/[\(\)\[\]]//g;
-       @sparks = split(/[,;. ]+/, $opt_S);
-    } else { 
-       # @sparks = (0,5,10,50);
-    } 
-    
-# $delta_comm = do compute_delta(@comm_percs);
-    
-    if ( $opt_A ) {
-       $opt_A =~ s/[\(\)\[\]]//g;
-       @has = split(/[,;. ]+/, $opt_A);
-    } else {
-       # @has = (10, 100, 200, 300, 500, 1000);
-    }
-    
-    if ( $opt_t ) {
-       $templ_file_name = ( $opt_t eq '.' ? "TEMPL"     #   default file name
-                            : $opt_t eq ',' ? "/users/fp/hwloidl/grasp/GrAn/bin/TEMPL"     #   global master template
-                            : $opt_t eq '/' ? "/users/fp/hwloidl/grasp/GrAn/bin/T0"     #   template, that throws away most of the info
-                             : $opt_t ); 
-       do read_template();
-       # see RTS2gran for use of template-package
-    }
-    
-    $ylabel = $opt_P ? "% of threads" : "No. of threads";
-}  
-
-# ----------------------------------------------------------------------------
-
-sub print_verbose_message { 
-
-    print "-" x 70 . "\n";
-    print "Setup: \n";
-    print "-" x 70 . "\n";
-    print "\nFilenames: \n";
-    print "  Input file: $input\n";
-    print "  Gran files: $gran_file_name $gran_global_file_name $gran_local_file_name\n"; 
-    print "  Comm files: $comm_file_name $comm_global_file_name $comm_local_file_name\n";
-    print "  Sparked threads file: $spark_file_name $spark_local_file_name $spark_global_file_name\n";
-    print "  Heap file: $ha_file_name\n";
-    print "  GNUPLOT file name: $gp_file_name   Correlation file name: $corr_file_name\n";
-    print "  Cumulative RT file name: $cumulat_rts_file_name   \n  Cumulative HA file name: $cumulat_has_file_name\n";
-    print "  Cluster RT file name: $clust_rts_file_name   \n  Cluster HA file name: $clust_has_file_name\n";
-    print "  Cumulative runtimes file name:    $cumulat_rts_file_name\n";
-    print "  Cumulative heap allocations file name   $cumulat_has_file_name\n";
-    print "  Cluster run times file name:    $clust_rts_file_name\n";
-    print "  Cluster heap allocations file name:    $clust_has_file_name\n";
-    print "  PE load file name:    $pe_file_name\n";
-    print "  Site size file name:    $sn_file_name\n";
-    print "\nBoundaries: \n";
-    print "  Gran boundaries: @exec_times\n";
-    print "  Comm boundaries: @comm_percs\n";
-    print "  Sparked threads boundaries: @sparks\n";
-    print "  Heap boundaries: @has\n";
-    print "\nOther pars: \n";
-    print "  Left margin: $left_margin  Right margin: $right_margin\n";
-    print "  GP-extension: $ext_size  GP xsize: $xsize  GP ysize: $ysize\n";
-    print "  Gray scale: $gray  Smart x-tics is " . ($opt_T ? "ON" : "OFF") .
-         "  Percentage y-axis is " . ($opt_P ? "ON" : "OFF") . "\n";
-    print "  Log. scaling assoc list: ";
-    while (($key,$value) = each %logscale) {
-        print "$key: $value, ";
-    }
-    print "\n";
-    print "  Active template file: $templ_file\n"              if $opt_t;  
-    print "-" x 70 . "\n";
-}
-
-# ----------------------------------------------------------------------------
-
-sub sort_and_cum {
-
-@sorted_rts = sort {$a <=> $b} @all_rts;
-
-($xstart_cluster_rts,$xend_cluster_rts,$max_cluster_rts,$xtics_cluster_rts) =
-  &write_cumulative_data($cumulat_rts_file_name,$clust_rts_file_name,@sorted_rts);
-
-$xend_cum_rts = pop(@sorted_rts);
-$yend_cum_rts = 100;
-$yend_cum0_rts = $#sorted_rts+1;         # unpercentified cum graph
-
-open(RTS,">$rts_file_name") || die "$rts_file_name: $!";
-print RTS "Sorted list of all runtimes:\n";
-print RTS join("\n",@sorted_rts);
-close(RTS);
-
-@sorted_has = sort {$a <=> $b} @all_has;
-
-($xstart_cluster_has,$xend_cluster_has,$max_cluster_has,$xtics_cluster_has) =
-  &write_cumulative_data($cumulat_has_file_name,$clust_has_file_name,@sorted_has);
-
-$xend_cum_has = pop(@sorted_has);
-$yend_cum_has = 100;
-$yend_cum0_has = $#sorted_has+1;         # unpercentified cum graph
-
-open(HAS,">$has_file_name") || die "$has_file_name: $!";
-print HAS "Sorted list of all heap allocations:\n";
-print HAS join("\n",@sorted_has);
-close(HAS);
-
-@sorted_lsps = sort {$a <=> $b} @all_local_sparks;
-
-open(LSPS,">$lsps_file_name") || die "$lsps_file_name: $!";
-print LSPS "Sorted list of all local sparks:\n";
-print LSPS join("\n",@sorted_lsps);
-close(LSPS);
-
-@sorted_gsps = sort {$a <=> $b} @all_global_sparks;
-
-open(GSPS,">$gsps_file_name") || die "$gsps_file_name: $!";
-print GSPS "Sorted list of all global sparks:\n";
-print GSPS join("\n",@sorted_gsps);
-close(GSPS);
-
-@sorted_fts = sort {$a <=> $b} @all_fts;
-
-($xstart_cluster_fts,$xend_cluster_fts,$max_cluster_fts,$xtics_cluster_fts) =
-  &write_cumulative_data($cumulat_fts_file_name,$clust_fts_file_name,@sorted_fts);
-
-$xend_cum_fts = pop(@sorted_fts);
-$yend_cum_fts = 100;
-$yend_cum0_fts = $#sorted_fts+1;         # unpercentified cum graph
-
-open(FTS,">$fts_file_name") || die "$FTS_file_name: $!";
-print FTS "Sorted list of all communication times:\n";
-print FTS join("\n",@sorted_fts);
-close(FTS);
-
-@sorted_comm_percs = sort {$a <=> $b} @all_comm_percs;
-
-($xstart_cluster_cps,$xend_cluster_cps,$max_cluster_cps,$xtics_cluster_cps) =
-  &write_cumulative_data($cumulat_cps_file_name,$clust_cps_file_name,@sorted_comm_percs);
-
-$xend_cum_cps = 100;  # pop(@sorted_comm_percs);
-$yend_cum_cps = 100;
-$yend_cum0_cps = $#sorted_comm_percs+1;         # unpercentified cum graph
-
-open(CCPS,">$ccps_file_name") || die "$ccps_file_name: $!";
-print CCPS "Sorted list of all communication percentages:\n";
-print CCPS join("\n",@sorted_comm_percs);
-close(CCPS);
-
-($xstart_pe,$xend_pe,$max_pe,$xtics_pe) =
-    &write_array($pe_file_name,$#pe_load,@pe_load);
-
-($xstart_sn,$xend_sn,$max_sn,$xtics_sn) =
-    &write_array($sn_file_name,$#site_size,@site_size);
-
-if ( $opt_D ) {
-  print "After write_array: xstart, xend, max _sn: $xstart_sn,$xend_sn,$max_sn,$xtics_sn\n";
-} 
-}
-
-# ----------------------------------------------------------------------------
-# Compute statistical values (like mean, std_dev and especially corr coeff).
-# Write the important info to a file.
-# ----------------------------------------------------------------------------
-
-sub do_statistics {
-    local ($n) = @_;
-
-    if ( $n <= 1 ) {
-       print "Sorry, no statistics for just $n threads\n";
-        return -1;
-    }
-
-# Compute mean values and std deviations
-# ......................................
-    
-    ($mean_rt,$std_dev_rt) = &mean_std_dev($sum_rt,@all_rts);
-    ($mean_comm_perc,$std_dev_comm_perc) = &mean_std_dev($sum_comm_perc,@all_comm_percs);
-    ($mean_spark,$std_dev_spark) = &mean_std_dev($sum_sp,@all_sparks);
-    ($mean_local_spark,$std_dev_local_spark) = &mean_std_dev($sum_local_sp,@all_local_sparks);
-    ($mean_global_spark,$std_dev_global_spark) = &mean_std_dev($sum_global_sp,@all_global_sparks);
-    ($mean_ha,$std_dev_ha) = &mean_std_dev($sum_ha,@all_has);
-    ($mean_ft,$std_dev_ft) = &mean_std_dev($sum_ft,@all_fts);
-    
-# Compute correlation coefficients
-# ................................
-    
-    $c_exec_ha = &corr($#all_rts+1,$sum_rt,@all_rts,$sum_ha,@all_has);
-    $c_exec_sp = &corr($#all_rts+1,$sum_rt,@all_rts,$sum_sp,@all_sparks);
-    $c_exec_lsp = &corr($#all_rts+1,$sum_rt,@all_rts,$sum_local_sp,@all_local_sparks);
-    $c_exec_gsp = &corr($#all_rts+1,$sum_rt,@all_rts,$sum_global_sp,@all_global_sparks);
-    $c_ha_sp   = &corr($#all_has+1,$sum_ha,@all_has,$sum_sp,@all_sparks);
-    $c_ha_lsp   = &corr($#all_has+1,$sum_ha,@all_has,$sum_local_sp,@all_local_sparks);
-    $c_ha_gsp   = &corr($#all_has+1,$sum_ha,@all_has,$sum_global_sp,@all_global_sparks);
-    $c_exec_ft = &corr($#all_rts+1,$sum_rt,@all_rts,$sum_ft,@all_fts);
-    $c_ha_ft = &corr($#all_has+1,$sum_ha,@all_has,$sum_ft,@all_fts);
-    $c_lsp_ft = &corr($#all_local_sparks+1,$sum_local_sp,@all_local_sparks,$sum_ft,@all_fts);
-    $c_gsp_ft = &corr($#all_global_sparks+1,$sum_global_sp,@all_global_sparks,$sum_ft,@all_fts);
-    
-# Write corr coeffs into a file
-# .............................
-    
-    open(CORR,">$corr_file_name") || die "Couldn't open file $corr_file_name\n";
-    #printf CORR ("%f\n%f\n%f\n%f\n%f",$c_exec_ha,$c_exec_lsp,$c_exec_gsp,$c_ha_lsp,$c_ha_gsp)   ;
-    printf CORR ("CORR of runtime and heap alloc:  %f\n",$c_exec_ha);
-    printf CORR ("CORR of runtime and no. of sparks:  %f\n",$c_exec_sp);
-    printf CORR ("CORR of heap alloc and no. sparks:  %f\n",$c_ha_sp);
-    printf CORR ("CORR of runtime and no. of local sparks:  %f\n",$c_exec_lsp);
-    printf CORR ("CORR of runtime and no. of global sparks:  %f\n",$c_exec_gsp);
-    printf CORR ("CORR of heap alloc and no. local sparks:  %f\n",$c_ha_lsp);
-    printf CORR ("CORR of heap alloc and no. global sparks:  %f\n",$c_ha_gsp);
-    printf CORR ("CORR of runtime and communication time:  %f\n",$c_exec_ft);
-    printf CORR ("CORR of heap alloc and communication time:  %f\n",$c_ha_ft);
-    printf CORR ("CORR of no. of local sparks and communication time:  %f\n",$c_lsp_ft);
-    printf CORR ("CORR of no. of global sparks and communication time:  %f\n",$c_gsp_ft);
-    close(CORR);
-
-# These are needed later in the GNUPLOT files
-# ...........................................
-
-    $max_rt_class = &list_max(@exec_class);
-    $max_rt_global_class = &list_max(@exec_global_class);
-    $max_rt_local_class = &list_max(@exec_local_class);
-    $max_comm_perc_class = &list_max(@comm_class);
-    $max_comm_perc_global_class = &list_max(@comm_global_class);
-    $max_comm_perc_local_class = &list_max(@comm_local_class);
-    $max_spark_class = &list_max(@spark_class);
-    $max_spark_local_class = &list_max(@spark_local_class);
-    $max_spark_global_class = &list_max(@spark_global_class);
-    $max_ha_class = &list_max(@ha_class);
-    $max_ft_class = &list_max(@fetch_class);
-
-}
-
-# ----------------------------------------------------------------------------
-# This is written to STDOUT at the end of the file processing (before 
-# gnuplotting and such) if the verbose option is given.
-# ----------------------------------------------------------------------------
-
-sub print_general_info {
-
-    printf("\nTotal number of lines: %d\n", $line_no);
-    
-    print "\nDistribution of execution times: \n";
-    print " Intervals: " . join('|',@exec_times) . "\n";
-    print " Total: " . join('|',@exec_class) . "\n";
-    print " Global: " . join('|',@exec_global_class) . "\n";
-    print " Local: " . join('|',@exec_local_class) . "\n";
-    
-    $total=0; foreach $i (@exec_class) { $total += $i ; }
-    $global=0; foreach $i (@exec_global_class) { $global += $i ; }
-    $local=0; foreach $i (@exec_local_class) { $local += $i ; }
-    
-    print " Sum of classes (should be " . $line_no . "): " . $total .
-       "   (global/local)=(" . $global . "/" . $local . ")\n";
-    print " Mean value: $mean_rt   Std dev: $std_dev_rt\n";
-    
-    print "\nPercentage of communication: \n";
-    print " Intervals: " . join('|',@comm_percs) . "\n";
-    print " Total: " . join('|',@comm_class) . "\n";
-    print " Global: " . join('|',@comm_global_class) . "\n";
-    print " Local: " . join('|',@comm_local_class) . "\n";
-    print " Values outside closed int: Total: " . $outside .
-       " Global: " . $outside_global . " Local: " . $outside_local . "\n";
-    
-    $total=0; foreach $i (@comm_class) { $total += $i ; }
-    $global=0; foreach $i (@comm_global_class) { $global += $i ; }
-    $local=0; foreach $i (@comm_local_class) { $local += $i ; }
-    
-    print " Sum of classes (should be " . $line_no . "): " . $total .
-       "   (global/local)=(" . $global . "/" . $local . ")\n";
-    print " Mean value: $mean_comm_perc   Std dev: $std_dev_comm_perc\n";
-    
-    print "\nSparked threads: \n";
-    print " Intervals:   " . join('|',@sparks) . "\n";
-    print " Total allocs: " . join('|',@spark_class) . "\n";
-    
-    $total=0; foreach $i (@spark_class) { $total += $i ; }
-
-    print " Sum of classes (should be " . $line_no . "): " . $total . "\n";
-    print " Mean value: $mean_spark   Std dev: $std_dev_spark\n";
-    
-    print "\nHeap Allcoations: \n";
-    print " Intervals:   " . join('|',@has) . "\n";
-    print " Total allocs: " . join('|',@ha_class) . "\n";
-    
-    $total=0; foreach $i (@ha_class) { $total += $i ; }
-    
-    print " Sum of classes (should be " . $line_no . "): " . $total . "\n";
-    print " Mean value: $mean_ha   Std dev: $std_dev_ha\n";
-    print "\n";
-    print "CORRELATION between runtimes and heap allocations: $c_exec_ha \n";
-    print "CORRELATION between runtime and no. of sparks:  $c_exec_sp \n";
-    print "CORRELATION between heap alloc and no. sparks:  $c_ha_sp \n";
-    print "CORRELATION between runtimes and locally sparked threads: $c_exec_lsp \n";
-    print "CORRELATION between runtimes and globally sparked threads: $c_exec_gsp \n";
-    print "CORRELATION between heap allocations and locally sparked threads: $c_ha_lsp \n";
-    print "CORRELATION between heap allocations and globally sparked threads: $c_ha_gsp \n";
-    print "CORRELATION between runtime and communication time:  $c_exec_ft\n";
-    print "CORRELATION between heap alloc and communication time:  $c_ha_ft\n";
-    print "CORRELATION between no. of local sparks and communication time:  $c_lsp_ft\n";
-    print "CORRELATION between no. of global sparks and communication time:  $c_gsp_ft\n";
-    print "\n";
-    
-}
-
-# ----------------------------------------------------------------------------
-# Old (obsolete) stuff
-# ----------------------------------------------------------------------------
-#
-#for ($index=0; 
-#     $index <= &list_max($#spark_local_class,$#spark_local_class); 
-#     $index++) {
-#    $spark_class[$index] = $spark_local_class[$index] + $spark_global_class[$index];
-#}
-#
-#for ($index=0, $sum_sp=0; 
-#     $index <= &list_max($#all_local_sparks,$#all_global_sparks); 
-#     $index++) {
-#    $all_sparks[$index] = $all_local_sparks[$index] + $all_global_sparks[$index];
-#    $sum_sp += $all_sparks[$index];
-#}
-#
-# ----------------------------------------------------------------------------
-#
-#sub compute_delta {
-#    local (@times) = @_;
-#
-#    return ($times[$#times] -  $times[$#times-1]);
-#}
-#
-# ----------------------------------------------------------------------------
-
-sub insert_elem {
-    local ($elem,$val,$n,*list1,*list2) = @_;
-    local (@small_part, $i, $len);
-
-    if ( $opt_D ) {
-       print "Inserting val $val (with elem $elem) in the following list: \n" .
-               @list . "\n yields the lists: \n  ";
-    }
-
-    for ($i=0; $i<=$#list2 && $list2[$i]>$val; $i++) { }
-    $len = $#list2 - $i + 1;
-    if ( $len == 0 ) {
-       push(@list1,$elem);
-       push(@list2,$val);
-    } else {
-       splice(@list1,$i,0,$elem);
-       splice(@list2,$i,0,$val);
-    }
-
-    if ( $opt_D ) {
-       print @list1 . "\n and \n" . @list2;
-    }
-
-}
-
-# ----------------------------------------------------------------------------
-
-sub skip_header {
-    local ($in_header);
-
-    $in_header = 9;
-    while (<INPUT>) {
-       if ( $in_header = 9 ) {
-           if (/^=/) {
-               $gum_style_gr = 1;
-               $in_header = 0;
-               $prg = "????";          # 
-               $pars = "-b??????";             # 
-               $nPEs =  1; # 
-               $lat =  1;
-               return ($prg, $pars, $nPEs, $lat);
-           } else {
-               $gum_style_gr = 0;
-               $in_header = 1;
-           }
-           
-       }
-       $prg = $1, $pars = $2  if /^Granularity Simulation for\s+(\w+)\s+(.*)$/;
-       $nPEs = $1             if /^PEs\s+(\d+)/;
-       $lat = $1, $fetch = $2 if /^Latency\s+(\d+)[^F]+Fetch\s+(\d+)/;
-
-       last             if /^\+\+\+\+\+/;
-    }
-}
-
-# ----------------------------------------------------------------------------
-
-sub write_pie_chart {
-    local ($rt_perc, $bt_perc, $ft_perc, $it_perc);
-    local ($title, $title_sz, $label_sz, $x_center, $y_center, $radius); 
-
-    $PieChart = "/users/fp/hwloidl/grasp/GrAn/bin/PieChart.ps";
-
-    $title = "Original Glaswegian Communication Pie (tm)";
-    $title_sz = 24;
-    $label_sz = 12;
-    $x_center = 300; 
-    $y_center = 400;
-    $radius = 100;
-
-    open(PIE,">$pie_file_name") || die "$pie_file_name: $!";
-    
-    print PIE "%!PS-Adobe-2.0\n";
-    print PIE "%%Title: Pie Chart\n";
-    print PIE "%%Creator: gran-extr\n";
-    print PIE "%%CreationDate: Ides of March 44 B.C.\n";
-    print PIE "%%EndComments\n";
-    print PIE "\n";
-    print PIE "% Def of PieChart is taken from:\n";
-    print PIE "% ($PieChart) run\n";
-    print PIE "\n";
-
-    open(PIE_CHART,"<$PieChart") || die "$PieChart: $!";
-    while (<PIE_CHART>){
-       print PIE $_;
-    }
-    close (PIE_CHART);
-    print PIE "\n";
-
-    $rt_perc = $tot_rt / $tot_total_rt;
-    $bt_perc = $tot_bt / $tot_total_rt;
-    $ft_perc = $tot_ft / $tot_total_rt;
-    $it_perc = $tot_it / $tot_total_rt;
-
-    print PIE "($title) $title_sz $label_sz  % Title, title size and label size\n" .
-             "[                     % PS Array of (descrition, percentage [0, .., 1])\n" .
-             "[(Run Time) $rt_perc]\n" .
-             "[(Block Time) $bt_perc]\n" .
-             "[(Fetch Time) $ft_perc]\n" .
-             "[(Ready Time) $it_perc]\n" .
-             "] $x_center $y_center $radius DrawPieChart\n";
-    print PIE "showpage\n";
-
-    close(PIE);
-}
-
-# ----------------------------------------------------------------------------
-
-sub basename {
-    local ($in_str) = @_;
-    local ($str,$i) ;
-
-    $i = rindex($in_str,"/");
-    if ($i == -1) {
-       $str = $in_str;
-    } else {
-       $str = substr($in_str,$i+1) ;
-    }
-
-    return $str;
-}
-
-# ----------------------------------------------------------------------------
-
-sub dirname {
-    local ($in_str) = @_;
-    local ($str,$i) ;
-
-    $i = rindex($in_str,"/");
-    if ($i == -1) {
-       $str = "";
-    } else {
-       $str = substr($in_str,0,$i+1) ;
-    }
-
-    return $str;
-}
-
-# ----------------------------------------------------------------------------
-