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_feature_set_solver_print1(self): import numpy as np import openmdao.api as om from openmdao.test_suite.components.double_sellar import SubSellar prob = om.Problem() model = prob.model sub1 = model.add_subsystem('sub1', om.Group(), promotes_inputs=['z']) sub2 = sub1.add_subsystem('sub2', om.Group(), promotes_inputs=['z']) g1 = sub2.add_subsystem('g1', SubSellar(), promotes_inputs=['z']) g2 = model.add_subsystem('g2', SubSellar()) model.connect('sub1.sub2.g1.y2', 'g2.x') model.connect('g2.y2', 'sub1.sub2.g1.x') model.nonlinear_solver = om.NewtonSolver() model.linear_solver = om.ScipyKrylov() model.nonlinear_solver.options['solve_subsystems'] = True model.nonlinear_solver.options['max_sub_solves'] = 0 g1.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) g1.linear_solver = om.LinearBlockGS() g2.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) g2.linear_solver = om.ScipyKrylov() g2.linear_solver.precon = om.LinearBlockGS() g2.linear_solver.precon.options['maxiter'] = 2 prob.set_solver_print(level=2) prob.setup() prob.set_val('z', np.array([5.0, 2.0])) prob.run_model()
def test_feature_max_sub_solves(self): prob = Problem() model = prob.model = Group() model.add_subsystem('g1', SubSellar()) model.add_subsystem('g2', SubSellar()) model.connect('g1.y2', 'g2.x') model.connect('g2.y2', 'g1.x') # Converge the outer loop with Gauss Seidel, with a looser tolerance. model.nonlinear_solver = NewtonSolver() model.linear_solver = DirectSolver() g1 = model.get_subsystem('g1') g1.nonlinear_solver = NewtonSolver() g1.nonlinear_solver.options['rtol'] = 1.0e-5 g1.linear_solver = DirectSolver() g2 = model.get_subsystem('g2') g2.nonlinear_solver = NewtonSolver() g2.nonlinear_solver.options['rtol'] = 1.0e-5 g2.linear_solver = DirectSolver() model.nonlinear_solver = NewtonSolver() model.linear_solver = ScipyIterativeSolver() model.nonlinear_solver.options['solve_subsystems'] = True model.nonlinear_solver.options['max_sub_solves'] = 0 prob.setup() prob.run_model()
def test_hierarchy_iprint3(self): prob = Problem() model = prob.model model.add_subsystem('pz', IndepVarComp('z', np.array([5.0, 2.0]))) sub1 = model.add_subsystem('sub1', Group()) sub2 = sub1.add_subsystem('sub2', 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 = NonlinearBlockJac() sub1.nonlinear_solver = NonlinearBlockJac() sub2.nonlinear_solver = NonlinearBlockJac() g1.nonlinear_solver = NonlinearBlockJac() g2.nonlinear_solver = NonlinearBlockJac() prob.set_solver_print(level=2) prob.setup(check=False) output = run_model(prob)
def test_hierarchy_iprint(self): prob = Problem() model = prob.model model.add_subsystem('pz', IndepVarComp('z', np.array([5.0, 2.0]))) sub1 = model.add_subsystem('sub1', Group()) sub2 = sub1.add_subsystem('sub2', 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 = NewtonSolver() model.linear_solver = ScipyIterativeSolver() model.nonlinear_solver.options['solve_subsystems'] = True model.nonlinear_solver.options['max_sub_solves'] = 0 g1.nonlinear_solver = NewtonSolver() g1.linear_solver = LinearBlockGS() g2.nonlinear_solver = NewtonSolver() g2.linear_solver = ScipyIterativeSolver() g2.linear_solver.precon = LinearBlockGS() g2.linear_solver.precon.options['maxiter'] = 2 prob.set_solver_print(level=2) prob.setup(check=False) output = run_model(prob)
def test_feature_set_solver_print4(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('sub1.sub2.g1.y2', 'g2.x') model.connect('g2.y2', 'sub1.sub2.g1.x') model.nonlinear_solver = om.NewtonSolver() model.linear_solver = om.ScipyKrylov() model.nonlinear_solver.options['solve_subsystems'] = True model.nonlinear_solver.options['max_sub_solves'] = 0 g1.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) g1.linear_solver = om.LinearBlockGS() g2.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) g2.linear_solver = om.ScipyKrylov() g2.linear_solver.precon = om.LinearBlockGS() g2.linear_solver.precon.options['maxiter'] = 2 prob.set_solver_print(level=-1, type_='all') g2.set_solver_print(level=2, type_='NL') prob.setup() prob.run_model()
def test_hierarchy_iprint(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.NewtonSolver() model.linear_solver = om.LinearBlockGS() model.nonlinear_solver.options['solve_subsystems'] = True model.nonlinear_solver.options['max_sub_solves'] = 0 g1.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) g1.linear_solver = om.LinearBlockGS() g2.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) g2.linear_solver = om.PETScKrylov() g2.linear_solver.precon = om.LinearBlockGS() g2.linear_solver.precon.options['maxiter'] = 2 prob.set_solver_print(level=2) prob.setup() # Conclude setup but don't run model. prob.final_setup() # if USE_PROC_FILES is not set, solver convergence messages # should only appear on proc 0 output = run_model(prob) if model.comm.rank == 0 or os.environ.get('USE_PROC_FILES'): self.assertTrue(output.count('\nNL: Newton Converged') == 1) else: self.assertTrue(output.count('\nNL: Newton Converged') == 0)
def test_hierarchy_iprint(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.NewtonSolver() model.linear_solver = om.ScipyKrylov() model.nonlinear_solver.options['solve_subsystems'] = True model.nonlinear_solver.options['max_sub_solves'] = 0 g1.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) g1.linear_solver = om.LinearBlockGS() g2.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) g2.linear_solver = om.ScipyKrylov() g2.linear_solver.precon = om.LinearBlockGS() g2.linear_solver.precon.options['maxiter'] = 2 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.sub2.g1'), 1) self.assertGreaterEqual(output.count('g2'), 1) self.assertGreaterEqual(output.count('NL: Newton'), 2) self.assertGreaterEqual(output.count('LN: SCIPY'), 2) self.assertGreaterEqual(output.count('precon: LNBGS'), 2)
def test_feature_set_solver_print3(self): import numpy as np from openmdao.api import Problem, Group, IndepVarComp, NewtonSolver, ScipyIterativeSolver, LinearBlockGS from openmdao.test_suite.components.double_sellar import SubSellar prob = Problem() model = prob.model model.add_subsystem('pz', IndepVarComp('z', np.array([5.0, 2.0]))) sub1 = model.add_subsystem('sub1', Group()) sub2 = sub1.add_subsystem('sub2', 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 = NewtonSolver() model.linear_solver = ScipyIterativeSolver() model.nonlinear_solver.options['solve_subsystems'] = True model.nonlinear_solver.options['max_sub_solves'] = 0 g1.nonlinear_solver = NewtonSolver() g1.linear_solver = LinearBlockGS() g2.nonlinear_solver = NewtonSolver() g2.linear_solver = ScipyIterativeSolver() g2.linear_solver.precon = LinearBlockGS() g2.linear_solver.precon.options['maxiter'] = 2 prob.set_solver_print(level=0) prob.set_solver_print(level=2, depth=2) prob.setup() prob.run_model()
def test_feature_max_sub_solves(self): import numpy as np from openmdao.api import Problem, Group, IndepVarComp, NewtonSolver, LinearBlockGS, ExecComp, DirectSolver, ScipyKrylov from openmdao.test_suite.components.double_sellar import SubSellar prob = Problem() model = prob.model model.add_subsystem('g1', SubSellar()) model.add_subsystem('g2', SubSellar()) model.connect('g1.y2', 'g2.x') model.connect('g2.y2', 'g1.x') # Converge the outer loop with Gauss Seidel, with a looser tolerance. model.nonlinear_solver = NewtonSolver() model.linear_solver = DirectSolver() g1 = model.g1 g1.nonlinear_solver = NewtonSolver() g1.nonlinear_solver.options['rtol'] = 1.0e-5 g1.linear_solver = DirectSolver() g2 = model.g2 g2.nonlinear_solver = NewtonSolver() g2.nonlinear_solver.options['rtol'] = 1.0e-5 g2.linear_solver = DirectSolver() model.nonlinear_solver = NewtonSolver() model.linear_solver = ScipyKrylov() model.nonlinear_solver.options['solve_subsystems'] = True model.nonlinear_solver.options['max_sub_solves'] = 0 prob.setup() prob.run_model()
def test_feature_max_sub_solves(self): import numpy as np import openmdao.api as om from openmdao.test_suite.components.double_sellar import SubSellar prob = om.Problem() model = prob.model model.add_subsystem('g1', SubSellar()) model.add_subsystem('g2', SubSellar()) model.connect('g1.y2', 'g2.x') model.connect('g2.y2', 'g1.x') # Converge the outer loop with Gauss Seidel, with a looser tolerance. model.nonlinear_solver = om.NewtonSolver() model.linear_solver = om.DirectSolver() g1 = model.g1 g1.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) g1.nonlinear_solver.options['rtol'] = 1.0e-5 g1.linear_solver = om.DirectSolver() g2 = model.g2 g2.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) g2.nonlinear_solver.options['rtol'] = 1.0e-5 g2.linear_solver = om.DirectSolver() model.nonlinear_solver = om.NewtonSolver() model.linear_solver = om.ScipyKrylov() model.nonlinear_solver.options['solve_subsystems'] = True model.nonlinear_solver.options['max_sub_solves'] = 0 prob.setup() prob.run_model()
def test_hierarchy_list_vars_options(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.NewtonSolver() model.linear_solver = om.ScipyKrylov() model.nonlinear_solver.options['solve_subsystems'] = True model.nonlinear_solver.options['max_sub_solves'] = 0 g1.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) g1.linear_solver = om.LinearBlockGS() g2.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) g2.linear_solver = om.ScipyKrylov() g2.linear_solver.precon = om.LinearBlockGS() g2.linear_solver.precon.options['maxiter'] = 2 prob.setup() prob.run_driver() # logging inputs # out_stream - not hierarchical - extras - no print_arrays stream = StringIO() prob.model.list_inputs(values=True, units=True, hierarchical=False, print_arrays=False, out_stream=stream) text = stream.getvalue() self.assertEqual(1, text.count("10 Input(s) in 'model'")) # make sure they are in the correct order self.assertTrue( text.find("sub1.sub2.g1.d1.z") < text.find('sub1.sub2.g1.d1.x') < text.find('sub1.sub2.g1.d1.y2') < text.find('sub1.sub2.g1.d2.z') < text.find('sub1.sub2.g1.d2.y1') < text.find('g2.d1.z') < text.find( 'g2.d1.x') < text.find('g2.d1.y2') < text.find( 'g2.d2.z') < text.find('g2.d2.y1')) num_non_empty_lines = sum([1 for s in text.splitlines() if s.strip()]) self.assertEqual(14, num_non_empty_lines) # out_stream - hierarchical - extras - no print_arrays stream = StringIO() prob.model.list_inputs(values=True, units=True, hierarchical=True, print_arrays=False, out_stream=stream) text = stream.getvalue() self.assertEqual(1, text.count("10 Input(s) in 'model'")) num_non_empty_lines = sum([1 for s in text.splitlines() if s.strip()]) self.assertEqual(22, num_non_empty_lines) self.assertEqual(1, text.count('\nsub1')) self.assertEqual(1, text.count('\n sub2')) self.assertEqual(1, text.count('\n g1')) self.assertEqual(1, text.count('\n d1')) self.assertEqual(2, text.count('\n z')) # logging outputs # out_stream - not hierarchical - extras - no print_arrays stream = StringIO() prob.model.list_outputs(values=True, units=True, shape=True, bounds=True, residuals=True, scaling=True, hierarchical=False, print_arrays=False, out_stream=stream) text = stream.getvalue() self.assertEqual(text.count('5 Explicit Output'), 1) # make sure they are in the correct order self.assertTrue( text.find("pz.z") < text.find('sub1.sub2.g1.d1.y1') < text.find( 'sub1.sub2.g1.d2.y2') < text.find('g2.d1.y1') < text.find( 'g2.d2.y2')) num_non_empty_lines = sum([1 for s in text.splitlines() if s.strip()]) self.assertEqual(11, num_non_empty_lines) # Hierarchical stream = StringIO() prob.model.list_outputs(values=True, units=True, shape=True, bounds=True, residuals=True, scaling=True, hierarchical=True, print_arrays=False, out_stream=stream) text = stream.getvalue() self.assertEqual(text.count('\n y1'), 1) self.assertEqual(text.count('\ng2'), 1) num_non_empty_lines = sum([1 for s in text.splitlines() if s.strip()]) self.assertEqual(num_non_empty_lines, 20)