xref: /petsc/src/binding/petsc4py/test/test_snes_py.py (revision 5808f68492579297331054bd8ff190489c3b8c20)
1*5808f684SSatish Balay# --------------------------------------------------------------------
2*5808f684SSatish Balay
3*5808f684SSatish Balayfrom petsc4py import PETSc
4*5808f684SSatish Balayimport unittest
5*5808f684SSatish Balayfrom sys import getrefcount
6*5808f684SSatish Balay
7*5808f684SSatish Balay# --------------------------------------------------------------------
8*5808f684SSatish Balay
9*5808f684SSatish Balayclass MySNES(object):
10*5808f684SSatish Balay
11*5808f684SSatish Balay    def __init__(self):
12*5808f684SSatish Balay        self.trace = False
13*5808f684SSatish Balay        self.call_log = {}
14*5808f684SSatish Balay
15*5808f684SSatish Balay    def _log(self, method, *args):
16*5808f684SSatish Balay        self.call_log.setdefault(method, 0)
17*5808f684SSatish Balay        self.call_log[method] += 1
18*5808f684SSatish Balay        if not self.trace: return
19*5808f684SSatish Balay        clsname = self.__class__.__name__
20*5808f684SSatish Balay        pargs = []
21*5808f684SSatish Balay        for a in args:
22*5808f684SSatish Balay            pargs.append(a)
23*5808f684SSatish Balay            if isinstance(a, PETSc.Object):
24*5808f684SSatish Balay                pargs[-1] = type(a).__name__
25*5808f684SSatish Balay        pargs = tuple(pargs)
26*5808f684SSatish Balay        print ('%-20s' % ('%s.%s%s'% (clsname, method, pargs)))
27*5808f684SSatish Balay
28*5808f684SSatish Balay    def create(self,*args):
29*5808f684SSatish Balay        self._log('create', *args)
30*5808f684SSatish Balay
31*5808f684SSatish Balay    def destroy(self,*args):
32*5808f684SSatish Balay        self._log('destroy', *args)
33*5808f684SSatish Balay        if not self.trace: return
34*5808f684SSatish Balay        for k, v in self.call_log.items():
35*5808f684SSatish Balay            print ('%-20s %2d' % (k, v))
36*5808f684SSatish Balay
37*5808f684SSatish Balay    def view(self, snes, viewer):
38*5808f684SSatish Balay        self._log('view', snes, viewer)
39*5808f684SSatish Balay
40*5808f684SSatish Balay    def setFromOptions(self, snes):
41*5808f684SSatish Balay        OptDB = PETSc.Options(snes)
42*5808f684SSatish Balay        self.trace = OptDB.getBool('trace',self.trace)
43*5808f684SSatish Balay        self._log('setFromOptions',snes)
44*5808f684SSatish Balay
45*5808f684SSatish Balay    def setUp(self, snes):
46*5808f684SSatish Balay        self._log('setUp', snes)
47*5808f684SSatish Balay
48*5808f684SSatish Balay    def reset(self, snes):
49*5808f684SSatish Balay        self._log('reset', snes)
50*5808f684SSatish Balay
51*5808f684SSatish Balay    #def preSolve(self, snes):
52*5808f684SSatish Balay    #    self._log('preSolve', snes)
53*5808f684SSatish Balay    #
54*5808f684SSatish Balay    #def postSolve(self, snes):
55*5808f684SSatish Balay    #    self._log('postSolve', snes)
56*5808f684SSatish Balay
57*5808f684SSatish Balay    def preStep(self, snes):
58*5808f684SSatish Balay        self._log('preStep', snes)
59*5808f684SSatish Balay
60*5808f684SSatish Balay    def postStep(self, snes):
61*5808f684SSatish Balay        self._log('postStep', snes)
62*5808f684SSatish Balay
63*5808f684SSatish Balay    #def computeFunction(self, snes, x, F):
64*5808f684SSatish Balay    #    self._log('computeFunction', snes, x, F)
65*5808f684SSatish Balay    #    snes.computeFunction(x, F)
66*5808f684SSatish Balay    #
67*5808f684SSatish Balay    #def computeJacobian(self, snes, x, A, B):
68*5808f684SSatish Balay    #    self._log('computeJacobian', snes, x, A, B)
69*5808f684SSatish Balay    #    flag = snes.computeJacobian(x, A, B)
70*5808f684SSatish Balay    #    return flag
71*5808f684SSatish Balay    #
72*5808f684SSatish Balay    #def linearSolve(self, snes, b, x):
73*5808f684SSatish Balay    #    self._log('linearSolve', snes, b, x)
74*5808f684SSatish Balay    #    snes.ksp.solve(b,x)
75*5808f684SSatish Balay    #    ## return False # not succedd
76*5808f684SSatish Balay    #    if snes.ksp.getConvergedReason() < 0:
77*5808f684SSatish Balay    #        return False # not succedd
78*5808f684SSatish Balay    #    return True # succedd
79*5808f684SSatish Balay    #
80*5808f684SSatish Balay    #def lineSearch(self, snes, x, y, F):
81*5808f684SSatish Balay    #    self._log('lineSearch', snes, x, y, F)
82*5808f684SSatish Balay    #    x.axpy(-1,y)
83*5808f684SSatish Balay    #    snes.computeFunction(x, F)
84*5808f684SSatish Balay    #    ## return False # not succedd
85*5808f684SSatish Balay    #    return True # succedd
86*5808f684SSatish Balay
87*5808f684SSatish Balay
88*5808f684SSatish Balayfrom test_snes import BaseTestSNES
89*5808f684SSatish Balay
90*5808f684SSatish Balayclass TestSNESPython(BaseTestSNES, unittest.TestCase):
91*5808f684SSatish Balay
92*5808f684SSatish Balay    SNES_TYPE = PETSc.SNES.Type.PYTHON
93*5808f684SSatish Balay
94*5808f684SSatish Balay    def setUp(self):
95*5808f684SSatish Balay        super(TestSNESPython, self).setUp()
96*5808f684SSatish Balay        self.snes.setPythonContext(MySNES())
97*5808f684SSatish Balay
98*5808f684SSatish Balay# --------------------------------------------------------------------
99*5808f684SSatish Balay
100*5808f684SSatish Balayif __name__ == '__main__':
101*5808f684SSatish Balay    unittest.main()
102*5808f684SSatish Balay
103*5808f684SSatish Balay# --------------------------------------------------------------------
104