#!/usr/bin/env python

__author__ = "Anders Logg (logg@simula.no)"
__date__ = "2009-09-15 -- 2011-01-04"
__copyright__ = "Copyright (C) 2009 Anders Logg"
__license__  = "GNU LGPL Version 2.1"

# Modified by Johan Hake, 2009.

# FIXME: Not checked if working!

from dolfin import *
from glob import glob
from numpy import arange

# Size of mesh
size = 128

# Number of processes to use
# NOTE: Largest number of processors to run is 2^EXP
EXP = 6
num_processes = list(2**arange(EXP+1))

# Function for extracting log file
def get_filename(pattern):
    filenames = glob(pattern)
    if len(filenames) == 0:
        raise IOError, "Unable to open file: %s" % pattern
    elif len(filenames) > 1:
        raise RuntimeError, "More than one data file, don't know which one to pick: " + ", ".join(filenames)
    filename = filenames[0]
    print "Reading data from %s..." % filename
    return filename

# Iterate over process range
assemble_time = []
assemble_second_time = []
solve_time = []

# Remove run with one processor
if 1 in num_processes:
    num_processes.remove(1)

for np in num_processes:

    # Read timings for assemble benchmark
    lines = open(get_filename(\
        "assemble-poisson_np_%d_size_%d.log*" % (np, size))).readlines()
    assemble_time.append(float([line for line in lines \
                                if "TIME (first assembly):" in \
                                line][0].split("TIME (first assembly): ")[-1]))

    assemble_second_time.append(float([line for line in lines \
                                       if "TIME (second assembly):" in \
                                       line][0].split("TIME (second assembly): ")[-1]))

    # Read timings for solve benchmark
    filename = get_filename("solve-poisson_np_%d_size_%d.log*" % (np, size))
    solve_time.append(float([line for line in open(filename).readlines()\
                             if "TIME:" in line][0].split("TIME: ")[-1]))

# Compute speedups
scale_assemble = [assemble_time[0] / t for t in assemble_time]
scale_second_assemble = [assemble_second_time[0] / t for t in assemble_second_time]
scale_solve = [solve_time[0] / t for t in solve_time]

# Print results
table = Table("Speedup")
for i, np in enumerate(num_processes):
    table.set(str(np), "Assemble (first)", scale_assemble[i])
    table.set(str(np), "Assemble (second)", scale_second_assemble[i])
    table.set(str(np), "Solve", scale_solve[i])

print ""
info(table, True)
