Source code for openmdao.test_suite.components.exec_comp_for_test
import time
from openmdao.components.exec_comp import ExecComp
from openmdao.core.analysis_error import AnalysisError
[docs]class ExecComp4Test(ExecComp):
"""
A version of ExecComp for benchmarking and testing.
Parameters
----------
exprs : str or list of str
The expressions that determine the inputs and outputs of this component.
nl_delay : float(0.01)
The sleep time in seconds that will occur when solve_nonlinear is called.
lin_delay : float(0.01)
The sleep time in seconds that will occur when apply_linear is called.
rec_procs : tuple of the form (minprocs, maxprocs)
Minimum and maximun MPI processes usable by this component.
fail_rank : int or collection of int (0)
Rank (if running under MPI) or worker number (if running under
multiprocessing) where failures will be initiated.
fails : list or tuple of int
If the current self.num_nl_solves matches any of these, then this
component will raise an exception.
fail_hard : bool(False)
If True and fails is not empty, this component will raise a
RuntimeError when a failure is induced. Otherwise, an AnalysisError
will be raised.
"""
[docs] def __init__(self, exprs, nl_delay=0.01, lin_delay=0.01,
req_procs=(1,1), fail_rank=-1, fails=(),
fail_hard=False, **kwargs):
super().__init__(exprs, **kwargs)
self.nl_delay = nl_delay
self.lin_delay = lin_delay
self.num_nl_solves = 0
self.num_compute_partials = 0
self.req_procs = req_procs
self.fail_rank = fail_rank
if isinstance(fail_rank, int):
self.fail_rank = (self.fail_rank,)
self.fails = fails
self.fail_hard = fail_hard
[docs] def compute(self, inputs, outputs):
"""
Execute this component's assignment statements.
Parameters
----------
inputs : `Vector`
`Vector` containing inputs.
outputs : `Vector`
`Vector` containing outputs.
"""
try:
if (self.fail_rank == -1 or self.comm.rank in self.fail_rank) and self.num_nl_solves in self.fails:
if self.fail_hard:
raise RuntimeError("OMG, a critical error!")
else:
raise AnalysisError("just an analysis error")
super().compute(inputs, outputs)
time.sleep(self.nl_delay)
finally:
self.num_nl_solves += 1
[docs] def compute_partials(self, inputs, partials):
"""
Use complex step method to update the given Jacobian.
Parameters
----------
inputs : `Vector`
`Vector` containing parameters. (p)
partials : `Jacobian`
Contains sub-jacobians.
"""
super().compute_partials(inputs, partials)
time.sleep(self.lin_delay)
self.num_compute_partials += 1