def test_feature_boundscheck_basic(self): import numpy as np from openmdao.api import Problem, Group, IndepVarComp, NewtonSolver, ScipyIterativeSolver, BoundsEnforceLS from openmdao.test_suite.components.implicit_newton_linesearch import ImplCompTwoStatesArrays top = Problem() top.model = Group() top.model.add_subsystem('px', IndepVarComp('x', np.ones((3, 1)))) top.model.add_subsystem('comp', ImplCompTwoStatesArrays()) top.model.connect('px.x', 'comp.x') top.model.nonlinear_solver = NewtonSolver() top.model.nonlinear_solver.options['maxiter'] = 10 top.model.linear_solver = ScipyIterativeSolver() top.model.nonlinear_solver.linesearch = BoundsEnforceLS() top.setup(check=False) # Test lower bounds: should go to the lower bound and stall top['px.x'] = 2.0 top['comp.y'] = 0. top['comp.z'] = 1.6 top.run_model() assert_rel_error(self, top['comp.z'][0], [1.5], 1e-8) assert_rel_error(self, top['comp.z'][1], [1.5], 1e-8) assert_rel_error(self, top['comp.z'][2], [1.5], 1e-8)
def test_feature_boundscheck_wall(self): import numpy as np import openmdao.api as om from openmdao.test_suite.components.implicit_newton_linesearch import ImplCompTwoStatesArrays top = om.Problem() top.model.add_subsystem('comp', ImplCompTwoStatesArrays(), promotes_inputs=['x']) top.model.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) top.model.nonlinear_solver.options['maxiter'] = 10 top.model.linear_solver = om.ScipyKrylov() top.model.nonlinear_solver.linesearch = om.BoundsEnforceLS( bound_enforcement='wall') top.setup() top.set_val('x', np.array([0.5, 0.5, 0.5]).reshape(3, 1)) # Test upper bounds: should go to the upper bound and stall top.set_val('comp.y', 0.) top.set_val('comp.z', 2.4) top.run_model() assert_near_equal(top.get_val('comp.z', indices=0), [2.6], 1e-8) assert_near_equal(top.get_val('comp.z', indices=1), [2.5], 1e-8) assert_near_equal(top.get_val('comp.z', indices=2), [2.65], 1e-8)
def test_feature_armijo_boundscheck_scalar(self): import numpy as np from openmdao.api import Problem, Group, IndepVarComp, NewtonSolver, ScipyKrylov, ArmijoGoldsteinLS from openmdao.test_suite.components.implicit_newton_linesearch import ImplCompTwoStatesArrays top = Problem() top.model = Group() top.model.add_subsystem('px', IndepVarComp('x', np.ones((3, 1)))) top.model.add_subsystem('comp', ImplCompTwoStatesArrays()) top.model.connect('px.x', 'comp.x') top.model.nonlinear_solver = NewtonSolver() top.model.nonlinear_solver.options['maxiter'] = 10 top.model.linear_solver = ScipyKrylov() ls = top.model.nonlinear_solver.linesearch = ArmijoGoldsteinLS( bound_enforcement='scalar') ls.options['bound_enforcement'] = 'scalar' top.setup(check=False) top.run_model() # Test lower bounds: should stop just short of the lower bound top['px.x'] = 2.0 top['comp.y'] = 0. top['comp.z'] = 1.6 top.run_model() print(top['comp.z'][0]) print(top['comp.z'][1]) print(top['comp.z'][2])
def test_feature_armijo_boundscheck_wall(self): import numpy as np from openmdao.api import Problem, Group, IndepVarComp, NewtonSolver, ScipyKrylov, ArmijoGoldsteinLS from openmdao.test_suite.components.implicit_newton_linesearch import ImplCompTwoStatesArrays top = Problem() top.model = Group() top.model.add_subsystem('px', IndepVarComp('x', np.ones((3, 1)))) top.model.add_subsystem('comp', ImplCompTwoStatesArrays()) top.model.connect('px.x', 'comp.x') top.model.nonlinear_solver = NewtonSolver() top.model.nonlinear_solver.options['maxiter'] = 10 top.model.linear_solver = ScipyKrylov() ls = top.model.nonlinear_solver.linesearch = ArmijoGoldsteinLS( bound_enforcement='wall') ls.options['bound_enforcement'] = 'wall' top.setup(check=False) # Test upper bounds: should go to the upper bound and stall top['px.x'] = 0.5 top['comp.y'] = 0. top['comp.z'] = 2.4 top.run_model() assert_rel_error(self, top['comp.z'][0], [2.6], 1e-8) assert_rel_error(self, top['comp.z'][1], [2.5], 1e-8) assert_rel_error(self, top['comp.z'][2], [2.65], 1e-8)
def test_feature_boundscheck_wall(self): top = Problem() top.model = Group() top.model.add_subsystem('px', IndepVarComp('x', np.ones((3, 1)))) top.model.add_subsystem('comp', ImplCompTwoStatesArrays()) top.model.connect('px.x', 'comp.x') top.model.nonlinear_solver = NewtonSolver() top.model.nonlinear_solver.options['maxiter'] = 10 top.model.linear_solver = ScipyIterativeSolver() ls = top.model.nonlinear_solver.linesearch = BoundsEnforceLS() ls.options['bound_enforcement'] = 'wall' top.setup(check=False) # Test upper bounds: should go to the upper bound and stall top['px.x'] = 0.5 top['comp.y'] = 0. top['comp.z'] = 2.4 top.run_model() assert_rel_error(self, top['comp.z'][0], [2.6], 1e-8) assert_rel_error(self, top['comp.z'][1], [2.5], 1e-8) assert_rel_error(self, top['comp.z'][2], [2.65], 1e-8)
def test_feature_armijo_boundscheck_vector(self): import numpy as np import openmdao.api as om from openmdao.test_suite.components.implicit_newton_linesearch import ImplCompTwoStatesArrays top = om.Problem() top.model.add_subsystem('px', om.IndepVarComp('x', np.ones((3, 1)))) top.model.add_subsystem('comp', ImplCompTwoStatesArrays()) top.model.connect('px.x', 'comp.x') top.model.nonlinear_solver = om.NewtonSolver() top.model.nonlinear_solver.options['maxiter'] = 10 top.model.linear_solver = om.ScipyKrylov() top.model.nonlinear_solver.linesearch = om.ArmijoGoldsteinLS( bound_enforcement='vector') top.setup() # Test lower bounds: should go to the lower bound and stall top['px.x'] = 2.0 top['comp.y'] = 0. top['comp.z'] = 1.6 top.run_model() for ind in range(3): assert_rel_error(self, top['comp.z'][ind], [1.5], 1e-8)
def test_feature_print_bound_enforce(self): import numpy as np from openmdao.api import Problem, Group, IndepVarComp, NewtonSolver, ScipyKrylov, BoundsEnforceLS from openmdao.test_suite.components.implicit_newton_linesearch import ImplCompTwoStatesArrays top = Problem() top.model = Group() top.model.add_subsystem('px', IndepVarComp('x', np.ones((3, 1)))) top.model.add_subsystem('comp', ImplCompTwoStatesArrays()) top.model.connect('px.x', 'comp.x') newt = top.model.nonlinear_solver = NewtonSolver() top.model.nonlinear_solver.options['maxiter'] = 2 top.model.linear_solver = ScipyKrylov() ls = newt.linesearch = BoundsEnforceLS(bound_enforcement='vector') ls.options['print_bound_enforce'] = True top.set_solver_print(level=2) top.setup() # Test lower bounds: should go to the lower bound and stall top['px.x'] = 2.0 top['comp.y'] = 0. top['comp.z'] = 1.6 top.run_model() assert_rel_error(self, top['comp.z'][0], [1.5], 1e-8) assert_rel_error(self, top['comp.z'][1], [1.5], 1e-8) assert_rel_error(self, top['comp.z'][2], [1.5], 1e-8)
def test_feature_boundscheck_wall(self): import numpy as np import openmdao.api as om from openmdao.test_suite.components.implicit_newton_linesearch import ImplCompTwoStatesArrays top = om.Problem() top.model.add_subsystem('px', om.IndepVarComp('x', np.ones((3, 1)))) top.model.add_subsystem('comp', ImplCompTwoStatesArrays()) top.model.connect('px.x', 'comp.x') top.model.nonlinear_solver = om.NewtonSolver() top.model.nonlinear_solver.options['maxiter'] = 10 top.model.linear_solver = om.ScipyKrylov() top.model.nonlinear_solver.linesearch = om.BoundsEnforceLS( bound_enforcement='wall') top.setup() # Test upper bounds: should go to the upper bound and stall top['px.x'] = 0.5 top['comp.y'] = 0. top['comp.z'] = 2.4 top.run_model() assert_rel_error(self, top['comp.z'][0], [2.6], 1e-8) assert_rel_error(self, top['comp.z'][1], [2.5], 1e-8) assert_rel_error(self, top['comp.z'][2], [2.65], 1e-8)
def test_feature_boundscheck_scalar(self): import numpy as np import openmdao.api as om from openmdao.test_suite.components.implicit_newton_linesearch import ImplCompTwoStatesArrays top = om.Problem() top.model.add_subsystem('px', om.IndepVarComp('x', np.ones((3, 1)))) top.model.add_subsystem('comp', ImplCompTwoStatesArrays()) top.model.connect('px.x', 'comp.x') top.model.nonlinear_solver = om.NewtonSolver() top.model.nonlinear_solver.options['maxiter'] = 10 top.model.linear_solver = om.ScipyKrylov() top.model.nonlinear_solver.linesearch = om.BoundsEnforceLS( bound_enforcement='scalar') top.setup() top.run_model() # Test lower bounds: should stop just short of the lower bound top['px.x'] = 2.0 top['comp.y'] = 0. top['comp.z'] = 1.6 top.run_model()
def test_feature_boundscheck_scalar(self): import numpy as np import openmdao.api as om from openmdao.test_suite.components.implicit_newton_linesearch import ImplCompTwoStatesArrays top = om.Problem() top.model.add_subsystem('comp', ImplCompTwoStatesArrays(), promotes_inputs=['x']) top.model.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) top.model.nonlinear_solver.options['maxiter'] = 10 top.model.linear_solver = om.ScipyKrylov() top.model.nonlinear_solver.linesearch = om.BoundsEnforceLS( bound_enforcement='scalar') top.setup() top.set_val('x', np.array([2., 2, 2]).reshape(3, 1)) top.run_model() # Test lower bounds: should stop just short of the lower bound top.set_val('comp.y', 0.) top.set_val('comp.z', 1.6) top.run_model()
def test_feature_boundscheck_basic(self): import numpy as np import openmdao.api as om from openmdao.test_suite.components.implicit_newton_linesearch import ImplCompTwoStatesArrays top = om.Problem() top.model.add_subsystem('comp', ImplCompTwoStatesArrays(), promotes_inputs=['x']) top.model.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) top.model.nonlinear_solver.options['maxiter'] = 10 top.model.linear_solver = om.ScipyKrylov() top.model.nonlinear_solver.linesearch = om.BoundsEnforceLS() top.setup() top.set_val('x', np.array([2., 2, 2]).reshape(3, 1)) # Test lower bounds: should go to the lower bound and stall top.set_val('comp.y', 0.) top.set_val('comp.z', 1.6) top.run_model() for ind in range(3): assert_near_equal(top.get_val('comp.z', indices=ind), [1.5], 1e-8)
def test_feature_boundscheck_scalar(self): top = Problem() top.model = Group() top.model.add_subsystem('px', IndepVarComp('x', np.ones((3, 1)))) top.model.add_subsystem('comp', ImplCompTwoStatesArrays()) top.model.connect('px.x', 'comp.x') top.model.nonlinear_solver = NewtonSolver() top.model.nonlinear_solver.options['maxiter'] = 10 top.model.linear_solver = ScipyIterativeSolver() ls = top.model.nonlinear_solver.linesearch = BoundsEnforceLS() ls.options['bound_enforcement'] = 'scalar' top.setup(check=False) top.run_model() # Test lower bounds: should stop just short of the lower bound top['px.x'] = 2.0 top['comp.y'] = 0. top['comp.z'] = 1.6 top.run_model() print(top['comp.z'][0]) print(top['comp.z'][1]) print(top['comp.z'][2])
def test_feature_armijo_print_bound_enforce(self): import numpy as np import openmdao.api as om from openmdao.test_suite.components.implicit_newton_linesearch import ImplCompTwoStatesArrays top = om.Problem() top.model.add_subsystem('px', om.IndepVarComp('x', np.ones((3, 1)))) top.model.add_subsystem('comp', ImplCompTwoStatesArrays()) top.model.connect('px.x', 'comp.x') newt = top.model.nonlinear_solver = om.NewtonSolver( solve_subsystems=False) top.model.nonlinear_solver.options['maxiter'] = 2 top.model.linear_solver = om.ScipyKrylov() ls = newt.linesearch = om.ArmijoGoldsteinLS() ls.options['print_bound_enforce'] = True top.set_solver_print(level=2) top.setup() # Test lower bounds: should go to the lower bound and stall top['px.x'] = 2.0 top['comp.y'] = 0. top['comp.z'] = 1.6 top.run_model() for ind in range(3): assert_near_equal(top['comp.z'][ind], [1.5], 1e-8)
def test_feature_print_bound_enforce(self): top = om.Problem() top.model.add_subsystem('comp', ImplCompTwoStatesArrays(), promotes_inputs=['x']) newt = top.model.nonlinear_solver = om.NewtonSolver( solve_subsystems=False) top.model.nonlinear_solver.options['maxiter'] = 2 top.model.linear_solver = om.ScipyKrylov() ls = newt.linesearch = om.BoundsEnforceLS(bound_enforcement='vector') ls.options['print_bound_enforce'] = True top.set_solver_print(level=2) top.setup() top.set_val('x', np.array([2., 2, 2]).reshape(3, 1)) # Test lower bounds: should go to the lower bound and stall top.set_val('comp.y', 0.) top.set_val('comp.z', 1.6) top.run_model() for ind in range(3): assert_near_equal(top.get_val('comp.z', indices=ind), [1.5], 1e-8)
def test_feature_goldstein(self): top = om.Problem() top.model.add_subsystem('px', om.IndepVarComp('x', np.ones((3, 1)))) top.model.add_subsystem('comp', ImplCompTwoStatesArrays()) top.model.connect('px.x', 'comp.x') top.model.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) top.model.nonlinear_solver.options['maxiter'] = 10 top.model.linear_solver = om.ScipyKrylov() ls = top.model.nonlinear_solver.linesearch = om.ArmijoGoldsteinLS( bound_enforcement='vector') ls.options['method'] = 'Goldstein' top.setup() # Test lower bounds: should go to the lower bound and stall top['px.x'] = 2.0 top['comp.y'] = 0. top['comp.z'] = 1.6 top.run_model() for ind in range(3): assert_near_equal(top['comp.z'][ind], [1.5], 1e-8)
def setUp(self): top = om.Problem() top.model.add_subsystem('px', om.IndepVarComp('x', np.ones((3, 1)))) top.model.add_subsystem('comp', ImplCompTwoStatesArrays()) top.model.connect('px.x', 'comp.x') top.model.nonlinear_solver = om.NewtonSolver() top.model.nonlinear_solver.options['maxiter'] = 10 top.model.linear_solver = om.ScipyKrylov() top.set_solver_print(level=0) top.setup() self.top = top self.ub = np.array([2.6, 2.5, 2.65])
def test_feature_armijogoldsteinls_basic(self): top = om.Problem() top.model.add_subsystem('comp', ImplCompTwoStatesArrays(), promotes_inputs=['x']) top.model.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) top.model.nonlinear_solver.options['maxiter'] = 10 top.model.linear_solver = om.ScipyKrylov() top.model.nonlinear_solver.linesearch = om.ArmijoGoldsteinLS() top.setup() top.set_val('x', np.array([2., 2, 2]).reshape(3, 1)) # Test lower bounds: should go to the lower bound and stall top.set_val('comp.y', 0.) top.set_val('comp.z', 1.6) top.run_model() for ind in range(3): assert_near_equal(top.get_val('comp.z', indices=ind), [1.5], 1e-8)
def test_feature_armijo_boundscheck_scalar(self): top = om.Problem() top.model.add_subsystem('comp', ImplCompTwoStatesArrays(), promotes_inputs=['x']) top.model.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) top.model.nonlinear_solver.options['maxiter'] = 10 top.model.linear_solver = om.ScipyKrylov() ls = top.model.nonlinear_solver.linesearch = om.ArmijoGoldsteinLS( bound_enforcement='scalar') top.setup() top.set_val('x', np.array([2., 2, 2]).reshape(3, 1)) top.run_model() # Test lower bounds: should stop just short of the lower bound top.set_val('comp.y', 0.) top.set_val('comp.z', 1.6) top.run_model()