xref: /petsc/src/binding/petsc4py/test/test_object.py (revision 3a028a11bff09486bed12f8f17558ed2e1d20b96)
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
44*3a028a11SStefano Zampini    def testId(self):
45*3a028a11SStefano Zampini        oid = self.obj.getId()
46*3a028a11SStefano Zampini        self.assertTrue(oid > 0)
47*3a028a11SStefano Zampini        self.assertEqual(self.obj.id, oid)
48*3a028a11SStefano 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)
715808f684SSatish Balay        self.obj.setFromOptions()
725808f684SSatish Balay
735808f684SSatish Balay    def testName(self):
745808f684SSatish Balay        oldname = self.obj.getName()
756f336411SStefano Zampini        newname = f'{oldname}-{oldname}'
765808f684SSatish Balay        self.obj.setName(newname)
775808f684SSatish Balay        self.assertEqual(self.obj.getName(), newname)
785808f684SSatish Balay        self.obj.setName(oldname)
795808f684SSatish Balay        self.assertEqual(self.obj.getName(), oldname)
805808f684SSatish Balay
815808f684SSatish Balay    def testComm(self):
825808f684SSatish Balay        comm = self.obj.getComm()
835808f684SSatish Balay        self.assertTrue(isinstance(comm, PETSc.Comm))
845808f684SSatish Balay        self.assertTrue(comm in [PETSc.COMM_SELF, PETSc.COMM_WORLD])
855808f684SSatish Balay
865808f684SSatish Balay    def testRefCount(self):
875808f684SSatish Balay        self.assertEqual(self.obj.getRefCount(), 1)
885808f684SSatish Balay        self.obj.incRef()
895808f684SSatish Balay        self.assertEqual(self.obj.getRefCount(), 2)
905808f684SSatish Balay        self.obj.incRef()
915808f684SSatish Balay        self.assertEqual(self.obj.getRefCount(), 3)
925808f684SSatish Balay        self.obj.decRef()
935808f684SSatish Balay        self.assertEqual(self.obj.getRefCount(), 2)
945808f684SSatish Balay        self.obj.decRef()
955808f684SSatish Balay        self.assertEqual(self.obj.getRefCount(), 1)
965808f684SSatish Balay        self.obj.decRef()
975808f684SSatish Balay        self.assertFalse(bool(self.obj))
985808f684SSatish Balay
995808f684SSatish Balay    def testHandle(self):
1005808f684SSatish Balay        self.assertTrue(self.obj.handle)
1015808f684SSatish Balay        self.assertTrue(self.obj.fortran)
1025808f684SSatish Balay        h, f = self.obj.handle, self.obj.fortran
1035808f684SSatish Balay        if (h > 0 and f > 0) or (h < 0 and f < 0):
1045808f684SSatish Balay            self.assertEqual(h, f)
1055808f684SSatish Balay        self.obj.destroy()
1065808f684SSatish Balay        self.assertFalse(self.obj.handle)
1075808f684SSatish Balay        self.assertFalse(self.obj.fortran)
1085808f684SSatish Balay
1095808f684SSatish Balay    def testComposeQuery(self):
1105808f684SSatish Balay        import copy
1116f336411SStefano Zampini
1125808f684SSatish Balay        try:
1135808f684SSatish Balay            myobj = copy.deepcopy(self.obj)
1145808f684SSatish Balay        except NotImplementedError:
1155808f684SSatish Balay            return
1165808f684SSatish Balay        self.assertEqual(myobj.getRefCount(), 1)
1175808f684SSatish Balay        self.obj.compose('myobj', myobj)
1185808f684SSatish Balay        self.assertTrue(type(self.obj.query('myobj')) is self.CLASS)
1195808f684SSatish Balay        self.assertEqual(self.obj.query('myobj'), myobj)
1205808f684SSatish Balay        self.assertEqual(myobj.getRefCount(), 2)
1215808f684SSatish Balay        self.obj.compose('myobj', None)
1225808f684SSatish Balay        self.assertEqual(myobj.getRefCount(), 1)
1235808f684SSatish Balay        self.assertEqual(self.obj.query('myobj'), None)
1245808f684SSatish Balay        myobj.destroy()
1255808f684SSatish Balay
1265808f684SSatish Balay    def testProperties(self):
1275808f684SSatish Balay        self.assertEqual(self.obj.getClassId(), self.obj.classid)
1285808f684SSatish Balay        self.assertEqual(self.obj.getClassName(), self.obj.klass)
1295808f684SSatish Balay        self.assertEqual(self.obj.getType(), self.obj.type)
1305808f684SSatish Balay        self.assertEqual(self.obj.getName(), self.obj.name)
1315808f684SSatish Balay        self.assertEqual(self.obj.getComm(), self.obj.comm)
1325808f684SSatish Balay        self.assertEqual(self.obj.getRefCount(), self.obj.refcount)
1335808f684SSatish Balay
1345808f684SSatish Balay    def testShallowCopy(self):
1355808f684SSatish Balay        import copy
1366f336411SStefano Zampini
1375808f684SSatish Balay        rc = self.obj.getRefCount()
1385808f684SSatish Balay        obj = copy.copy(self.obj)
1395808f684SSatish Balay        self.assertTrue(obj is not self.obj)
1405808f684SSatish Balay        self.assertTrue(obj == self.obj)
1416f336411SStefano Zampini        self.assertTrue(isinstance(obj, type(self.obj)))
1425808f684SSatish Balay        self.assertEqual(obj.getRefCount(), rc + 1)
1435808f684SSatish Balay        del obj
1445808f684SSatish Balay        self.assertEqual(self.obj.getRefCount(), rc)
1455808f684SSatish Balay
1465808f684SSatish Balay    def testDeepCopy(self):
1475808f684SSatish Balay        import copy
1486f336411SStefano Zampini
1495808f684SSatish Balay        rc = self.obj.getRefCount()
1505808f684SSatish Balay        try:
1515808f684SSatish Balay            obj = copy.deepcopy(self.obj)
1525808f684SSatish Balay        except NotImplementedError:
1535808f684SSatish Balay            return
1545808f684SSatish Balay        self.assertTrue(obj is not self.obj)
1555808f684SSatish Balay        self.assertTrue(obj != self.obj)
1566f336411SStefano Zampini        self.assertTrue(isinstance(obj, type(self.obj)))
1575808f684SSatish Balay        self.assertEqual(self.obj.getRefCount(), rc)
1585808f684SSatish Balay        self.assertEqual(obj.getRefCount(), 1)
1595808f684SSatish Balay        del obj
1605808f684SSatish Balay
16184f2ad6dSLawrence Mitchell    def testStateInspection(self):
16284f2ad6dSLawrence Mitchell        state = self.obj.stateGet()
16384f2ad6dSLawrence Mitchell        self.obj.stateIncrease()
16484f2ad6dSLawrence Mitchell        self.assertTrue(state < self.obj.stateGet())
16584f2ad6dSLawrence Mitchell        self.obj.stateSet(0)
16684f2ad6dSLawrence Mitchell        self.assertTrue(self.obj.stateGet() == 0)
16784f2ad6dSLawrence Mitchell        self.obj.stateSet(state)
16884f2ad6dSLawrence Mitchell        self.assertTrue(self.obj.stateGet() == state)
16984f2ad6dSLawrence Mitchell
17084f2ad6dSLawrence Mitchell
1715808f684SSatish Balay# --------------------------------------------------------------------
1725808f684SSatish Balay
1736f336411SStefano Zampini
1745808f684SSatish Balayclass TestObjectRandom(BaseTestObject, unittest.TestCase):
1755808f684SSatish Balay    CLASS = PETSc.Random
1765808f684SSatish Balay    FACTORY = 'create'
1775808f684SSatish Balay
1786f336411SStefano Zampini
1795808f684SSatish Balayclass TestObjectViewer(BaseTestObject, unittest.TestCase):
1805808f684SSatish Balay    CLASS = PETSc.Viewer
1815808f684SSatish Balay    FACTORY = 'create'
1825808f684SSatish Balay
1836f336411SStefano Zampini
1845808f684SSatish Balayclass TestObjectIS(BaseTestObject, unittest.TestCase):
1855808f684SSatish Balay    CLASS = PETSc.IS
1865808f684SSatish Balay    FACTORY = 'createGeneral'
1875808f684SSatish Balay    TARGS = ([],)
1885808f684SSatish Balay
1896f336411SStefano Zampini
1905808f684SSatish Balayclass TestObjectLGMap(BaseTestObject, unittest.TestCase):
1915808f684SSatish Balay    CLASS = PETSc.LGMap
1925808f684SSatish Balay    FACTORY = 'create'
1935808f684SSatish Balay    TARGS = ([],)
1945808f684SSatish Balay
1956f336411SStefano Zampini
1965808f684SSatish Balayclass TestObjectAO(BaseTestObject, unittest.TestCase):
1975808f684SSatish Balay    CLASS = PETSc.AO
1985808f684SSatish Balay    FACTORY = 'createMapping'
1995808f684SSatish Balay    TARGS = ([], [])
2005808f684SSatish Balay
2016f336411SStefano Zampini
2025808f684SSatish Balayclass TestObjectDMDA(BaseTestObject, unittest.TestCase):
2035808f684SSatish Balay    CLASS = PETSc.DMDA
2045808f684SSatish Balay    FACTORY = 'create'
2055808f684SSatish Balay    TARGS = ([3, 3, 3],)
2065808f684SSatish Balay
2076f336411SStefano Zampini
2085808f684SSatish Balayclass TestObjectDS(BaseTestObject, unittest.TestCase):
2095808f684SSatish Balay    CLASS = PETSc.DS
2105808f684SSatish Balay    FACTORY = 'create'
2115808f684SSatish Balay
2126f336411SStefano Zampini
2135808f684SSatish Balayclass TestObjectVec(BaseTestObject, unittest.TestCase):
2145808f684SSatish Balay    CLASS = PETSc.Vec
2155808f684SSatish Balay    FACTORY = 'createSeq'
2165808f684SSatish Balay    TARGS = (0,)
2175808f684SSatish Balay
2185808f684SSatish Balay    def setUp(self):
2195808f684SSatish Balay        BaseTestObject.setUp(self)
2205808f684SSatish Balay        self.obj.assemble()
2215808f684SSatish Balay
2226f336411SStefano Zampini
2235808f684SSatish Balayclass TestObjectMat(BaseTestObject, unittest.TestCase):
2245808f684SSatish Balay    CLASS = PETSc.Mat
2255808f684SSatish Balay    FACTORY = 'createAIJ'
2265808f684SSatish Balay    TARGS = (0,)
2275808f684SSatish Balay    KARGS = {'nnz': 0, 'comm': PETSc.COMM_SELF}
2285808f684SSatish Balay
2295808f684SSatish Balay    def setUp(self):
2305808f684SSatish Balay        BaseTestObject.setUp(self)
2315808f684SSatish Balay        self.obj.assemble()
2325808f684SSatish Balay
2336f336411SStefano Zampini
234af20bb8eSPierre Jolivetclass TestObjectMatPartitioning(BaseTestObject, unittest.TestCase):
235af20bb8eSPierre Jolivet    CLASS = PETSc.MatPartitioning
236af20bb8eSPierre Jolivet    FACTORY = 'create'
237af20bb8eSPierre Jolivet
2386f336411SStefano Zampini
2395808f684SSatish Balayclass TestObjectNullSpace(BaseTestObject, unittest.TestCase):
2405808f684SSatish Balay    CLASS = PETSc.NullSpace
2415808f684SSatish Balay    FACTORY = 'create'
2425808f684SSatish Balay    TARGS = (True, [])
2435808f684SSatish Balay
2446f336411SStefano Zampini
2455808f684SSatish Balayclass TestObjectKSP(BaseTestObject, unittest.TestCase):
2465808f684SSatish Balay    CLASS = PETSc.KSP
2475808f684SSatish Balay    FACTORY = 'create'
2485808f684SSatish Balay
2496f336411SStefano Zampini
2505808f684SSatish Balayclass TestObjectPC(BaseTestObject, unittest.TestCase):
2515808f684SSatish Balay    CLASS = PETSc.PC
2525808f684SSatish Balay    FACTORY = 'create'
2535808f684SSatish Balay
2546f336411SStefano Zampini
2555808f684SSatish Balayclass TestObjectSNES(BaseTestObject, unittest.TestCase):
2565808f684SSatish Balay    CLASS = PETSc.SNES
2575808f684SSatish Balay    FACTORY = 'create'
2585808f684SSatish Balay
2596f336411SStefano Zampini
2605808f684SSatish Balayclass TestObjectTS(BaseTestObject, unittest.TestCase):
2615808f684SSatish Balay    CLASS = PETSc.TS
2625808f684SSatish Balay    FACTORY = 'create'
2636f336411SStefano Zampini
2645808f684SSatish Balay    def setUp(self):
2656f336411SStefano Zampini        super().setUp()
2665808f684SSatish Balay        self.obj.setProblemType(PETSc.TS.ProblemType.NONLINEAR)
2675808f684SSatish Balay        self.obj.setType(PETSc.TS.Type.BEULER)
2685808f684SSatish Balay
2696f336411SStefano Zampini
2705808f684SSatish Balayclass TestObjectTAO(BaseTestObject, unittest.TestCase):
2715808f684SSatish Balay    CLASS = PETSc.TAO
2725808f684SSatish Balay    FACTORY = 'create'
2735808f684SSatish Balay
2746f336411SStefano Zampini
2755808f684SSatish Balayclass TestObjectAOBasic(BaseTestObject, unittest.TestCase):
2765808f684SSatish Balay    CLASS = PETSc.AO
2775808f684SSatish Balay    FACTORY = 'createBasic'
2785808f684SSatish Balay    TARGS = ([], [])
2795808f684SSatish Balay
2806f336411SStefano Zampini
2815808f684SSatish Balayclass TestObjectAOMapping(BaseTestObject, unittest.TestCase):
2825808f684SSatish Balay    CLASS = PETSc.AO
2835808f684SSatish Balay    FACTORY = 'createMapping'
2845808f684SSatish Balay    TARGS = ([], [])
2855808f684SSatish Balay
2866f336411SStefano Zampini
2875808f684SSatish Balay# class TestObjectFE(BaseTestObject, unittest.TestCase):
2885808f684SSatish Balay#     CLASS  = PETSc.FE
2895808f684SSatish Balay#     FACTORY = 'create'
2905808f684SSatish Balay#
2915808f684SSatish Balay# class TestObjectQuad(BaseTestObject, unittest.TestCase):
2925808f684SSatish Balay#     CLASS  = PETSc.Quad
2935808f684SSatish Balay#     FACTORY = 'create'
2945808f684SSatish Balay
2956f336411SStefano Zampini
2965808f684SSatish Balayclass TestObjectDMLabel(BaseTestObject, unittest.TestCase):
2975808f684SSatish Balay    CLASS = PETSc.DMLabel
2985808f684SSatish Balay    FACTORY = 'create'
2996f336411SStefano Zampini    TARGS = ('test',)
3006f336411SStefano Zampini
3015808f684SSatish Balay
302aa712e9bSRomain Beucherclass TestObjectSpace(BaseTestObject, unittest.TestCase):
303aa712e9bSRomain Beucher    CLASS = PETSc.Space
304aa712e9bSRomain Beucher    FACTORY = 'create'
305aa712e9bSRomain Beucher
3066f336411SStefano Zampini
307aa712e9bSRomain Beucherclass TestObjectDualSpace(BaseTestObject, unittest.TestCase):
308aa712e9bSRomain Beucher    CLASS = PETSc.DualSpace
309aa712e9bSRomain Beucher    FACTORY = 'create'
310aa712e9bSRomain Beucher
3115808f684SSatish Balay
3126f336411SStefano Zampini# --------------------------------------------------------------------
31384f2ad6dSLawrence Mitchell
3145808f684SSatish Balayif numpy.iscomplexobj(PETSc.ScalarType()):
3155808f684SSatish Balay    del TestObjectTAO
3165808f684SSatish Balay
3175808f684SSatish Balayif __name__ == '__main__':
3185808f684SSatish Balay    unittest.main()
319