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

# RCAIDE/Framework/External_Interfaces/OpenVSP/get_fuel_tank_properties.py
# 
# Created:  Sep 2018, T. MacDonald
# Modified: Oct 2018, T. MacDonald
#           Jan 2020, T. MacDonald

# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ----------------------------------------------------------------------------------------------------------------------  
# RCAIDE imports 
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
from RCAIDE.Framework.Core import Data

# ----------------------------------------------------------------------------------------------------------------------
#  Get Fuel Tank Properties
# ----------------------------------------------------------------------------------------------------------------------   
[docs] def get_fuel_tank_properties(vehicle,tag,fuel_tank_set_index=3,slices_for_calculation=100): """This function computes the center of gravity, total possible fuel mass, the available volume of each fuel tank in the vehicle through a mass properties computation in OpenVSP. Assumptions: Fuel tanks exists in the fuselage and wings only All fuel tanks have unique names Source: N/A Inputs: vehicle.fuselages.*.Fuel_Tanks.*.tag [-] vehicle.wings.*.Fuel_Tanks.*.tag [-] Outputs: vehicle.fuselages.*.Fuel_Tanks.*.mass_properties. center_of_gravity [m] fuel_mass_when_full [kg] fuel_volume_when_full [m^3] vehicle.wings.*.Fuel_Tanks.*.mass_properties. center_of_gravity [m] fuel_mass_when_full [kg] fuel_volume_when_full [m^3] Properties Used: N/A """ # Reset OpenVSP to avoid including a previous vehicle vsp.ClearVSPModel() vsp.ReadVSPFile(tag + '.vsp3') # Extract fuel tanks from vehicle fuel_tanks = get_fuel_tanks(vehicle) num_slices = slices_for_calculation # Slices used to estimate mass distribution from areas in OpenVSP mass_props_output_file = tag + '_mass_props.txt' vsp.SetComputationFileName(vsp.MASS_PROP_TXT_TYPE,mass_props_output_file) print('Computing Fuel Tank Mass Properties... ') vsp.ComputeMassProps(fuel_tank_set_index, num_slices) print('Done') # Extract full tank mass properties from OpenVSP output file fo = open(mass_props_output_file) for line in fo: prop_list = line.split() try: if prop_list[0] in fuel_tanks: # Indices based on position in OpenVSP output (may change in the future) cg_x = float(prop_list[2]) cg_y = float(prop_list[3]) cg_z = float(prop_list[4]) mass = float(prop_list[1]) vol = float(prop_list[-1]) if 'center_of_gravity' not in fuel_tanks[prop_list[0]]: # assumes at most two identical tank names fuel_tanks[prop_list[0]].center_of_gravity = np.array([cg_x,cg_y,cg_z]) fuel_tanks[prop_list[0]].fuel_mass_when_full = mass fuel_tanks[prop_list[0]].volume = vol else: fuel_tanks[prop_list[0]].center_of_gravity = \ (fuel_tanks[prop_list[0]].center_of_gravity+np.array([cg_x,cg_y,cg_z]))/2. fuel_tanks[prop_list[0]].fuel_mass_when_full += mass fuel_tanks[prop_list[0]].volume += vol except IndexError: # in case line is empty pass # Apply fuel tank properties to the vehicle vehicle = apply_properties(vehicle, fuel_tanks) return vehicle
# ---------------------------------------------------------------------------------------------------------------------- # Apply Properties # ----------------------------------------------------------------------------------------------------------------------
[docs] def apply_properties(vehicle,fuel_tanks): """Apply fuel tank properties from OpenVSP to the RCAIDE vehicle. Assumptions: Fuel tanks exists in the fuselage and wings only Source: N/A Inputs: vehicle.fuselages.*.Fuel_Tanks.*.tag [-] vehicle.wings.*.Fuel_Tanks.*.tag [-] fuel_tanks. tag [-] center_of_gravity [m] fuel_mass_when_full [kg] volume [m^3] Outputs: vehicle.fuselages.*.Fuel_Tanks.*.mass_properties. center_of_gravity [m] fuel_mass_when_full [kg] fuel_volume_when_full [m^3] vehicle.wings.*.Fuel_Tanks.*.mass_properties. center_of_gravity [m] fuel_mass_when_full [kg] fuel_volume_when_full [m^3] Properties Used: N/A """ for wing in vehicle.wings: for tank in wing.Fuel_Tanks: tank.mass_properties.center_of_gravity = fuel_tanks[tank.tag].center_of_gravity tank.mass_properties.fuel_mass_when_full = fuel_tanks[tank.tag].fuel_mass_when_full tank.mass_properties.fuel_volume_when_full = fuel_tanks[tank.tag].volume for fuse in vehicle.fuselages: for tank in fuse.Fuel_Tanks: tank.mass_properties.center_of_gravity = fuel_tanks[tank.tag].center_of_gravity tank.mass_properties.fuel_mass_when_full = fuel_tanks[tank.tag].fuel_mass_when_full tank.mass_properties.fuel_volume_when_full = fuel_tanks[tank.tag].volume return vehicle
# ---------------------------------------------------------------------------------------------------------------------- # Get Fuel Tanks # ----------------------------------------------------------------------------------------------------------------------
[docs] def get_fuel_tanks(vehicle): """Creates a data structure with fuel tanks based on fuel tanks present in the vehicle Assumptions: Fuel tanks exists in the fuselage and wings only Source: N/A Inputs: vehicle.fuselages.*.Fuel_Tanks.*.tag [-] vehicle.wings.*.Fuel_Tanks.*.tag [-] Outputs: fuel_tanks.tag [-] Properties Used: N/A """ vsp_fuel_tanks = Data() for network in vehicle.networks: for fuel_line in network.fuel_lines: for fuel_tank in fuel_line.fuel_tanks: vsp_fuel_tanks[fuel_tank.tag] = Data() return vsp_fuel_tanks