Source code for openmdao.components.linear_system

""" A component that solves a linear system. """

import numpy as np

from openmdao.core.component import Component


[docs]class LinearSystem(Component): """ A component that solves a linear system Ax=b where A and x are params and x is a state.""" def __init__(self, size): super(LinearSystem, self).__init__() self.size = size self.add_param("A", val=np.eye(size)) self.add_param("b", val=np.ones(size)) self.add_state("x", val=np.zeros(size))
[docs] def solve_nonlinear(self, params, unknowns, resids): """ Use numpy to solve Ax=b for x. """ unknowns['x'] = np.linalg.solve(params['A'], params['b']) resids['x'] = params['A'].dot(unknowns['x']) - params['b']
[docs] def apply_nonlinear(self, params, unknowns, resids): """Evaluating residual for given state.""" resids['x'] = params['A'].dot(unknowns['x']) - params['b']
[docs] def apply_linear(self, params, unknowns, dparams, dunknowns, dresids, mode): """ Apply the derivative of state variable with respect to everything.""" if mode == 'fwd': if 'x' in dunknowns: dresids['x'] += params['A'].dot(dunknowns['x']) if 'A' in dparams: dresids['x'] += dparams['A'].dot(unknowns['x']) if 'b' in dparams: dresids['x'] -= dparams['b'] elif mode == 'rev': if 'x' in dunknowns: dunknowns['x'] += params['A'].T.dot(dresids['x']) if 'A' in dparams: dparams['A'] += np.outer(unknowns['x'], dresids['x']).T if 'b' in dparams: dparams['b'] -= dresids['x']