Modifying Solver Options
Modifying Solver Options¶
In OpenMDAO, implicit outputs can have bounds and scaling attached to them. These are defined when
add_output is called on an implicit component.
In complex models, this means that a user may need to tweak bounds and scaling in multiple files. The bounds and scaling of a variable may be dependent upon the application of the model. These bounds may need to be adjusted in a file that is generally outside of the expertise of the user.
OpenMDAO provides a method
System.set_output_solver_options that allows users to set bounds throughout their model from a single script or notebook.
- System.set_output_solver_options(name, lower=UNDEFINED, upper=UNDEFINED, ref=UNDEFINED, ref0=UNDEFINED, res_ref=UNDEFINED)
Set solver output options.
Allows the user to set output solver options after the output has been defined and metadata set using the add_ouput method.
Name of the variable in this system’s namespace.
- lowerfloat or list or tuple or ndarray or None
Lower bound(s) in user-defined units. It can be (1) a float, (2) an array_like consistent with the shape arg (if given), or (3) an array_like matching the shape of val, if val is array_like. A value of None means this output has no lower bound. Default is None.
- upperfloat or list or tuple or ndarray or None
Upper bound(s) in user-defined units. It can be (1) a float, (2) an array_like consistent with the shape arg (if given), or (3) an array_like matching the shape of val, if val is array_like. A value of None means this output has no upper bound. Default is None.
Scaling parameter. The value in the user-defined units of this output variable when the scaled value is 1. Default is 1.
Scaling parameter. The value in the user-defined units of this output variable when the scaled value is 0. Default is 0.
Scaling parameter. The value in the user-defined res_units of this output’s residual when the scaled value is 1. Default is None, which means residual scaling matches output scaling.
Example of Setting Solver Output Options¶
Here is an example of how to make use of the
# Implicit component in which bounds and scaling are set on outputs import openmdao.api as om class ScalingExample3(om.ImplicitComponent): def setup(self): self.add_input('x1', val=100.0) self.add_input('x2', val=5000.0) self.add_output('y1', val=200., ref=1e2, res_ref=1e5, ref0=1.0, lower=2., upper=3) self.add_output('y2', val=6000., ref=1e3, res_ref=1e-5) def apply_nonlinear(self, inputs, outputs, residuals): x1 = inputs['x1'] x2 = inputs['x2'] y1 = outputs['y1'] y2 = outputs['y2'] residuals['y1'] = 1e5 * (x1 - y1) / y1 residuals['y2'] = 1e-5 * (x2 - y2) / y2
# Script that makes use of this implicit component prob = om.Problem() # ScalingExample3 sets values for ref, res_ref, ref0, lower, and upper comp = prob.model.add_subsystem('comp', ScalingExample3()) prob.setup() prob.run_model() # Run model with the bounds and scaling set in the component
# Now override a value from this cell (could also be from a separate script) and re-run the model prob.model.set_output_solver_options(name='comp.y1',ref=1e3) prob.setup() prob.run_model()