Ejemplo n.º 1
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)
Ejemplo 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)
Ejemplo n.º 3
0
    def test_aerostruct_analysis(self):
        OAS_prob = OASProblem({
            'type': 'aerostruct',
            'optimize': False,
            'record_db': False
        })
        surf_dict = {
            'num_y': 13,
            'num_x': 2,
            'wing_type': 'CRM',
            'CD0': 0.015,
            'symmetry': False
        }
        OAS_prob.add_surface(surf_dict)
        OAS_prob.setup()
        OAS_prob.run()
        prob = OAS_prob.prob

        self.assertAlmostEqual(prob['wing_perf.CL'],
                               0.6587983088529461,
                               places=5)
        self.assertAlmostEqual(prob['wing_perf.failure'],
                               0.13716279310143381,
                               places=5)
        self.assertAlmostEqual(prob['fuelburn'], 55565.087226705218, places=2)
        self.assertAlmostEqual(prob['CM'][1], -0.18836163204083048, places=2)
Ejemplo n.º 4
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)
Ejemplo n.º 5
0
 def test_aero_analysis_flat_side_by_side(self):
     OAS_prob = OASProblem({
         'type': 'aero',
         'optimize': False,
         'record_db': False
     })
     OAS_prob.add_surface({
         'name': 'wing',
         'span': 5.,
         'num_y': 3,
         'span_cos_spacing': 0.,
         'symmetry': False,
         'offset': np.array([0., -2.5, 0.])
     })
     OAS_prob.add_surface({
         'name': 'tail',
         'span': 5.,
         'num_y': 3,
         'span_cos_spacing': 0.,
         'symmetry': False,
         'offset': np.array([0., 2.5, 0.])
     })
     OAS_prob.setup()
     OAS_prob.run()
     prob = OAS_prob.prob
     self.assertAlmostEqual(prob['wing_perf.CL'],
                            0.46173591841167183,
                            places=5)
     self.assertAlmostEqual(prob['tail_perf.CL'],
                            0.46173591841167183,
                            places=5)
     self.assertAlmostEqual(prob['wing_perf.CD'], .005524603647, places=5)
     self.assertAlmostEqual(prob['tail_perf.CD'], .005524603647, places=5)
Ejemplo n.º 6
0
    def test_aerostruct_analysis(self):
        OAS_prob = OASProblem({
            'type': 'aerostruct',
            'optimize': False,
            'record_db': False
        })
        surf_dict = {
            'num_y': 13,
            'num_x': 2,
            'wing_type': 'CRM',
            'CD0': 0.015,
            'symmetry': False
        }
        OAS_prob.add_surface(surf_dict)
        OAS_prob.setup()
        OAS_prob.run()
        prob = OAS_prob.prob

        self.assertAlmostEqual(prob['wing_perf.CL'],
                               0.45756166834224915,
                               places=5)
        self.assertAlmostEqual(prob['wing_perf.failure'],
                               -0.41828919706776535,
                               places=5)
        self.assertAlmostEqual(prob['fuelburn'], 66894.86498288115, places=2)
        self.assertAlmostEqual(prob['CM'][1], -0.12243137977093457, places=2)
Ejemplo n.º 7
0
    def test_aerostruct_analysis_symmetry(self):
        OAS_prob = OASProblem({
            'type': 'aerostruct',
            'optimize': False,
            'record_db': False
        })
        surf_dict = {
            'symmetry': True,
            'num_y': 13,
            'num_x': 2,
            'wing_type': 'CRM',
            'CD0': 0.015
        }
        OAS_prob.add_surface(surf_dict)
        OAS_prob.setup()
        OAS_prob.run()
        prob = OAS_prob.prob

        self.assertAlmostEqual(prob['wing_perf.CL'],
                               0.49879098021094814,
                               places=5)
        self.assertAlmostEqual(prob['wing_perf.failure'],
                               -0.4358500552830447,
                               places=5)
        self.assertAlmostEqual(prob['fuelburn'], 70951.02191803591, places=1)
        self.assertAlmostEqual(prob['CM'][1], -0.13082531653444995, places=2)
