Source code for RCAIDE.Library.Mission.Segments.Ground.Battery_Charge_Discharge
# RCAIDE/Library/Missions/Segments/Ground/Battery_Charge_Discharge.py
#
#
# Created: Jul 2023, M. Clarke
import RCAIDE
from RCAIDE.Framework.Core import Units
import numpy as np
# ----------------------------------------------------------------------------------------------------------------------
# Initialize Conditions
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def initialize_conditions(segment):
"""
Initializes conditions for battery charging or discharging on ground
Parameters
----------
segment : Segment
The mission segment being analyzed
- cutoff_SOC : float
Target state of charge to reach [-]
- cooling_time : float
Additional time for battery cooling [s]
- initial_battery_state_of_charge : float, optional
Initial SOC if no previous segment [-]
- analyses:
energy:
vehicle:
networks : list
List of power networks
Each network contains:
- busses : list
List of electrical busses
Each bus contains:
- charging_c_rate : float
Battery charging C-rate [-]
- battery_modules : list
List of battery modules
For discharging segments:
- time : float
Duration of discharge [s]
Returns
-------
None
Updates segment conditions directly:
- conditions.frames.inertial.time [s]
Notes
-----
This function sets up the initial conditions for a ground segment involving
battery charging or discharging. For charging segments, the charging time is
determined by the battery with the lowest state of charge.
**Calculation Process**
For charging:
1. Find lowest battery state of charge
2. Calculate charging time based on:
t = (SOC_target - SOC_current) / C_rate
3. Add cooling time
4. Discretize time points
For discharging:
1. Use specified discharge time
2. Discretize time points
**Major Assumptions**
* Charging time determined by lowest SOC battery
* Constant C-rate charging
* Linear SOC increase during charging
* Uniform cooling time added
See Also
--------
RCAIDE.Framework.Mission.Segments
"""
t_nondim = segment.state.numerics.dimensionless.control_points
if isinstance(segment, RCAIDE.Framework.Mission.Segments.Ground.Battery_Recharge):
for network in segment.analyses.energy.vehicle.networks:
time = []
for bus in network.busses:
t=0
if segment.state.initials.keys():
end_of_flight_soc = 1
for battery_module in segment.state.conditions.energy[bus.tag].battery_modules:
end_of_flight_soc = min(end_of_flight_soc,battery_module.cell.state_of_charge[-1])
else:
end_of_flight_soc = segment.initial_battery_state_of_charge
t = max(((segment.cutoff_SOC-end_of_flight_soc) / bus.charging_c_rate )*Units.hrs , t)
t += segment.cooling_time
time.append(t)
t_initial = segment.state.conditions.frames.inertial.time[0,0]
t_nondim = segment.state.numerics.dimensionless.control_points
time = np.max(time)
charging_time = t_nondim * ( time ) + t_initial
segment.state.conditions.frames.inertial.time[:,0] = charging_time[:,0]
else:
t_initial = segment.state.conditions.frames.inertial.time[0,0]
t_nondim = segment.state.numerics.dimensionless.control_points
time = t_nondim * ( segment.time ) + t_initial
segment.state.conditions.frames.inertial.time[:,0] = time[:,0]