def setUp(self): self.nn = 5 ivc = om.IndepVarComp() ivc.add_output(name='a', shape=(self.nn, 3), units='m') ivc.add_output(name='b', shape=(2 * self.nn, 2), units='ft') vmc = om.VectorMagnitudeComp(vec_size=self.nn, units='m') vmc.add_magnitude('b_mag', 'b', vec_size=2 * self.nn, length=2, units='ft') model = om.Group() model.add_subsystem('ivc', subsys=ivc, promotes_outputs=['a', 'b']) model.add_subsystem('vmc', subsys=vmc) model.connect('a', 'vmc.a') model.connect('b', 'vmc.b') p = self.p = om.Problem(model) p.setup() p['a'] = 1.0 + np.random.rand(self.nn, 3) p['b'] = 1.0 + np.random.rand(2 * self.nn, 2) p.run_model()
def test(self): """ An example demonstrating a trivial use case of MuxComp """ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_rel_error # The number of elements to be muxed n = 3 # The size of each element to be muxed m = 100 p = om.Problem() ivc = om.IndepVarComp() ivc.add_output(name='x', shape=(m, ), units='m') ivc.add_output(name='y', shape=(m, ), units='m') ivc.add_output(name='z', shape=(m, ), units='m') p.model.add_subsystem(name='ivc', subsys=ivc, promotes_outputs=['x', 'y', 'z']) mux_comp = p.model.add_subsystem(name='mux', subsys=om.MuxComp(vec_size=n)) mux_comp.add_var('r', shape=(m, ), axis=1, units='m') p.model.add_subsystem(name='vec_mag_comp', subsys=om.VectorMagnitudeComp(vec_size=m, length=n, in_name='r', mag_name='r_mag', units='m')) p.model.connect('x', 'mux.r_0') p.model.connect('y', 'mux.r_1') p.model.connect('z', 'mux.r_2') p.model.connect('mux.r', 'vec_mag_comp.r') p.setup() p['x'] = 1 + np.random.rand(m) p['y'] = 1 + np.random.rand(m) p['z'] = 1 + np.random.rand(m) p.run_model() # Verify the results against numpy.dot in a for loop. for i in range(n): r_i = [p['x'][i], p['y'][i], p['z'][i]] expected_i = np.sqrt(np.dot(r_i, r_i)) assert_rel_error(self, p.get_val('vec_mag_comp.r_mag')[i], expected_i)
def test_input_as_output(self): vmc = om.VectorMagnitudeComp() with self.assertRaises(NameError) as ctx: vmc.add_magnitude('a', 'aa') self.assertEqual( str(ctx.exception), "<class VectorMagnitudeComp>: 'a' specified as" " an output, but it has already been defined as an input.")
def test_duplicate_outputs(self): vmc = om.VectorMagnitudeComp() with self.assertRaises(NameError) as ctx: vmc.add_magnitude('a_mag', 'aa') self.assertEqual( str(ctx.exception), "<class VectorMagnitudeComp>: " "Multiple definition of output 'a_mag'.")
def test_multiple(self): """ A simple example to compute the magnitude of 3-vectors at at 100 points simultaneously. """ import numpy as np import openmdao.api as om n = 100 p = om.Problem() comp = om.VectorMagnitudeComp(vec_size=n, length=3, in_name='r', mag_name='r_mag', units='km') comp.add_magnitude(vec_size=n, length=3, in_name='b', mag_name='b_mag', units='ft') p.model.add_subsystem(name='vec_mag_comp', subsys=comp, promotes_inputs=['r', 'b']) p.setup() p.set_val('r', 1.0 + np.random.rand(n, 3)) p.set_val('b', 1.0 + np.random.rand(n, 3)) p.run_model() # Verify the results against numpy.dot in a for loop. expected_r = [] expected_b = [] for i in range(n): a_i = p.get_val('r')[i, :] expected_r.append(np.sqrt(np.dot(a_i, a_i))) actual_i = p.get_val('vec_mag_comp.r_mag')[i] rel_error = np.abs(expected_r[i] - actual_i) / actual_i assert rel_error < 1e-9, f"Relative error: {rel_error}" b_i = p.get_val('b')[i, :] expected_b.append(np.sqrt(np.dot(b_i, b_i))) actual_i = p.get_val('vec_mag_comp.b_mag')[i] rel_error = np.abs(expected_b[i] - actual_i) / actual_i assert rel_error < 1e-9, f"Relative error: {rel_error}" assert_near_equal(p.get_val('vec_mag_comp.r_mag'), np.array(expected_r)) assert_near_equal(p.get_val('vec_mag_comp.b_mag'), np.array(expected_b))
def test_units_mismatch(self): vmc = om.VectorMagnitudeComp() with self.assertRaises(ValueError) as ctx: vmc.add_magnitude('a_mag2', 'a', units='ft') self.assertEqual( str(ctx.exception), "<class VectorMagnitudeComp>: " "Conflicting units 'ft' specified for input 'a', " "which has already been defined with units 'None'.")
def test_length_mismatch(self): vmc = om.VectorMagnitudeComp() with self.assertRaises(ValueError) as ctx: vmc.add_magnitude('a_mag2', 'a', length=5) self.assertEqual( str(ctx.exception), "<class VectorMagnitudeComp>: " "Conflicting length=5 specified for input 'a', " "which has already been defined with length=1.")
def test_vec_size_mismatch(self): vmc = om.VectorMagnitudeComp() with self.assertRaises(ValueError) as ctx: vmc.add_magnitude('a_mag2', 'a', vec_size=10) self.assertEqual( str(ctx.exception), "VectorMagnitudeComp: " "Conflicting vec_size=10 specified for input 'a', " "which has already been defined with vec_size=1.")
def test(self): """ An example demonstrating a trivial use case of MuxComp """ import numpy as np import openmdao.api as om # The number of elements to be muxed n = 3 # The size of each element to be muxed m = 100 p = om.Problem() mux_comp = p.model.add_subsystem(name='mux', subsys=om.MuxComp(vec_size=n)) mux_comp.add_var('r', shape=(m, ), axis=1, units='m') p.model.add_subsystem(name='vec_mag_comp', subsys=om.VectorMagnitudeComp(vec_size=m, length=n, in_name='r', mag_name='r_mag', units='m')) p.model.connect('mux.r', 'vec_mag_comp.r') p.setup() p.set_val('mux.r_0', 1 + np.random.rand(m)) p.set_val('mux.r_1', 1 + np.random.rand(m)) p.set_val('mux.r_2', 1 + np.random.rand(m)) p.run_model() # Verify the results against numpy.dot in a for loop. for i in range(n): r_i = [ p.get_val('mux.r_0')[i], p.get_val('mux.r_1')[i], p.get_val('mux.r_2')[i] ] expected_i = np.sqrt(np.dot(r_i, r_i)) assert_near_equal(p.get_val('vec_mag_comp.r_mag')[i], expected_i)
def test(self): """ A simple example to compute the magnitude of 3-vectors at at 100 points simultaneously. """ import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_rel_error n = 100 p = om.Problem() ivc = om.IndepVarComp() ivc.add_output(name='pos', shape=(n, 3), units='m') p.model.add_subsystem(name='ivc', subsys=ivc, promotes_outputs=['pos']) dp_comp = om.VectorMagnitudeComp(vec_size=n, length=3, in_name='r', mag_name='r_mag', units='km') p.model.add_subsystem(name='vec_mag_comp', subsys=dp_comp) p.model.connect('pos', 'vec_mag_comp.r') p.setup() p['pos'] = 1.0 + np.random.rand(n, 3) p.run_model() # Verify the results against numpy.dot in a for loop. for i in range(n): a_i = p['pos'][i, :] expected_i = np.sqrt(np.dot(a_i, a_i)) / 1000.0 assert_rel_error(self, p.get_val('vec_mag_comp.r_mag')[i], expected_i)
def setUp(self): self.nn = 5 self.p = om.Problem() ivc = om.IndepVarComp() ivc.add_output(name='a', shape=(self.nn, 3), units='m') self.p.model.add_subsystem(name='ivc', subsys=ivc, promotes_outputs=['a']) self.p.model.add_subsystem(name='vec_mag_comp', subsys=om.VectorMagnitudeComp(vec_size=self.nn, units='m')) self.p.model.connect('a', 'vec_mag_comp.a') self.p.setup() self.p['a'] = 1.0 + np.random.rand(self.nn, 3) self.p.run_model()
def setup(self): self.add_subsystem( 'ivc', om.IndepVarComp('a', shape=(5, 3), units='m')) self.add_subsystem( 'vmc', om.VectorMagnitudeComp(vec_size=5, units='m')) self.connect('ivc.a', 'vmc.a')