Source code for RCAIDE.Framework.External_Interfaces.OpenVSP.mach_slices

# RCAIDE/Framework/External_Interfaces/OpenVSP/mach_slices.py
# Created:  May 2021, E. Botero 
 
# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ----------------------------------------------------------------------------------------------------------------------  
# RCAIDE imports 
from . import export_vsp_vehicle

try:
    import vsp as vsp
except ImportError:
    try:
        import openvsp as vsp
    except ImportError:
        # This allows RCAIDE to build without OpenVSP
        pass
import numpy as np

# ---------------------------------------------------------------------------------------------------------------------- 
#  Mach Slices
# ---------------------------------------------------------------------------------------------------------------------- 
[docs] def mach_slices(vehicle,mach,angle_of_attack=[0.],number_slices = 99): """ This method calculates the volume equivalent area for a vehicle for sonic boom analysis. It will write a VSP then slice it up depending on the mach number and angle of attack Assumptions: X_locs is the location where lift values are taken on the x-axis AE_x is the lift equivalent area Source: N/A Inputs: vehicle [vehicle] mach [-] angle_of_attack [radians] number_slices [int] Outputs: X_locs [m] slice_areas [m^2] Properties Used: N/A """ # Write the vehicle export_vsp_vehicle(vehicle,vehicle.tag,write_file=False) X_locs_all = [] slice_areas_all = [] for ii in range(len(mach)): m = mach[ii] if len(angle_of_attack)>1: aoa = angle_of_attack[ii] else: aoa = angle_of_attack[0] # Calculate the mach angle and adjust for AoA mach_angle = np.arcsin(1/m) roty = (np.pi/2-mach_angle) + aoa # Take the components of the X and Z axis to get the slicing plane x_component = np.cos(roty) z_component = np.sin(roty) # Now slice it vsp.ComputePlaneSlice( 0, number_slices, vsp.vec3d(x_component[0], 0.0, z_component[0]), True) # Pull out the areas from the slices pslice_results = vsp.FindLatestResultsID("Slice") slice_areas = vsp.GetDoubleResults( pslice_results, "Slice_Area" ) * np.cos(roty) vec3d = vsp.GetVec3dResults(pslice_results, "Slice_Area_Center") X = [] Z = [] for v in vec3d: X.append(v.x()) Z.append(v.z()) X = np.array(X) Z = np.array(Z) X_locs = X + Z*np.tan(mach_angle) if slice_areas[-1]==0.: slice_areas = slice_areas[0:-1] X_locs = X_locs[:-1] # Turn them into arrays X_locs = np.array(X_locs) slice_areas = np.array(slice_areas) # A vectorized Output X_locs_all.append(X_locs) slice_areas_all.append(slice_areas) return X_locs_all, slice_areas_all