Пример #1
0
 def execute(self):
     """ Calculate the wingsurface from the spar geometry """
     
     # Make sure that input data has the same length
     self.verify_input()
     
     for beam in self.eqbeams:
         a = Assembly()
     
         # Add a splined blade planform from the input data
         a.add('pf_splines', SplinedBladePlanform(True))
         a.driver.workflow.add('pf_splines')
         a.pf_splines.nC = 3
         a.pf_splines.pfIn = beam
         a.pf_splines.configure_splines()
         
         a.create_passthrough('pf_splines.blade_length')
         a.create_passthrough('pf_splines.span_ni')
         
         a.add('blade_surface', LoftedBladeSurface())
         a.driver.workflow.add('blade_surface')
         
         a.connect('pf_splines.pfOut', 'blade_surface.pf')
         a.connect('span_ni', 'blade_surface.span_ni')
         
         # load the planform file
         a.span_ni = self.span_ni
         
         b = a.blade_surface
         
         # distribute 200 points evenly along the airfoil sections
         b.chord_ni = 200
         for f in self.airfoils:
             b.base_airfoils.append(np.loadtxt(f))
         b.blend_var = np.array([0.25, 0.75])
         
         self.wingsurf.append(a)
    def test_nested(self):
        asm3 = Assembly()
        asm3.add('comp1', ExecComp(exprs=['z=x+y']))
        driver = asm3.add('driver', SLSQPdriver())
        driver.workflow.add('comp1')
        driver.add_parameter('comp1.y', low=-1, high=1, start=0)
        driver.add_objective('comp1.z')
        driver.add_constraint('comp1.z >= 0')
        asm3.create_passthrough('comp1.x')
        asm3.create_passthrough('comp1.z')

        asm2 = Assembly()
        asm2.add('comp1', ExecComp(exprs=['z=x+y']))
        asm2.add('asm3', asm3)
        asm2.connect('comp1.z', 'asm3.x')
        driver = asm2.add('driver', SLSQPdriver())
        driver.workflow.add(('comp1', 'asm3'))
        driver.add_parameter('comp1.y', low=-1, high=1, start=0)
        driver.add_objective('asm3.z')
        driver.add_constraint('comp1.z >= 0')
        asm2.create_passthrough('comp1.x')
        asm2.create_passthrough('asm3.z')

        asm1 = set_as_top(Assembly())
        asm1.add('comp1', ExecComp(exprs=['z=x+y']))
        asm1.add('asm2', asm2)
        asm1.connect('comp1.z', 'asm2.x')
        driver = asm1.add('driver', SLSQPdriver())
        driver.workflow.add(('comp1', 'asm2'))
        driver.add_parameter('comp1.y', low=-1, high=1, start=0)
        driver.add_objective('asm2.z')
        driver.add_constraint('comp1.z >= 0')

        sout = StringIO()
        asm1.recorders = [JSONCaseRecorder(sout)]
        asm1.run()

        if os.environ.get('REGEN_JSON_FILES'):
            with open('nested.new', 'w') as out:
                out.write(sout.getvalue())
        verify_json(self, sout, 'nested.json')
    def test_nested(self):
        asm3 = Assembly()
        asm3.add('comp1', ExecComp(exprs=['z=x+y']))
        driver = asm3.add('driver', SLSQPdriver())
        driver.workflow.add('comp1')
        driver.add_parameter('comp1.y', low=-1, high=1, start=0)
        driver.add_objective('comp1.z')
        driver.add_constraint('comp1.z >= 0')
        asm3.create_passthrough('comp1.x')
        asm3.create_passthrough('comp1.z')

        asm2 = Assembly()
        asm2.add('comp1', ExecComp(exprs=['z=x+y']))
        asm2.add('asm3', asm3)
        asm2.connect('comp1.z', 'asm3.x')
        driver = asm2.add('driver', SLSQPdriver())
        driver.workflow.add(('comp1', 'asm3'))
        driver.add_parameter('comp1.y', low=-1, high=1, start=0)
        driver.add_objective('asm3.z')
        driver.add_constraint('comp1.z >= 0')
        asm2.create_passthrough('comp1.x')
        asm2.create_passthrough('asm3.z')

        asm1 = set_as_top(Assembly())
        asm1.add('comp1', ExecComp(exprs=['z=x+y']))
        asm1.add('asm2', asm2)
        asm1.connect('comp1.z', 'asm2.x')
        driver = asm1.add('driver', SLSQPdriver())
        driver.workflow.add(('comp1', 'asm2'))
        driver.add_parameter('comp1.y', low=-1, high=1, start=0)
        driver.add_objective('asm2.z')
        driver.add_constraint('comp1.z >= 0')

        sout = StringIO()
        asm1.recorders = [JSONCaseRecorder(sout)]
        asm1.run()

        if os.environ.get('REGEN_JSON_FILES'):
            with open('nested.new', 'w') as out:
               out.write(sout.getvalue())
        verify_json(self, sout, 'nested.json')
