1#!/usr/bin/python3
2
3import pickle, numpy
4import dune.generator
5import ufl
6from dune.grid import structuredGrid, gridFunction
7from dune.fem.space import lagrange
8
9class CheckPointer:
10    def __init__(self,fileName,hgrid=None):
11        if hgrid is None:
12            self.file = open(fileName,'rb')
13            self.hgrid = pickle.load(self.file)
14        else:
15            self.file = open(fileName,'wb')
16            self.hgrid = hgrid
17            pickle.dump(self.hgrid,self.file)
18        self.items = []
19
20    def hierarchicalGrid(self):
21        return self.hgrid
22
23    def add(self,item):
24        self.items += [item]
25
26    def backup(self):
27        for i in self.items:
28            if hasattr(i,"read"):
29                pickle.dump(i.write(),self.file)
30            else:
31                pickle.dump(i,self.file)
32    def restore(self):
33        for i in self.items:
34            if hasattr(i,"read"):
35                i.read( pickle.load(self.file) )
36            else:
37                i = pickle.load( self.file ) # this doesn't work
38
39def run(restore=False):
40    if not restore:
41        grid = structuredGrid([0,0],[1,1],[2,2])
42        grid.hierarchicalGrid.globalRefine(2)
43        checkPointer = CheckPointer("dumpA", grid.hierarchicalGrid)
44    else:
45        checkPointer = CheckPointer("dumpA")
46        grid = checkPointer.hierarchicalGrid().leafView
47
48    space = lagrange(grid)
49    df = space.interpolate([0],name="test")
50    checkPointer.add(df)
51
52    spc = lagrange(grid, storage='istl')
53    df_istl = spc.interpolate([0],name="test_istl")
54
55    # test discrete function assignment
56    df.assign( df_istl )
57    df_istl.assign( df )
58
59    if not restore:
60        print("interpolating grid function")
61        @gridFunction(grid)
62        def gf(x): return x[0]*x[1]*(1-x[0])*(1-x[1])
63        df.interpolate( gf )
64    else:
65        print("restoring discrete function")
66        checkPointer.restore()
67
68    # df.plot()
69    if not restore:
70        checkPointer.backup()
71
72
73if __name__ == "__main__":
74    run(False)
75    run(True)
76