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