15808f684SSatish Balayimport unittest 25808f684SSatish Balay 384f2ad6dSLawrence Mitchellfrom petsc4py import PETSc 46f336411SStefano Zampiniimport numpy 584f2ad6dSLawrence Mitchell 65808f684SSatish Balay# -------------------------------------------------------------------- 75808f684SSatish Balay 85808f684SSatish Balay 96f336411SStefano Zampiniclass BaseTestObject: 105808f684SSatish Balay CLASS, FACTORY = None, None 115808f684SSatish Balay TARGS, KARGS = (), {} 125808f684SSatish Balay BUILD = None 136f336411SStefano Zampini 145808f684SSatish Balay def setUp(self): 155808f684SSatish Balay self.obj = self.CLASS() 165808f684SSatish Balay getattr(self.obj, self.FACTORY)(*self.TARGS, **self.KARGS) 176f336411SStefano Zampini if not self.obj: 186f336411SStefano Zampini self.obj.create() 195808f684SSatish Balay 205808f684SSatish Balay def tearDown(self): 215808f684SSatish Balay self.obj = None 2262e5d2d2SJDBetteridge PETSc.garbage_cleanup() 235808f684SSatish Balay 245808f684SSatish Balay def testTypeRegistry(self): 255808f684SSatish Balay type_reg = PETSc.__type_registry__ 265808f684SSatish Balay classid = self.obj.getClassId() 275808f684SSatish Balay typeobj = self.CLASS 285808f684SSatish Balay if isinstance(self.obj, PETSc.DMDA): 295808f684SSatish Balay typeobj = PETSc.DM 305808f684SSatish Balay self.assertTrue(type_reg[classid] is typeobj) 315808f684SSatish Balay 325808f684SSatish Balay def testLogClass(self): 335808f684SSatish Balay name = self.CLASS.__name__ 346f336411SStefano Zampini if name == 'DMDA': 356f336411SStefano Zampini name = 'DM' 365808f684SSatish Balay logcls = PETSc.Log.Class(name) 375808f684SSatish Balay classid = self.obj.getClassId() 385808f684SSatish Balay self.assertEqual(logcls.id, classid) 395808f684SSatish Balay 405808f684SSatish Balay def testClass(self): 415808f684SSatish Balay self.assertTrue(isinstance(self.obj, self.CLASS)) 425808f684SSatish Balay self.assertTrue(type(self.obj) is self.CLASS) 435808f684SSatish Balay 443a028a11SStefano Zampini def testId(self): 453a028a11SStefano Zampini oid = self.obj.getId() 463a028a11SStefano Zampini self.assertTrue(oid > 0) 473a028a11SStefano Zampini self.assertEqual(self.obj.id, oid) 483a028a11SStefano Zampini 495808f684SSatish Balay def testNonZero(self): 505808f684SSatish Balay self.assertTrue(bool(self.obj)) 515808f684SSatish Balay 525808f684SSatish Balay def testDestroy(self): 535808f684SSatish Balay self.assertTrue(bool(self.obj)) 545808f684SSatish Balay self.obj.destroy() 555808f684SSatish Balay self.assertFalse(bool(self.obj)) 565808f684SSatish Balay ## self.assertRaises(PETSc.Error, self.obj.destroy) 575808f684SSatish Balay ## self.assertTrue(self.obj.this is this) 585808f684SSatish Balay 595808f684SSatish Balay def testOptions(self): 605808f684SSatish Balay self.assertFalse(self.obj.getOptionsPrefix()) 615808f684SSatish Balay prefix1 = 'my_' 625808f684SSatish Balay self.obj.setOptionsPrefix(prefix1) 635808f684SSatish Balay self.assertEqual(self.obj.getOptionsPrefix(), prefix1) 645808f684SSatish Balay prefix2 = 'opt_' 655808f684SSatish Balay self.obj.setOptionsPrefix(prefix2) 665808f684SSatish Balay self.assertEqual(self.obj.getOptionsPrefix(), prefix2) 676f336411SStefano Zampini self.obj.appendOptionsPrefix(prefix1) 686f336411SStefano Zampini self.assertEqual(self.obj.getOptionsPrefix(), prefix2 + prefix1) 696f336411SStefano Zampini self.obj.setOptionsPrefix(None) 706f336411SStefano Zampini self.assertEqual(self.obj.getOptionsPrefix(), None) 71*8e704042SBarry Smith if not self.obj.getType() or not 'da' == str(self.obj.getType()): 725808f684SSatish Balay self.obj.setFromOptions() 735808f684SSatish Balay 744e953f6bSStefano Zampini def opts_handler(obj): 754e953f6bSStefano Zampini n = obj.getAttr('opts_handler_called') 764e953f6bSStefano Zampini obj.setAttr('opts_handler_called', n + 1) 774e953f6bSStefano Zampini self.assertEqual(type(self.obj), type(obj)) 784e953f6bSStefano Zampini self.assertEqual(self.obj.klass, obj.klass) 794e953f6bSStefano Zampini self.assertEqual(self.obj.type, obj.type) 804e953f6bSStefano Zampini self.assertEqual(self.obj.id, obj.id) 814e953f6bSStefano Zampini 824e953f6bSStefano Zampini for _ in range(2): 834e953f6bSStefano Zampini self.obj.setAttr('opts_handler_called', 0) 844e953f6bSStefano Zampini self.obj.setOptionsHandler(opts_handler) 85*8e704042SBarry Smith if not self.obj.getType() or not 'da' == str(self.obj.getType()): 864e953f6bSStefano Zampini self.obj.setFromOptions() 874e953f6bSStefano Zampini missing = [ 884e953f6bSStefano Zampini 'AO', 894e953f6bSStefano Zampini 'DMLabel', 904e953f6bSStefano Zampini 'PetscDualSpace', 914e953f6bSStefano Zampini 'IS', 924e953f6bSStefano Zampini 'ISLocalToGlobalMapping', 934e953f6bSStefano Zampini 'MatPartitioning', 944e953f6bSStefano Zampini 'MatNullSpace', 954e953f6bSStefano Zampini 'PetscRandom', 964e953f6bSStefano Zampini 'PetscViewer', 974e953f6bSStefano Zampini ] 984e953f6bSStefano Zampini if self.obj.klass not in missing: 994e953f6bSStefano Zampini self.assertTrue(self.obj.getAttr('opts_handler_called') == 1) 1004e953f6bSStefano Zampini 101*8e704042SBarry Smith if not self.obj.getType() or not 'da' == str(self.obj.getType()): 1024e953f6bSStefano Zampini self.obj.setAttr('opts_handler_called', 0) 1034e953f6bSStefano Zampini self.obj.setOptionsHandler(None) 1044e953f6bSStefano Zampini self.obj.setFromOptions() 1054e953f6bSStefano Zampini self.assertFalse(self.obj.getAttr('opts_handler_called')) 1064e953f6bSStefano Zampini 1074e953f6bSStefano Zampini self.obj.destroyOptionsHandlers() 1084e953f6bSStefano Zampini self.obj.setFromOptions() 1094e953f6bSStefano Zampini self.assertFalse(self.obj.getAttr('opts_handler_called')) 1104e953f6bSStefano Zampini 1115808f684SSatish Balay def testName(self): 1125808f684SSatish Balay oldname = self.obj.getName() 1136f336411SStefano Zampini newname = f'{oldname}-{oldname}' 1145808f684SSatish Balay self.obj.setName(newname) 1155808f684SSatish Balay self.assertEqual(self.obj.getName(), newname) 1165808f684SSatish Balay self.obj.setName(oldname) 1175808f684SSatish Balay self.assertEqual(self.obj.getName(), oldname) 1185808f684SSatish Balay 1195808f684SSatish Balay def testComm(self): 1205808f684SSatish Balay comm = self.obj.getComm() 1215808f684SSatish Balay self.assertTrue(isinstance(comm, PETSc.Comm)) 1225808f684SSatish Balay self.assertTrue(comm in [PETSc.COMM_SELF, PETSc.COMM_WORLD]) 1235808f684SSatish Balay 1245808f684SSatish Balay def testRefCount(self): 1255808f684SSatish Balay self.assertEqual(self.obj.getRefCount(), 1) 1265808f684SSatish Balay self.obj.incRef() 1275808f684SSatish Balay self.assertEqual(self.obj.getRefCount(), 2) 1285808f684SSatish Balay self.obj.incRef() 1295808f684SSatish Balay self.assertEqual(self.obj.getRefCount(), 3) 1305808f684SSatish Balay self.obj.decRef() 1315808f684SSatish Balay self.assertEqual(self.obj.getRefCount(), 2) 1325808f684SSatish Balay self.obj.decRef() 1335808f684SSatish Balay self.assertEqual(self.obj.getRefCount(), 1) 1345808f684SSatish Balay self.obj.decRef() 1355808f684SSatish Balay self.assertFalse(bool(self.obj)) 1365808f684SSatish Balay 1375808f684SSatish Balay def testHandle(self): 1385808f684SSatish Balay self.assertTrue(self.obj.handle) 1395808f684SSatish Balay self.assertTrue(self.obj.fortran) 1405808f684SSatish Balay h, f = self.obj.handle, self.obj.fortran 1415808f684SSatish Balay if (h > 0 and f > 0) or (h < 0 and f < 0): 1425808f684SSatish Balay self.assertEqual(h, f) 1435808f684SSatish Balay self.obj.destroy() 1445808f684SSatish Balay self.assertFalse(self.obj.handle) 1455808f684SSatish Balay self.assertFalse(self.obj.fortran) 1465808f684SSatish Balay 1475808f684SSatish Balay def testComposeQuery(self): 1485808f684SSatish Balay import copy 1496f336411SStefano Zampini 1505808f684SSatish Balay try: 1515808f684SSatish Balay myobj = copy.deepcopy(self.obj) 1525808f684SSatish Balay except NotImplementedError: 1535808f684SSatish Balay return 1545808f684SSatish Balay self.assertEqual(myobj.getRefCount(), 1) 1555808f684SSatish Balay self.obj.compose('myobj', myobj) 1565808f684SSatish Balay self.assertTrue(type(self.obj.query('myobj')) is self.CLASS) 1575808f684SSatish Balay self.assertEqual(self.obj.query('myobj'), myobj) 1585808f684SSatish Balay self.assertEqual(myobj.getRefCount(), 2) 1595808f684SSatish Balay self.obj.compose('myobj', None) 1605808f684SSatish Balay self.assertEqual(myobj.getRefCount(), 1) 1615808f684SSatish Balay self.assertEqual(self.obj.query('myobj'), None) 1625808f684SSatish Balay myobj.destroy() 1635808f684SSatish Balay 1645808f684SSatish Balay def testProperties(self): 1655808f684SSatish Balay self.assertEqual(self.obj.getClassId(), self.obj.classid) 1665808f684SSatish Balay self.assertEqual(self.obj.getClassName(), self.obj.klass) 1675808f684SSatish Balay self.assertEqual(self.obj.getType(), self.obj.type) 1685808f684SSatish Balay self.assertEqual(self.obj.getName(), self.obj.name) 1695808f684SSatish Balay self.assertEqual(self.obj.getComm(), self.obj.comm) 1705808f684SSatish Balay self.assertEqual(self.obj.getRefCount(), self.obj.refcount) 1715808f684SSatish Balay 1725808f684SSatish Balay def testShallowCopy(self): 1735808f684SSatish Balay import copy 1746f336411SStefano Zampini 1755808f684SSatish Balay rc = self.obj.getRefCount() 1765808f684SSatish Balay obj = copy.copy(self.obj) 1775808f684SSatish Balay self.assertTrue(obj is not self.obj) 1785808f684SSatish Balay self.assertTrue(obj == self.obj) 1796f336411SStefano Zampini self.assertTrue(isinstance(obj, type(self.obj))) 1805808f684SSatish Balay self.assertEqual(obj.getRefCount(), rc + 1) 1815808f684SSatish Balay del obj 1825808f684SSatish Balay self.assertEqual(self.obj.getRefCount(), rc) 1835808f684SSatish Balay 1845808f684SSatish Balay def testDeepCopy(self): 1855808f684SSatish Balay import copy 1866f336411SStefano Zampini 1875808f684SSatish Balay rc = self.obj.getRefCount() 1885808f684SSatish Balay try: 1895808f684SSatish Balay obj = copy.deepcopy(self.obj) 1905808f684SSatish Balay except NotImplementedError: 1915808f684SSatish Balay return 1925808f684SSatish Balay self.assertTrue(obj is not self.obj) 1935808f684SSatish Balay self.assertTrue(obj != self.obj) 1946f336411SStefano Zampini self.assertTrue(isinstance(obj, type(self.obj))) 1955808f684SSatish Balay self.assertEqual(self.obj.getRefCount(), rc) 1965808f684SSatish Balay self.assertEqual(obj.getRefCount(), 1) 1975808f684SSatish Balay del obj 1985808f684SSatish Balay 19984f2ad6dSLawrence Mitchell def testStateInspection(self): 20084f2ad6dSLawrence Mitchell state = self.obj.stateGet() 20184f2ad6dSLawrence Mitchell self.obj.stateIncrease() 20284f2ad6dSLawrence Mitchell self.assertTrue(state < self.obj.stateGet()) 20384f2ad6dSLawrence Mitchell self.obj.stateSet(0) 20484f2ad6dSLawrence Mitchell self.assertTrue(self.obj.stateGet() == 0) 20584f2ad6dSLawrence Mitchell self.obj.stateSet(state) 20684f2ad6dSLawrence Mitchell self.assertTrue(self.obj.stateGet() == state) 20784f2ad6dSLawrence Mitchell 20884f2ad6dSLawrence Mitchell 2095808f684SSatish Balay# -------------------------------------------------------------------- 2105808f684SSatish Balay 2116f336411SStefano Zampini 2125808f684SSatish Balayclass TestObjectRandom(BaseTestObject, unittest.TestCase): 2135808f684SSatish Balay CLASS = PETSc.Random 2145808f684SSatish Balay FACTORY = 'create' 2155808f684SSatish Balay 2166f336411SStefano Zampini 2175808f684SSatish Balayclass TestObjectViewer(BaseTestObject, unittest.TestCase): 2185808f684SSatish Balay CLASS = PETSc.Viewer 2195808f684SSatish Balay FACTORY = 'create' 2205808f684SSatish Balay 2216f336411SStefano Zampini 2225808f684SSatish Balayclass TestObjectIS(BaseTestObject, unittest.TestCase): 2235808f684SSatish Balay CLASS = PETSc.IS 2245808f684SSatish Balay FACTORY = 'createGeneral' 2255808f684SSatish Balay TARGS = ([],) 2265808f684SSatish Balay 2276f336411SStefano Zampini 2285808f684SSatish Balayclass TestObjectLGMap(BaseTestObject, unittest.TestCase): 2295808f684SSatish Balay CLASS = PETSc.LGMap 2305808f684SSatish Balay FACTORY = 'create' 2315808f684SSatish Balay TARGS = ([],) 2325808f684SSatish Balay 2336f336411SStefano Zampini 2345808f684SSatish Balayclass TestObjectAO(BaseTestObject, unittest.TestCase): 2355808f684SSatish Balay CLASS = PETSc.AO 2365808f684SSatish Balay FACTORY = 'createMapping' 2375808f684SSatish Balay TARGS = ([], []) 2385808f684SSatish Balay 2396f336411SStefano Zampini 2405808f684SSatish Balayclass TestObjectDMDA(BaseTestObject, unittest.TestCase): 2415808f684SSatish Balay CLASS = PETSc.DMDA 2425808f684SSatish Balay FACTORY = 'create' 2435808f684SSatish Balay TARGS = ([3, 3, 3],) 2445808f684SSatish Balay 2456f336411SStefano Zampini 2465808f684SSatish Balayclass TestObjectDS(BaseTestObject, unittest.TestCase): 2475808f684SSatish Balay CLASS = PETSc.DS 2485808f684SSatish Balay FACTORY = 'create' 2495808f684SSatish Balay 2506f336411SStefano Zampini 2515808f684SSatish Balayclass TestObjectVec(BaseTestObject, unittest.TestCase): 2525808f684SSatish Balay CLASS = PETSc.Vec 2535808f684SSatish Balay FACTORY = 'createSeq' 2545808f684SSatish Balay TARGS = (0,) 2555808f684SSatish Balay 2565808f684SSatish Balay def setUp(self): 2575808f684SSatish Balay BaseTestObject.setUp(self) 2585808f684SSatish Balay self.obj.assemble() 2595808f684SSatish Balay 2606f336411SStefano Zampini 2615808f684SSatish Balayclass TestObjectMat(BaseTestObject, unittest.TestCase): 2625808f684SSatish Balay CLASS = PETSc.Mat 2635808f684SSatish Balay FACTORY = 'createAIJ' 2645808f684SSatish Balay TARGS = (0,) 2655808f684SSatish Balay KARGS = {'nnz': 0, 'comm': PETSc.COMM_SELF} 2665808f684SSatish Balay 2675808f684SSatish Balay def setUp(self): 2685808f684SSatish Balay BaseTestObject.setUp(self) 2695808f684SSatish Balay self.obj.assemble() 2705808f684SSatish Balay 2716f336411SStefano Zampini 272af20bb8eSPierre Jolivetclass TestObjectMatPartitioning(BaseTestObject, unittest.TestCase): 273af20bb8eSPierre Jolivet CLASS = PETSc.MatPartitioning 274af20bb8eSPierre Jolivet FACTORY = 'create' 275af20bb8eSPierre Jolivet 2766f336411SStefano Zampini 2775808f684SSatish Balayclass TestObjectNullSpace(BaseTestObject, unittest.TestCase): 2785808f684SSatish Balay CLASS = PETSc.NullSpace 2795808f684SSatish Balay FACTORY = 'create' 2805808f684SSatish Balay TARGS = (True, []) 2815808f684SSatish Balay 2826f336411SStefano Zampini 2835808f684SSatish Balayclass TestObjectKSP(BaseTestObject, unittest.TestCase): 2845808f684SSatish Balay CLASS = PETSc.KSP 2855808f684SSatish Balay FACTORY = 'create' 2865808f684SSatish Balay 2876f336411SStefano Zampini 2885808f684SSatish Balayclass TestObjectPC(BaseTestObject, unittest.TestCase): 2895808f684SSatish Balay CLASS = PETSc.PC 2905808f684SSatish Balay FACTORY = 'create' 2915808f684SSatish Balay 2926f336411SStefano Zampini 2935808f684SSatish Balayclass TestObjectSNES(BaseTestObject, unittest.TestCase): 2945808f684SSatish Balay CLASS = PETSc.SNES 2955808f684SSatish Balay FACTORY = 'create' 2965808f684SSatish Balay 2976f336411SStefano Zampini 2985808f684SSatish Balayclass TestObjectTS(BaseTestObject, unittest.TestCase): 2995808f684SSatish Balay CLASS = PETSc.TS 3005808f684SSatish Balay FACTORY = 'create' 3016f336411SStefano Zampini 3025808f684SSatish Balay def setUp(self): 3036f336411SStefano Zampini super().setUp() 3045808f684SSatish Balay self.obj.setProblemType(PETSc.TS.ProblemType.NONLINEAR) 3055808f684SSatish Balay self.obj.setType(PETSc.TS.Type.BEULER) 3065808f684SSatish Balay 3076f336411SStefano Zampini 3085808f684SSatish Balayclass TestObjectTAO(BaseTestObject, unittest.TestCase): 3095808f684SSatish Balay CLASS = PETSc.TAO 3105808f684SSatish Balay FACTORY = 'create' 3115808f684SSatish Balay 3126f336411SStefano Zampini 3135808f684SSatish Balayclass TestObjectAOBasic(BaseTestObject, unittest.TestCase): 3145808f684SSatish Balay CLASS = PETSc.AO 3155808f684SSatish Balay FACTORY = 'createBasic' 3165808f684SSatish Balay TARGS = ([], []) 3175808f684SSatish Balay 3186f336411SStefano Zampini 3195808f684SSatish Balayclass TestObjectAOMapping(BaseTestObject, unittest.TestCase): 3205808f684SSatish Balay CLASS = PETSc.AO 3215808f684SSatish Balay FACTORY = 'createMapping' 3225808f684SSatish Balay TARGS = ([], []) 3235808f684SSatish Balay 3246f336411SStefano Zampini 3255808f684SSatish Balay# class TestObjectFE(BaseTestObject, unittest.TestCase): 3265808f684SSatish Balay# CLASS = PETSc.FE 3275808f684SSatish Balay# FACTORY = 'create' 3285808f684SSatish Balay# 3295808f684SSatish Balay# class TestObjectQuad(BaseTestObject, unittest.TestCase): 3305808f684SSatish Balay# CLASS = PETSc.Quad 3315808f684SSatish Balay# FACTORY = 'create' 3325808f684SSatish Balay 3336f336411SStefano Zampini 3345808f684SSatish Balayclass TestObjectDMLabel(BaseTestObject, unittest.TestCase): 3355808f684SSatish Balay CLASS = PETSc.DMLabel 3365808f684SSatish Balay FACTORY = 'create' 3376f336411SStefano Zampini TARGS = ('test',) 3386f336411SStefano Zampini 3395808f684SSatish Balay 340aa712e9bSRomain Beucherclass TestObjectSpace(BaseTestObject, unittest.TestCase): 341aa712e9bSRomain Beucher CLASS = PETSc.Space 342aa712e9bSRomain Beucher FACTORY = 'create' 343aa712e9bSRomain Beucher 3446f336411SStefano Zampini 345aa712e9bSRomain Beucherclass TestObjectDualSpace(BaseTestObject, unittest.TestCase): 346aa712e9bSRomain Beucher CLASS = PETSc.DualSpace 347aa712e9bSRomain Beucher FACTORY = 'create' 348aa712e9bSRomain Beucher 3495808f684SSatish Balay 3506f336411SStefano Zampini# -------------------------------------------------------------------- 35184f2ad6dSLawrence Mitchell 3525808f684SSatish Balayif numpy.iscomplexobj(PETSc.ScalarType()): 3535808f684SSatish Balay del TestObjectTAO 3545808f684SSatish Balay 3555808f684SSatish Balayif __name__ == '__main__': 3565808f684SSatish Balay unittest.main() 357