Source code for RCAIDE.Library.Methods.Powertrain.Sources.Batteries.Common.append_battery_conditions

# RCAIDE/Methods/Powertrain/Sources/Batteries/Common/append_battery_module_conditions.py
# 
# 
# Created:  Jul 2023, M. Clarke
# Modified: Sep 2024, S. Shekar

# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# RCAIDE imports 
import RCAIDE 
from RCAIDE.Framework.Mission.Common     import   Conditions

# ----------------------------------------------------------------------------------------------------------------------
#  METHODS
# ----------------------------------------------------------------------------------------------------------------------  
[docs] def append_battery_conditions(battery_module,segment,bus): """ Appends the initial battery conditions Assumptions: ------------ Battery temperature is set to one degree hotter than ambient temperature for robust convergence. Initial mission energy, maxed aged energy, and initial segment energy are the same. Cycle day is zero unless specified, resistance_growth_factor and capacity_fade_factor is one unless specified in the segment Source: N/A Inputs: atmosphere.temperature [Kelvin] Optional: segment. battery_module.cycle_in_day [unitless] battery_module.module.temperature [Kelvin] battery_module.charge_throughput [Ampere-Hours] battery_module.resistance_growth_factor [unitless] battery_module.capacity_fade_factor [unitless] battery_module.discharge [boolean] increment_battery_age_by_one_day [boolean] Outputs: segment battery_discharge [boolean] increment_battery_age_by_one_day [boolean] segment.state.conditions.energy battery_module.battery_discharge_flag [boolean] battery_module.maximum_initial_energy [watts] battery_module.energy [watts] battery_module.temperature [kelvin] battery_module.cycle_in_day [int] battery_module.cell.charge_throughput [Ampere-Hours] battery_module.resistance_growth_factor [unitless] battery_module.capacity_fade_factor [unitless] Properties Used: None """ ones_row = segment.state.ones_row # compute ambient conditions atmosphere = RCAIDE.Framework.Analyses.Atmospheric.US_Standard_1976() alt = -segment.conditions.frames.inertial.position_vector[:,2] if segment.temperature_deviation != None: temp_dev = segment.temperature_deviation atmo_data = atmosphere.compute_values(altitude = alt,temperature_deviation=temp_dev) bus_results = segment.state.conditions.energy[bus.tag] bus_results.battery_modules[battery_module.tag] = Conditions() bus_results.battery_modules[battery_module.tag].cell = Conditions() bus_results.battery_modules[battery_module.tag].voltage_open_circuit = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].cell.voltage_open_circuit = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].internal_resistance = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].cell.internal_resistance = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].voltage_under_load = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].cell.voltage_under_load = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].power = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].cell.power = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].power_draw = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].current_draw = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].current = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].cell.current = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].heat_energy_generated = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].cell.heat_energy_generated = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].cell.energy = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].energy = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].cell.cycle_in_day = 0 bus_results.battery_modules[battery_module.tag].cell.resistance_growth_factor = 1. bus_results.battery_modules[battery_module.tag].cell.capacity_fade_factor = 1. # Conditions for recharging battery module if isinstance(segment,RCAIDE.Framework.Mission.Segments.Ground.Battery_Recharge): segment.state.conditions.energy.recharging = True segment.state.unknowns['recharge'] = 0* ones_row(1) segment.state.residuals.network['recharge'] = 0* ones_row(1) elif type(segment) == RCAIDE.Framework.Mission.Segments.Ground.Battery_Discharge: segment.state.conditions.energy.recharging = False segment.state.unknowns['discharge'] = 0* ones_row(1) segment.state.residuals.network['discharge'] = 0* ones_row(1) else: segment.state.conditions.energy.recharging = False # first segment if 'initial_battery_state_of_charge' in segment: n_series = battery_module.electrical_configuration.series n_parallel = battery_module.electrical_configuration.parallel n_total = n_series*n_parallel initial_battery_energy = segment.initial_battery_state_of_charge*battery_module.maximum_energy bus_results.battery_modules[battery_module.tag].maximum_initial_energy = initial_battery_energy bus_results.battery_modules[battery_module.tag].energy = initial_battery_energy* ones_row(1) bus_results.battery_modules[battery_module.tag].cell.energy = initial_battery_energy / n_total* ones_row(1) bus_results.battery_modules[battery_module.tag].state_of_charge = segment.initial_battery_state_of_charge* ones_row(1) bus_results.battery_modules[battery_module.tag].cell.state_of_charge = segment.initial_battery_state_of_charge* ones_row(1) bus_results.battery_modules[battery_module.tag].cell.depth_of_discharge = 1 - segment.initial_battery_state_of_charge* ones_row(1) else: bus_results.battery_modules[battery_module.tag].energy = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].state_of_charge = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].cell.state_of_charge = 0 * ones_row(1) bus_results.battery_modules[battery_module.tag].cell.depth_of_discharge = 0 * ones_row(1) # temperature if 'battery_cell_temperature' in segment: cell_temperature = segment.battery_cell_temperature else: cell_temperature = atmo_data.temperature[0,0] bus_results.battery_modules[battery_module.tag].temperature = cell_temperature * ones_row(1) bus_results.battery_modules[battery_module.tag].cell.temperature = cell_temperature * ones_row(1) # charge thoughput if 'charge_throughput' in segment: bus_results.battery_modules[battery_module.tag].cell.charge_throughput = segment.charge_throughput * ones_row(1) bus_results.battery_modules[battery_module.tag].cell.resistance_growth_factor = segment.resistance_growth bus_results.battery_modules[battery_module.tag].cell.capacity_fade_factor = segment.capacity_fade bus_results.battery_modules[battery_module.tag].cell.cycle_in_day = segment.cycle_day bus_results.battery_modules[battery_module.tag].cell.resistance_growth_factor = 1 bus_results.battery_modules[battery_module.tag].cell.capacity_fade_factor = 1 bus_results.battery_modules[battery_module.tag].cell.cycle_in_day = 0 else: bus_results.battery_modules[battery_module.tag].cell.charge_throughput = 0 * ones_row(1) # This is the only one besides energy and discharge flag that should be moduleed into the segment top level if 'increment_battery_age_by_one_day' not in segment: segment.increment_battery_age_by_one_day = False return
[docs] def append_battery_segment_conditions(battery_module, bus, conditions, segment): """Sets the initial battery energy at the start of each segment as the last point from the previous segment Assumptions: None Source: N/A Inputs: battery (data structure) [None] Outputs: None Properties Used: None """ module_conditions = conditions[bus.tag].battery_modules[battery_module.tag] if segment.state.initials: battery_initials = segment.state.initials.conditions.energy[bus.tag].battery_modules[battery_module.tag] if type(segment) == RCAIDE.Framework.Mission.Segments.Ground.Battery_Recharge: module_conditions.battery_discharge_flag = False else: module_conditions.battery_discharge_flag = True module_conditions.energy[:,0] = battery_initials.energy[-1,0] module_conditions.temperature[:,0] = battery_initials.temperature[-1,0] module_conditions.cell.temperature[:,0] = battery_initials.cell.temperature[-1,0] module_conditions.cell.cycle_in_day = battery_initials.cell.cycle_in_day module_conditions.cell.charge_throughput[:,0] = battery_initials.cell.charge_throughput[-1,0] module_conditions.cell.resistance_growth_factor = battery_initials.cell.resistance_growth_factor module_conditions.cell.capacity_fade_factor = battery_initials.cell.capacity_fade_factor module_conditions.cell.state_of_charge[:,0] = battery_initials.cell.state_of_charge[-1,0] module_conditions.cell.energy[:,0] = battery_initials.cell.energy[-1,0] if 'battery_cell_temperature' in segment: module_conditions.temperature[:,0] = segment.battery_cell_temperature module_conditions.cell.temperature[:,0] = segment.battery_cell_temperature return