#!/usr/bin/env python

__author__ = "Anders Logg (logg@simula.no)"
__date__ = "2009-09-15 -- 2009-09-17"
__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 = 64

# Number of processes to use
num_processes = 2**arange(16 + 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
t1 = []
t2 = []
for np in num_processes:

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

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

# Compute speedups
s1 = [t1[0] / t for t in t1]
s2 = [t2[0] / t for t in t2]

# Print results
table = Table("Speedup")
for i, np in enumerate(num_processes):
    table.set(str(np), "Assemble",         s1[i])
    table.set(str(np), "Assemble + solve", s2[i])

info(table, True)
