def test_hierarchy_iprint3(self): prob = om.Problem() model = prob.model model.add_subsystem('pz', om.IndepVarComp('z', np.array([5.0, 2.0]))) sub1 = model.add_subsystem('sub1', om.Group()) sub2 = sub1.add_subsystem('sub2', om.Group()) g1 = sub2.add_subsystem('g1', SubSellar()) g2 = model.add_subsystem('g2', SubSellar()) model.connect('pz.z', 'sub1.sub2.g1.z') model.connect('sub1.sub2.g1.y2', 'g2.x') model.connect('g2.y2', 'sub1.sub2.g1.x') model.nonlinear_solver = om.NonlinearBlockJac() sub1.nonlinear_solver = om.NonlinearBlockJac() sub2.nonlinear_solver = om.NonlinearBlockJac() g1.nonlinear_solver = om.NonlinearBlockJac() g2.nonlinear_solver = om.NonlinearBlockJac() prob.set_solver_print(level=2) prob.setup() output = run_model(prob)
def test_hierarchy_iprint3(self): prob = om.Problem() model = prob.model model.add_subsystem('pz', om.IndepVarComp('z', np.array([5.0, 2.0]))) sub1 = model.add_subsystem('sub1', om.Group()) sub2 = sub1.add_subsystem('sub2', om.Group()) g1 = sub2.add_subsystem('g1', SubSellar()) g2 = model.add_subsystem('g2', SubSellar()) model.connect('pz.z', 'sub1.sub2.g1.z') model.connect('sub1.sub2.g1.y2', 'g2.x') model.connect('g2.y2', 'sub1.sub2.g1.x') model.nonlinear_solver = om.NonlinearBlockJac() sub1.nonlinear_solver = om.NonlinearBlockJac() sub2.nonlinear_solver = om.NonlinearBlockJac() g1.nonlinear_solver = om.NonlinearBlockJac() g2.nonlinear_solver = om.NonlinearBlockJac() prob.set_solver_print(level=2) prob.setup() output = run_model(prob) # Check that certain things show up in our outputs self.assertGreaterEqual(output.count('sub1'), 2) self.assertGreaterEqual(output.count('sub1.sub2'), 2) self.assertGreaterEqual(output.count('sub1.sub2.g1'), 2) self.assertGreaterEqual(output.count('g2'), 2) self.assertGreaterEqual(output.count('NL: NLBJ'), 2)
def test_reraise_analylsis_error(self): prob = om.Problem() model = prob.model model.add_subsystem('p1', om.IndepVarComp('x', 0.5)) model.add_subsystem('p2', om.IndepVarComp('x', 3.0)) sub = model.add_subsystem('sub', om.ParallelGroup()) sub.add_subsystem('c1', AEComp()) sub.add_subsystem('c2', AEComp()) sub.nonlinear_solver = om.NonlinearBlockJac() model.add_subsystem('obj', om.ExecComp(['val = x1 + x2'])) model.connect('p1.x', 'sub.c1.x') model.connect('p2.x', 'sub.c2.x') model.connect('sub.c1.y', 'obj.x1') model.connect('sub.c2.y', 'obj.x2') prob.driver = AEDriver() prob.setup() handled = prob.run_driver() self.assertTrue(handled)
def test_feature_rtol(self): import numpy as np import openmdao.api as om from openmdao.test_suite.components.sellar import SellarDis1withDerivatives, SellarDis2withDerivatives prob = om.Problem() model = prob.model model.add_subsystem('d1', SellarDis1withDerivatives(), promotes=['x', 'z', 'y1', 'y2']) model.add_subsystem('d2', SellarDis2withDerivatives(), promotes=['z', 'y1', 'y2']) 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), promotes=['obj', 'x', 'z', 'y1', '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', 'y2']) model.linear_solver = om.LinearBlockGS() nlbgs = model.nonlinear_solver = om.NonlinearBlockJac() nlbgs.options['rtol'] = 1e-3 prob.setup() prob.set_val('x', 1.) prob.set_val('z', np.array([5.0, 2.0])) prob.run_model() assert_near_equal(prob.get_val('y1'), 25.5891491526, .00001) assert_near_equal(prob.get_val('y2'), 12.0569142166, .00001)
def test_feature_maxiter(self): import numpy as np import openmdao.api as om from openmdao.test_suite.components.sellar import SellarDis1withDerivatives, SellarDis2withDerivatives 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']) model.add_subsystem('d1', SellarDis1withDerivatives(), promotes=['x', 'z', 'y1', 'y2']) model.add_subsystem('d2', SellarDis2withDerivatives(), promotes=['z', 'y1', 'y2']) 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), promotes=['obj', 'x', 'z', 'y1', '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', 'y2']) model.linear_solver = om.LinearBlockGS() nlbgs = model.nonlinear_solver = om.NonlinearBlockJac() nlbgs.options['maxiter'] = 4 prob.setup() prob.run_model() assert_rel_error(self, prob['y1'], 25.5723813937, .00001) assert_rel_error(self, prob['y2'], 12.0542542372, .00001)
def test_feature_maxiter(self): prob = om.Problem() model = prob.model model.add_subsystem('d1', SellarDis1withDerivatives(), promotes=['x', 'z', 'y1', 'y2']) model.add_subsystem('d2', SellarDis2withDerivatives(), promotes=['z', 'y1', 'y2']) 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), promotes=['obj', 'x', 'z', 'y1', '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', 'y2']) model.linear_solver = om.LinearBlockGS() nlbgs = model.nonlinear_solver = om.NonlinearBlockJac() nlbgs.options['maxiter'] = 4 prob.setup() prob.set_val('x', 1.) prob.set_val('z', np.array([5.0, 2.0])) prob.run_model() assert_near_equal(prob['y1'], 25.5723813937, .00001) assert_near_equal(prob['y2'], 12.0542542372, .00001)
prob.model.linear_solver = om.DirectSolver() elif solver_flag == 'nlbgs': # The nonlinear block Gauss-Seidel solver is an iterative solvver # Requires no linear solver and works even without derivatives prob.model.nonlinear_solver = om.NonlinearBlockGS(iprint=2) prob.model.nonlinear_solver.options['maxiter'] = 400 prob.model.nonlinear_solver.options['atol'] = 1e-8 prob.model.nonlinear_solver.options['rtol'] = 1e-8 # The Aitken relaxation method improves robustness at cost of some speed prob.model.nonlinear_solver.options['use_aitken'] = False prob.model.nonlinear_solver.options['use_apply_nonlinear'] = True elif solver_flag == 'nlbjac': # We don't usually recommend using nonlinear block Jacobi as it converges slower prob.model.nonlinear_solver = om.NonlinearBlockJac(iprint=2) prob.model.nonlinear_solver.options['maxiter'] = 400 prob.model.nonlinear_solver.options['atol'] = 1e-8 prob.model.nonlinear_solver.options['rtol'] = 1e-8 else: raise ValueError("bad solver selection!") prob.setup() ### If using the Newton solver you should generally check your partial derivatives ### before you run the model. It won't converge if you made a mistake. # prob.check_partials(compact_print=True) prob.run_model() ### If you want to list all inputs and outputs, uncomment the following