def test_specify_subgroup_solvers(self): from openmdao.api import Problem, NewtonSolver, ScipyIterativeSolver, DirectSolver, NonlinearBlockGS, LinearBlockGS from openmdao.test_suite.components.double_sellar import DoubleSellar prob = Problem() model = prob.model = DoubleSellar() # each SubSellar group converges itself g1 = model.get_subsystem('g1') g1.nonlinear_solver = NewtonSolver() g1.linear_solver = DirectSolver() # used for derivatives g2 = model.get_subsystem('g2') g2.nonlinear_solver = NewtonSolver() g2.linear_solver = DirectSolver() # Converge the outer loop with Gauss Seidel, with a looser tolerance. model.nonlinear_solver = NonlinearBlockGS() model.nonlinear_solver.options['rtol'] = 1.0e-5 model.linear_solver = ScipyIterativeSolver() model.linear_solver.precon = LinearBlockGS() prob.setup() prob.run_model() assert_rel_error(self, prob['g1.y1'], 0.64, .00001) assert_rel_error(self, prob['g1.y2'], 0.80, .00001) assert_rel_error(self, prob['g2.y1'], 0.64, .00001) assert_rel_error(self, prob['g2.y2'], 0.80, .00001)
def test_specify_precon(self): import numpy as np from openmdao.api import Problem, Group, IndepVarComp, ScipyKrylov, NewtonSolver, \ LinearBlockGS, ExecComp from openmdao.test_suite.components.sellar import SellarDis1withDerivatives, \ SellarDis2withDerivatives prob = Problem() model = prob.model model.add_subsystem('px', IndepVarComp('x', 1.0), promotes=['x']) model.add_subsystem('pz', IndepVarComp('z', np.array([5.0, 2.0])), promotes=['z']) model.add_subsystem('d1', SellarDis1withDerivatives(), promotes=['x', 'z', 'y1', 'y2']) model.add_subsystem('d2', SellarDis2withDerivatives(), promotes=['z', 'y1', 'y2']) model.add_subsystem('obj_cmp', ExecComp('obj = x**2 + z[1] + y1 + exp(-y2)', z=np.array([0.0, 0.0]), x=0.0), promotes=['obj', 'x', 'z', 'y1', 'y2']) model.add_subsystem('con_cmp1', ExecComp('con1 = 3.16 - y1'), promotes=['con1', 'y1']) model.add_subsystem('con_cmp2', ExecComp('con2 = y2 - 24.0'), promotes=['con2', 'y2']) model.nonlinear_solver = NewtonSolver() model.linear_solver = ScipyKrylov() model.linear_solver.precon = LinearBlockGS() model.linear_solver.precon.options['maxiter'] = 2 prob.setup() prob.run_model() assert_rel_error(self, prob['y1'], 25.58830273, .00001) assert_rel_error(self, prob['y2'], 12.05848819, .00001)
def test_specify_precon(self): import numpy as np from openmdao.api import Problem, ScipyKrylov, NewtonSolver, LinearBlockGS, \ DirectSolver from openmdao.test_suite.components.double_sellar import DoubleSellar prob = Problem(model=DoubleSellar()) model = prob.model model.nonlinear_solver = NewtonSolver() model.nonlinear_solver.linesearch = BoundsEnforceLS() model.linear_solver = ScipyKrylov() model.g1.linear_solver = DirectSolver() model.g2.linear_solver = DirectSolver() model.linear_solver.precon = LinearBlockGS() # TODO: This should work with 1 iteration. #model.linear_solver.precon.options['maxiter'] = 1 prob.setup() prob.set_solver_print(level=2) prob.run_model() assert_rel_error(self, prob['g1.y1'], 0.64, .00001) assert_rel_error(self, prob['g1.y2'], 0.80, .00001) assert_rel_error(self, prob['g2.y1'], 0.64, .00001) assert_rel_error(self, prob['g2.y2'], 0.80, .00001)
def test_preconditioner_deprecation(self): group = TestImplicitGroup(lnSolverClass=self.linear_solver_class) msg = "The 'preconditioner' property provides backwards compatibility " \ + "with OpenMDAO <= 1.x ; use 'precon' instead." # check deprecation on setter & getter with assert_warning(DeprecationWarning, msg): group.linear_solver.preconditioner = LinearBlockGS() with assert_warning(DeprecationWarning, msg): group.linear_solver.preconditioner
def test_preconditioner_deprecation(self): group = TestImplicitGroup(lnSolverClass=self.linear_solver_class) msg = "The 'preconditioner' property provides backwards compatibility " \ + "with OpenMDAO <= 1.x ; use 'precon' instead." # check deprecation on setter with warnings.catch_warnings(record=True) as w: group.linear_solver.preconditioner = LinearBlockGS() self.assertEqual(len(w), 1) self.assertTrue(issubclass(w[0].category, DeprecationWarning)) self.assertEqual(str(w[0].message), msg) # check deprecation on getter with warnings.catch_warnings(record=True) as w: group.linear_solver.preconditioner self.assertEqual(len(w), 1) self.assertTrue(issubclass(w[0].category, DeprecationWarning)) self.assertEqual(str(w[0].message), msg)
def test_specify_precon(self): import numpy as np from openmdao.api import Problem, Group, ScipyKrylov, NewtonSolver, LinearBlockGS, \ DirectSolver, ExecComp, PETScKrylov from openmdao.test_suite.components.quad_implicit import QuadraticComp prob = Problem() model = prob.model sub1 = model.add_subsystem('sub1', Group()) sub1.add_subsystem('q1', QuadraticComp()) sub1.add_subsystem('z1', ExecComp('y = -6.0 + .01 * x')) sub2 = model.add_subsystem('sub2', Group()) sub2.add_subsystem('q2', QuadraticComp()) sub2.add_subsystem('z2', ExecComp('y = -6.0 + .01 * x')) model.connect('sub1.q1.x', 'sub1.z1.x') model.connect('sub1.z1.y', 'sub2.q2.c') model.connect('sub2.q2.x', 'sub2.z2.x') model.connect('sub2.z2.y', 'sub1.q1.c') model.nonlinear_solver = NewtonSolver() model.linear_solver = ScipyKrylov() prob.setup() model.sub1.linear_solver = DirectSolver() model.sub2.linear_solver = DirectSolver() model.linear_solver.precon = LinearBlockGS() prob.set_solver_print(level=2) prob.run_model() assert_rel_error(self, prob['sub1.q1.x'], 1.996, .0001) assert_rel_error(self, prob['sub2.q2.x'], 1.996, .0001)