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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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
# 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))
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))