# Source code for openmdao.test_suite.components.misc_components

"""
Misc components.
Contains some general test components that are used in multiple places for testing, but aren't
featured as examples, and are not meant to be showcased as the proper way to write components
in OpenMDAO.
"""
from __future__ import division, print_function
import numpy as np
import openmdao.api as om
[docs]class Comp4LinearCacheTest(om.ImplicitComponent):
"""
Component needed for testing cached linear solutions.
Generally, needed an implicit component that was challenging enough that it took a few
iterations to solve with the petsc and scipy iterative linear solvers. Equation just
came from playing around. It does not represent any academic or real world problem, so
it does not need to be explained.
"""
[docs] def setup(self):
"""
Set up the model and define derivatives.
"""
self.add_input('x', val=1.0)
self.add_output('y', val=np.sqrt(3))
self.declare_partials(of='*', wrt='*')
[docs] def apply_nonlinear(self, inputs, outputs, residuals):
"""
Compute residuals.
Parameters
----------
inputs : Vector
Unscaled, dimensional input variables read via inputs[key].
outputs : Vector
Unscaled, dimensional output variables read via outputs[key].
residuals : Vector
Unscaled, dimensional residuals written to via residuals[key].
"""
x = inputs['x']
y = outputs['y']
residuals['y'] = x * y ** 3 - 3.0 * y * x ** 3
[docs] def linearize(self, inputs, outputs, partials):
"""
Compute derivatives.
These derivatives are correct.
Parameters
----------
inputs : Vector
Unscaled, dimensional input variables read via inputs[key].
outputs : Vector
Unscaled, dimensional output variables read via outputs[key].
partials : `Jacobian`
Contains sub-jacobians.
"""
x = inputs['x']
y = outputs['y']
partials['y', 'x'] = y ** 3 - 9.0 * y * x ** 2
partials['y', 'y'] = 3.0 * x * y ** 2 - 3.0 * y * x ** 3