Ejemplo n.º 8
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)
Ejemplo n.º 9
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)
Ejemplo n.º 10
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)
Ejemplo n.º 11
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)
Ejemplo n.º 12
0
    def test_aerostruct_analysis_symmetry(self):
        OAS_prob = OASProblem({
            'type': 'aerostruct',
            'optimize': False,
            'record_db': False
        })
        surf_dict = {
            'symmetry': True,
            'num_y': 13,
            'num_x': 2,
            'wing_type': 'CRM',
            'CD0': 0.015
        }
        OAS_prob.add_surface(surf_dict)
        OAS_prob.setup()
        OAS_prob.run()
        prob = OAS_prob.prob

        self.assertAlmostEqual(prob['wing_perf.CL'],
                               0.69060502679333224,
                               places=5)
        self.assertAlmostEqual(prob['wing_perf.failure'],
                               0.064759950520982532,
                               places=5)
        self.assertAlmostEqual(prob['fuelburn'], 57109.065516474155, places=1)
        self.assertAlmostEqual(prob['CM'][1], -0.19380236992046351, places=2)
Ejemplo n.º 13
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)
Ejemplo n.º 14
0
 def test_aero_analysis_flat_full(self):
     OAS_prob = OASProblem({'type' : 'aero',
                            'optimize' : False,
                            'record_db' : False})
     surf_dict = {'symmetry' : False}
     OAS_prob.add_surface(surf_dict)
     OAS_prob.setup()
     OAS_prob.run()
     prob = OAS_prob.prob
     self.assertAlmostEqual(prob['wing_perf.CL'], .45655138, places=5)
     self.assertAlmostEqual(prob['wing_perf.CD'], 0.0055402121081108589, places=5)
Ejemplo n.º 15
0
 def test_struct_analysis_symmetry(self):
     OAS_prob = OASProblem({'type' : 'struct',
                            'optimize' : False,
                            'record_db' : False})
     surf_dict = {'symmetry' : True,
                 't_over_c' : 0.15}
     OAS_prob.add_surface(surf_dict)
     OAS_prob.setup()
     OAS_prob.run()
     prob = OAS_prob.prob
     self.assertAlmostEqual(prob['wing.structural_weight'], 988.13495481063956, places=3)
Ejemplo n.º 16
0
    def test_aero_analysis_flat(self):
        OAS_prob = OASProblem({'type' : 'aero',
                               'optimize' : False,
                               'record_db' : False})
        OAS_prob.add_surface({'span_cos_spacing' : 0})
        OAS_prob.setup()
        OAS_prob.run()
        prob = OAS_prob.prob

        self.assertAlmostEqual(prob['wing_perf.CL'], .46173591841167, places=5)
        self.assertAlmostEqual(prob['wing_perf.CD'], .005524603647, places=5)
Ejemplo n.º 17
0
 def test_aero_analysis_flat_full(self):
     OAS_prob = OASProblem({'type' : 'aero',
                            'optimize' : False,
                            'record_db' : False})
     surf_dict = {'symmetry' : False}
     OAS_prob.add_surface(surf_dict)
     OAS_prob.setup()
     OAS_prob.run()
     prob = OAS_prob.prob
     self.assertAlmostEqual(prob['wing_perf.CL'], .45655138, places=5)
     self.assertAlmostEqual(prob['wing_perf.CD'], 0.0055402121081108589, places=5)
Ejemplo n.º 18
0
 def test_struct_analysis_symmetry(self):
     OAS_prob = OASProblem({'type' : 'struct',
                            'optimize' : False,
                            'record_db' : False})
     surf_dict = {'symmetry' : True,
                 't_over_c' : 0.15}
     OAS_prob.add_surface(surf_dict)
     OAS_prob.setup()
     OAS_prob.run()
     prob = OAS_prob.prob
     self.assertAlmostEqual(prob['wing.structural_weight'], 988.13495481063956, places=3)
Ejemplo n.º 19
0
    def test_aero_analysis_flat(self):
        OAS_prob = OASProblem({'type' : 'aero',
                               'optimize' : False,
                               'record_db' : False})
        OAS_prob.add_surface({'span_cos_spacing' : 0})
        OAS_prob.setup()
        OAS_prob.run()
        prob = OAS_prob.prob

        self.assertAlmostEqual(prob['wing_perf.CL'], .46173591841167, places=5)
        self.assertAlmostEqual(prob['wing_perf.CD'], .005524603647, places=5)
