Changing Model Settings After Setup¶
setup has been called, the entire model hierarchy has been instantiated and
setup and configure have been called on all Groups and Components.
However, you may still want to make some changes to your model configuration.
OpenMDAO allows you to do a limited number of things after the Problem
setup has been called, but before
you have called
run_driver. These allowed actions include the following:
Change solver settings
Assign Dense or Sparse Jacobians
Assign case recorders
Here, we instantiate a hierarchy of Groups, and then change the solver to one that can solve this problem.
import openmdao.api as om class ImplSimple(om.ImplicitComponent): def setup(self): self.add_input('a', val=1.) self.add_output('x', val=0.) def apply_nonlinear(self, inputs, outputs, residuals): residuals['x'] = np.exp(outputs['x']) - \ inputs['a']**2 * outputs['x']**2 def linearize(self, inputs, outputs, jacobian): jacobian['x', 'x'] = np.exp(outputs['x']) - \ 2 * inputs['a']**2 * outputs['x'] jacobian['x', 'a'] = -2 * inputs['a'] * outputs['x']**2 class Sub(om.Group): def setup(self): self.add_subsystem('comp', ImplSimple()) # This will not solve it self.nonlinear_solver = om.NonlinearBlockGS() def configure(self): # This will not solve it either. self.nonlinear_solver = om.NonlinearBlockGS() class Super(om.Group): def setup(self): self.add_subsystem('sub', Sub()) top = om.Problem(model=Super()) top.setup() # This will solve it. top.model.sub.nonlinear_solver = om.NewtonSolver(solve_subsystems=False) top.model.sub.linear_solver = om.ScipyKrylov() print(isinstance(top.model.sub.nonlinear_solver, om.NewtonSolver)) print(isinstance(top.model.sub.linear_solver, om.ScipyKrylov))