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