Ejemplo n.º 20
0
 def test_aero_analysis_flat_viscous_full(self):
     OAS_prob = OASProblem({'type' : 'aero',
                            'optimize' : False,
                            'record_db' : False,
                            'with_viscous' : True})
     surf_dict = {'symmetry' : False}
     OAS_prob.add_surface(surf_dict)
     OAS_prob.setup()
     OAS_prob.run()
     prob = OAS_prob.prob
     self.assertAlmostEqual(prob['wing_perf.CL'], .45655138, places=5)
     self.assertAlmostEqual(prob['wing_perf.CD'], 0.018942466133780547, places=5)
Ejemplo n.º 21
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)
Ejemplo n.º 22
0
 def test_aero_analysis_flat_viscous_full(self):
     OAS_prob = OASProblem({'type' : 'aero',
                            'optimize' : False,
                            'record_db' : False,
                            'with_viscous' : True})
     surf_dict = {'symmetry' : False}
     OAS_prob.add_surface(surf_dict)
     OAS_prob.setup()
     OAS_prob.run()
     prob = OAS_prob.prob
     self.assertAlmostEqual(prob['wing_perf.CL'], .45655138, places=5)
     self.assertAlmostEqual(prob['wing_perf.CD'], 0.018942466133780547, places=5)
Ejemplo n.º 23
0
 def test_aero_analysis_flat_multiple(self):
     OAS_prob = OASProblem({'type' : 'aero',
                            'optimize' : False,
                            'record_db' : False})
     OAS_prob.add_surface({'span_cos_spacing' : 0.})
     OAS_prob.add_surface({'name' : 'tail',
                           'span_cos_spacing' : 0.,
                           'offset' : np.array([0., 0., 1000000.])})
     OAS_prob.setup()
     OAS_prob.run()
     prob = OAS_prob.prob
     self.assertAlmostEqual(prob['wing_perf.CL'], .46173591841167, places=5)
     self.assertAlmostEqual(prob['tail_perf.CL'], .46173591841167, places=5)
Ejemplo n.º 24
0
 def test_aero_analysis_flat_multiple(self):
     OAS_prob = OASProblem({'type' : 'aero',
                            'optimize' : False,
                            'record_db' : False})
     OAS_prob.add_surface({'span_cos_spacing' : 0.})
     OAS_prob.add_surface({'name' : 'tail',
                           'span_cos_spacing' : 0.,
                           'offset' : np.array([0., 0., 1000000.])})
     OAS_prob.setup()
     OAS_prob.run()
     prob = OAS_prob.prob
     self.assertAlmostEqual(prob['wing_perf.CL'], .46173591841167, places=5)
     self.assertAlmostEqual(prob['tail_perf.CL'], .46173591841167, places=5)
Ejemplo n.º 25
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)
Ejemplo n.º 26
0
    def test_aerostruct_analysis_symmetry_deriv(self):
        OAS_prob = OASProblem({
            'type': 'aerostruct',
            'optimize': False,
            'record_db': True
        })
        surf_dict = {
            'symmetry': True,
            'num_y': 7,
            'num_x': 2,
            'wing_type': 'CRM',
            'CD0': 0.015
        }
        OAS_prob.add_surface(surf_dict)
        OAS_prob.setup()
        OAS_prob.run()
        prob = OAS_prob.prob

        data = prob.check_partial_derivatives(out_stream=None)

        new_dict = {}
        for key1 in data.keys():
            for key2 in data[key1].keys():
                for key3 in data[key1][key2].keys():
                    if 'rel' in key3:
                        error = np.linalg.norm(data[key1][key2][key3])
                        new_key = key1 + '_' + key2[0] + '_' + key2[
                            1] + '_' + key3
                        new_dict.update({new_key: error})

        for key in new_dict.keys():
            error = new_dict[key]
            if not np.isnan(error):

                # The FD check is not valid for these cases
                if 'assembly_forces_Iy' in key or 'assembly_forces_J' in key or \
                'assembly_forces_A' in key or 'assembly_K_loads' in key or \
                'assembly_forces_loads' in key or 'assembly_forces_Iz' in key or \
                'assembly_forces_nodes' in key or 'CM_wing_S_ref' in key or \
                'CM_rho' in key:
                    pass
                elif 'K' in key or 'vonmises' in key:
                    self.assertAlmostEqual(0., error, places=0)
                else:
                    self.assertAlmostEqual(0., error, places=2)
