xref: /petsc/src/binding/petsc4py/test/test_object.py (revision 8a7d4057d9226490dba4e1a062f54f84e7d90861)
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