Exemplo n.º 1
0
        def test_aero_optimization_chord_monotonic(self):
            OAS_prob = OASProblem({
                'type': 'aero',
                'optimize': True,
                'record_db': False,
                'with_viscous': False
            })
            OAS_prob.add_surface({
                'chord_cp': np.random.random(5),
                'num_y': 11,
                'monotonic_con': ['chord'],
                'span_cos_spacing': 0.,
            })

            OAS_prob.add_desvar('wing.chord_cp', lower=0.1, upper=5.)
            OAS_prob.add_desvar('alpha', lower=-10., upper=10.)
            OAS_prob.add_constraint('wing_perf.CL', equals=0.1)
            OAS_prob.add_constraint('wing.S_ref', equals=20)
            OAS_prob.add_constraint('wing.monotonic_chord', upper=0.)
            OAS_prob.add_objective('wing_perf.CD', scaler=1e4)

            OAS_prob.setup()

            OAS_prob.run()
            prob = OAS_prob.prob
            self.assertAlmostEqual(prob['wing_perf.CD'],
                                   0.00057432581266351113,
                                   places=5)
            self.assertAlmostEqual(prob['wing.monotonic_chord'][0],
                                   -1.710374671671999,
                                   places=4)
Exemplo n.º 2
0
        def test_struct_optimization_symmetry_exact(self):
            OAS_prob = OASProblem({
                'type': 'struct',
                'optimize': True,
                'record_db': False
            })
            OAS_prob.add_surface({
                'exact_failure_constraint': True,
                't_over_c': 0.15
            })

            OAS_prob.add_desvar('wing.thickness_cp',
                                lower=0.001,
                                upper=0.25,
                                scaler=1e2)
            OAS_prob.add_constraint('wing.failure', upper=0.)
            OAS_prob.add_constraint('wing.thickness_intersects', upper=0.)
            OAS_prob.add_objective('wing.structural_weight', scaler=1e-3)

            OAS_prob.setup()

            OAS_prob.run()
            prob = OAS_prob.prob
            self.assertAlmostEqual(prob['wing.structural_weight'],
                                   1132.0650209475402,
                                   places=2)
Exemplo n.º 3
0
        def test_aero_optimization_chord_monotonic_no_sym(self):
            OAS_prob = OASProblem({'type' : 'aero',
                                   'optimize' : True,
                                   'record_db' : False,
                                   'symmetry' : False,
                                   'with_viscous' : False})
            OAS_prob.add_surface({
            'chord_cp' : np.random.random(5),
            'num_y' : 11,
            'monotonic_con' : ['chord'],
            'span_cos_spacing' : 0.,
            })

            OAS_prob.add_desvar('wing.chord_cp', lower=0.1, upper=5.)
            OAS_prob.add_desvar('alpha', lower=-10., upper=10.)
            OAS_prob.add_constraint('wing_perf.CL', equals=0.1)
            OAS_prob.add_constraint('wing.S_ref', equals=20)
            OAS_prob.add_constraint('wing.monotonic_chord', upper=0.)
            OAS_prob.add_objective('wing_perf.CD', scaler=1e4)

            OAS_prob.setup()

            OAS_prob.run()
            prob = OAS_prob.prob
            self.assertAlmostEqual(prob['wing_perf.CD'], 0.00057432581266351113, places=5)
            self.assertAlmostEqual(prob['wing.monotonic_chord'][0], -1.710374671671999, places=2)
Exemplo n.º 4
0
def OAS_setup(user_prob_dict={}, user_surf_list=[]):

    # default prob_dict and surf_dict's from run_aerostruct.py
    default_prob_dict = _get_default_prob_dict()
    default_prob_dict.update(user_prob_dict)
    prob_dict = default_prob_dict

    # remove 'des_vars', 'contraints', and 'objectives' entries from prob_dict
    # so it doesn't potentially conflict with OASProblem object
    des_vars = prob_dict.pop('des_vars', [])
    constraints = prob_dict.pop('constraints', [])
    objectives = prob_dict.pop('objectives', [])

    if user_surf_list:
        # replace default_surf_list if user supplied one
        surf_list = user_surf_list
    else:
        surf_list = _get_default_surf_list()

    # when wrapping from Matlab, an array of a single value will always be
    # converted to a float in Python and not an iterable, which causes problems.
    iterable_vars = [
        'chord_cp', 'thickness_cp', 'radius_cp', 'twist_cp', 'xshear_cp',
        'yshear_cp', 'zshear_cp'
    ]
    for surf in surf_list:
        for key, val in iteritems(surf):
            if (key in iterable_vars) and (not hasattr(val, '__iter__')):
                surf[key] = np.array([val])  # make an ndarray from list

    # Create OASProblem object
    OASprob = OASProblem(prob_dict)

    # Add surfaces to OASProblem
    for surf in surf_list:
        OASprob.add_surface(surf)

    # Add design variables to OASProblem
    for var_tuple in des_vars:
        OASprob.add_desvar(var_tuple[0], **var_tuple[1])

    # Add constraints to OASProblem
    for var_tuple in constraints:
        OASprob.add_constraint(var_tuple[0], **var_tuple[1])

    # Add objectives to OASProblem
    for var_tuple in objectives:
        OASprob.add_objective(var_tuple[0], **var_tuple[1])

    # setup OpenMDAO components in OASProblem
    OASprob.setup()

    return OASprob
