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()
示例#2
0
    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.")
示例#9
0
    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')