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 Function: 10*5808f684SSatish Balay def __call__(self, snes, x, f): 11*5808f684SSatish Balay f[0] = (x[0]*x[0] + x[0]*x[1] - 3.0).item() 12*5808f684SSatish Balay f[1] = (x[0]*x[1] + x[1]*x[1] - 6.0).item() 13*5808f684SSatish Balay f.assemble() 14*5808f684SSatish Balay 15*5808f684SSatish Balayclass Jacobian: 16*5808f684SSatish Balay def __call__(self, snes, x, J, P): 17*5808f684SSatish Balay P[0,0] = (2.0*x[0] + x[1]).item() 18*5808f684SSatish Balay P[0,1] = (x[0]).item() 19*5808f684SSatish Balay P[1,0] = (x[1]).item() 20*5808f684SSatish Balay P[1,1] = (x[0] + 2.0*x[1]).item() 21*5808f684SSatish Balay P.assemble() 22*5808f684SSatish Balay if J != P: J.assemble() 23*5808f684SSatish Balay 24*5808f684SSatish Balay# -------------------------------------------------------------------- 25*5808f684SSatish Balay 26*5808f684SSatish Balayclass BaseTestSNES(object): 27*5808f684SSatish Balay 28*5808f684SSatish Balay SNES_TYPE = None 29*5808f684SSatish Balay 30*5808f684SSatish Balay def setUp(self): 31*5808f684SSatish Balay snes = PETSc.SNES() 32*5808f684SSatish Balay snes.create(PETSc.COMM_SELF) 33*5808f684SSatish Balay if self.SNES_TYPE: 34*5808f684SSatish Balay snes.setType(self.SNES_TYPE) 35*5808f684SSatish Balay self.snes = snes 36*5808f684SSatish Balay 37*5808f684SSatish Balay def tearDown(self): 38*5808f684SSatish Balay self.snes = None 39*5808f684SSatish Balay 40*5808f684SSatish Balay def testGetSetType(self): 41*5808f684SSatish Balay self.assertEqual(self.snes.getType(), self.SNES_TYPE) 42*5808f684SSatish Balay self.snes.setType(self.SNES_TYPE) 43*5808f684SSatish Balay self.assertEqual(self.snes.getType(), self.SNES_TYPE) 44*5808f684SSatish Balay 45*5808f684SSatish Balay def testTols(self): 46*5808f684SSatish Balay tols = self.snes.getTolerances() 47*5808f684SSatish Balay self.snes.setTolerances(*tols) 48*5808f684SSatish Balay tnames = ('rtol', 'atol','stol', 'max_it') 49*5808f684SSatish Balay tolvals = [getattr(self.snes, t) for t in tnames] 50*5808f684SSatish Balay self.assertEqual(tuple(tols), tuple(tolvals)) 51*5808f684SSatish Balay 52*5808f684SSatish Balay def testProperties(self): 53*5808f684SSatish Balay snes = self.snes 54*5808f684SSatish Balay # 55*5808f684SSatish Balay snes.appctx = (1,2,3) 56*5808f684SSatish Balay self.assertEqual(snes.appctx, (1,2,3)) 57*5808f684SSatish Balay snes.appctx = None 58*5808f684SSatish Balay self.assertEqual(snes.appctx, None) 59*5808f684SSatish Balay # 60*5808f684SSatish Balay snes.its = 1 61*5808f684SSatish Balay self.assertEqual(snes.its, 1) 62*5808f684SSatish Balay snes.its = 0 63*5808f684SSatish Balay self.assertEqual(snes.its, 0) 64*5808f684SSatish Balay # 65*5808f684SSatish Balay snes.norm = 1 66*5808f684SSatish Balay self.assertEqual(snes.norm, 1) 67*5808f684SSatish Balay snes.norm = 0 68*5808f684SSatish Balay self.assertEqual(snes.norm, 0) 69*5808f684SSatish Balay # 70*5808f684SSatish Balay rh, ih = snes.history 71*5808f684SSatish Balay self.assertTrue(len(rh)==0) 72*5808f684SSatish Balay self.assertTrue(len(ih)==0) 73*5808f684SSatish Balay # 74*5808f684SSatish Balay reason = PETSc.SNES.ConvergedReason.CONVERGED_ITS 75*5808f684SSatish Balay snes.reason = reason 76*5808f684SSatish Balay self.assertEqual(snes.reason, reason) 77*5808f684SSatish Balay self.assertTrue(snes.converged) 78*5808f684SSatish Balay self.assertFalse(snes.diverged) 79*5808f684SSatish Balay self.assertFalse(snes.iterating) 80*5808f684SSatish Balay reason = PETSc.SNES.ConvergedReason.DIVERGED_MAX_IT 81*5808f684SSatish Balay snes.reason = reason 82*5808f684SSatish Balay self.assertEqual(snes.reason, reason) 83*5808f684SSatish Balay self.assertFalse(snes.converged) 84*5808f684SSatish Balay self.assertTrue(snes.diverged) 85*5808f684SSatish Balay self.assertFalse(snes.iterating) 86*5808f684SSatish Balay reason = PETSc.SNES.ConvergedReason.CONVERGED_ITERATING 87*5808f684SSatish Balay snes.reason = reason 88*5808f684SSatish Balay self.assertEqual(snes.reason, reason) 89*5808f684SSatish Balay self.assertFalse(snes.converged) 90*5808f684SSatish Balay self.assertFalse(snes.diverged) 91*5808f684SSatish Balay self.assertTrue(snes.iterating) 92*5808f684SSatish Balay # 93*5808f684SSatish Balay self.assertFalse(snes.use_ew) 94*5808f684SSatish Balay self.assertFalse(snes.use_mf) 95*5808f684SSatish Balay self.assertFalse(snes.use_fd) 96*5808f684SSatish Balay 97*5808f684SSatish Balay def testGetSetFunc(self): 98*5808f684SSatish Balay r, func = self.snes.getFunction() 99*5808f684SSatish Balay self.assertFalse(r) 100*5808f684SSatish Balay self.assertTrue(func is None) 101*5808f684SSatish Balay r = PETSc.Vec().createSeq(2) 102*5808f684SSatish Balay func = Function() 103*5808f684SSatish Balay refcnt = getrefcount(func) 104*5808f684SSatish Balay self.snes.setFunction(func, r) 105*5808f684SSatish Balay self.snes.setFunction(func, r) 106*5808f684SSatish Balay self.assertEqual(getrefcount(func), refcnt + 1) 107*5808f684SSatish Balay r2, func2 = self.snes.getFunction() 108*5808f684SSatish Balay self.assertEqual(r, r2) 109*5808f684SSatish Balay self.assertEqual(func, func2[0]) 110*5808f684SSatish Balay self.assertEqual(getrefcount(func), refcnt + 1) 111*5808f684SSatish Balay r3, func3 = self.snes.getFunction() 112*5808f684SSatish Balay self.assertEqual(r, r3) 113*5808f684SSatish Balay self.assertEqual(func, func3[0]) 114*5808f684SSatish Balay self.assertEqual(getrefcount(func), refcnt + 1) 115*5808f684SSatish Balay 116*5808f684SSatish Balay def testCompFunc(self): 117*5808f684SSatish Balay r = PETSc.Vec().createSeq(2) 118*5808f684SSatish Balay func = Function() 119*5808f684SSatish Balay self.snes.setFunction(func, r) 120*5808f684SSatish Balay x, y = r.duplicate(), r.duplicate() 121*5808f684SSatish Balay x[0], x[1] = [1, 2] 122*5808f684SSatish Balay self.snes.computeFunction(x, y) 123*5808f684SSatish Balay self.assertAlmostEqual(abs(y[0]), 0.0) 124*5808f684SSatish Balay self.assertAlmostEqual(abs(y[1]), 0.0) 125*5808f684SSatish Balay 126*5808f684SSatish Balay def testGetSetJac(self): 127*5808f684SSatish Balay A, P, jac = self.snes.getJacobian() 128*5808f684SSatish Balay self.assertFalse(A) 129*5808f684SSatish Balay self.assertFalse(P) 130*5808f684SSatish Balay self.assertTrue(jac is None) 131*5808f684SSatish Balay J = PETSc.Mat().create(PETSc.COMM_SELF) 132*5808f684SSatish Balay J.setSizes([2,2]) 133*5808f684SSatish Balay J.setType(PETSc.Mat.Type.SEQAIJ) 134*5808f684SSatish Balay J.setUp() 135*5808f684SSatish Balay jac = Jacobian() 136*5808f684SSatish Balay refcnt = getrefcount(jac) 137*5808f684SSatish Balay self.snes.setJacobian(jac, J) 138*5808f684SSatish Balay self.snes.setJacobian(jac, J) 139*5808f684SSatish Balay self.assertEqual(getrefcount(jac), refcnt + 1) 140*5808f684SSatish Balay J2, P2, jac2 = self.snes.getJacobian() 141*5808f684SSatish Balay self.assertEqual(J, J2) 142*5808f684SSatish Balay self.assertEqual(J2, P2) 143*5808f684SSatish Balay self.assertEqual(jac, jac2[0]) 144*5808f684SSatish Balay self.assertEqual(getrefcount(jac), refcnt + 1) 145*5808f684SSatish Balay J3, P3, jac3 = self.snes.getJacobian() 146*5808f684SSatish Balay self.assertEqual(J, J3) 147*5808f684SSatish Balay self.assertEqual(J3, P3) 148*5808f684SSatish Balay self.assertEqual(jac, jac3[0]) 149*5808f684SSatish Balay self.assertEqual(getrefcount(jac), refcnt + 1) 150*5808f684SSatish Balay 151*5808f684SSatish Balay def testCompJac(self): 152*5808f684SSatish Balay J = PETSc.Mat().create(PETSc.COMM_SELF) 153*5808f684SSatish Balay J.setSizes([2,2]) 154*5808f684SSatish Balay J.setType(PETSc.Mat.Type.SEQAIJ) 155*5808f684SSatish Balay J.setUp() 156*5808f684SSatish Balay jac = Jacobian() 157*5808f684SSatish Balay self.snes.setJacobian(jac, J) 158*5808f684SSatish Balay x = PETSc.Vec().createSeq(2) 159*5808f684SSatish Balay x[0], x[1] = [1, 2] 160*5808f684SSatish Balay self.snes.getKSP().getPC() 161*5808f684SSatish Balay self.snes.computeJacobian(x, J) 162*5808f684SSatish Balay 163*5808f684SSatish Balay def testGetSetUpd(self): 164*5808f684SSatish Balay self.assertTrue(self.snes.getUpdate() is None) 165*5808f684SSatish Balay upd = lambda snes, it: None 166*5808f684SSatish Balay refcnt = getrefcount(upd) 167*5808f684SSatish Balay self.snes.setUpdate(upd) 168*5808f684SSatish Balay self.assertEqual(getrefcount(upd), refcnt + 1) 169*5808f684SSatish Balay self.snes.setUpdate(upd) 170*5808f684SSatish Balay self.assertEqual(getrefcount(upd), refcnt + 1) 171*5808f684SSatish Balay self.snes.setUpdate(None) 172*5808f684SSatish Balay self.assertTrue(self.snes.getUpdate() is None) 173*5808f684SSatish Balay self.assertEqual(getrefcount(upd), refcnt) 174*5808f684SSatish Balay self.snes.setUpdate(upd) 175*5808f684SSatish Balay self.assertEqual(getrefcount(upd), refcnt + 1) 176*5808f684SSatish Balay upd2 = lambda snes, it: None 177*5808f684SSatish Balay refcnt2 = getrefcount(upd2) 178*5808f684SSatish Balay self.snes.setUpdate(upd2) 179*5808f684SSatish Balay self.assertEqual(getrefcount(upd), refcnt) 180*5808f684SSatish Balay self.assertEqual(getrefcount(upd2), refcnt2 + 1) 181*5808f684SSatish Balay tmp = self.snes.getUpdate()[0] 182*5808f684SSatish Balay self.assertTrue(tmp is upd2) 183*5808f684SSatish Balay self.assertEqual(getrefcount(upd2), refcnt2 + 2) 184*5808f684SSatish Balay del tmp 185*5808f684SSatish Balay self.snes.setUpdate(None) 186*5808f684SSatish Balay self.assertTrue(self.snes.getUpdate() is None) 187*5808f684SSatish Balay self.assertEqual(getrefcount(upd2), refcnt2) 188*5808f684SSatish Balay 189*5808f684SSatish Balay def testGetKSP(self): 190*5808f684SSatish Balay ksp = self.snes.getKSP() 191*5808f684SSatish Balay self.assertEqual(ksp.getRefCount(), 2) 192*5808f684SSatish Balay 193*5808f684SSatish Balay def testSolve(self): 194*5808f684SSatish Balay J = PETSc.Mat().create(PETSc.COMM_SELF) 195*5808f684SSatish Balay J.setSizes([2,2]) 196*5808f684SSatish Balay J.setType(PETSc.Mat.Type.SEQAIJ) 197*5808f684SSatish Balay J.setUp() 198*5808f684SSatish Balay r = PETSc.Vec().createSeq(2) 199*5808f684SSatish Balay x = PETSc.Vec().createSeq(2) 200*5808f684SSatish Balay b = PETSc.Vec().createSeq(2) 201*5808f684SSatish Balay self.snes.setFunction(Function(), r) 202*5808f684SSatish Balay self.snes.setJacobian(Jacobian(), J) 203*5808f684SSatish Balay x.setArray([2,3]) 204*5808f684SSatish Balay b.set(0) 205*5808f684SSatish Balay self.snes.setConvergenceHistory() 206*5808f684SSatish Balay self.snes.setFromOptions() 207*5808f684SSatish Balay self.snes.solve(b, x) 208*5808f684SSatish Balay rh, ih = self.snes.getConvergenceHistory() 209*5808f684SSatish Balay self.snes.setConvergenceHistory(0, reset=True) 210*5808f684SSatish Balay rh, ih = self.snes.getConvergenceHistory() 211*5808f684SSatish Balay self.assertEqual(len(rh), 0) 212*5808f684SSatish Balay self.assertEqual(len(ih), 0) 213*5808f684SSatish Balay self.assertAlmostEqual(abs(x[0]), 1.0) 214*5808f684SSatish Balay self.assertAlmostEqual(abs(x[1]), 2.0) 215*5808f684SSatish Balay # XXX this test should not be here ! 216*5808f684SSatish Balay reason = self.snes.callConvergenceTest(1, 0, 0, 0) 217*5808f684SSatish Balay self.assertTrue(reason > 0) 218*5808f684SSatish Balay 219*5808f684SSatish Balay def testResetAndSolve(self): 220*5808f684SSatish Balay self.snes.reset() 221*5808f684SSatish Balay self.testSolve() 222*5808f684SSatish Balay self.snes.reset() 223*5808f684SSatish Balay self.testSolve() 224*5808f684SSatish Balay self.snes.reset() 225*5808f684SSatish Balay 226*5808f684SSatish Balay def testSetMonitor(self): 227*5808f684SSatish Balay reshist = {} 228*5808f684SSatish Balay def monitor(snes, its, fgnorm): 229*5808f684SSatish Balay reshist[its] = fgnorm 230*5808f684SSatish Balay refcnt = getrefcount(monitor) 231*5808f684SSatish Balay self.snes.setMonitor(monitor) 232*5808f684SSatish Balay self.assertEqual(getrefcount(monitor), refcnt + 1) 233*5808f684SSatish Balay self.testSolve() 234*5808f684SSatish Balay self.assertTrue(len(reshist) > 0) 235*5808f684SSatish Balay reshist = {} 236*5808f684SSatish Balay self.snes.cancelMonitor() 237*5808f684SSatish Balay self.assertEqual(getrefcount(monitor), refcnt) 238*5808f684SSatish Balay self.testSolve() 239*5808f684SSatish Balay self.assertTrue(len(reshist) == 0) 240*5808f684SSatish Balay self.snes.setMonitor(monitor) 241*5808f684SSatish Balay self.snes.monitor(1, 7) 242*5808f684SSatish Balay self.assertTrue(reshist[1] == 7) 243*5808f684SSatish Balay ## Monitor = PETSc.SNES.Monitor 244*5808f684SSatish Balay ## self.snes.setMonitor(Monitor()) 245*5808f684SSatish Balay ## self.snes.setMonitor(Monitor.DEFAULT) 246*5808f684SSatish Balay ## self.snes.setMonitor(Monitor.SOLUTION) 247*5808f684SSatish Balay ## self.snes.setMonitor(Monitor.RESIDUAL) 248*5808f684SSatish Balay ## self.snes.setMonitor(Monitor.SOLUTION_UPDATE) 249*5808f684SSatish Balay 250*5808f684SSatish Balay def testSetGetStepFails(self): 251*5808f684SSatish Balay its = self.snes.getIterationNumber() 252*5808f684SSatish Balay self.assertEqual(its, 0) 253*5808f684SSatish Balay fails = self.snes.getNonlinearStepFailures() 254*5808f684SSatish Balay self.assertEqual(fails, 0) 255*5808f684SSatish Balay fails = self.snes.getMaxNonlinearStepFailures() 256*5808f684SSatish Balay self.assertEqual(fails, 1) 257*5808f684SSatish Balay self.snes.setMaxNonlinearStepFailures(5) 258*5808f684SSatish Balay fails = self.snes.getMaxNonlinearStepFailures() 259*5808f684SSatish Balay self.assertEqual(fails, 5) 260*5808f684SSatish Balay self.snes.setMaxNonlinearStepFailures(1) 261*5808f684SSatish Balay fails = self.snes.getMaxNonlinearStepFailures() 262*5808f684SSatish Balay self.assertEqual(fails, 1) 263*5808f684SSatish Balay 264*5808f684SSatish Balay def testSetGetLinFails(self): 265*5808f684SSatish Balay its = self.snes.getLinearSolveIterations() 266*5808f684SSatish Balay self.assertEqual(its, 0) 267*5808f684SSatish Balay fails = self.snes.getLinearSolveFailures() 268*5808f684SSatish Balay self.assertEqual(fails, 0) 269*5808f684SSatish Balay fails = self.snes.getMaxLinearSolveFailures() 270*5808f684SSatish Balay self.assertEqual(fails, 1) 271*5808f684SSatish Balay self.snes.setMaxLinearSolveFailures(5) 272*5808f684SSatish Balay fails = self.snes.getMaxLinearSolveFailures() 273*5808f684SSatish Balay self.assertEqual(fails, 5) 274*5808f684SSatish Balay self.snes.setMaxLinearSolveFailures(1) 275*5808f684SSatish Balay fails = self.snes.getMaxLinearSolveFailures() 276*5808f684SSatish Balay self.assertEqual(fails, 1) 277*5808f684SSatish Balay 278*5808f684SSatish Balay def testEW(self): 279*5808f684SSatish Balay self.snes.setUseEW(False) 280*5808f684SSatish Balay self.assertFalse(self.snes.getUseEW()) 281*5808f684SSatish Balay self.snes.setUseEW(True) 282*5808f684SSatish Balay self.assertTrue(self.snes.getUseEW()) 283*5808f684SSatish Balay params = self.snes.getParamsEW() 284*5808f684SSatish Balay params['version'] = 1 285*5808f684SSatish Balay self.snes.setParamsEW(**params) 286*5808f684SSatish Balay params = self.snes.getParamsEW() 287*5808f684SSatish Balay self.assertEqual(params['version'], 1) 288*5808f684SSatish Balay params['version'] = PETSc.DEFAULT 289*5808f684SSatish Balay self.snes.setParamsEW(**params) 290*5808f684SSatish Balay params = self.snes.getParamsEW() 291*5808f684SSatish Balay self.assertEqual(params['version'], 1) 292*5808f684SSatish Balay 293*5808f684SSatish Balay def testMF(self): 294*5808f684SSatish Balay #self.snes.setOptionsPrefix('MF-') 295*5808f684SSatish Balay #opts = PETSc.Options(self.snes) 296*5808f684SSatish Balay #opts['mat_mffd_type'] = 'ds' 297*5808f684SSatish Balay #opts['snes_monitor'] = 'stdout' 298*5808f684SSatish Balay #opts['ksp_monitor'] = 'stdout' 299*5808f684SSatish Balay #opts['snes_view'] = 'stdout' 300*5808f684SSatish Balay J = PETSc.Mat().create(PETSc.COMM_SELF) 301*5808f684SSatish Balay J.setSizes([2,2]) 302*5808f684SSatish Balay J.setType(PETSc.Mat.Type.SEQAIJ) 303*5808f684SSatish Balay J.setUp() 304*5808f684SSatish Balay r = PETSc.Vec().createSeq(2) 305*5808f684SSatish Balay x = PETSc.Vec().createSeq(2) 306*5808f684SSatish Balay b = PETSc.Vec().createSeq(2) 307*5808f684SSatish Balay fun = Function() 308*5808f684SSatish Balay jac = Jacobian() 309*5808f684SSatish Balay self.snes.setFunction(fun, r) 310*5808f684SSatish Balay self.snes.setJacobian(jac, J) 311*5808f684SSatish Balay self.assertFalse(self.snes.getUseMF()) 312*5808f684SSatish Balay self.snes.setUseMF(False) 313*5808f684SSatish Balay self.assertFalse(self.snes.getUseMF()) 314*5808f684SSatish Balay self.snes.setUseMF(True) 315*5808f684SSatish Balay self.assertTrue(self.snes.getUseMF()) 316*5808f684SSatish Balay self.snes.setFromOptions() 317*5808f684SSatish Balay x.setArray([2,3]) 318*5808f684SSatish Balay b.set(0) 319*5808f684SSatish Balay self.snes.solve(b, x) 320*5808f684SSatish Balay self.assertAlmostEqual(abs(x[0]), 1.0) 321*5808f684SSatish Balay self.assertAlmostEqual(abs(x[1]), 2.0) 322*5808f684SSatish Balay 323*5808f684SSatish Balay def testFDColor(self): 324*5808f684SSatish Balay J = PETSc.Mat().create(PETSc.COMM_SELF) 325*5808f684SSatish Balay J.setSizes([2,2]) 326*5808f684SSatish Balay J.setType(PETSc.Mat.Type.SEQAIJ) 327*5808f684SSatish Balay J.setUp() 328*5808f684SSatish Balay r = PETSc.Vec().createSeq(2) 329*5808f684SSatish Balay x = PETSc.Vec().createSeq(2) 330*5808f684SSatish Balay b = PETSc.Vec().createSeq(2) 331*5808f684SSatish Balay fun = Function() 332*5808f684SSatish Balay jac = Jacobian() 333*5808f684SSatish Balay self.snes.setFunction(fun, r) 334*5808f684SSatish Balay self.snes.setJacobian(jac, J) 335*5808f684SSatish Balay self.assertFalse(self.snes.getUseFD()) 336*5808f684SSatish Balay jac(self.snes, x, J, J) 337*5808f684SSatish Balay self.snes.setUseFD(False) 338*5808f684SSatish Balay self.assertFalse(self.snes.getUseFD()) 339*5808f684SSatish Balay self.snes.setUseFD(True) 340*5808f684SSatish Balay self.assertTrue(self.snes.getUseFD()) 341*5808f684SSatish Balay self.snes.setFromOptions() 342*5808f684SSatish Balay x.setArray([2,3]) 343*5808f684SSatish Balay b.set(0) 344*5808f684SSatish Balay self.snes.solve(b, x) 345*5808f684SSatish Balay self.assertAlmostEqual(abs(x[0]), 1.0) 346*5808f684SSatish Balay self.assertAlmostEqual(abs(x[1]), 2.0) 347*5808f684SSatish Balay 348*5808f684SSatish Balay# -------------------------------------------------------------------- 349*5808f684SSatish Balay 350*5808f684SSatish Balayclass TestSNESLS(BaseTestSNES, unittest.TestCase): 351*5808f684SSatish Balay SNES_TYPE = PETSc.SNES.Type.NEWTONLS 352*5808f684SSatish Balay 353*5808f684SSatish Balayclass TestSNESTR(BaseTestSNES, unittest.TestCase): 354*5808f684SSatish Balay SNES_TYPE = PETSc.SNES.Type.NEWTONTR 355*5808f684SSatish Balay 356*5808f684SSatish Balay# -------------------------------------------------------------------- 357*5808f684SSatish Balay 358*5808f684SSatish Balayif __name__ == '__main__': 359*5808f684SSatish Balay unittest.main() 360