Exemplo n.º 5
0
        def test_aerostruct_optimization_symmetry_multiple(self):
            OAS_prob = OASProblem({
                'type': 'aerostruct',
                'optimize': True,
                'with_viscous': True,
                'record_db': False
            })
            surf_dict = {
                'name': 'wing',
                'symmetry': True,
                'num_y': 5,
                'num_x': 2,
                'wing_type': 'CRM',
                'CD0': 0.015,
                'num_twist_cp': 2,
                'num_thickness_cp': 2
            }
            OAS_prob.add_surface(surf_dict)
            surf_dict.update({
                'name': 'tail',
                'offset': np.array([10., 0., 10.])
            })
            OAS_prob.add_surface(surf_dict)

            # Add design variables and constraints for both the wing and tail
            OAS_prob.add_desvar('wing.twist_cp', lower=-15., upper=15.)
            OAS_prob.add_desvar('wing.thickness_cp',
                                lower=0.01,
                                upper=0.5,
                                scaler=1e2)
            OAS_prob.add_constraint('wing_perf.failure', upper=0.)
            OAS_prob.add_constraint('wing_perf.thickness_intersects', upper=0.)
            OAS_prob.add_desvar('tail.twist_cp', lower=-15., upper=15.)
            OAS_prob.add_desvar('tail.thickness_cp',
                                lower=0.01,
                                upper=0.5,
                                scaler=1e2)
            OAS_prob.add_constraint('tail_perf.failure', upper=0.)
            OAS_prob.add_constraint('tail_perf.thickness_intersects', upper=0.)

            OAS_prob.add_desvar('alpha', lower=-10., upper=10.)
            OAS_prob.add_constraint('L_equals_W', equals=0.)
            OAS_prob.add_objective('fuelburn', scaler=1e-5)

            OAS_prob.setup()

            OAS_prob.run()
            prob = OAS_prob.prob

            self.assertAlmostEqual(prob['fuelburn'],
                                   171166.87568490615,
                                   places=1)
            self.assertAlmostEqual(prob['wing_perf.failure'], 0, places=5)
Exemplo n.º 6
0
def OAS_setup(user_prob_dict={}, user_surf_list=[]):

    # default prob_dict and surf_dict's from run_aerostruct.py
    default_prob_dict = _get_default_prob_dict()
    default_prob_dict.update(user_prob_dict)
    prob_dict = default_prob_dict

    # remove 'des_vars', 'contraints', and 'objectives' entries from prob_dict
    # so it doesn't potentially conflict with OASProblem object
    des_vars = prob_dict.pop('des_vars', [])
    constraints = prob_dict.pop('constraints', [])
    objectives = prob_dict.pop('objectives', [])

    if user_surf_list:
        # replace default_surf_list if user supplied one
        surf_list = user_surf_list
    else:
        surf_list = _get_default_surf_list()


    # when wrapping from Matlab, an array of a single value will always be
    # converted to a float in Python and not an iterable, which causes problems.
    iterable_vars = ['chord_cp','thickness_cp','radius_cp','twist_cp',
                    'xshear_cp','yshear_cp','zshear_cp']
    for surf in surf_list:
    	for key, val in iteritems(surf):
            if (key in iterable_vars) and (not hasattr(val,'__iter__')):
		        surf[key] = np.array([val])  # make an ndarray from list

    # Create OASProblem object
    OASprob = OASProblem(prob_dict)

    # Add surfaces to OASProblem
    for surf in surf_list:
        OASprob.add_surface(surf)

    # Add design variables to OASProblem
    for var_tuple in des_vars:
        OASprob.add_desvar(var_tuple[0], **var_tuple[1])

    # Add constraints to OASProblem
    for var_tuple in constraints:
        OASprob.add_constraint(var_tuple[0], **var_tuple[1])

    # Add objectives to OASProblem
    for var_tuple in objectives:
        OASprob.add_objective(var_tuple[0], **var_tuple[1])

    # setup OpenMDAO components in OASProblem
    OASprob.setup()

    return OASprob