class ArrayTest(unittest.TestCase):

    def setUp(self):
        self.top = Assembly()
        self.top.add('driver', MyDriver())
        self.top.add('comp', ArrayComp())
        self.top.driver.workflow.add('comp')

    def test_basic(self):
        top = self.top
        comp = top.comp
        driver = top.driver

        comp.x1d = [1, 2, 3]
        comp.x2d = [[1, 2, 3], [4, 5, 6]]
        top.run()
        self.assertEqual(comp.fx1d, 6.)
        self.assertEqual(list(comp.fx2d), [6., 15.])

        code = "driver.add_parameter('comp.x1d')"
        assert_raises(self, code, globals(), locals(), ValueError,
                      "driver: Trying to add parameter 'comp.x1d', but no"
                      " lower limit was found and no 'low' argument was given."
                      " One or the other must be specified.")

        code = "driver.add_parameter('comp.x1d', low=-10)"
        assert_raises(self, code, globals(), locals(), ValueError,
                      "driver: Trying to add parameter 'comp.x1d', but no"
                      " upper limit was found and no 'high' argument was given."
                      " One or the other must be specified.")

        driver.add_parameter('comp.x1d', low=-10, high=10, start=1)

        code = "driver.add_parameter('comp.x2d')"
        assert_raises(self, code, globals(), locals(), ValueError,
                      "driver: Trying to add parameter 'comp.x2d', but no"
                      " lower limit was found and no 'low' argument was given."
                      " One or the other must be specified.")

        code = "driver.add_parameter('comp.x2d', low=-10)"
        assert_raises(self, code, globals(), locals(), ValueError,
                      "driver: Trying to add parameter 'comp.x2d', but no"
                      " upper limit was found and no 'high' argument was given."
                      " One or the other must be specified.")

        driver.add_parameter('comp.x2d', low=-10, high=10, start=2)
        top.run()

        comp.x1d = [1, 2, 3]
        comp.x2d = [[1, 2, 3], [4, 5, 6]]

        targets = driver.list_param_targets()
        self.assertEqual(targets, ['comp.x1d', 'comp.x2d'])

        targets = driver.list_param_group_targets()
        self.assertEqual(targets, [('comp.x1d',), ('comp.x2d',)])

        self.assertEqual(list(comp.x1d), [1, 2, 3])
        self.assertEqual([list(row) for row in comp.x2d[:]],
                         [[1, 2, 3], [4, 5, 6]])

        driver.init_parameters()
        var = driver.workflow._system.vec['u']['comp.x1d']
        self.assertEqual(list(var), [1, 1, 1])
        var = driver.workflow._system.vec['u']['comp.x2d']
        self.assertEqual(list(var), [2, 2, 2, 2, 2, 2])

        driver.set_parameter_by_name('comp.x1d', 3)
        var = driver.workflow._system.vec['u']['comp.x1d']
        self.assertEqual(list(var), [3, 3, 3])

        driver.set_parameter_by_name('comp.x1d', array([4, 5, 6]))
        var = driver.workflow._system.vec['u']['comp.x1d']
        self.assertEqual(list(var), [4, 5, 6])

        driver.set_parameter_by_name('comp.x2d', 4)
        var = driver.workflow._system.vec['u']['comp.x2d']
        self.assertEqual(list(var), [4, 4, 4, 4, 4, 4])

        driver.set_parameter_by_name('comp.x2d', array([[5, 6, 7], [8, 9, 0]]))
        var = driver.workflow._system.vec['u']['comp.x2d']
        self.assertEqual(list(var), [5, 6, 7, 8, 9, 0])

        driver.set_parameters([7, 8, 9, 1, 2, 3, 4, 5, 6])
        var = driver.workflow._system.vec['u']['comp.x1d']
        self.assertEqual(list(var), [7, 8, 9])
        var = driver.workflow._system.vec['u']['comp.x2d']
        self.assertEqual(list(var), [1, 2, 3, 4, 5, 6])

        self.assertEqual(driver._hasparameters.get_expr_depends(),
                         [('driver', 'comp')])
        self.assertEqual(driver._hasparameters.get_referenced_compnames(),
                         set(['comp']))
        self.assertEqual(driver._hasparameters.get_referenced_varpaths(),
                         set(['comp.x1d', 'comp.x2d']))

        # Still have last set_parameters() values.
        var = driver.workflow._system.vec['u']['comp.x1d']
        self.assertEqual(list(var), [7, 8, 9])
        var = driver.workflow._system.vec['u']['comp.x2d']
        self.assertEqual(list(var), [1, 2, 3, 4, 5, 6])

        top.run()
        # Now have init_parameters() values.
        var = driver.workflow._system.vec['u']['comp.x1d']
        self.assertEqual(list(var), [1, 1, 1])
        var = driver.workflow._system.vec['u']['comp.x2d']
        self.assertEqual(list(var), [2, 2, 2, 2, 2, 2])

    def test_mixed_use(self):
        # Connect to one element of array and use another element as parameter.
        self.top.comp.x1d = [1., 2., 3.]
        self.top.add('exec_comp', ExecComp(exprs=['c=x+y', 'd=x-y']))
        self.top.driver.workflow.add('exec_comp')
        self.top.connect('exec_comp.c', 'comp.x1d[0]')
        self.top.driver.add_parameter('comp.x1d[1]', low=-10, high=10, start=1.)
        self.top.run()

    def test_set_boundary_params(self):
        self.top = set_as_top(Assembly())
        self.top.add('driver', MyDriver())

        class ArrayComp2(Component):

            x = Array([0.0, 0.0], iotype='in')
            y = Array([0.0, 0.0], iotype='in')
            c = Array([0.0, 0.0], iotype='out')

            def execute(self):
                self.c = self.x + self.y

        self.top.add('comp', ArrayComp2())
        self.top.driver.workflow.add('comp')
        self.top.create_passthrough('comp.x')
        self.top.create_passthrough('comp.c')
        self.top.connect('x', 'comp.y')

        self.top.driver.add_parameter(('x'), low=0., high=1e99)
        self.top.x = [22.0, 31.1]
        self.top.run()
        self.assertEqual(self.top.x[0], 22.)
        self.assertEqual(self.top.x[1], 31.1)
        self.assertEqual(self.top.comp.y[0], 22.)
        self.assertEqual(self.top.comp.y[1], 31.1)
