xref: /petsc/src/binding/petsc4py/test/test_snes_py.py (revision 552edb6364df478b294b3111f33a8f37ca096b20)
15808f684SSatish Balay# --------------------------------------------------------------------
25808f684SSatish Balay
35808f684SSatish Balayfrom petsc4py import PETSc
45808f684SSatish Balayimport unittest
5*6f336411SStefano Zampinifrom test_snes import BaseTestSNES
65808f684SSatish Balay
75808f684SSatish Balay# --------------------------------------------------------------------
85808f684SSatish Balay
95808f684SSatish Balay
10*6f336411SStefano Zampiniclass MySNES:
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
18*6f336411SStefano Zampini        if not self.trace:
19*6f336411SStefano Zampini            return
205808f684SSatish Balay        clsname = self.__class__.__name__
215808f684SSatish Balay        pargs = []
225808f684SSatish Balay        for a in args:
235808f684SSatish Balay            pargs.append(a)
245808f684SSatish Balay            if isinstance(a, PETSc.Object):
255808f684SSatish Balay                pargs[-1] = type(a).__name__
265808f684SSatish Balay        pargs = tuple(pargs)
27*6f336411SStefano Zampini        print(f'{clsname}.{method}{pargs}')
285808f684SSatish Balay
295808f684SSatish Balay    def create(self, *args):
305808f684SSatish Balay        self._log('create', *args)
315808f684SSatish Balay
325808f684SSatish Balay    def destroy(self, *args):
335808f684SSatish Balay        self._log('destroy', *args)
34*6f336411SStefano Zampini        if not self.trace:
35*6f336411SStefano Zampini            return
365808f684SSatish Balay        for k, v in self.call_log.items():
37*6f336411SStefano Zampini            print(f'{k} {v}')
385808f684SSatish Balay
395808f684SSatish Balay    def view(self, snes, viewer):
405808f684SSatish Balay        self._log('view', snes, viewer)
415808f684SSatish Balay
425808f684SSatish Balay    def setFromOptions(self, snes):
435808f684SSatish Balay        OptDB = PETSc.Options(snes)
445808f684SSatish Balay        self.trace = OptDB.getBool('trace', self.trace)
455808f684SSatish Balay        self._log('setFromOptions', snes)
465808f684SSatish Balay
475808f684SSatish Balay    def setUp(self, snes):
485808f684SSatish Balay        self._log('setUp', snes)
495808f684SSatish Balay
505808f684SSatish Balay    def reset(self, snes):
515808f684SSatish Balay        self._log('reset', snes)
525808f684SSatish Balay
535808f684SSatish Balay    # def preSolve(self, snes):
545808f684SSatish Balay    #    self._log('preSolve', snes)
555808f684SSatish Balay    #
565808f684SSatish Balay    # def postSolve(self, snes):
575808f684SSatish Balay    #    self._log('postSolve', snes)
585808f684SSatish Balay
595808f684SSatish Balay    def preStep(self, snes):
605808f684SSatish Balay        self._log('preStep', snes)
615808f684SSatish Balay
625808f684SSatish Balay    def postStep(self, snes):
635808f684SSatish Balay        self._log('postStep', snes)
645808f684SSatish Balay
655808f684SSatish Balay    # def computeFunction(self, snes, x, F):
665808f684SSatish Balay    #    self._log('computeFunction', snes, x, F)
675808f684SSatish Balay    #    snes.computeFunction(x, F)
685808f684SSatish Balay    #
695808f684SSatish Balay    # def computeJacobian(self, snes, x, A, B):
705808f684SSatish Balay    #    self._log('computeJacobian', snes, x, A, B)
715808f684SSatish Balay    #    flag = snes.computeJacobian(x, A, B)
725808f684SSatish Balay    #    return flag
735808f684SSatish Balay    #
745808f684SSatish Balay    # def linearSolve(self, snes, b, x):
755808f684SSatish Balay    #    self._log('linearSolve', snes, b, x)
765808f684SSatish Balay    #    snes.ksp.solve(b,x)
77a5b23f4aSJose E. Roman    #    ## return False # not succeed
785808f684SSatish Balay    #    if snes.ksp.getConvergedReason() < 0:
79a5b23f4aSJose E. Roman    #        return False # not succeed
80a5b23f4aSJose E. Roman    #    return True # succeed
815808f684SSatish Balay    #
825808f684SSatish Balay    # def lineSearch(self, snes, x, y, F):
835808f684SSatish Balay    #    self._log('lineSearch', snes, x, y, F)
845808f684SSatish Balay    #    x.axpy(-1,y)
855808f684SSatish Balay    #    snes.computeFunction(x, F)
86a5b23f4aSJose E. Roman    #    ## return False # not succeed
87a5b23f4aSJose E. Roman    #    return True # succeed
885808f684SSatish Balay
895808f684SSatish Balay
905808f684SSatish Balayclass TestSNESPython(BaseTestSNES, unittest.TestCase):
915808f684SSatish Balay    SNES_TYPE = PETSc.SNES.Type.PYTHON
925808f684SSatish Balay
935808f684SSatish Balay    def setUp(self):
94*6f336411SStefano Zampini        super().setUp()
955808f684SSatish Balay        self.snes.setPythonContext(MySNES())
965808f684SSatish Balay
97ebead697SStefano Zampini    def testGetType(self):
98ebead697SStefano Zampini        ctx = self.snes.getPythonContext()
99*6f336411SStefano Zampini        pytype = f'{ctx.__module__}.{type(ctx).__name__}'
100ebead697SStefano Zampini        self.assertTrue(self.snes.getPythonType() == pytype)
101ebead697SStefano Zampini
102*6f336411SStefano Zampini
1035808f684SSatish Balay# --------------------------------------------------------------------
1045808f684SSatish Balay
1055808f684SSatish Balayif __name__ == '__main__':
1065808f684SSatish Balay    unittest.main()
1075808f684SSatish Balay
1085808f684SSatish Balay# --------------------------------------------------------------------
109