xref: /petsc/src/binding/petsc4py/test/test_snes_py.py (revision ebead697dbf761eb322f829370bbe90b3bd93fa3)
15808f684SSatish Balay# --------------------------------------------------------------------
25808f684SSatish Balay
35808f684SSatish Balayfrom petsc4py import PETSc
45808f684SSatish Balayimport unittest
55808f684SSatish Balayfrom sys import getrefcount
65808f684SSatish Balay
75808f684SSatish Balay# --------------------------------------------------------------------
85808f684SSatish Balay
95808f684SSatish Balayclass MySNES(object):
105808f684SSatish Balay
115808f684SSatish Balay    def __init__(self):
125808f684SSatish Balay        self.trace = False
135808f684SSatish Balay        self.call_log = {}
145808f684SSatish Balay
155808f684SSatish Balay    def _log(self, method, *args):
165808f684SSatish Balay        self.call_log.setdefault(method, 0)
175808f684SSatish Balay        self.call_log[method] += 1
185808f684SSatish Balay        if not self.trace: return
195808f684SSatish Balay        clsname = self.__class__.__name__
205808f684SSatish Balay        pargs = []
215808f684SSatish Balay        for a in args:
225808f684SSatish Balay            pargs.append(a)
235808f684SSatish Balay            if isinstance(a, PETSc.Object):
245808f684SSatish Balay                pargs[-1] = type(a).__name__
255808f684SSatish Balay        pargs = tuple(pargs)
265808f684SSatish Balay        print ('%-20s' % ('%s.%s%s'% (clsname, method, pargs)))
275808f684SSatish Balay
285808f684SSatish Balay    def create(self,*args):
295808f684SSatish Balay        self._log('create', *args)
305808f684SSatish Balay
315808f684SSatish Balay    def destroy(self,*args):
325808f684SSatish Balay        self._log('destroy', *args)
335808f684SSatish Balay        if not self.trace: return
345808f684SSatish Balay        for k, v in self.call_log.items():
355808f684SSatish Balay            print ('%-20s %2d' % (k, v))
365808f684SSatish Balay
375808f684SSatish Balay    def view(self, snes, viewer):
385808f684SSatish Balay        self._log('view', snes, viewer)
395808f684SSatish Balay
405808f684SSatish Balay    def setFromOptions(self, snes):
415808f684SSatish Balay        OptDB = PETSc.Options(snes)
425808f684SSatish Balay        self.trace = OptDB.getBool('trace',self.trace)
435808f684SSatish Balay        self._log('setFromOptions',snes)
445808f684SSatish Balay
455808f684SSatish Balay    def setUp(self, snes):
465808f684SSatish Balay        self._log('setUp', snes)
475808f684SSatish Balay
485808f684SSatish Balay    def reset(self, snes):
495808f684SSatish Balay        self._log('reset', snes)
505808f684SSatish Balay
515808f684SSatish Balay    #def preSolve(self, snes):
525808f684SSatish Balay    #    self._log('preSolve', snes)
535808f684SSatish Balay    #
545808f684SSatish Balay    #def postSolve(self, snes):
555808f684SSatish Balay    #    self._log('postSolve', snes)
565808f684SSatish Balay
575808f684SSatish Balay    def preStep(self, snes):
585808f684SSatish Balay        self._log('preStep', snes)
595808f684SSatish Balay
605808f684SSatish Balay    def postStep(self, snes):
615808f684SSatish Balay        self._log('postStep', snes)
625808f684SSatish Balay
635808f684SSatish Balay    #def computeFunction(self, snes, x, F):
645808f684SSatish Balay    #    self._log('computeFunction', snes, x, F)
655808f684SSatish Balay    #    snes.computeFunction(x, F)
665808f684SSatish Balay    #
675808f684SSatish Balay    #def computeJacobian(self, snes, x, A, B):
685808f684SSatish Balay    #    self._log('computeJacobian', snes, x, A, B)
695808f684SSatish Balay    #    flag = snes.computeJacobian(x, A, B)
705808f684SSatish Balay    #    return flag
715808f684SSatish Balay    #
725808f684SSatish Balay    #def linearSolve(self, snes, b, x):
735808f684SSatish Balay    #    self._log('linearSolve', snes, b, x)
745808f684SSatish Balay    #    snes.ksp.solve(b,x)
75a5b23f4aSJose E. Roman    #    ## return False # not succeed
765808f684SSatish Balay    #    if snes.ksp.getConvergedReason() < 0:
77a5b23f4aSJose E. Roman    #        return False # not succeed
78a5b23f4aSJose E. Roman    #    return True # succeed
795808f684SSatish Balay    #
805808f684SSatish Balay    #def lineSearch(self, snes, x, y, F):
815808f684SSatish Balay    #    self._log('lineSearch', snes, x, y, F)
825808f684SSatish Balay    #    x.axpy(-1,y)
835808f684SSatish Balay    #    snes.computeFunction(x, F)
84a5b23f4aSJose E. Roman    #    ## return False # not succeed
85a5b23f4aSJose E. Roman    #    return True # succeed
865808f684SSatish Balay
875808f684SSatish Balay
885808f684SSatish Balayfrom test_snes import BaseTestSNES
895808f684SSatish Balay
905808f684SSatish Balayclass TestSNESPython(BaseTestSNES, unittest.TestCase):
915808f684SSatish Balay
925808f684SSatish Balay    SNES_TYPE = PETSc.SNES.Type.PYTHON
935808f684SSatish Balay
945808f684SSatish Balay    def setUp(self):
955808f684SSatish Balay        super(TestSNESPython, self).setUp()
965808f684SSatish Balay        self.snes.setPythonContext(MySNES())
975808f684SSatish Balay
98*ebead697SStefano Zampini    def testGetType(self):
99*ebead697SStefano Zampini        ctx = self.snes.getPythonContext()
100*ebead697SStefano Zampini        pytype = "{0}.{1}".format(ctx.__module__, type(ctx).__name__)
101*ebead697SStefano Zampini        self.assertTrue(self.snes.getPythonType() == pytype)
102*ebead697SStefano Zampini
1035808f684SSatish Balay# --------------------------------------------------------------------
1045808f684SSatish Balay
1055808f684SSatish Balayif __name__ == '__main__':
1065808f684SSatish Balay    unittest.main()
1075808f684SSatish Balay
1085808f684SSatish Balay# --------------------------------------------------------------------
109