Exemplo n.º 7
0
        def test_aero_multiple_opt(self):
            OAS_prob = OASProblem({'type' : 'aero',
                                   'optimize' : True,
                                   'record_db' : False})
            surf_dict = { 'name' : 'wing',
                          'span' : 5.,
                          'num_y' : 3,
                          'span_cos_spacing' : 0.}
            OAS_prob.add_surface(surf_dict)
            surf_dict.update({'name' : 'tail',
                           'offset' : np.array([0., 0., 10.])})
            OAS_prob.add_surface(surf_dict)

            OAS_prob.add_desvar('tail.twist_cp', lower=-10., upper=15.)
            OAS_prob.add_desvar('tail.sweep', lower=10., upper=30.)
            OAS_prob.add_desvar('tail.dihedral', lower=-10., upper=20.)
            OAS_prob.add_desvar('tail.taper', lower=.5, upper=2.)
            OAS_prob.add_constraint('tail_perf.CL', equals=0.5)
            OAS_prob.add_objective('tail_perf.CD', scaler=1e4)

            OAS_prob.setup()

            OAS_prob.run()
            prob = OAS_prob.prob
            self.assertAlmostEqual(prob['wing_perf.CL'], 0.41532382375677429, places=4)
            self.assertAlmostEqual(prob['tail_perf.CL'], .5, places=5)
            self.assertAlmostEqual(prob['wing_perf.CD'], .0075400306289957033, places=5)
            self.assertAlmostEqual(prob['tail_perf.CD'], 0.008087914662238814, places=5)
Exemplo n.º 8
0
        def test_aero_multiple_opt(self):
            OAS_prob = OASProblem({'type' : 'aero',
                                   'optimize' : True,
                                   'record_db' : False})
            surf_dict = { 'name' : 'wing',
                          'span' : 5.,
                          'num_y' : 3,
                          'span_cos_spacing' : 0.}
            OAS_prob.add_surface(surf_dict)
            surf_dict.update({'name' : 'tail',
                           'offset' : np.array([0., 0., 10.])})
            OAS_prob.add_surface(surf_dict)

            OAS_prob.add_desvar('tail.twist_cp', lower=-10., upper=15.)
            OAS_prob.add_desvar('tail.sweep', lower=10., upper=30.)
            OAS_prob.add_desvar('tail.dihedral', lower=-10., upper=20.)
            OAS_prob.add_desvar('tail.taper', lower=.5, upper=2.)
            OAS_prob.add_constraint('tail_perf.CL', equals=0.5)
            OAS_prob.add_objective('tail_perf.CD', scaler=1e4)

            OAS_prob.setup()

            OAS_prob.run()
            prob = OAS_prob.prob
            self.assertAlmostEqual(prob['wing_perf.CL'], 0.41532382375677429, places=4)
            self.assertAlmostEqual(prob['tail_perf.CL'], .5, places=5)
            self.assertAlmostEqual(prob['wing_perf.CD'], .0075400306289957033, places=5)
            self.assertAlmostEqual(prob['tail_perf.CD'], 0.008087914662238814, places=5)
Exemplo n.º 9
0
        def test_aero_optimization_fd(self):
            # Need to use SLSQP here because SNOPT finds a different optimum
            OAS_prob = OASProblem({
                'type': 'aero',
                'optimize': True,
                'record_db': False,
                'optimizer': 'SLSQP',
                'force_fd': True
            })
            OAS_prob.add_surface()

            OAS_prob.add_desvar('wing.twist_cp', lower=-10., upper=15.)
            OAS_prob.add_desvar('wing.sweep', lower=10., upper=30.)
            OAS_prob.add_desvar('wing.dihedral', lower=-10., upper=20.)
            OAS_prob.add_desvar('wing.taper', lower=.5, upper=2.)
            OAS_prob.add_constraint('wing_perf.CL', equals=0.5)
            OAS_prob.add_objective('wing_perf.CD', scaler=1e4)

            OAS_prob.setup()

            OAS_prob.run()
            prob = OAS_prob.prob
            self.assertAlmostEqual(prob['wing_perf.CD'],
                                   0.0038513637269919619,
                                   places=5)
Exemplo n.º 10
0
    def test_struct_optimization_symmetry(self):
        OAS_prob = OASProblem({'type' : 'struct',
                               'optimize' : True,
                               'record_db' : False})
        OAS_prob.add_surface({'t_over_c': 0.15})

        OAS_prob.add_desvar('wing.thickness_cp', lower=0.001, upper=0.25, scaler=1e2)
        OAS_prob.add_constraint('wing.failure', upper=0.)
        OAS_prob.add_constraint('wing.thickness_intersects', upper=0.)
        OAS_prob.add_objective('wing.structural_weight', scaler=1e-3)

        OAS_prob.setup()

        OAS_prob.run()
        prob = OAS_prob.prob
        self.assertAlmostEqual(prob['wing.structural_weight'], 1144.8503583047038, places=2)
