def _setup_model(self, solver_class): prob = om.Problem() model = prob.model model.add_subsystem('px', om.IndepVarComp('x', 1.0), promotes=['x']) model.add_subsystem('pz', om.IndepVarComp('z', np.array([5.0, 2.0])), promotes=['z']) proms = [ 'x', 'z', 'y1', 'state_eq.y2_actual', 'state_eq.y2_command', 'd1.y2', 'd2.y2' ] sub = model.add_subsystem('sub', om.Group(), promotes=proms) subgrp = sub.add_subsystem( 'state_eq_group', om.Group(), promotes=['state_eq.y2_actual', 'state_eq.y2_command']) subgrp.add_subsystem('state_eq', StateConnection()) sub.add_subsystem('d1', SellarDis1withDerivatives(), promotes=['x', 'z', 'y1']) sub.add_subsystem('d2', SellarDis2withDerivatives(), promotes=['z', 'y1']) model.connect('state_eq.y2_command', 'd1.y2') model.connect('d2.y2', 'state_eq.y2_actual') model.add_subsystem('obj_cmp', om.ExecComp('obj = x**2 + z[1] + y1 + exp(-y2)', z=np.array([0.0, 0.0]), x=0.0, y1=0.0, y2=0.0), promotes=['x', 'z', 'y1', 'obj']) model.connect('d2.y2', 'obj_cmp.y2') model.add_subsystem('con_cmp1', om.ExecComp('con1 = 3.16 - y1'), promotes=['con1', 'y1']) model.add_subsystem('con_cmp2', om.ExecComp('con2 = y2 - 24.0'), promotes=['con2']) # splice a group containing discrete vars into the model model.add_subsystem('discrete_g', InternalDiscreteGroup()) model.connect('d2.y2', 'discrete_g.x') model.connect('discrete_g.y', 'con_cmp2.y2') model.nonlinear_solver = solver_class() prob.set_solver_print(level=0) prob.setup() return prob
def test_sellar_specify_linear_solver(self): prob = om.Problem() model = prob.model model.add_subsystem('px', om.IndepVarComp('x', 1.0), promotes=['x']) model.add_subsystem('pz', om.IndepVarComp('z', np.array([5.0, 2.0])), promotes=['z']) proms = ['x', 'z', 'y1', 'state_eq.y2_actual', 'state_eq.y2_command', 'd1.y2', 'd2.y2'] sub = model.add_subsystem('sub', om.Group(), promotes=proms) subgrp = sub.add_subsystem('state_eq_group', om.Group(), promotes=['state_eq.y2_actual', 'state_eq.y2_command']) subgrp.linear_solver = om.ScipyKrylov() subgrp.add_subsystem('state_eq', StateConnection()) sub.add_subsystem('d1', SellarDis1withDerivatives(), promotes=['x', 'z', 'y1']) sub.add_subsystem('d2', SellarDis2withDerivatives(), promotes=['z', 'y1']) model.connect('state_eq.y2_command', 'd1.y2') model.connect('d2.y2', 'state_eq.y2_actual') model.add_subsystem('obj_cmp', om.ExecComp('obj = x**2 + z[1] + y1 + exp(-y2)', z=np.array([0.0, 0.0]), x=0.0, y1=0.0, y2=0.0), promotes=['x', 'z', 'y1', 'obj']) model.connect('d2.y2', 'obj_cmp.y2') model.add_subsystem('con_cmp1', om.ExecComp('con1 = 3.16 - y1'), promotes=['con1', 'y1']) model.add_subsystem('con_cmp2', om.ExecComp('con2 = y2 - 24.0'), promotes=['con2']) model.connect('d2.y2', 'con_cmp2.y2') model.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) # Use bad settings for this one so that problem doesn't converge. # That way, we test that we are really using Newton's Lin Solver # instead. model.linear_solver = om.ScipyKrylov() model.linear_solver.options['maxiter'] = 1 # The good solver model.nonlinear_solver.linear_solver = om.ScipyKrylov() prob.set_solver_print(level=0) prob.setup() prob.run_model() assert_near_equal(prob.get_val('y1'), 25.58830273, .00001) assert_near_equal(prob['state_eq.y2_command'], 12.05848819, .00001) # Make sure we aren't iterating like crazy self.assertLess(model.nonlinear_solver._iter_count, 8) self.assertEqual(model.linear_solver._iter_count, 0) self.assertGreater(model.nonlinear_solver.linear_solver._iter_count, 0)
def test_implicit_iter(self): prob = Problem() model = prob.model model.add_subsystem('indep', IndepVarComp('y', 1.0)) model.add_subsystem('statecomp', StateConnection()) model.connect('indep.y', 'statecomp.y2_actual') # provide iterative solvers for implicit group model.linear_solver = LinearBlockGS() model.nonlinear_solver = NonlinearBlockGS() # perform setup with checks but don't run model testlogger = TestLogger() prob.setup(check=True, logger=testlogger) prob.final_setup() # should not trigger any solver warnings warnings = testlogger.get('warning') self.assertEqual(len(warnings), 0)