def generate_forces(alpha=0., elevator=0., thrust=0., dt=0.1, case_name='hale_forces', case_route='./', **kwargs): output_route = kwargs.get('output_route', './output/') m = kwargs.get('M', 4) rho = kwargs.get('rho', 1.225) tolerance = kwargs.get('tolerance', 1e-5) hale = aircraft.Hale(case_name, case_route, output_route) hale.clean() hale.init_structure(**kwargs) hale.init_aero(m) hale.set_flight_controls(thrust=thrust, elevator=elevator) hale.generate() settings = dict() u_inf = kwargs.get('u_inf', 10) settings['SHARPy'] = { 'case': case_name, 'route': case_route, 'flow': kwargs.get('flow', []), 'write_screen': 'on', 'write_log': 'on', 'log_folder': './output/', 'log_file': case_name + '.log' } settings['BeamLoader'] = { 'unsteady': 'on', 'orientation': algebra.euler2quat(np.array([0., alpha, 0.])) } settings['AerogridLoader'] = { 'unsteady': 'off', 'aligned_grid': 'on', 'mstar': int(kwargs.get('wake_length', 10) * m), 'control_surface_deflection': ['', ''], 'control_surface_deflection_generator_settings': { '0': {}, '1': {} }, 'wake_shape_generator': 'StraightWake', 'wake_shape_generator_input': { 'u_inf': u_inf, 'u_inf_direction': [1., 0., 0.], 'dt': dt, }, } settings['NonLinearStatic'] = { 'print_info': 'off', 'max_iterations': 150, 'num_load_steps': 1, 'delta_curved': 1e-1, 'min_delta': tolerance, 'gravity_on': kwargs.get('gravity', 'on'), 'gravity': 10.6235, 'initial_position': [0., 0., 0.] } settings['StaticUvlm'] = { 'print_info': 'on', 'horseshoe': kwargs.get('horseshoe', 'off'), 'num_cores': 4, 'n_rollup': 0, 'rollup_dt': dt, 'rollup_aic_refresh': 1, 'rollup_tolerance': 1e-4, 'velocity_field_generator': 'SteadyVelocityField', 'velocity_field_input': { 'u_inf': u_inf, 'u_inf_direction': [1., 0, 0] }, 'rho': rho } settings['StaticCoupled'] = { 'print_info': 'off', 'structural_solver': 'NonLinearStatic', 'structural_solver_settings': settings['NonLinearStatic'], 'aero_solver': 'StaticUvlm', 'aero_solver_settings': settings['StaticUvlm'], 'max_iter': 100, 'n_load_steps': kwargs.get('n_load_steps', 1), 'tolerance': kwargs.get('fsi_tolerance', 1e-5), 'relaxation_factor': kwargs.get('relaxation_factor', 0.2) } settings['StaticTrim'] = { 'solver': 'StaticCoupled', 'solver_settings': settings['StaticCoupled'], 'initial_alpha': alpha, 'initial_deflection': elevator, 'initial_thrust': thrust, 'fz_tolerance': 0.1, 'fx_tolerance': 0.1, 'm_tolerance': 0.1, 'save_info': 'on', } settings['BeamPlot'] = {'include_FoR': 'on'} settings['AerogridPlot'] = { 'include_rbm': 'off', 'include_applied_forces': 'on', 'minus_m_star': 0, 'u_inf': u_inf } settings['AeroForcesCalculator'] = { 'write_text_file': 'on', 'text_file_name': 'aeroforces.txt', 'screen_output': 'on', 'coefficients': True, 'q_ref': 0.5 * rho * u_inf**2, 'S_ref': 2 * hale.structure.span_main * hale.aero.chord_main, 'b_ref': 2 * hale.structure.span_main } settings['SaveParametricCase'] = { 'save_case': 'off', 'parameters': { 'alpha': alpha } } hale.create_settings(settings) hale.run()
def generate_derivatives(alpha=0., elevator=0., thrust=0., dt=0.1, case_name='hale_static', case_route='./', **kwargs): output_route = kwargs.get('output_route', './output/') m = kwargs.get('M', 4) rho = kwargs.get('rho', 1.225) tolerance = kwargs.get('tolerance', 1e-5) hale = aircraft.Hale(case_name, case_route, output_route) hale.clean() hale.init_structure(**kwargs) hale.init_aero(m) hale.set_flight_controls(thrust=thrust, elevator=elevator) hale.generate() settings = dict() u_inf = kwargs.get('u_inf', 10) settings['SHARPy'] = {'case': case_name, 'route': case_route, 'flow': kwargs.get('flow', []), 'write_screen': 'on', 'write_log': 'on', 'log_folder': './output/', 'log_file': case_name + '.log'} settings['BeamLoader'] = {'unsteady': 'on', 'orientation': algebra.euler2quat(np.array([0., alpha, 0.]))} settings['AerogridLoader'] = {'unsteady': 'on', 'aligned_grid': 'on', 'mstar': int(kwargs.get('wake_length', 10) * m), 'control_surface_deflection': ['', ''], 'control_surface_deflection_generator_settings': {'0': {}, '1': {}}, 'wake_shape_generator': 'StraightWake', 'wake_shape_generator_input': { 'u_inf': u_inf, 'u_inf_direction': [1., 0., 0.], 'dt': dt, }, } settings['NonLinearStatic'] = {'print_info': 'off', 'max_iterations': 150, 'num_load_steps': 1, 'delta_curved': 1e-1, 'min_delta': tolerance, 'gravity_on': kwargs.get('gravity', 'on'), 'gravity': 10.6235, 'initial_position': [0., 0., 0.]} settings['StaticUvlm'] = {'print_info': 'on', 'horseshoe': kwargs.get('horseshoe', 'off'), 'num_cores': 4, 'n_rollup': 0, 'rollup_dt': dt, 'rollup_aic_refresh': 1, 'rollup_tolerance': 1e-4, 'velocity_field_generator': 'SteadyVelocityField', 'velocity_field_input': {'u_inf': u_inf, 'u_inf_direction': [1., 0, 0]}, 'rho': rho} settings['StaticCoupled'] = {'print_info': 'off', 'structural_solver': 'NonLinearStatic', 'structural_solver_settings': settings['NonLinearStatic'], 'aero_solver': 'StaticUvlm', 'aero_solver_settings': settings['StaticUvlm'], 'max_iter': 100, 'n_load_steps': kwargs.get('n_load_steps', 1), 'tolerance': kwargs.get('fsi_tolerance', 1e-5), 'relaxation_factor': kwargs.get('relaxation_factor', 0.2)} settings['StaticTrim'] = {'solver': 'StaticCoupled', 'solver_settings': settings['StaticCoupled'], 'initial_alpha': alpha, 'initial_deflection': elevator, 'initial_thrust': thrust, 'fz_tolerance': 0.1, 'fx_tolerance': 0.1, 'm_tolerance': 0.1, 'save_info': 'on', } settings['BeamPlot'] = { 'include_FoR': 'on'} settings['AerogridPlot'] = { 'include_rbm': 'off', 'include_applied_forces': 'on', 'minus_m_star': 0, 'u_inf': u_inf } settings['AeroForcesCalculator'] = { 'write_text_file': 'on', 'text_file_name': 'aeroforces.txt', 'screen_output': 'on', 'coefficients': True, 'q_ref': 0.5 * rho * u_inf ** 2, 'S_ref': hale.structure.span_main * hale.aero.chord_main, } settings['BeamPlot'] = { 'include_rbm': 'on', 'include_applied_forces': 'on', 'include_FoR': 'on'} struct_solver_settings = {'print_info': 'off', 'initial_velocity_direction': [-1., 0., 0.], 'max_iterations': 950, 'delta_curved': 1e-6, 'min_delta': tolerance, 'newmark_damp': 5e-3, 'gravity_on': kwargs.get('gravity', 'on'), 'gravity': 10.6235, 'num_steps': 1, 'dt': dt, 'initial_velocity': u_inf * 1} step_uvlm_settings = {'print_info': 'on', 'num_cores': 4, 'convection_scheme': 2, #ws.wake_type, 'vortex_radius': 1e-6, 'velocity_field_generator': 'SteadyVelocityField', 'velocity_field_input': {'u_inf': u_inf * 0, 'u_inf_direction': [1., 0., 0.]}, 'rho': rho, 'n_time_steps': 1, 'dt': dt, 'gamma_dot_filtering': 3} settings['DynamicCoupled'] = {'print_info': 'on', # 'structural_substeps': 1, # 'dynamic_relaxation': 'on', # 'clean_up_previous_solution': 'on', 'structural_solver': 'NonLinearDynamicCoupledStep', 'structural_solver_settings': struct_solver_settings, 'aero_solver': 'StepUvlm', 'aero_solver_settings': step_uvlm_settings, 'fsi_substeps': 200, 'fsi_tolerance': tolerance, 'relaxation_factor': 0.3, 'minimum_steps': 1, 'relaxation_steps': 150, 'final_relaxation_factor': 0.5, 'n_time_steps': 1, # ws.n_tstep, 'dt': dt, 'include_unsteady_force_contribution': 'off'} # 'postprocessors': ['BeamPlot', 'AerogridPlot', 'WriteVariablesTime'], # 'postprocessors_settings': {'BeamLoads': {'folder': output_route, # 'csv_output': 'off'}, # 'BeamPlot': {'folder': output_route, # 'include_rbm': 'on', # 'include_applied_forces': 'on'}, # 'AerogridPlot': { # 'u_inf': ws.u_inf, # 'folder': output_route, # 'include_rbm': 'on', # 'include_applied_forces': 'on', # 'minus_m_star': 0}, # 'WriteVariablesTime': { # 'folder': output_route, # 'cleanup_old_solution': 'on', # 'delimiter': ',', # 'FoR_variables': ['total_forces', # 'total_gravity_forces', # 'for_pos', 'quat'], # }}} settings['StabilityDerivatives'] = { 'u_inf': u_inf, 'c_ref': hale.aero.chord_main, 'b_ref': hale.structure.span_main * 2, 'S_ref': 2 * hale.structure.span_main * hale.aero.chord_main, } settings['Modal'] = {'print_info': True, 'use_undamped_modes': True, 'NumLambda': 50, 'rigid_body_modes': True, 'write_modes_vtk': 'on', 'print_matrices': 'on', 'save_data': 'on', 'continuous_eigenvalues': 'off', 'dt': dt, 'plot_eigenvalues': False, 'rigid_modes_ppal_axes': 'off', 'rigid_modes_cg': 'on', } # ROM settings rom_settings = dict() rom_settings['algorithm'] = 'mimo_rational_arnoldi' rom_settings['r'] = 4 rom_settings['frequency'] = np.array([0], dtype=float) rom_settings['single_side'] = 'observability' settings['LinearAssembler'] = {'linear_system': 'LinearAeroelastic', 'linear_system_settings': { 'beam_settings': {'modal_projection': 'on', 'inout_coords': 'modes', 'discrete_time': 'off', 'newmark_damp': 0.5e-3, 'discr_method': 'newmark', 'dt': dt, 'proj_modes': 'undamped', 'use_euler': 'on', 'num_modes': 20, 'print_info': 'on', 'gravity': kwargs.get('gravity', 'on'), 'remove_dofs': [], 'remove_rigid_states': 'on'}, 'aero_settings': {'dt': dt, # 'ScalingDict': {'length': hale.aero.chord_main / 2, # 'speed': u_inf, # 'density': rho}, 'integr_order': 2, 'density': rho, 'remove_predictor': 'off', 'use_sparse': False, 'vortex_radius': 1e-7, 'remove_inputs': ['u_gust'], 'convert_to_ct': 'on', # 'rom_method': ['Krylov'], # 'rom_method_settings': {'Krylov': rom_settings}, }, 'track_body': 'off', }} settings['AsymptoticStability'] = { 'print_info': 'on', 'modes_to_plot': [], # 'velocity_analysis': [27, 29, 3], 'display_root_locus': 'off', 'frequency_cutoff': 0, 'export_eigenvalues': 'on', 'num_evals': 1000, 'target_system': ['aeroelastic', 'aerodynamic', 'structural'], 'folder': output_route} settings['FrequencyResponse'] = {'target_system': ['aeroelastic', 'aerodynamic', 'structural'], 'quick_plot': 'off', 'frequency_spacing': 'log', 'frequency_unit': 'w', 'frequency_bounds': [1e-3, 1e3], 'num_freqs': 200, 'print_info': 'on'} settings['PickleData'] = {} hale.create_settings(settings) return hale