Exemplo n.º 11
0
        def test_aero_viscous_chord_optimization(self):
            # Need to use SLSQP here because SNOPT finds a different optimum
            OAS_prob = OASProblem({'type' : 'aero',
                                   'optimize' : True,
                                   'record_db' : False,
                                   'optimizer' : 'SLSQP',
                                   'with_viscous' : True})
            OAS_prob.add_surface()

            OAS_prob.add_desvar('wing.chord_cp', lower=0.1, upper=3.)
            OAS_prob.add_desvar('alpha', lower=-10., upper=10.)
            OAS_prob.add_constraint('wing_perf.CL', equals=0.5)
            OAS_prob.add_constraint('wing.S_ref', equals=20)
            OAS_prob.add_objective('wing_perf.CD', scaler=1e4)

            OAS_prob.setup()

            OAS_prob.run()
            prob = OAS_prob.prob
            self.assertAlmostEqual(prob['wing_perf.CD'], 0.023570021288019886, places=5)
Exemplo n.º 12
0
        def test_aero_viscous_chord_optimization(self):
            # Need to use SLSQP here because SNOPT finds a different optimum
            OAS_prob = OASProblem({'type' : 'aero',
                                   'optimize' : True,
                                   'record_db' : False,
                                   'optimizer' : 'SLSQP',
                                   'with_viscous' : True})
            OAS_prob.add_surface()

            OAS_prob.add_desvar('wing.chord_cp', lower=0.1, upper=3.)
            OAS_prob.add_desvar('alpha', lower=-10., upper=10.)
            OAS_prob.add_constraint('wing_perf.CL', equals=0.5)
            OAS_prob.add_constraint('wing.S_ref', equals=20)
            OAS_prob.add_objective('wing_perf.CD', scaler=1e4)

            OAS_prob.setup()

            OAS_prob.run()
            prob = OAS_prob.prob
            self.assertAlmostEqual(prob['wing_perf.CD'], 0.023570021288019886, places=5)
Exemplo n.º 13
0
        def test_aerostruct_optimization_symmetry(self):
            OAS_prob = OASProblem({'type' : 'aerostruct',
                                   'optimize' : True,
                                   'with_viscous' : True,
                                   'record_db' : False})
            surf_dict = {'symmetry' : True,
                      'num_y' : 7,
                      'num_x' : 3,
                      'wing_type' : 'CRM',
                      'CD0' : 0.015,
                      'num_twist_cp' : 2,
                      'num_thickness_cp' : 2}
            OAS_prob.add_surface(surf_dict)

            OAS_prob.add_desvar('wing.twist_cp', lower=-15., upper=15.)
            OAS_prob.add_desvar('wing.thickness_cp', lower=0.01, upper=0.5, scaler=1e2)
            OAS_prob.add_constraint('wing_perf.failure', upper=0.)
            OAS_prob.add_constraint('wing_perf.thickness_intersects', upper=0.)
            OAS_prob.add_desvar('alpha', lower=-10., upper=10.)
            OAS_prob.add_constraint('L_equals_W', equals=0.)
            OAS_prob.add_objective('fuelburn', scaler=1e-4)

            OAS_prob.setup()

            OAS_prob.run()
            prob = OAS_prob.prob

            self.assertAlmostEqual(prob['fuelburn'], 96077.224922178371, places=0)
            self.assertAlmostEqual(prob['wing_perf.failure'], 0, places=5)
Exemplo n.º 14
0
        def test_aerostruct_optimization_symmetry(self):
            OAS_prob = OASProblem({'type' : 'aerostruct',
                                   'optimize' : True,
                                   'with_viscous' : True,
                                   'record_db' : False})
            surf_dict = {'symmetry' : True,
                      'num_y' : 7,
                      'num_x' : 3,
                      'wing_type' : 'CRM',
                      'CD0' : 0.015,
                      'num_twist_cp' : 2,
                      'num_thickness_cp' : 2}
            OAS_prob.add_surface(surf_dict)

            OAS_prob.add_desvar('wing.twist_cp', lower=-15., upper=15.)
            OAS_prob.add_desvar('wing.thickness_cp', lower=0.01, upper=0.5, scaler=1e2)
            OAS_prob.add_constraint('wing_perf.failure', upper=0.)
            OAS_prob.add_constraint('wing_perf.thickness_intersects', upper=0.)
            OAS_prob.add_desvar('alpha', lower=-10., upper=10.)
            OAS_prob.add_constraint('L_equals_W', equals=0.)
            OAS_prob.add_objective('fuelburn', scaler=1e-4)

            OAS_prob.setup()

            OAS_prob.run()
            prob = OAS_prob.prob

            self.assertAlmostEqual(prob['fuelburn'], 96074.934265520889, places=0)
            self.assertAlmostEqual(prob['wing_perf.failure'], 0, places=5)
