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 BaseTestKSP(object): 10*5808f684SSatish Balay 11*5808f684SSatish Balay KSP_TYPE = None 12*5808f684SSatish Balay PC_TYPE = None 13*5808f684SSatish Balay 14*5808f684SSatish Balay def setUp(self): 15*5808f684SSatish Balay ksp = PETSc.KSP() 16*5808f684SSatish Balay ksp.create(PETSc.COMM_SELF) 17*5808f684SSatish Balay if self.KSP_TYPE: 18*5808f684SSatish Balay ksp.setType(self.KSP_TYPE) 19*5808f684SSatish Balay if self.PC_TYPE: 20*5808f684SSatish Balay pc = ksp.getPC() 21*5808f684SSatish Balay pc.setType(self.PC_TYPE) 22*5808f684SSatish Balay self.ksp = ksp 23*5808f684SSatish Balay 24*5808f684SSatish Balay def tearDown(self): 25*5808f684SSatish Balay self.ksp = None 26*5808f684SSatish Balay 27*5808f684SSatish Balay def testGetSetType(self): 28*5808f684SSatish Balay self.assertEqual(self.ksp.getType(), self.KSP_TYPE) 29*5808f684SSatish Balay self.ksp.setType(self.KSP_TYPE) 30*5808f684SSatish Balay self.assertEqual(self.ksp.getType(), self.KSP_TYPE) 31*5808f684SSatish Balay 32*5808f684SSatish Balay def testTols(self): 33*5808f684SSatish Balay tols = self.ksp.getTolerances() 34*5808f684SSatish Balay self.ksp.setTolerances(*tols) 35*5808f684SSatish Balay tnames = ('rtol', 'atol', 'divtol', 'max_it') 36*5808f684SSatish Balay tolvals = [getattr(self.ksp, t) for t in tnames] 37*5808f684SSatish Balay self.assertEqual(tuple(tols), tuple(tolvals)) 38*5808f684SSatish Balay 39*5808f684SSatish Balay def testProperties(self): 40*5808f684SSatish Balay ksp = self.ksp 41*5808f684SSatish Balay # 42*5808f684SSatish Balay ksp.appctx = (1,2,3) 43*5808f684SSatish Balay self.assertEqual(ksp.appctx, (1,2,3)) 44*5808f684SSatish Balay ksp.appctx = None 45*5808f684SSatish Balay self.assertEqual(ksp.appctx, None) 46*5808f684SSatish Balay # 47*5808f684SSatish Balay side = ksp.pc_side 48*5808f684SSatish Balay ksp.pc_side = side 49*5808f684SSatish Balay self.assertEqual(ksp.pc_side, side) 50*5808f684SSatish Balay # 51*5808f684SSatish Balay nt = ksp.norm_type 52*5808f684SSatish Balay ksp.norm_type = nt 53*5808f684SSatish Balay self.assertEqual(ksp.norm_type, nt) 54*5808f684SSatish Balay # 55*5808f684SSatish Balay ksp.its = 1 56*5808f684SSatish Balay self.assertEqual(ksp.its, 1) 57*5808f684SSatish Balay ksp.its = 0 58*5808f684SSatish Balay self.assertEqual(ksp.its, 0) 59*5808f684SSatish Balay # 60*5808f684SSatish Balay ksp.norm = 1 61*5808f684SSatish Balay self.assertEqual(ksp.norm, 1) 62*5808f684SSatish Balay ksp.norm = 0 63*5808f684SSatish Balay self.assertEqual(ksp.norm, 0) 64*5808f684SSatish Balay # 65*5808f684SSatish Balay rh = ksp.history 66*5808f684SSatish Balay self.assertTrue(len(rh)==0) 67*5808f684SSatish Balay # 68*5808f684SSatish Balay reason = PETSc.KSP.ConvergedReason.CONVERGED_ITS 69*5808f684SSatish Balay ksp.reason = reason 70*5808f684SSatish Balay self.assertEqual(ksp.reason, reason) 71*5808f684SSatish Balay self.assertTrue(ksp.converged) 72*5808f684SSatish Balay self.assertFalse(ksp.diverged) 73*5808f684SSatish Balay self.assertFalse(ksp.iterating) 74*5808f684SSatish Balay reason = PETSc.KSP.ConvergedReason.DIVERGED_MAX_IT 75*5808f684SSatish Balay ksp.reason = reason 76*5808f684SSatish Balay self.assertEqual(ksp.reason, reason) 77*5808f684SSatish Balay self.assertFalse(ksp.converged) 78*5808f684SSatish Balay self.assertTrue(ksp.diverged) 79*5808f684SSatish Balay self.assertFalse(ksp.iterating) 80*5808f684SSatish Balay reason = PETSc.KSP.ConvergedReason.CONVERGED_ITERATING 81*5808f684SSatish Balay ksp.reason = reason 82*5808f684SSatish Balay self.assertEqual(ksp.reason, reason) 83*5808f684SSatish Balay self.assertFalse(ksp.converged) 84*5808f684SSatish Balay self.assertFalse(ksp.diverged) 85*5808f684SSatish Balay self.assertTrue(ksp.iterating) 86*5808f684SSatish Balay 87*5808f684SSatish Balay def testGetSetPC(self): 88*5808f684SSatish Balay oldpc = self.ksp.getPC() 89*5808f684SSatish Balay self.assertEqual(oldpc.getRefCount(), 2) 90*5808f684SSatish Balay newpc = PETSc.PC() 91*5808f684SSatish Balay newpc.create(self.ksp.getComm()) 92*5808f684SSatish Balay self.assertEqual(newpc.getRefCount(), 1) 93*5808f684SSatish Balay self.ksp.setPC(newpc) 94*5808f684SSatish Balay self.assertEqual(newpc.getRefCount(), 2) 95*5808f684SSatish Balay self.assertEqual(oldpc.getRefCount(), 1) 96*5808f684SSatish Balay oldpc.destroy() 97*5808f684SSatish Balay self.assertFalse(bool(oldpc)) 98*5808f684SSatish Balay pc = self.ksp.getPC() 99*5808f684SSatish Balay self.assertTrue(bool(pc)) 100*5808f684SSatish Balay self.assertEqual(pc, newpc) 101*5808f684SSatish Balay self.assertEqual(pc.getRefCount(), 3) 102*5808f684SSatish Balay newpc.destroy() 103*5808f684SSatish Balay self.assertFalse(bool(newpc)) 104*5808f684SSatish Balay self.assertEqual(pc.getRefCount(), 2) 105*5808f684SSatish Balay 106*5808f684SSatish Balay def testSolve(self): 107*5808f684SSatish Balay A = PETSc.Mat().create(PETSc.COMM_SELF) 108*5808f684SSatish Balay A.setSizes([3,3]) 109*5808f684SSatish Balay A.setType(PETSc.Mat.Type.SEQAIJ) 110*5808f684SSatish Balay A.setPreallocationNNZ(1) 111*5808f684SSatish Balay for i in range(3): 112*5808f684SSatish Balay A.setValue(i, i, 0.9/(i+1)) 113*5808f684SSatish Balay A.assemble() 114*5808f684SSatish Balay A.shift(1) 115*5808f684SSatish Balay x, b = A.createVecs() 116*5808f684SSatish Balay b.set(10) 117*5808f684SSatish Balay x.setRandom() 118*5808f684SSatish Balay self.ksp.setOperators(A) 119*5808f684SSatish Balay self.ksp.setConvergenceHistory() 120*5808f684SSatish Balay self.ksp.solve(b, x) 121*5808f684SSatish Balay r = b.duplicate() 122*5808f684SSatish Balay u = x.duplicate() 123*5808f684SSatish Balay self.ksp.buildSolution(u) 124*5808f684SSatish Balay self.ksp.buildResidual(u) 125*5808f684SSatish Balay rh = self.ksp.getConvergenceHistory() 126*5808f684SSatish Balay self.ksp.setConvergenceHistory(0) 127*5808f684SSatish Balay rh = self.ksp.getConvergenceHistory() 128*5808f684SSatish Balay self.assertEqual(len(rh), 0) 129*5808f684SSatish Balay del A, x, b 130*5808f684SSatish Balay 131*5808f684SSatish Balay def testResetAndSolve(self): 132*5808f684SSatish Balay self.ksp.reset() 133*5808f684SSatish Balay self.testSolve() 134*5808f684SSatish Balay self.ksp.reset() 135*5808f684SSatish Balay self.testSolve() 136*5808f684SSatish Balay self.ksp.reset() 137*5808f684SSatish Balay 138*5808f684SSatish Balay def testSetMonitor(self): 139*5808f684SSatish Balay reshist = {} 140*5808f684SSatish Balay def monitor(ksp, its, rnorm): 141*5808f684SSatish Balay reshist[its] = rnorm 142*5808f684SSatish Balay refcnt = getrefcount(monitor) 143*5808f684SSatish Balay self.ksp.setMonitor(monitor) 144*5808f684SSatish Balay self.assertEqual(getrefcount(monitor), refcnt + 1) 145*5808f684SSatish Balay ## self.testSolve() 146*5808f684SSatish Balay reshist = {} 147*5808f684SSatish Balay self.ksp.cancelMonitor() 148*5808f684SSatish Balay self.assertEqual(getrefcount(monitor), refcnt) 149*5808f684SSatish Balay self.testSolve() 150*5808f684SSatish Balay self.assertEqual(len(reshist), 0) 151*5808f684SSatish Balay ## Monitor = PETSc.KSP.Monitor 152*5808f684SSatish Balay ## self.ksp.setMonitor(Monitor()) 153*5808f684SSatish Balay ## self.ksp.setMonitor(Monitor.DEFAULT) 154*5808f684SSatish Balay ## self.ksp.setMonitor(Monitor.TRUE_RESIDUAL_NORM) 155*5808f684SSatish Balay ## self.ksp.setMonitor(Monitor.SOLUTION) 156*5808f684SSatish Balay 157*5808f684SSatish Balay def testSetConvergenceTest(self): 158*5808f684SSatish Balay def converged(ksp, its, rnorm): 159*5808f684SSatish Balay if its > 10: return True 160*5808f684SSatish Balay return False 161*5808f684SSatish Balay refcnt = getrefcount(converged) 162*5808f684SSatish Balay self.ksp.setConvergenceTest(converged) 163*5808f684SSatish Balay self.assertEqual(getrefcount(converged), refcnt + 1) 164*5808f684SSatish Balay self.ksp.setConvergenceTest(None) 165*5808f684SSatish Balay self.assertEqual(getrefcount(converged), refcnt) 166*5808f684SSatish Balay 167*5808f684SSatish Balay# -------------------------------------------------------------------- 168*5808f684SSatish Balay 169*5808f684SSatish Balayclass TestKSPPREONLY(BaseTestKSP, unittest.TestCase): 170*5808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.PREONLY 171*5808f684SSatish Balay PC_TYPE = PETSc.PC.Type.LU 172*5808f684SSatish Balay 173*5808f684SSatish Balayclass TestKSPRICHARDSON(BaseTestKSP, unittest.TestCase): 174*5808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.RICHARDSON 175*5808f684SSatish Balay 176*5808f684SSatish Balayclass TestKSPCHEBYCHEV(BaseTestKSP, unittest.TestCase): 177*5808f684SSatish Balay try: 178*5808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CHEBYSHEV 179*5808f684SSatish Balay except AttributeError: 180*5808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CHEBYCHEV 181*5808f684SSatish Balay 182*5808f684SSatish Balayclass TestKSPCG(BaseTestKSP, unittest.TestCase): 183*5808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CG 184*5808f684SSatish Balay 185*5808f684SSatish Balayclass TestKSPCGNE(BaseTestKSP, unittest.TestCase): 186*5808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CGNE 187*5808f684SSatish Balay 188*5808f684SSatish Balayclass TestKSPSTCG(BaseTestKSP, unittest.TestCase): 189*5808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.STCG 190*5808f684SSatish Balay 191*5808f684SSatish Balayclass TestKSPBCGS(BaseTestKSP, unittest.TestCase): 192*5808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.BCGS 193*5808f684SSatish Balay 194*5808f684SSatish Balayclass TestKSPBCGSL(BaseTestKSP, unittest.TestCase): 195*5808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.BCGSL 196*5808f684SSatish Balay 197*5808f684SSatish Balayclass TestKSPCGS(BaseTestKSP, unittest.TestCase): 198*5808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CGS 199*5808f684SSatish Balay 200*5808f684SSatish Balayclass TestKSPQCG(BaseTestKSP, unittest.TestCase): 201*5808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.QCG 202*5808f684SSatish Balay PC_TYPE = PETSc.PC.Type.JACOBI 203*5808f684SSatish Balay 204*5808f684SSatish Balayclass TestKSPBICG(BaseTestKSP, unittest.TestCase): 205*5808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.BICG 206*5808f684SSatish Balay 207*5808f684SSatish Balayclass TestKSPGMRES(BaseTestKSP, unittest.TestCase): 208*5808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.GMRES 209*5808f684SSatish Balay 210*5808f684SSatish Balayclass TestKSPFGMRES(BaseTestKSP, unittest.TestCase): 211*5808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.FGMRES 212*5808f684SSatish Balay 213*5808f684SSatish Balay# -------------------------------------------------------------------- 214*5808f684SSatish Balay 215*5808f684SSatish Balayif PETSc.ScalarType().dtype.char in 'FDG': 216*5808f684SSatish Balay del TestKSPSTCG 217*5808f684SSatish Balay 218*5808f684SSatish Balay# -------------------------------------------------------------------- 219*5808f684SSatish Balay 220*5808f684SSatish Balayif __name__ == '__main__': 221*5808f684SSatish Balay unittest.main() 222