diff --git a/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/call_functions/_00_readenergycarrierandtankconfiguration.py b/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/call_functions/_00_readenergycarrierandtankconfiguration.py index b4c787bc0980caeb1909d164cdd1b04c0dd9a64e..792cd19a046cb6e8169fc4aff537c936e867f6b3 100644 --- a/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/call_functions/_00_readenergycarrierandtankconfiguration.py +++ b/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/call_functions/_00_readenergycarrierandtankconfiguration.py @@ -135,6 +135,7 @@ def read_energy_carrier_and_tank_configuration(paths_and_names, dict_ac_data, di energy_carrier_lookup[tank['energy_carrier_id']]['energy_carrier']), 'tank_location': tank['tank_location'], 'tank_position': tank['tank_position'], + 'designator': tank['tank_location'] + '_' + tank['tank_position'], 'energy_share': tank['energy_share'], 'energy_required': tank['energy_required'], 'volume_available': 0.0, diff --git a/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/call_functions/_01_checktankconfiguration.py b/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/call_functions/_01_checktankconfiguration.py index 44617f75b84057a8816596712ade89703a39d3b7..a03f589c6f715402e4a53c5603b5de31144f2089 100644 --- a/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/call_functions/_01_checktankconfiguration.py +++ b/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/call_functions/_01_checktankconfiguration.py @@ -20,26 +20,47 @@ def check_tank_configuration(paths_and_names, dict_ac_data, dict_tank_design, ru # Extract values from 'dict_ac_data' and 'dict_tank_design'. energy_carrier = dict_ac_data['energy_carrier'] tank_entity_list = [key for key in dict_tank_design if key.startswith('tank_') and key[5:].isdigit()] + wing_mounting = dict_ac_data['wing_mounting'] number_of_tanks = 0 """Kerosene.""" if energy_carrier == 'kerosene': - # Define tank combination dict based on energy carrier. - combinations = { - # Standard integral wing tanks. - 'wing': - {'inner_left': False, - 'outer_left': False, - 'inner_right': False, - 'outer_right': False, - 'center': False}, - # Trim tank. - 'horizontal_stabilizer': - {'total': False}, - # Additional center tank. - 'fuselage': - {'center': False} - } + # Define tank combination dict based on energy carrier and wing mounting. + if wing_mounting == 'low': + combinations = { + # Standard integral wing tanks. + 'wing': + {'inner_left': False, + 'outer_left': False, + 'inner_right': False, + 'outer_right': False, + 'center': False}, + # Trim tank. + 'horizontal_stabilizer': + {'total': False}, + # Additional center tank. + 'fuselage': + {'center': False} + } + elif wing_mounting == 'high': + combinations = { + # Standard integral wing tanks. + 'wing': + {'inner_left': False, + 'inner_right': False, + 'center': False}, + # Trim tank. + 'horizontal_stabilizer': + {'total': False}, + # Additional center tank. + 'fuselage': + {'center': False} + } + else: + # If wing mounting is not high or low, wing definition is invalid. Abort program. + runtime_output.critical('Error: Wing mounting not "high" or "low". Invalid wing definition. ' + + 'Program aborted.') + sys.exit('Exit information: Invalid wing definition in aircraft exchange file.') # Iterate over tank entities of 'tank_entity_list'. for tank_entity in tank_entity_list: @@ -84,22 +105,34 @@ def check_tank_configuration(paths_and_names, dict_ac_data, dict_tank_design, ru # Define number of tanks and set tank configuration name for valid tank configurations. if valid_wing_tanks and not (trim_tank or additional_center_tank): - number_of_tanks = 5 + if wing_mounting == 'low': + number_of_tanks = 5 + elif wing_mounting == 'high': + number_of_tanks = 3 tank_configuration = 'wing_all_tanks' # Print. runtime_output.print('Valid tank configuration found in acXML: ' + tank_configuration) elif valid_wing_with_trim_tank and not additional_center_tank: - number_of_tanks = 6 + if wing_mounting == 'low': + number_of_tanks = 6 + elif wing_mounting == 'high': + number_of_tanks = 4 tank_configuration = 'wing_with_trim_tank' # Print. runtime_output.print('Valid tank configuration found in acXML: ' + tank_configuration) elif valid_wing_with_additional_center_tank and not trim_tank: - number_of_tanks = 6 + if wing_mounting == 'low': + number_of_tanks = 6 + elif wing_mounting == 'high': + number_of_tanks = 4 tank_configuration = 'wing_with_additional_center_tank' # Print. runtime_output.print('Valid tank configuration found in acXML: ' + tank_configuration) elif valid_wing_with_additional_center_and_trim_tank: - number_of_tanks = 7 + if wing_mounting == 'low': + number_of_tanks = 7 + elif wing_mounting == 'high': + number_of_tanks = 5 tank_configuration = 'wing_with_additional_center_and_trim_tank' # Print. runtime_output.print('Valid tank configuration found in acXML: ' + tank_configuration) diff --git a/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/call_functions/_02_preparegeometricaldata.py b/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/call_functions/_02_preparegeometricaldata.py index 43246f5a4a27cd718bb94ac2fea083bc601d3e87..544310ce3c8daca57bd7d8acc699c9957c2e34bb 100644 --- a/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/call_functions/_02_preparegeometricaldata.py +++ b/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/call_functions/_02_preparegeometricaldata.py @@ -93,9 +93,6 @@ def prepare_for_kerosene(dict_ac_data, dict_tank_design, runtime_output): dict_tank_design = prepare_wing_tanks(dict_ac_data, dict_tank_design, runtime_output) # Trim tank. if 'trim' in dict_tank_design['tank_configuration']: - # # Not implemented yet. - # runtime_output.critical('Error: Trim tank not implemented yet! Program aborted.') - # sys.exit('Exit information: Trim tank calculation not implemented yet!') dict_tank_design = prepare_trim_tank(dict_ac_data, dict_tank_design, runtime_output) # Additional center tank. if 'additional_center' in dict_tank_design['tank_configuration']: diff --git a/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/tankdesigntuberlin.py b/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/tankdesigntuberlin.py index 01485ca847ffd81aaf8cd0a251f92a565cdcec32..b95796d344b229b6adec2c7be299f745bbe1ef15 100644 --- a/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/tankdesigntuberlin.py +++ b/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/tankdesigntuberlin.py @@ -62,9 +62,9 @@ def tank_design_tu_berlin(paths_and_names, routing_dict, dict_ac_data, runtime_o """Convert coordinates from CGAL to aircraft coordinate system.""" # List of parameters to be considered for CGAL to aircraft coordinate system conversion. - param_list = ["fuselage_position", "wing_position", "empennage_position", "fuselage_entity_position", - "fuselage_section_origin", "fuselage_payload_deck_origin", "wing_section_chord_origin", - "empennage_entity_position", "empennage_section_chord_origin"] + # param_list = ["fuselage_position", "wing_position", "empennage_position", "fuselage_entity_position", + # "fuselage_section_origin", "fuselage_payload_deck_origin", "wing_section_chord_origin", + # "empennage_entity_position", "empennage_section_chord_origin"] # for param in param_list: # if dict_ac_data[param + "_x"] is not None: diff --git a/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/kerosene/calculatetanks.py b/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/kerosene/calculatetanks.py index b95bba00108caf1d1f4a6dd438b5df4541c35e66..87b3b25bd8e98169b90cf493207f683010ffdc4c 100644 --- a/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/kerosene/calculatetanks.py +++ b/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/kerosene/calculatetanks.py @@ -144,8 +144,15 @@ def calculate_kerosene_tanks(dict_ac_data, dict_tank_design, runtime_output): runtime_output.print('Energy check: Energy demand covered.') case 'wing_with_additional_center_and_trim_tank': - first_act_then_trim = (dict_tank_design['tank_5']['tank_location'] == 'fuselage') - first_trim_then_act = (dict_tank_design['tank_5']['tank_location'] == 'horizontal_stabilizer') + additional_center_tank_entity = [k for k, v in dict_tank_design.items() + if k.startswith('tank_') and k[5:].isdigit() + and v['tank_location'] == 'fuselage' + and v['tank_position'] == 'center'] + trim_tank_entity = [k for k, v in dict_tank_design.items() if k.startswith('tank_') and k[5:].isdigit() + and v['tank_location'] == 'horizontal_stabilizer' and v['tank_position'] == 'total'] + first_act_then_trim = (int(additional_center_tank_entity[-1][-1]) < int(trim_tank_entity[-1][-1])) + # first_act_then_trim = (dict_tank_design['tank_5']['tank_location'] == 'fuselage') + first_trim_then_act = not first_act_then_trim if first_act_then_trim and not first_trim_then_act: if not energy_demand_covered: runtime_output.print('Energy check: Demand not covered yet. Continue with design of additional ' @@ -443,8 +450,20 @@ def calculate_wing_tanks(dict_ac_data, dict_tank_design, runtime_output, mission case 'center': inner_surface_str = 'fuselage_center_line' outer_surface_str = 'outer_center_tank_section' + elif number_of_wing_sections == 3: + # Set sections depending on tank position. + match dict_tank_design[wing_tank_entity]['tank_position']: + case 'inner_left' | 'inner_right': + inner_surface_str = 'section_0' + outer_surface_str = 'section_1' + # case 'outer_left' | 'outer_right': + # inner_surface_str = 'section_1' + # outer_surface_str = 'section_2' + case 'center': + inner_surface_str = 'fuselage_center_line' + outer_surface_str = 'outer_center_tank_section' else: - runtime_output.critical('Error: Wing without kink not implemented yet! Program aborted.') + runtime_output.critical('Error: Unknown wing geometry! Program aborted.') sys.exit(1) else: runtime_output.critical('Error: Wing not symmetric! ' @@ -705,10 +724,6 @@ def calculate_wing_tanks(dict_ac_data, dict_tank_design, runtime_output, mission print_outputs = True calculate_vent_tank_volume(energy_wing_tank_with_center_tank) energy_wing_tank_without_center_tank, energy_wing_tank_with_center_tank = calculate_wing_tanks_volume() - # calculate_wing_tanks_volume() - # output is volume_wing_tank_with_center_tank - # this is input for calculate_vent_tank() - # then calculate_wing_tanks_volume() # -------------------------- END OF NEW VENT TANK CALCULATION ------------------------- # -------------------------- START OF OLD VENT TANK CALCULATION ------------------------- @@ -1430,8 +1445,8 @@ def calculate_trim_tank(dict_ac_data, dict_tank_design, runtime_output, energy_d # Centroid. # Assumption: inner surface area always greater than outer surface area. - inner_surface = dict_tank_design['tank_5']['geometry']['cross_section_1'] - outer_surface = dict_tank_design['tank_5']['geometry']['cross_section_2'] + inner_surface = dict_tank_design[tank_entity]['geometry']['cross_section_1'] + outer_surface = dict_tank_design[tank_entity]['geometry']['cross_section_2'] inner_surface_area = (inner_surface['height'] *inner_surface['width']) outer_surface_area = (outer_surface['height'] diff --git a/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/usermethoddatapreparation.py b/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/usermethoddatapreparation.py index 8b8525a535177b507ca76bbe0168be588721e4c4..d91e385386757c75b8aa357d68e67ff48a576c6d 100644 --- a/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/usermethoddatapreparation.py +++ b/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/usermethoddatapreparation.py @@ -50,7 +50,6 @@ def user_method_data_input_preparation(routing_dict): [tmp_mission_analysis_path +'loaded_mission_energy/mission_energy[@ID="0"]/consumed_energy', float], 'mission_energy_ID': [tmp_mission_analysis_path +'loaded_mission_energy/mission_energy[@ID="0"]/energy_carrier_ID', int], - # TODO here only loaded mission energy is used, but there are also trip, taxi & landing energy 'energy_carrier_name': [tmp_design_specs_path + 'energy_carriers/energy_carrier[@ID="0"]/type', str], # Tank configuration. @@ -81,6 +80,7 @@ def user_method_data_input_preparation(routing_dict): 'fuselage_payload_deck_structural_floor_thickness': [tmp_fuselage_payload_deck_path + 'payload_deck_structural_floor_thickness', float], # Wing data. + 'wing_mounting': [tmp_design_specs_path + 'configuration/wing_definition/mounting', str], 'wing_name': [tmp_wing_path + 'name', str], 'wing_position_x': ['./component_design/wing/position/x', float], 'wing_position_y': ['./component_design/wing/position/y', float],