Exemplo n.º 15
0
        def test_aerostruct_optimization_symmetry_multiple(self):
            OAS_prob = OASProblem({'type' : 'aerostruct',
                                   'optimize' : True,
                                   'with_viscous' : True,
                                   'record_db' : False})
            surf_dict = {'name' : 'wing',
                         'symmetry' : True,
                         'num_y' : 5,
                         'num_x' : 2,
                         'wing_type' : 'CRM',
                         'CD0' : 0.015,
                         'num_twist_cp' : 2,
                         'num_thickness_cp' : 2}
            OAS_prob.add_surface(surf_dict)
            surf_dict.update({'name' : 'tail',
                              'offset':np.array([10., 0., 10.])})
            OAS_prob.add_surface(surf_dict)

            # Add design variables and constraints for both the wing and tail
            OAS_prob.add_desvar('wing.twist_cp', lower=-15., upper=15.)
            OAS_prob.add_desvar('wing.thickness_cp', lower=0.01, upper=0.5, scaler=1e2)
            OAS_prob.add_constraint('wing_perf.failure', upper=0.)
            OAS_prob.add_constraint('wing_perf.thickness_intersects', upper=0.)
            OAS_prob.add_desvar('tail.twist_cp', lower=-15., upper=15.)
            OAS_prob.add_desvar('tail.thickness_cp', lower=0.01, upper=0.5, scaler=1e2)
            OAS_prob.add_constraint('tail_perf.failure', upper=0.)
            OAS_prob.add_constraint('tail_perf.thickness_intersects', upper=0.)

            OAS_prob.add_desvar('alpha', lower=-10., upper=10.)
            OAS_prob.add_constraint('L_equals_W', equals=0.)
            OAS_prob.add_objective('fuelburn', scaler=1e-5)

            OAS_prob.setup()

            OAS_prob.run()
            prob = OAS_prob.prob

            self.assertAlmostEqual(prob['fuelburn'], 171166.87568490615, places=1)
            self.assertAlmostEqual(prob['wing_perf.failure'], 0, places=5)
Exemplo n.º 16
0
        def test_aero_optimization_fd(self):
            # Need to use SLSQP here because SNOPT finds a different optimum
            OAS_prob = OASProblem({'type' : 'aero',
                                   'optimize' : True,
                                   'record_db' : False,
                                   'optimizer' : 'SLSQP',
                                   'force_fd' : True})
            OAS_prob.add_surface()

            OAS_prob.add_desvar('wing.twist_cp', lower=-10., upper=15.)
            OAS_prob.add_desvar('wing.sweep', lower=10., upper=30.)
            OAS_prob.add_desvar('wing.dihedral', lower=-10., upper=20.)
            OAS_prob.add_desvar('wing.taper', lower=.5, upper=2.)
            OAS_prob.add_constraint('wing_perf.CL', equals=0.5)
            OAS_prob.add_objective('wing_perf.CD', scaler=1e4)

            OAS_prob.setup()

            OAS_prob.run()
            prob = OAS_prob.prob
            self.assertAlmostEqual(prob['wing_perf.CD'], 0.0038513637269919619, places=5)
Exemplo n.º 17
0
        def test_aero_viscous_optimization(self):
            OAS_prob = OASProblem({'type' : 'aero',
                                   'optimize' : True,
                                   'record_db' : False,
                                   'with_viscous' : True})
            OAS_prob.add_surface()

            OAS_prob.add_desvar('wing.twist_cp', lower=-10., upper=15.)
            OAS_prob.add_desvar('wing.sweep', lower=10., upper=30.)
            OAS_prob.add_desvar('wing.dihedral', lower=-10., upper=20.)
            OAS_prob.add_constraint('wing_perf.CL', equals=0.5)
            OAS_prob.add_objective('wing_perf.CD', scaler=1e4)

            OAS_prob.setup()

            OAS_prob.run()
            prob = OAS_prob.prob
            self.assertAlmostEqual(prob['wing_perf.CD'], 0.019234984422361764, places=5)
Exemplo n.º 18
0
        def test_aero_viscous_optimization(self):
            OAS_prob = OASProblem({'type' : 'aero',
                                   'optimize' : True,
                                   'record_db' : False,
                                   'with_viscous' : True})
            OAS_prob.add_surface()

            OAS_prob.add_desvar('wing.twist_cp', lower=-10., upper=15.)
            OAS_prob.add_desvar('wing.sweep', lower=10., upper=30.)
            OAS_prob.add_desvar('wing.dihedral', lower=-10., upper=20.)
            OAS_prob.add_constraint('wing_perf.CL', equals=0.5)
            OAS_prob.add_objective('wing_perf.CD', scaler=1e4)

            OAS_prob.setup()

            OAS_prob.run()
            prob = OAS_prob.prob
            self.assertAlmostEqual(prob['wing_perf.CD'], 0.019234984422361764, places=5)
