Source code for RCAIDE.Framework.Analyses.Stability.Athena_Vortex_Lattice

# RCAIDE/Framework/Analyses/Stability/Athena_Vortex_Lattice.py 
# 
# Created:  Jul 2023, M. Clarke

# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ----------------------------------------------------------------------------------------------------------------------

# RCAIDE imports   
from RCAIDE.Framework.Core                                     import Data, Units
from RCAIDE.Framework.Analyses                                 import Process 
from RCAIDE.Library.Methods.Aerodynamics                       import Common
from .Stability                                                import Stability  
from RCAIDE.Framework.Analyses.Common.Process_Geometry         import Process_Geometry 
from RCAIDE.Library.Methods.Aerodynamics.Athena_Vortex_Lattice import *   
from RCAIDE.Library.Methods.Aerodynamics.Athena_Vortex_Lattice.AVL_Objects.Run_Case     import Run_Case

# package imports 
import numpy as np 

# ----------------------------------------------------------------------------------------------------------------------
#  Athena_Vortex_Lattice
# ----------------------------------------------------------------------------------------------------------------------
[docs] class Athena_Vortex_Lattice(Stability): """This is a subsonic aerodynamic buildup analysis based on the vortex lattice method Assumptions: Stall effects are negligible Source: N/A Inputs: None Outputs: None Properties Used: N/A """ def __defaults__(self): """This sets the default values and methods for the analysis. Assumptions: None Source: N/A Inputs: None Outputs: None Properties Used: N/A """ self.tag = 'Athena_Vortex_Lattice' self.vehicle = Data() self.process = Process() self.process.initialize = Process() # correction factors settings = self.settings settings.fuselage_lift_correction = 1.14 settings.trim_drag_correction_factor = 1.1 settings.wing_parasite_drag_form_factor = 1.2 settings.fuselage_parasite_drag_form_factor = 2.4 settings.drag_reduction_factors = Data() settings.drag_reduction_factors.parasite_drag = 0.0 # Reduction factors are proportional (.1 is a 10% weight reduction) settings.drag_reduction_factors.induced_drag = 0.0 # Reduction factors are proportional (.1 is a 10% weight reduction) settings.drag_reduction_factors.compressibility_drag = 0.0 # Reduction factors are proportional (.1 is a 10% weight reduction) settings.maximum_lift_coefficient_factor = 1.0 settings.lift_to_drag_adjustment = 0.0 settings.viscous_lift_dependent_drag_factor = 0.38 settings.drag_coefficient_increment = 0.0 settings.spoiler_drag_increment = 0.0 settings.maximum_lift_coefficient = np.inf settings.recalculate_total_wetted_area = False settings.oswald_efficiency_factor = None settings.span_efficiency = None settings.run_cases = Run_Case.Container() settings.flow_symmetry = Data() settings.flow_symmetry.xz_plane = 0 # Symmetry across the xz-plane, y=0 settings.flow_symmetry.xy_parallel = 0 # Symmetry across the z=z_symmetry_plane plane settings.flow_symmetry.z_symmetry_plane = 0.0 settings.number_of_control_surfaces = 0 settings.filenames = Data() settings.filenames.avl_bin_name = 'avl' # to call avl from command line. If avl is not on the system path, include absolute path to the avl binary i.e. '/your/path/to/avl' settings.filenames.run_folder = 'avl_files' settings.filenames.features = 'aircraft.avl' settings.filenames.mass_file = 'aircraft.mass' settings.filenames.batch_template = 'batch_{0:04d}.run' settings.filenames.deck_template = 'commands_{0:04d}.deck' settings.filenames.aero_output_template_1 = 'stability_axis_derivatives_{}.txt' settings.filenames.aero_output_template_2 = 'surface_forces_{}.txt' settings.filenames.aero_output_template_3 = 'strip_forces_{}.txt' settings.filenames.aero_output_template_4 = 'body_axis_derivatives_{}.txt' settings.filenames.dynamic_output_template_1 = 'eigen_mode_{}.txt' settings.filenames.dynamic_output_template_2 = 'system_matrix_{}.txt' settings.filenames.case_template = 'case_{0:04d}_{1:04d}' settings.filenames.log_filename = 'avl_log.txt' settings.filenames.err_filename = 'avl_err.txt' settings.number_of_spanwise_vortices = 20 settings.number_of_chordwise_vortices = 10 settings.use_surrogate = True settings.trim_aircraft = False settings.model_fuselage = False settings.print_output = False settings.keep_files = False settings.new_regression_results = False settings.side_slip_angle = 0.0 settings.roll_rate_coefficient = 0.0 settings.pitch_rate_coefficient = 0.0 settings.lift_coefficient = None # correction factors settings.supersonic = Data() settings.supersonic.peak_mach_number = 1.04 settings.supersonic.begin_drag_rise_mach_number = 0.95 settings.supersonic.end_drag_rise_mach_number = 1.2 settings.supersonic.transonic_drag_multiplier = 1.25 settings.supersonic.volume_wave_drag_scaling = 3.2 settings.supersonic.fuselage_parasite_drag_begin_blend_mach = 0.91 settings.supersonic.fuselage_parasite_drag_end_blend_mach = 0.99 settings.supersonic.cross_sectional_area_calculation_type = 'Fixed' settings.supersonic.wave_drag_type = 'Raymer' self.reference_values = Data() self.reference_values.S_ref = 0 self.reference_values.c_ref = 0 self.reference_values.b_ref = 0 self.reference_values.X_ref = 0 self.reference_values.Y_ref = 0 self.reference_values.Z_ref = 0 # conditions table, used for surrogate model training self.training = Data() self.training.angle_of_attack = np.array([-2.,0., 2.,5., 7., 10.])*Units.degrees self.training.Mach = np.array([0.05,0.15,0.25, 0.45,0.65,0.85]) self.training.lift_coefficient = None self.training.drag_coefficient = None self.training.span_efficiency_factor = None self.training.moment_coefficient = None self.training.Cm_alpha_moment_coefficient = None self.training.Cn_beta_moment_coefficient = None self.training.neutral_point = None self.training_file = None self.current_status = Data() self.current_status.batch_index = 0 self.current_status.batch_file = None self.current_status.deck_file = None self.current_status.cases = None # surrogoate models self.surrogates = Data() self.surrogates.moment_coefficient = None self.surrogates.Cm_alpha_moment_coefficient = None self.surrogates.Cn_beta_moment_coefficient = None self.surrogates.neutral_point = None # build the evaluation process compute = Process() compute.lift = Process() compute.lift.inviscid_wings = None compute.lift.fuselage = Common.Lift.fuselage_correction compute.drag = Process() compute.drag.parasite = Process() compute.drag.parasite.wings = Process_Geometry('wings') compute.drag.parasite.wings.wing = Common.Drag.parasite_drag_wing compute.drag.parasite.fuselages = Process_Geometry('fuselages') compute.drag.parasite.fuselages.fuselage = Common.Drag.parasite_drag_fuselage compute.drag.parasite.booms = Process_Geometry('booms') compute.drag.parasite.booms.boom = Common.Drag.parasite_drag_fuselage compute.drag.parasite.nacelles = Common.Drag.parasite_drag_nacelle compute.drag.parasite.pylons = Common.Drag.parasite_drag_pylon compute.drag.parasite.total = Common.Drag.parasite_total compute.drag.induced = Common.Drag.induced_drag compute.drag.cooling = Process() compute.drag.cooling.total = Common.Drag.cooling_drag compute.drag.compressibility = Process() compute.drag.compressibility.total = Common.Drag.compressibility_drag compute.drag.miscellaneous = Common.Drag.miscellaneous_drag compute.drag.spoiler = Common.Drag.spoiler_drag compute.drag.total = Common.Drag.total_drag self.process.compute = compute
[docs] def initialize(self): use_surrogate = self.settings.use_surrogate # If we are using the surrogate if use_surrogate == True: # sample training data train_AVL_surrogates(self) # build surrogate build_AVL_surrogates(self) # build the evaluation process compute = self.process.compute if use_surrogate == True: compute.lift.inviscid_wings = evaluate_AVL_surrogate else: compute.lift.inviscid_wings = evaluate_AVL_no_surrogate return
[docs] def evaluate(self,state): """The default evaluate function. Assumptions: None Source: N/A Inputs: None Outputs: results <RCAIDE data class> Properties Used: self.settings self.vehicle """ settings = self.settings vehicle = self.vehicle results = self.process.compute(state,settings,vehicle) return results