Ejemplo n.º 27
0
    def test_aerostruct_analysis_symmetry(self):
        OAS_prob = OASProblem({'type' : 'aerostruct',
                               'optimize' : False,
                               'record_db' : False})
        surf_dict = {'symmetry' : True,
                  'num_y' : 13,
                  'num_x' : 2,
                  'wing_type' : 'CRM',
                  'CD0' : 0.015}
        OAS_prob.add_surface(surf_dict)
        OAS_prob.setup()
        OAS_prob.run()
        prob = OAS_prob.prob

        self.assertAlmostEqual(prob['wing_perf.CL'], 0.69060502679333224, places=5)
        self.assertAlmostEqual(prob['wing_perf.failure'], 0.064759950520982532, places=5)
        self.assertAlmostEqual(prob['fuelburn'], 57109.065516474155, places=1)
        self.assertAlmostEqual(prob['CM'][1], -0.19380236992046351, places=2)
Ejemplo n.º 28
0
    def test_aerostruct_analysis(self):
        OAS_prob = OASProblem({'type' : 'aerostruct',
                               'optimize' : False,
                               'record_db' : False})
        surf_dict = {'num_y' : 13,
                  'num_x' : 2,
                  'wing_type' : 'CRM',
                  'CD0' : 0.015,
                  'symmetry' : False}
        OAS_prob.add_surface(surf_dict)
        OAS_prob.setup()
        OAS_prob.run()
        prob = OAS_prob.prob

        self.assertAlmostEqual(prob['wing_perf.CL'], 0.6587983088529461, places=5)
        self.assertAlmostEqual(prob['wing_perf.failure'], 0.13716279310143381, places=5)
        self.assertAlmostEqual(prob['fuelburn'], 55565.087226705218, places=2)
        self.assertAlmostEqual(prob['CM'][1], -0.18836163204083048, places=2)
Ejemplo n.º 29
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)
Ejemplo n.º 30
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)
Ejemplo n.º 31
0
        def test_aero_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'})
            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.0049392534859265614, places=5)
Ejemplo n.º 32
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)
Ejemplo n.º 33
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)
Ejemplo n.º 34
0
    def test_aerostruct_analysis_symmetry_deriv(self):
        OAS_prob = OASProblem({'type' : 'aerostruct',
                               'optimize' : False,
                               'record_db' : True})
        surf_dict = {'symmetry' : True,
                  'num_y' : 7,
                  'num_x' : 2,
                  'wing_type' : 'CRM',
                  'CD0' : 0.015}
        OAS_prob.add_surface(surf_dict)
        OAS_prob.setup()
        OAS_prob.run()
        prob = OAS_prob.prob

        data = prob.check_partial_derivatives(out_stream=None)

        new_dict = {}
        for key1 in data.keys():
            for key2 in data[key1].keys():
                for key3 in data[key1][key2].keys():
                    if 'rel' in key3:
                        error = np.linalg.norm(data[key1][key2][key3])
                        new_key = key1+'_'+key2[0]+'_'+key2[1]+'_'+key3
                        new_dict.update({new_key : error})

        for key in new_dict.keys():
            error = new_dict[key]
            if not np.isnan(error):

                # The FD check is not valid for these cases
                if 'assembly_forces_Iy' in key or 'assembly_forces_J' in key or \
                'assembly_forces_A' in key or 'assembly_K_loads' in key or \
                'assembly_forces_loads' in key or 'assembly_forces_Iz' in key or \
                'assembly_forces_nodes' in key or 'CM_wing_S_ref' in key or \
                'CM_rho' in key:
                    pass
                elif 'K' in key or 'vonmises' in key:
                    self.assertAlmostEqual(0., error, places=0)
                else:
                    self.assertAlmostEqual(0., error, places=2)