Exemplo n.º 19
0
def driver(X):

    assert len(
        X[0]) == (2 * N_CP +
                  6), "Found dimension %d, expected %d" % (len(X[0]),
                                                           (2 * N_CP + 6))

    # Set problem type
    prob_dict = {
        'type': 'aerostruct',
        'optimize': False,  # Don't optimize, only perform analysis
        'record_db': False,
        'W0':
        1000.,  # OEW of the aircraft without fuel and the structural weight, in kg
    }

    # Instantiate problem and add default surface
    with silence_stdout():
        oas_prob = OASProblem(prob_dict)

    # Create a dictionary to store options about the surface.
    # Here we have 3 twist control points and 3 thickness control points.
    # We also set the discretization, span, and panel spacing.
    surf_dict = {
        'name': 'wing',
        'symmetry': True,
        'num_y': 7,
        'num_x': 2,
        'span': 10.,
        'num_twist_cp': N_CP,
        'num_thickness_cp': N_CP,
        'num_chord_cp': 2,
        'wing_type': 'rect',
        'span_cos_spacing': 0.,
    }

    # Add the specified wing surface to the problem
    with silence_stdout():
        oas_prob.add_surface(surf_dict)

    # Set up the problem. Once we have this done, we can modify the internal
    # unknowns and run the multidisciplinary analysis at that design point.
    oas_prob.add_desvar('wing.twist_cp')
    oas_prob.add_desvar('wing.thickness_cp')
    oas_prob.add_desvar('wing.chord_cp')
    oas_prob.setup(out_stream=null_stream)

    Y = np.zeros((X.shape[0], 5))
    for i, x in enumerate(tqdm(X)):
        twist_cp = x[:N_CP]
        thickness_cp = x[N_CP:2 * N_CP]
        root_chord = x[2 * N_CP]
        taper_ratio = x[2 * N_CP + 1]
        alpha = x[2 * N_CP + 2]
        E = x[2 * N_CP + 3]
        G = x[2 * N_CP + 4]
        mrho = x[2 * N_CP + 5]

        oas_prob.surfaces[0]['E'] = E
        oas_prob.surfaces[0]['G'] = G
        oas_prob.surfaces[0]['mrho'] = mrho
        with silence_stdout():
            oas_prob.setup(out_stream=null_stream)

        # set design variables
        oas_prob.prob['alpha'] = alpha
        oas_prob.prob['wing.twist_cp'] = twist_cp
        oas_prob.prob['wing.thickness_cp'] = thickness_cp
        oas_prob.prob['wing.chord_cp'] = np.array([taper_ratio, 1.
                                                   ]) * root_chord

        with silence_stdout():
            oas_prob.run()

        Y[i, 0] = oas_prob.prob['fuelburn']
        Y[i, 1] = oas_prob.prob['wing_perf.structural_weight']
        Y[i, 2] = oas_prob.prob['wing_perf.L']
        Y[i, 3] = oas_prob.prob['total_weight']
        Y[i, 4] = oas_prob.prob['wing_perf.failure']

    return Y
Exemplo n.º 20
0
        'fem_origin': 0.4,
        'exact_failure_constraint': False,  # if false, use KS function
        'monotonic_con': None,
        'sweep': 1. * sweep_deg
    }

    # Add the specified wing surface to the problem
    OAS_prob.add_surface(surf_dict)

    # Add design variables, constraint, and objective on the problem
    # OAS_prob.add_desvar('alpha', lower=-10., upper=10.)
    OAS_prob.add_constraint('L_equals_W', equals=0.)
    OAS_prob.add_objective('fuelburn', scaler=1e-5)

    # Setup problem and add design variables, constraint, and objective
    OAS_prob.add_desvar('wing.twist_cp', lower=-10., upper=10.)
    OAS_prob.add_desvar('wing.thickness_cp',
                        lower=0.002,
                        upper=0.2,
                        scaler=1e2)
    OAS_prob.add_constraint('wing_perf.failure', upper=0.)
    OAS_prob.add_constraint('wing_perf.thickness_intersects', upper=0.)
    OAS_prob.setup()

    st = time()
    # Actually run the problem
    OAS_prob.run()

    print("\nFuelburn:", OAS_prob.prob['fuelburn'])
    print("Time elapsed: {} secs".format(time() - st))
    print(OAS_prob.prob['wing.thickness_cp'])
