Skip to content

Commit

Permalink
Merge a5cb8a5 into c10d6d5
Browse files Browse the repository at this point in the history
  • Loading branch information
DKilkenny committed May 5, 2020
2 parents c10d6d5 + a5cb8a5 commit 6b73f7a
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 0 deletions.
7 changes: 7 additions & 0 deletions openmdao/core/component.py
Expand Up @@ -1259,6 +1259,13 @@ def _declare_partials(self, of, wrt, dct):
meta['cols'] = cols
meta['shape'] = shape = (abs2meta[abs_key[0]]['size'], abs2meta[abs_key[1]]['size'])

if shape[0] == 0 or shape[1] == 0:
msg = "{}: '{}' is an array of size 0"
if shape[0] == 0:
raise ValueError(msg.format(self.msginfo, abs_key[0]))
elif shape[1] == 0:
raise ValueError(msg.format(self.msginfo, abs_key[1]))

if val is None:
# we can only get here if rows is None (we're not sparse list format)
meta['value'] = np.zeros(shape)
Expand Down
82 changes: 82 additions & 0 deletions openmdao/core/tests/test_coloring.py
Expand Up @@ -319,6 +319,88 @@ def test_dynamic_fwd_simul_coloring_snopt_approx_fd(self):
self.assertEqual((p.model._solve_nl_count - 2) / 22,
(p_color.model._solve_nl_count - 2 - 66) / 6)

def test_size_zero_array_in_component(self):
class DynamicPartialsComp(om.ExplicitComponent):
def __init__(self, size):
super(DynamicPartialsComp, self).__init__()
self.size = size
self.num_computes = 0

def setup(self):
self.add_input('y', np.ones(self.size))
self.add_input('x', np.ones(self.size))
self.add_output('g', np.ones(self.size))

self.declare_partials('*', '*', method='cs')

# turn on dynamic partial coloring
self.declare_coloring(wrt='*', method='cs', perturb_size=1e-5, num_full_jacs=2, tol=1e-20,
orders=20, show_summary=True, show_sparsity=True)

def compute(self, inputs, outputs):
outputs['g'] = np.arctan(inputs['y'] / inputs['x'])
self.num_computes += 1

SIZE = 0
p = om.Problem()

arctan_yox = p.model.add_subsystem('arctan_yox', DynamicPartialsComp(SIZE))

p.driver = om.ScipyOptimizeDriver()
p.driver.options['optimizer'] = 'SLSQP'
p.driver.options['disp'] = False

p.driver.declare_coloring(show_summary=True, show_sparsity=True)

p.setup(mode='fwd')

with self.assertRaises(Exception) as context:
p.run_driver()
self.assertEqual(str(context.exception),
"DynamicPartialsComp (arctan_yox): 'arctan_yox.g' is an array of size 0")

def test_size_zero_array_declare_partials(self):
class DynamicPartialsComp(om.ExplicitComponent):
def __init__(self, size):
super(DynamicPartialsComp, self).__init__()
self.size = size
self.num_computes = 0

def setup(self):
self.add_input('y', np.ones(self.size))
self.add_input('x', np.ones(self.size))
self.add_output('g', np.ones(self.size))
self.add_output('r', np.ones(1))

self.declare_partials('r', 'y', method='cs')

# turn on dynamic partial coloring
self.declare_coloring(wrt='*', method='cs', perturb_size=1e-5, num_full_jacs=2, tol=1e-20,
orders=20, show_summary=True, show_sparsity=True)

def compute(self, inputs, outputs):
outputs['g'] = np.arctan(inputs['y'] / inputs['x'])
self.num_computes += 1

SIZE = 0
p = om.Problem()

arctan_yox = p.model.add_subsystem('arctan_yox', DynamicPartialsComp(SIZE))

p.driver = om.ScipyOptimizeDriver()
p.driver.options['optimizer'] = 'SLSQP'
p.driver.options['disp'] = False

p.driver.declare_coloring(show_summary=True, show_sparsity=True)

p.setup(mode='fwd')

with self.assertRaises(Exception) as context:
p.run_driver()
self.assertEqual(str(context.exception),
"DynamicPartialsComp (arctan_yox): 'arctan_yox.y' is an array of size 0")


def test_dynamic_total_coloring_pyoptsparse_slsqp_auto(self):
try:
from pyoptsparse import OPT
Expand Down

0 comments on commit 6b73f7a

Please sign in to comment.