Ejemplo n.º 1
0
    def setUp(self):
        self.nn = 10

        self.p = om.Problem()

        ivc = om.IndepVarComp()
        for i in range(self.nn):
            ivc.add_output(name='a_{0}'.format(i), val=1.0)
            ivc.add_output(name='b_{0}'.format(i), val=1.0)

        self.p.model.add_subsystem(name='ivc',
                                   subsys=ivc,
                                   promotes_outputs=['*'])

        mux_comp = self.p.model.add_subsystem(
            name='mux_comp', subsys=om.MuxComp(vec_size=self.nn))

        mux_comp.add_var('a', shape=(1, ), axis=0)
        mux_comp.add_var('b', shape=(1, ), axis=1)

        for i in range(self.nn):
            self.p.model.connect('a_{0}'.format(i), 'mux_comp.a_{0}'.format(i))
            self.p.model.connect('b_{0}'.format(i), 'mux_comp.b_{0}'.format(i))

        self.p.setup(force_alloc_complex=True)

        for i in range(self.nn):
            self.p['a_{0}'.format(i)] = np.random.rand(1)
            self.p['b_{0}'.format(i)] = np.random.rand(1)

        self.p.run_model()
Ejemplo n.º 2
0
    def test_invalid_axis_1D(self):
        nn = 10

        a_size = 7
        b_size = 3

        p = om.Problem()

        ivc = om.IndepVarComp()
        for i in range(nn):
            ivc.add_output(name='a_{0}'.format(i), shape=(a_size, ))
            ivc.add_output(name='b_{0}'.format(i), shape=(b_size, ))

        p.model.add_subsystem(name='ivc', subsys=ivc, promotes_outputs=['*'])

        mux_comp = p.model.add_subsystem(name='mux_comp',
                                         subsys=om.MuxComp(vec_size=nn))

        mux_comp.add_var('a', shape=(a_size, ), axis=0)

        with self.assertRaises(ValueError) as ctx:
            mux_comp.add_var('b', shape=(b_size, ), axis=2)
        self.assertEqual(
            str(ctx.exception),
            "'mux_comp' <class MuxComp>: Cannot mux a 1D inputs for b along axis greater "
            "than 1 (2)")
Ejemplo n.º 3
0
    def setup(self):

        # We add in our group all the components for declared services that provide CG ratio
        # for specific load_cases
        for load_case_count in count():
            try:
                system = RegisterSubmodel.get_submodel(
                    f"{SERVICE_LOAD_CASE_CG_PREFIX}.{load_case_count + 1}")
            except FastNoSubmodelFoundError:
                break
            self.add_subsystem(f"cg_ratio_lc{load_case_count + 1}",
                               system,
                               promotes_inputs=["*"])

        cg_ratio_aggregator = self.add_subsystem(
            "cg_ratio_aggregator",
            om.MuxComp(vec_size=load_case_count),
            promotes=["data:weight:aircraft:load_cases:CG:MAC_position"],
        )

        # This part aggregates all CG ratios values in one vector variable.
        cg_ratio_aggregator.add_var(
            "data:weight:aircraft:load_cases:CG:MAC_position",
            shape=(1, ),
            axis=0)
        for i in range(load_case_count):
            self.connect(
                f"cg_ratio_lc{i + 1}.data:weight:aircraft:load_case_{i + 1}:CG:MAC_position",
                f"cg_ratio_aggregator.data:weight:aircraft:load_cases:CG:MAC_position_{i}",
            )

        self.add_subsystem("compute_max",
                           MaxCGRatiosForLoadCases(),
                           promotes=["*"])
Ejemplo n.º 4
0
    def test_invalid_axis_scalar(self):
        nn = 10

        p = om.Problem()

        ivc = om.IndepVarComp()
        for i in range(nn):
            ivc.add_output(name='a_{0}'.format(i), val=1.0)

        p.model.add_subsystem(name='ivc', subsys=ivc, promotes_outputs=['*'])

        mux_comp = p.model.add_subsystem(name='mux_comp',
                                         subsys=om.MuxComp(vec_size=nn))

        mux_comp.add_var('a', shape=(1, ), axis=2)

        for i in range(nn):
            p.model.connect('a_{0}'.format(i), 'mux_comp.a_{0}'.format(i))

        with self.assertRaises(ValueError) as ctx:
            p.setup()
        self.assertEqual(
            str(ctx.exception),
            'MuxComp (mux_comp): Cannot mux a 1D inputs for a along axis greater than 1 (2)'
        )
Ejemplo n.º 5
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)
Ejemplo n.º 6
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)