Exemplo n.º 21
0
    OAS_prob = OASProblem(prob_dict)

    # Create a dictionary to store options about the surface
    surf_dict = {'num_y' : 7,
                 'num_x' : 2,
                 'wing_type' : 'CRM',
                 'CD0' : 0.015,
                 'symmetry' : True,
                 'num_twist_cp' : 2,
                 'num_thickness_cp' : 2}

    # Add the specified wing surface to the problem
    OAS_prob.add_surface(surf_dict)

    # Add design variables, constraint, and objective on the problem
    OAS_prob.add_desvar('alpha', lower=-10., upper=10.)
    OAS_prob.add_constraint('L_equals_W', equals=0.)
    OAS_prob.add_objective('fuelburn', scaler=1e-5)

    # Single lifting surface
    if not sys.argv[1].endswith('m'):

        # Setup problem and add design variables, constraint, and objective
        OAS_prob.add_desvar('wing.twist_cp', lower=-15., upper=15.)
        OAS_prob.add_desvar('wing.thickness_cp', lower=0.01, upper=0.5, scaler=1e2)
        OAS_prob.add_constraint('wing_perf.failure', upper=0.)
        OAS_prob.add_constraint('wing_perf.thickness_intersects', upper=0.)
        OAS_prob.setup()

    # Multiple lifting surfaces
    else:
Exemplo n.º 22
0
    surf_dict = {'num_y' : 7,
                 'num_x' : 2,
                 'wing_type' : 'rect',
                 'CD0' : 0.015,
                 'symmetry' : True,
                 'num_twist_cp' : 2,
                 'num_thickness_cp' : 2}

    # Add the specified wing surface to the problem
    OAS_prob.add_surface(surf_dict)

    # Single lifting surface
    if not sys.argv[1].endswith('m'):

        # Setup problem and add design variables, constraint, and objective
        OAS_prob.add_desvar('wing.twist_cp', lower=-10., upper=15.)
        OAS_prob.add_desvar('wing.sweep', lower=10., upper=30.)
        OAS_prob.add_desvar('wing.dihedral', lower=-10., upper=20.)
        OAS_prob.add_desvar('wing.taper', lower=.5, upper=2.)
        OAS_prob.add_constraint('wing_perf.CL', equals=0.5)
        OAS_prob.add_objective('wing_perf.CD', scaler=1e4)
        OAS_prob.setup()

    # Multiple lifting surfaces
    else:

        # Add additional lifting surface
        OAS_prob.add_surface({'name' : 'tail',
                              'span' : 3.,
                              'num_y' : 7,
                              'span_cos_spacing' : .5,
Exemplo n.º 23
0
    # Material properties taken from http://www.performance-composites.com/carbonfibre/mechanicalproperties_2.asp
    'E': 85.e9,
    'G': 25.e9,
    'yield': 350.e6 / 1.25 / 2.5,
    'mrho': 1.6e3,
    'CD0': 0.015,
}

# Add the specified wing surface to the problem
OAS_prob.add_surface(surf_dict)

if prob_type == 'aero':

    # Setup problem and add design variables, constraint, and objective
    # OAS_prob.add_desvar('alpha', lower=-10., upper=15.)
    OAS_prob.add_desvar('wing.twist_cp', lower=-10., upper=15.)

    # OAS_prob.add_desvar('wing.chord_cp', lower=0.5, upper=3.)
    # OAS_prob.add_desvar('wing.xshear_cp', lower=-10., upper=15.)
    # OAS_prob.add_desvar('wing.sweep', lower=-60., upper=60.)
    # OAS_prob.add_desvar('wing.taper', lower=.5, upper=2.)
    OAS_prob.add_constraint('wing_perf.CL', equals=0.6032)
    # OAS_prob.add_constraint('CM', equals=0.)
    OAS_prob.add_objective('wing_perf.CD', scaler=1e3)

else:

    # Add design variables, constraint, and objective on the problem
    # OAS_prob.add_desvar('alpha', lower=-10., upper=10.)
    OAS_prob.add_constraint('L_equals_W', equals=0.)
    OAS_prob.add_objective('fuelburn', scaler=0.1)
Exemplo n.º 24
0
    if sys.argv[1].startswith('0'):  # run analysis once
        prob_dict.update({'optimize': False})
    else:  # perform optimization
        prob_dict.update({'optimize': True})

    # Instantiate problem and add default surface
    OAS_prob = OASProblem(prob_dict)
    OAS_prob.add_surface({'name': 'wing', 'num_y': 11, 'symmetry': True})

    # Single lifting surface
    if not sys.argv[1].endswith('m'):

        # Setup problem and add design variables, constraint, and objective
        OAS_prob.add_desvar('wing.thickness_cp',
                            lower=0.001,
                            upper=0.25,
                            scaler=1e2)
        OAS_prob.add_constraint('wing.thickness_intersects', upper=0.)
        OAS_prob.add_constraint('wing.failure', upper=0.)
        OAS_prob.add_objective('wing.structural_weight', scaler=1e-3)
        OAS_prob.setup()

    # Multiple lifting surfaces
    else:

        # Add additional lifting surface
        OAS_prob.add_surface({
            'name': 'tail',
            'span': 3.,
            'offset': np.array([10., 0., 0.])
        })
Exemplo n.º 25
0
    num_y = 11
    loads = np.zeros(((num_y+1)//2, 6))
    loads[:, 1] = 1e5

    # Instantiate problem and add default surface
    OAS_prob = OASProblem(prob_dict)
    OAS_prob.add_surface({'name' : 'wing',
                          'num_y' : 11,
                          'symmetry' : True,
                          'loads' : loads})

    # Single lifting surface
    if not sys.argv[1].endswith('m'):

        # Setup problem and add design variables, constraint, and objective
        OAS_prob.add_desvar('wing.thickness_cp', lower=0.001, upper=0.25, scaler=1e2)
        OAS_prob.add_constraint('wing.thickness_intersects', upper=0.)
        OAS_prob.add_constraint('wing.failure', upper=0.)
        OAS_prob.add_objective('wing.structural_weight', scaler=1e-3)
        OAS_prob.setup()

    # Multiple lifting surfaces
    else:

        # Add additional lifting surface
        OAS_prob.add_surface({'name' : 'tail',
                              'span' : 3.,
                              'offset' : np.array([10., 0., 0.])})

        OAS_prob.add_desvar('wing.thickness_cp', lower=0.001, upper=0.25, scaler=1e2)
        OAS_prob.add_constraint('wing.thickness_intersects', upper=0.)
Exemplo n.º 26
0
    'num_y': 7,
    'num_x': 2,
    'num_twist_cp': 3,
    'num_thickness_cp': 3,
    'num_chord_cp': 2,
    'wing_type': 'CRM',
    'CD0': 0.015,
    'span_cos_spacing': 0.,
}

# Add the specified wing surface to the problem
OAS_prob.add_surface(surf_dict)

# Set up the problem. Once we have this done, we can modify the internal
# unknowns and run the multidisciplinary analysis at that design point.
OAS_prob.add_desvar('wing.twist_cp')
OAS_prob.add_desvar('wing.thickness_cp')
OAS_prob.add_desvar('wing.chord_cp')


# Define a function that calls the already set-up problem
def run_aerostruct(twist_cp, thickness_cp, alpha, root_chord, taper_ratio, E):
    # If we modify values in the surface dictionary, we need to run setup again
    OAS_prob.surfaces[0]['E'] = E
    OAS_prob.setup()

    OAS_prob.prob['alpha'] = alpha
    OAS_prob.prob['wing.twist_cp'] = twist_cp
    OAS_prob.prob['wing.thickness_cp'] = thickness_cp
    OAS_prob.prob['wing.chord_cp'] = np.array([taper_ratio, 1.]) * root_chord
Exemplo n.º 27
0
    # Create a dictionary to store options about the surface
    surf_dict = {
        'num_y': 5,
        'num_x': 2,
        'wing_type': 'CRM',
        'CD0': 0.015,
        'symmetry': True,
        'num_twist_cp': 3,
        'num_thickness_cp': 3
    }

    # Add the specified wing surface to the problem
    OAS_prob.add_surface(surf_dict)

    # Add design variables, constraint, and objective on the problem
    OAS_prob.add_desvar('alpha', lower=-10., upper=10.)
    OAS_prob.add_constraint('L_equals_W', equals=0.)
    OAS_prob.add_objective('fuelburn', scaler=1e-5)

    # Single lifting surface
    if not sys.argv[1].endswith('m'):

        # Setup problem and add design variables, constraint, and objective
        OAS_prob.add_desvar('wing.twist_cp', lower=-15., upper=15.)
        OAS_prob.add_desvar('wing.thickness_cp',
                            lower=0.01,
                            upper=0.5,
                            scaler=1e2)
        OAS_prob.add_constraint('wing_perf.failure', upper=0.)
        OAS_prob.add_constraint('wing_perf.thickness_intersects', upper=0.)
        OAS_prob.setup()
Exemplo n.º 28
0
        'num_x': 2,
        'wing_type': 'rect',
        'CD0': 0.015,
        'symmetry': True,
        'num_twist_cp': 2,
        'num_thickness_cp': 2
    }

    # Add the specified wing surface to the problem
    OAS_prob.add_surface(surf_dict)

    # Single lifting surface
    if not sys.argv[1].endswith('m'):

        # Setup problem and add design variables, constraint, and objective
        OAS_prob.add_desvar('wing.twist_cp', lower=-10., upper=15.)
        OAS_prob.add_desvar('wing.sweep', lower=10., upper=30.)
        OAS_prob.add_desvar('wing.dihedral', lower=-10., upper=20.)
        OAS_prob.add_desvar('wing.taper', lower=.5, upper=2.)
        OAS_prob.add_constraint('wing_perf.CL', equals=0.5)
        OAS_prob.add_objective('wing_perf.CD', scaler=1e4)
        OAS_prob.setup()

    # Multiple lifting surfaces
    else:

        # Add additional lifting surface
        OAS_prob.add_surface({
            'name': 'tail',
            'span': 3.,
            'num_y': 7,