Пример #5
0
class ArrayTest(unittest.TestCase):
    def setUp(self):
        self.top = Assembly()
        self.top.add('driver', MyDriver())
        self.top.add('comp', ArrayComp())
        self.top.driver.workflow.add('comp')

    def test_basic(self):
        top = self.top
        comp = top.comp
        driver = top.driver

        comp.x1d = [1, 2, 3]
        comp.x2d = [[1, 2, 3], [4, 5, 6]]
        top.run()
        self.assertEqual(comp.fx1d, 6.)
        self.assertEqual(list(comp.fx2d), [6., 15.])

        code = "driver.add_parameter('comp.x1d')"
        assert_raises(
            self, code, globals(), locals(), ValueError,
            "driver: Trying to add parameter 'comp.x1d', but no"
            " lower limit was found and no 'low' argument was given."
            " One or the other must be specified.")

        code = "driver.add_parameter('comp.x1d', low=-10)"
        assert_raises(
            self, code, globals(), locals(), ValueError,
            "driver: Trying to add parameter 'comp.x1d', but no"
            " upper limit was found and no 'high' argument was given."
            " One or the other must be specified.")

        driver.add_parameter('comp.x1d', low=-10, high=10, start=1)

        code = "driver.add_parameter('comp.x2d')"
        assert_raises(
            self, code, globals(), locals(), ValueError,
            "driver: Trying to add parameter 'comp.x2d', but no"
            " lower limit was found and no 'low' argument was given."
            " One or the other must be specified.")

        code = "driver.add_parameter('comp.x2d', low=-10)"
        assert_raises(
            self, code, globals(), locals(), ValueError,
            "driver: Trying to add parameter 'comp.x2d', but no"
            " upper limit was found and no 'high' argument was given."
            " One or the other must be specified.")

        driver.add_parameter('comp.x2d', low=-10, high=10, start=2)
        top.run()

        comp.x1d = [1, 2, 3]
        comp.x2d = [[1, 2, 3], [4, 5, 6]]

        targets = driver.list_param_targets()
        self.assertEqual(targets, ['comp.x1d', 'comp.x2d'])

        targets = driver.list_param_group_targets()
        self.assertEqual(targets, [('comp.x1d', ), ('comp.x2d', )])

        self.assertEqual(list(comp.x1d), [1, 2, 3])
        self.assertEqual([list(row) for row in comp.x2d[:]],
                         [[1, 2, 3], [4, 5, 6]])

        driver.init_parameters()
        var = driver.workflow._system.vec['u']['comp.x1d']
        self.assertEqual(list(var), [1, 1, 1])
        var = driver.workflow._system.vec['u']['comp.x2d']
        self.assertEqual(list(var), [2, 2, 2, 2, 2, 2])

        driver.set_parameter_by_name('comp.x1d', 3)
        var = driver.workflow._system.vec['u']['comp.x1d']
        self.assertEqual(list(var), [3, 3, 3])

        driver.set_parameter_by_name('comp.x1d', array([4, 5, 6]))
        var = driver.workflow._system.vec['u']['comp.x1d']
        self.assertEqual(list(var), [4, 5, 6])

        driver.set_parameter_by_name('comp.x2d', 4)
        var = driver.workflow._system.vec['u']['comp.x2d']
        self.assertEqual(list(var), [4, 4, 4, 4, 4, 4])

        driver.set_parameter_by_name('comp.x2d', array([[5, 6, 7], [8, 9, 0]]))
        var = driver.workflow._system.vec['u']['comp.x2d']
        self.assertEqual(list(var), [5, 6, 7, 8, 9, 0])

        driver.set_parameters([7, 8, 9, 1, 2, 3, 4, 5, 6])
        var = driver.workflow._system.vec['u']['comp.x1d']
        self.assertEqual(list(var), [7, 8, 9])
        var = driver.workflow._system.vec['u']['comp.x2d']
        self.assertEqual(list(var), [1, 2, 3, 4, 5, 6])

        self.assertEqual(driver._hasparameters.get_expr_depends(),
                         [('driver', 'comp')])
        self.assertEqual(driver._hasparameters.get_referenced_compnames(),
                         set(['comp']))
        self.assertEqual(driver._hasparameters.get_referenced_varpaths(),
                         set(['comp.x1d', 'comp.x2d']))

        # Still have last set_parameters() values.
        var = driver.workflow._system.vec['u']['comp.x1d']
        self.assertEqual(list(var), [7, 8, 9])
        var = driver.workflow._system.vec['u']['comp.x2d']
        self.assertEqual(list(var), [1, 2, 3, 4, 5, 6])

        top.run()
        # Now have init_parameters() values.
        var = driver.workflow._system.vec['u']['comp.x1d']
        self.assertEqual(list(var), [1, 1, 1])
        var = driver.workflow._system.vec['u']['comp.x2d']
        self.assertEqual(list(var), [2, 2, 2, 2, 2, 2])

    def test_mixed_use(self):
        # Connect to one element of array and use another element as parameter.
        self.top.comp.x1d = [1., 2., 3.]
        self.top.add('exec_comp', ExecComp(exprs=['c=x+y', 'd=x-y']))
        self.top.driver.workflow.add('exec_comp')
        self.top.connect('exec_comp.c', 'comp.x1d[0]')
        self.top.driver.add_parameter('comp.x1d[1]',
                                      low=-10,
                                      high=10,
                                      start=1.)
        self.top.run()

    def test_set_boundary_params(self):
        self.top = set_as_top(Assembly())
        self.top.add('driver', MyDriver())

        class ArrayComp2(Component):

            x = Array([0.0, 0.0], iotype='in')
            y = Array([0.0, 0.0], iotype='in')
            c = Array([0.0, 0.0], iotype='out')

            def execute(self):
                self.c = self.x + self.y

        self.top.add('comp', ArrayComp2())
        self.top.driver.workflow.add('comp')
        self.top.create_passthrough('comp.x')
        self.top.create_passthrough('comp.c')
        self.top.connect('x', 'comp.y')

        self.top.driver.add_parameter(('x'), low=0., high=1e99)
        self.top.x = [22.0, 31.1]
        self.top.run()
        self.assertEqual(self.top.x[0], 22.)
        self.assertEqual(self.top.x[1], 31.1)
        self.assertEqual(self.top.comp.y[0], 22.)
        self.assertEqual(self.top.comp.y[1], 31.1)