#### import the simple module from the paraview
from paraview.simple import *
import glob, re, os

def CreateCellSelection(ids):
    source = IDSelectionSource()
    source.FieldType = "CELL"
    sids = []
    for i in ids:
        sids.append(0) #proc-id
        sids.append(i) #cell-id
    source.IDs = sids
    return source

path = 'C:\\Users\\John\\Box Sync\\paraview\\'

files = ['SteadyState_out.e', 'FinalCycle_out.e' ]
reader = []

for idx, fl in enumerate(files):
 reader.append(ExodusIIReader(FileName=path+fl))
 reader[idx].GenerateObjectIdCellArray = 1
 reader[idx].GenerateGlobalElementIdArray = 1
 ElementVariables = reader[idx].ElementVariables.Available
 ElementVariables.remove('x')
 reader[idx].ElementVariables = ElementVariables
 reader[idx].PointVariables = reader[idx].PointVariables.Available
 reader[idx].ElementBlocks = reader[idx].ElementBlocks.Available

reader[-1].ElementVariables = reader[-1].ElementVariables.Available
temporalShift = []

for idx, r in enumerate(reader):
 temporalShift.append(TemporalShiftScale(Input=r))
 temporalShift[idx].PreShift = -r.TimestepValues[0]

squareDiff = ProgrammableFilter(Input=temporalShift)

script = "output.CellData.append(inputs[-1].CellData['x'], 'x')\n"

for var in reader[0].ElementVariables:
 script=script + "output.CellData.append((inputs[0].CellData['" + var + "'] - inputs[1].CellData['" + var + "'])**2 , '" + var + "')\n"

squareDiff.Script=script
squareDiff.UpdatePipeline()

integrateVariables = IntegrateVariables(Input=squareDiff)

selection = CreateCellSelection(ids=[0])
integrateSqrVarOverSpace = PlotSelectionOverTime(Input=integrateVariables, Selection=selection)
integrateSqrVarOverSpace.OnlyReportSelectionStatistics = 0
integrateSqrVarOverSpace.UpdatePipeline()

integrateSqrVarOverST = ProgrammableFilter(Input=integrateSqrVarOverSpace)
integrateSqrVarOverST.Script = "from numpy import sum\nfor inTable, outTable in zip(inputs[0], output):\n for aname in inTable.RowData.keys():\n  outTable.RowData.append(sum(inTable.RowData[aname]), aname)"
integrateSqrVarOverST.UpdatePipeline()
