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