Source code for RCAIDE.Library.Methods.Powertrain.Distributors.Electrical_Bus.compute_bus_conditions

# RCAIDE/Methods/Energy/Distributors/Electrical_Bus.py
# 
# 
# Created: Sep 2024, S. Shekar

# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# imports 
import numpy as np

 
# ----------------------------------------------------------------------------------------------------------------------
# compute_bus_conditions
# ----------------------------------------------------------------------------------------------------------------------
[docs] def compute_bus_conditions(bus, state, t_idx, delta_t): """ Computes the conditions of the bus based on the response of the battery modules. Parameters ---------- bus : ElectricalBus The electrical bus component with the following attributes: - tag : str Identifier for the bus - battery_modules : list List of battery modules connected to the bus - battery_module_electric_configuration : str Configuration of battery modules ('Series' or 'Parallel') state : State Current system state containing conditions for all components t_idx : int Current time index in the simulation delta_t : float Time step [s] Returns ------- None Notes ----- This function calculates the electrical properties of the bus based on the connected battery modules. It handles both series and parallel configurations of battery modules. For series configuration: - Voltage is the sum of all battery module voltages - Temperature and energy are averaged/summed across modules - State of charge is taken from the last battery module For parallel configuration: - Voltage is the same as the last battery module - Temperature and energy are averaged/summed across modules - State of charge is taken from the last battery module's cell The function also handles the fully charged state by setting charging current, power draw, and current draw to zero when the state of charge reaches 1.0. **Major Assumptions** * Battery modules are the primary energy source for the bus * In parallel configuration, all modules have the same voltage See Also -------- RCAIDE.Library.Methods.Powertrain.Distributors.Electrical_Bus.append_bus_conditions RCAIDE.Library.Methods.Powertrain.Energy_Storage.Battery.compute_battery_module_conditions """ bus_conditions = state.conditions.energy[bus.tag] phi = state.conditions.energy.hybrid_power_split_ratio if len(bus.battery_modules) != 0: if bus.battery_module_electric_configuration == 'Series': bm_conditions = [bus_conditions.battery_modules[bm.tag] for bm in bus.battery_modules] bus_conditions.voltage_open_circuit[t_idx] = sum(bm.voltage_open_circuit[t_idx] for bm in bm_conditions) bus_conditions.voltage_under_load[t_idx] = sum(bm.voltage_under_load[t_idx] for bm in bm_conditions) bus_conditions.heat_energy_generated[t_idx] = sum(bm.heat_energy_generated[t_idx] for bm in bm_conditions) bus_conditions.efficiency[t_idx] = (bus_conditions.power_draw[t_idx]*phi[t_idx] + bus_conditions.heat_energy_generated[t_idx])/(bus_conditions.power_draw[t_idx]*phi[t_idx]) if t_idx != state.numerics.number_of_control_points-1: bm_conditions = [bus_conditions.battery_modules[bm.tag] for bm in bus.battery_modules] bus_conditions.temperature[t_idx+1] = sum(bm.temperature[t_idx+1] for bm in bm_conditions)/ len(bus.battery_modules) bus_conditions.energy[t_idx+1] = sum(bm.energy[t_idx+1] for bm in bm_conditions) bus_conditions.state_of_charge[t_idx+1] = bm_conditions[-1].state_of_charge[t_idx+1] elif bus.battery_module_electric_configuration == 'Parallel': bm_conditions = [bus_conditions.battery_modules[bm.tag] for bm in bus.battery_modules] bus_conditions.heat_energy_generated[t_idx] = sum(bm.heat_energy_generated[t_idx] for bm in bm_conditions) bus_conditions.voltage_open_circuit[t_idx] = bm_conditions[-1].voltage_open_circuit[t_idx] bus_conditions.voltage_under_load[t_idx] = bm_conditions[-1].voltage_under_load[t_idx] bus_conditions.efficiency[t_idx] = (bus_conditions.power_draw[t_idx]*phi[t_idx] + bus_conditions.heat_energy_generated[t_idx])/(bus_conditions.power_draw[t_idx]*phi[t_idx]) if t_idx != state.numerics.number_of_control_points-1: bus_conditions.heat_energy_generated[t_idx] = sum(bm.heat_energy_generated[t_idx] for bm in bm_conditions) bus_conditions.temperature[t_idx+1] = sum(bm.temperature[t_idx+1] for bm in bm_conditions)/len(bus.battery_modules) bus_conditions.energy[t_idx+1] = sum(bm.energy[t_idx+1] for bm in bm_conditions) bus_conditions.state_of_charge[t_idx+1] = bm_conditions[-1].cell.state_of_charge[t_idx+1] if t_idx != state.numerics.number_of_control_points-1: # Handle fully charged state if state.conditions.energy.recharging and np.float16(bus_conditions.state_of_charge[t_idx+1]) == 1: bus_conditions.charging_current[t_idx+1] = 0 bus_conditions.power_draw[t_idx+1] = 0 bus_conditions.current_draw[t_idx+1] = 0 return