def test_solver_debug_print(self, name, solver): p = om.Problem() model = p.model model.add_subsystem('ground', om.IndepVarComp('V', 0., units='V')) model.add_subsystem('source', om.IndepVarComp('I', 0.1, units='A')) model.add_subsystem('circuit', Circuit()) model.connect('source.I', 'circuit.I_in') model.connect('ground.V', 'circuit.Vg') p.setup() nl = model.circuit.nonlinear_solver = solver() nl.options['debug_print'] = True nl.options['err_on_non_converge'] = True if name == 'NonlinearBlockGS': nl.options['use_apply_nonlinear'] = True # suppress solver output for test nl.options['iprint'] = model.circuit.linear_solver.options[ 'iprint'] = -1 # For Broydensolver, don't calc Jacobian try: nl.options['compute_jacobian'] = False except KeyError: pass # set some poor initial guesses so that we don't converge p['circuit.n1.V'] = 10. p['circuit.n2.V'] = 1e-3 opts = {} # formatting has changed in numpy 1.14 and beyond. if LooseVersion(np.__version__) >= LooseVersion("1.14"): opts["legacy"] = '1.13' with printoptions(**opts): # run the model and check for expected output file output = run_model(p, ignore_exception=True) expected_output = '\n'.join([ self.expected_data, "Inputs and outputs at start of iteration " "have been saved to '%s'.\n" % self.filename ]) self.assertEqual(output, expected_output) with open(self.filename, 'r') as f: self.assertEqual(f.read(), self.expected_data) # setup & run again to make sure there is no error due to existing file p.setup() with printoptions(**opts): run_model(p, ignore_exception=False)
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_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 = ScipyKrylov() 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 = ScipyKrylov() 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_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_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() g1.linear_solver = om.LinearBlockGS() g2.nonlinear_solver = om.NewtonSolver() 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)
def test_solver_debug_print(self, name, solver): p = Problem() model = p.model model.add_subsystem('ground', IndepVarComp('V', 0., units='V')) model.add_subsystem('source', IndepVarComp('I', 0.1, units='A')) model.add_subsystem('circuit', Circuit()) model.connect('source.I', 'circuit.I_in') model.connect('ground.V', 'circuit.Vg') p.setup() nl = model.circuit.nonlinear_solver = solver() nl.options['debug_print'] = True nl.options['err_on_maxiter'] = True if name == 'NonlinearBlockGS': nl.options['use_apply_nonlinear'] = True # suppress solver output for test nl.options['iprint'] = model.circuit.linear_solver.options['iprint'] = -1 # For Broydensolver, don't calc Jacobian try: nl.options['compute_jacobian'] = False except KeyError: pass # set some poor initial guesses so that we don't converge p['circuit.n1.V'] = 10. p['circuit.n2.V'] = 1e-3 opts = {} # formatting has changed in numpy 1.14 and beyond. if LooseVersion(np.__version__) >= LooseVersion("1.14"): opts["legacy"] = '1.13' with printoptions(**opts): # run the model and check for expected output file output = run_model(p, ignore_exception=True) expected_output = '\n'.join([ self.expected_data, "Inputs and outputs at start of iteration " "have been saved to '%s'.\n" % self.filename ]) self.assertEqual(output, expected_output) with open(self.filename, 'r') as f: self.assertEqual(f.read(), self.expected_data)
def test_solver_debug_print(self, name, solver): p = Problem() model = p.model model.add_subsystem('ground', IndepVarComp('V', 0., units='V')) model.add_subsystem('source', IndepVarComp('I', 0.1, units='A')) model.add_subsystem('circuit', Circuit()) model.connect('source.I', 'circuit.I_in') model.connect('ground.V', 'circuit.Vg') p.setup() nl = model.circuit.nonlinear_solver = solver() nl.options['debug_print'] = True # suppress solver output for test nl.options['iprint'] = model.circuit.linear_solver.options['iprint'] = -1 # set some poor initial guesses so that we don't converge p['circuit.n1.V'] = 10. p['circuit.n2.V'] = 1e-3 opts = {} # formatting has changed in numpy 1.14 and beyond. if LooseVersion(np.__version__) >= LooseVersion("1.14"): opts["legacy"] = '1.13' with printoptions(**opts): # run the model and check for expected output file output = run_model(p) expected_output = '\n'.join([ self.expected_data, "Inputs and outputs at start of iteration " "have been saved to '%s'.\n" % self.filename ]) self.assertEqual(output, expected_output) with open(self.filename, 'r') as f: self.assertEqual(f.read(), self.expected_data)
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 = 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 = ScipyKrylov() 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 = ScipyKrylov() g2.linear_solver.precon = LinearBlockGS() g2.linear_solver.precon.options['maxiter'] = 2 prob.set_solver_print(level=2) prob.setup(check=False) # 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)