import pickle, sys
import numpy as np
import matplotlib.pyplot as plt
def main(filename):
    meshes = [168, 720, 1620, 2880]
    fid = open(filename,'rb')
    data = pickle.load(fid)
    fid.close()
    diff = []
    maxes = []
    high_res_maxes = []
    for i in xrange(len(data)-1): #loop over plot file results
        t1 = data[i]
        t2 = data[i+1]
        diff.append({})
        maxes.append({})
        high_res_maxes.append({})
        for v in t1.keys(): #loop over stored field variables
            diff[i][v] = []
            try:
                v1 = t1[v]
                v2 = t2[v]
            except:
                print 'Results do not both contain: '+v
                continue
            mv = []
            for j in xrange(len(v1)):
                d1 = v1[j]
                d2 = v2[j]
                dmy = d2-d1
                mv.append(np.amax(abs(d2)))
                #diff[i][v].append(np.max(abs(dmy)))
                diff[i][v].append(np.linalg.norm(dmy)/(dmy.size**0.5))
            maxes[i][v] = max(diff[i][v])
            high_res_maxes[i][v]=max(mv)
    for i in xrange(len(maxes)):
        for v in maxes[i].keys():
            print 'Maximum RMS error in '+v+' for mesh density iteration '+str(i)+': '+str(maxes[i][v])
            print 'This is '+str(maxes[i][v]/high_res_maxes[i][v]*100.)+'% of maximum absolute value of '+v

    N=np.ceil(float(len(maxes[0].keys()))/2.0) 
    cnt = 0
    fig = plt.figure()
    subplot = []
    for v in maxes[0].keys():
        subplot.append(fig.add_subplot(N,2,cnt))
        tmp = []
        change = []
        for i in xrange(len(meshes)):
            #tmp.append(maxes[i][v])
            tmp.append(maxes[i][v]/high_res_maxes[i][v]*100)
            #if i > 0:
                #change.append((maxes[i][v]-maxes[i-1][v])/maxes[i-1][v]*100)
        subplot[-1].plot(meshes,tmp,'bo')
        for i in xrange(len(change)):
            subplot[-1].annotate('%3.1f' % change[i]+'%',xy=(meshes[i+1],tmp[i+1]),
                    xycoords='data',xytext=(-10,+10), textcoords='offset points', fontsize=16)
        subplot[-1].margins(0.1)
        subplot[-1].set_xlabel('# of Elements')
        #subplot[-1].set_xlabel('Element Edge Length ('+r'$\mu m$'+')')
        subplot[-1].set_ylabel('% RMS Error')
        subplot[-1].set_title(v)
        cnt += 1

    plt.show()
if __name__ == '__main__':
    main(sys.argv[-1])
