Source code for RCAIDE.Library.Methods.Powertrain.Distributors.Electrical_Bus.append_bus_conditions
# RCAIDE/Methods/Energy/Distributors/Electrical_Bus/append_battery_conditions.py
#
# Created: Sep 2024, S. Shekar
# ----------------------------------------------------------------------------------------------------------------------
# IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# RCAIDE imports
import RCAIDE
from RCAIDE.Framework.Mission.Common import Conditions
# ----------------------------------------------------------------------------------------------------------------------
# METHODS
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def append_bus_conditions(bus,segment):
"""
Appends conditions for the electrical bus to the segment's energy conditions dictionary.
Parameters
----------
bus : RCAIDE.Library.Components.Distributors.ElectricalBus
Returns
-------
None
This function modifies the segment.state.conditions.energy dictionary in-place.
Notes
-----
This function creates a Conditions object for the electrical bus within the segment's
energy conditions dictionary, indexed by the bus tag. It initializes various bus
properties as zero arrays with the same length as the segment's state vector.
The initialized properties include:
- Battery module conditions
- Fuel cell stack conditions
- Power draw
- State of charge and depth of discharge
- Current draw and charging current
- Voltage (open circuit and under load)
- Heat energy generated
- Efficiency
- Temperature
- Energy
- Regenerative power
For segments with an initial battery state of charge specified, the function also
sets the initial energy and state of charge values accordingly.
See Also
--------
RCAIDE.Library.Methods.Powertrain.Distributors.Electrical_Bus.compute_bus_conditions
"""
ones_row = segment.state.ones_row
segment.state.conditions.energy[bus.tag] = Conditions()
segment.state.conditions.energy[bus.tag].battery_modules = Conditions()
segment.state.conditions.energy[bus.tag].fuel_cell_stacks = Conditions()
segment.state.conditions.energy[bus.tag].power_draw = 0 * ones_row(1)
segment.state.conditions.energy[bus.tag].hybrid_power_split_ratio = segment.hybrid_power_split_ratio * ones_row(1)
segment.state.conditions.energy[bus.tag].battery_fuel_cell_power_split_ratio = segment.battery_fuel_cell_power_split_ratio * ones_row(1)
segment.state.conditions.energy[bus.tag].state_of_charge = 0 * ones_row(1)
segment.state.conditions.energy[bus.tag].depth_of_discharge = 0 * ones_row(1)
segment.state.conditions.energy[bus.tag].current_draw = 0 * ones_row(1)
segment.state.conditions.energy[bus.tag].charging_current = 0 * ones_row(1)
segment.state.conditions.energy[bus.tag].voltage_open_circuit = 0 * ones_row(1)
segment.state.conditions.energy[bus.tag].voltage_under_load = 0 * ones_row(1)
segment.state.conditions.energy[bus.tag].heat_energy_generated = 0 * ones_row(1)
segment.state.conditions.energy[bus.tag].efficiency = 0 * ones_row(1)
segment.state.conditions.energy[bus.tag].temperature = 0 * ones_row(1)
segment.state.conditions.energy[bus.tag].energy = 0 * ones_row(1)
segment.state.conditions.energy[bus.tag].regenerative_power = 0 * ones_row(1)
# first segment
if 'initial_battery_state_of_charge' in segment:
initial_battery_energy = segment.initial_battery_state_of_charge*bus.maximum_energy
segment.state.conditions.energy[bus.tag].maximum_initial_energy = initial_battery_energy
segment.state.conditions.energy[bus.tag].energy = initial_battery_energy* ones_row(1)
segment.state.conditions.energy[bus.tag].state_of_charge = segment.initial_battery_state_of_charge* ones_row(1)
segment.state.conditions.energy[bus.tag].depth_of_discharge = 1 - segment.initial_battery_state_of_charge* ones_row(1)
return
[docs]
def append_bus_segment_conditions(bus,conditions,segment):
"""
Sets the initial bus properties at the start of each segment based on the last point from the previous segment.
Parameters
----------
bus : ElectricalBus
The electrical bus component for which conditions are being initialized.
conditions : dict
Dictionary containing conditions from the previous segment.
segment : Segment
The current mission segment in which the bus is operating.
Returns
-------
None
Notes
-----
This function initializes the power draw for the electrical bus at the start of a new segment
by transferring thermal power draw information from the previous segment. It handles power
requirements from battery thermal management systems (BTMS) and heat exchangers.
For segments with initial conditions from a previous segment, the function also:
1. Sets the battery discharge flag based on the segment type (false for recharge segments)
2. Transfers the final energy state from the previous segment to the initial state of the current segment
This ensures continuity of energy states between mission segments.
**Major Assumptions**
* Battery recharge segments are identified by their class type
* Power draw is initialized from thermal management components
See Also
--------
RCAIDE.Library.Methods.Powertrain.Distributors.Electrical_Bus.append_bus_conditions
RCAIDE.Library.Methods.Powertrain.Distributors.Electrical_Bus.compute_bus_conditions
"""
bus_conditions = conditions[bus.tag]
ones_row = segment.state.ones_row
bus_conditions.power_draw = 0 * ones_row(1)
# Thermal power draw
if segment.state.initials:
for network in segment.analyses.energy.vehicle.networks:
for coolant_line in network.coolant_lines:
for tag, item in coolant_line.items():
if tag == 'battery_modules':
for battery in item:
for btms in battery:
bus_conditions.power_draw[0,0] += segment.state.initials.conditions.energy[coolant_line.tag][btms.tag].power[-1]
if tag == 'heat_exchangers':
for heat_exchanger in item:
bus_conditions.power_draw[0,0] += segment.state.initials.conditions.energy[coolant_line.tag][heat_exchanger.tag].power[-1]
# Bus Properties
bus_initials = segment.state.initials.conditions.energy[bus.tag]
if type(segment) == RCAIDE.Framework.Mission.Segments.Ground.Battery_Recharge:
bus_initials.battery_discharge_flag = False
else:
bus_initials.battery_discharge_flag = True
bus_conditions.energy[0,0] = bus_initials.energy[-1,0]
return