Source code for openmdao.test_suite.components.matmultcomp

"""
A simple component used for derivative testing.
"""
import time

import numpy as np

import openmdao.api as om


[docs]class MatMultComp(om.ExplicitComponent):
[docs] def __init__(self, mat, approx_method='exact', sleep_time=0.1, **kwargs): super().__init__(**kwargs) self.mat = mat self.approx_method = approx_method self.sleep_time = sleep_time
[docs] def setup(self): self.add_input('x', val=np.ones(self.mat.shape[1])) self.add_output('y', val=np.zeros(self.mat.shape[0])) self.num_computes = 0
[docs] def setup_partials(self): self.declare_partials('*', '*', method=self.approx_method)
[docs] def compute(self, inputs, outputs): outputs['y'] = self.mat.dot(inputs['x']) self.num_computes += 1 time.sleep(self.sleep_time)
if __name__ == '__main__': import sys import openmdao.api as om from openmdao.utils.mpi import MPI if len(sys.argv) > 1: size = int(sys.argv[1]) else: size = 20 if MPI: ncom = MPI.COMM_WORLD.size if MPI.COMM_WORLD.rank == 0: mat = np.random.random(5 * size).reshape((5, size)) - 0.5 else: mat = None mat = MPI.COMM_WORLD.bcast(mat, root=0) profname = "prof_%d.out" % MPI.COMM_WORLD.rank else: mat = np.random.random(5 * size).reshape((5, size)) - 0.5 profname = "prof.out" print("mat shape:", mat.shape) p = om.Problem() model = p.model model.add_subsystem('indep', om.IndepVarComp('x', val=np.ones(mat.shape[1]))) comp = model.add_subsystem('comp', MatMultComp(mat, approx_method='fd', num_par_fd=5)) model.connect('indep.x', 'comp.x') p.setup(mode='fwd', force_alloc_complex=True) p.run_model() start = time.perf_counter() J = p.compute_totals(of=['comp.y'], wrt=['indep.x']) print("norm J - mat:", np.linalg.norm(J['comp.y','indep.x'] - comp.mat)) print("Elapsed time:", time.perf_counter() - start)