NonlinearRunOnce#
The simplest solver in OpenMDAO is NonlinearRunOnce, which executes the system’s components or subsystems sequentially. No iteration is performed by this solver, so it can only be used in systems where the following conditions are satisfied:
System does not contain a cycle, though subsystems may.
System does not contain any implicit states, though subsystems may.
Note that a subsystem may contain cycles or implicit states provided that it is fitted with a solver that can handle them such as NewtonSolver.
Here is an example of using NonlinearRunOnce for a simple model with the Paraboloid
component.
Paraboloid
class definition
class Paraboloid(om.ExplicitComponent):
"""
Evaluates the equation f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3.
"""
def setup(self):
self.add_input('x', val=0.0)
self.add_input('y', val=0.0)
self.add_output('f_xy', val=0.0)
def setup_partials(self):
self.declare_partials('*', '*')
def compute(self, inputs, outputs):
"""
f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3
Optimal solution (minimum): x = 6.6667; y = -7.3333
"""
x = inputs['x']
y = inputs['y']
outputs['f_xy'] = (x-3.0)**2 + x*y + (y+4.0)**2 - 3.0
def compute_partials(self, inputs, partials):
"""
Jacobian for our paraboloid.
"""
x = inputs['x']
y = inputs['y']
partials['f_xy', 'x'] = 2.0*x - 6.0 + y
partials['f_xy', 'y'] = 2.0*y + 8.0 + x
import openmdao.api as om
from openmdao.test_suite.components.paraboloid import Paraboloid
prob = om.Problem()
model = prob.model
model.add_subsystem('comp', Paraboloid(), promotes=['x', 'y', 'f_xy'])
model.linear_solver = om.LinearRunOnce()
prob.setup(check=False, mode='fwd')
prob.set_val('x', 0.0)
prob.set_val('y', 0.0)
prob.run_model()
of = ['f_xy']
wrt = ['x', 'y']
derivs = prob.compute_totals(of=of, wrt=wrt, return_format='dict')
print(derivs['f_xy']['x'])
print(derivs['f_xy']['y'])
[[-6.]]
[[8.]]
NonlinearRunOnce Options#
Option | Default | Acceptable Values | Acceptable Types | Description |
---|---|---|---|---|
iprint | 1 | N/A | ['int'] | whether to print output |
NonlinearRunOnce Constructor#
The call signature for the NonlinearRunOnce
constructor is:
- NonlinearRunOnce.__init__(**kwargs)
Initialize all attributes.