Ejemplo n.º 35
0
 def test_aerostruct_analysis(self):
     OAS_prob = OASProblem({
         'type': 'aerostruct',
         'optimize': False,
         'record_db': False
     })
     surf_dict = {
         'num_y': 13,
         'num_x': 2,
         'wing_type': 'CRM',
         'CD0': 0.015,
         'symmetry': False
     }
     OAS_prob.add_surface(surf_dict)
     OAS_prob.setup()
     OAS_prob.run()
     prob = OAS_prob.prob
     self.assertAlmostEqual(prob['wing_perf.CL'], 0.53470610411546438)
     self.assertAlmostEqual(prob['wing_perf.failure'],
                            -0.88555523062055341,
                            places=5)
     self.assertAlmostEqual(prob['fuelburn'], 99367.43763782426, places=2)
Ejemplo n.º 36
0
 def test_aerostruct_analysis_symmetry(self):
     OAS_prob = OASProblem({
         'type': 'aerostruct',
         'optimize': False,
         'record_db': False
     })
     surf_dict = {
         'symmetry': True,
         'num_y': 13,
         'num_x': 2,
         'wing_type': 'CRM',
         'CD0': 0.015
     }
     OAS_prob.add_surface(surf_dict)
     OAS_prob.setup()
     OAS_prob.run()
     prob = OAS_prob.prob
     self.assertAlmostEqual(prob['wing_perf.CL'], 0.57096081806728627)
     self.assertAlmostEqual(prob['wing_perf.failure'],
                            -0.8969902215221538,
                            places=5)
     self.assertAlmostEqual(prob['fuelburn'], 105120.8601409321, places=2)
Ejemplo n.º 37
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)
Ejemplo n.º 38
0
 def test_aero_analysis_flat_side_by_side(self):
     OAS_prob = OASProblem({'type' : 'aero',
                            'optimize' : False,
                            'record_db' : False})
     OAS_prob.add_surface({'name' : 'wing',
                           'span' : 5.,
                           'num_y' : 3,
                           'span_cos_spacing' : 0.,
                           'symmetry' : False,
                           'offset' : np.array([0., -2.5, 0.])})
     OAS_prob.add_surface({'name' : 'tail',
                           'span' : 5.,
                           'num_y' : 3,
                           'span_cos_spacing' : 0.,
                           'symmetry' : False,
                           'offset' : np.array([0., 2.5, 0.])})
     OAS_prob.setup()
     OAS_prob.run()
     prob = OAS_prob.prob
     self.assertAlmostEqual(prob['wing_perf.CL'], 0.46173591841167183, places=5)
     self.assertAlmostEqual(prob['tail_perf.CL'], 0.46173591841167183, places=5)
     self.assertAlmostEqual(prob['wing_perf.CD'], .005524603647, places=5)
     self.assertAlmostEqual(prob['tail_perf.CD'], .005524603647, places=5)
Ejemplo n.º 39
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
Ejemplo n.º 40
0
        # Add additional lifting surface
        surf_dict = {'name' : 'tail',
                     'num_y' : 7,
                     'num_x' : 2,
                     'span' : 20.,
                     'root_chord' : 5.,
                     'wing_type' : 'rect',
                     'offset' : np.array([50., 0., 5.]),
                     'twist_cp' : np.array([-9.5])}
        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.)

        # Setup problem
        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))
Ejemplo n.º 41
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)

    # 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.0001,
                        upper=0.5,
                        scaler=1e3)
    OAS_prob.add_desvar('wing.sweep', lower=-60., upper=60., scaler=1e-1)
    OAS_prob.add_constraint('wing_perf.failure', upper=0.)
    OAS_prob.add_constraint('wing_perf.thickness_intersects', upper=0.)
    OAS_prob.add_constraint('CM', equals=0.)

OAS_prob.setup()

st = time()

# Actually run the problem
OAS_prob.run()

print("\nWing CL:", OAS_prob.prob['wing_perf.CL'])
print("Wing CD:", OAS_prob.prob['wing_perf.CD'])
print("Time elapsed: {} secs".format(time() - st))