Skip to content

Battery Dynamics and Lifecycle

This chapter details the electrochemical modeling, sizing constraints, and cyclic aging of hybrid battery packs, encapsulated in the core/battery.py module.


📄 File : core/battery.py

1. General Role: This module models the energy storage system of the aircraft (the battery). Unlike a simple fuel tank, a battery is a dynamic system whose voltage crashes when almost empty (Voltage Crash) and which suffers irreversible capacity degradation (aging) with each flight. The module is called at each time step by the mission integrator to verify if the power demanded by the motors is physically sustainable by the chemistry.

2. Strong Scientific & Economic Assumptions:

  • Simplified Thévenin Model: The battery is macroscopically modeled as an ideal voltage source (OCV, Open Circuit Voltage) in series with a purely ohmic internal resistance.
  • EoL Oversizing: The aircraft manufacturer must guarantee the airline that the aircraft will be able to perform its nominal mission on the very last day of the battery's life. The pack is therefore artificially oversized on Day 1 to compensate for the 20% capacity loss due to aging.
  • Empirical Aging Law: State of Health (SoH) degradation is non-linear. A flight that deeply drains the battery (high DoD) or demands violent power peaks (high C-rate) will damage it exponentially compared to a nominal cycle.

3. Dictionary of Constants & Parameters:

(Initial parameters depend on the chemistry selected from the database in config.py)

  • specific_energy : Mass energy density at the pack level (cells + packaging + BMS + cooling) [kWh/kg].
  • DoD : Maximum allowed Depth of Discharge. A battery is never emptied to 100% for thermal and chemical safety reasons.
  • eta : Overall round-trip energy efficiency.
  • eta_power : Instantaneous power efficiency, used as a mathematical proxy to estimate the internal resistance of the cells.

4. Functions and Internal Logic:

  • __init__(self, name, props)

    • Role: Initialize the battery chemistry.
    • Internal Logic: The code explicitly distinguishes between the overall energy efficiency eta (which penalizes the total amount of electrical energy stored during charging) and the power efficiency eta_power. The latter acts as a proxy for the circuit's internal resistance: it defines the instantaneous heating of the battery when a very strong current flows through it.
  • dynamic_discharge(P_elec_demand_kw, E_pack_nom_kwh, E_consumed_kwh)

    • Role: Calculate the actual chemical power extracted from the battery to provide the electrical power demanded by the inverters/motors, while managing the voltage crash.
    • Mathematics:

      1. Charging Mode (Regeneration): If the demanded power is negative (e.g., propeller windmilling in descent), the battery recharges. The efficiency \(\eta\) penalizes the stored energy:

        \[ P_{\text{chem}} = P_{\text{elec}} \cdot \eta \]
      2. Voltage Crash (OCV): In discharge, the Open Circuit Voltage (OCV) decreases with the State of Charge (SoC). The equation models a 25% voltage drop when the battery is completely empty:

        \[ V_{\text{ratio}} = 0.75 + 0.25 \cdot \text{SoC} \]
      3. Power Limit (Short-Circuit): According to the maximum power transfer theorem (Thévenin), the battery collapses (voltage drops to zero due to internal resistance) if more power is drawn than the theoretical maximum \(P_{\text{max}}\) :

        \[ P_{\text{max}} = \frac{E_{\text{nom}} \cdot V_{\text{ratio}}^2}{4 (1 - \eta_{\text{power}})} \]
      4. Pouillet's Law (Chemical Power): To provide \(P_{\text{elec}}\), the battery must extract a higher chemical power \(P_{\text{chem}}\) to compensate for Joule heating losses (\(R I^2\)). Solving the quadratic equation \(P_{\text{elec}} = P_{\text{chem}} - R \cdot (\frac{P_{\text{chem}}}{V_{OCV}})^2\) yields the root:

        \[ P_{\text{chem}} = 2 \cdot P_{\text{max}} \left( 1 - \sqrt{1 - \frac{P_{\text{elec}}}{P_{\text{max}}}} \right) \]
  • mass_for_energy(energy_chem_kwh, eol_soh) and mass_for_power(...)

    • Role: Size the mass of the battery pack (Bottom-Up) so that it is capable of performing the flight.
    • Mathematics: The calculated mass is artificially increased by dividing the gross requirement by the eol_soh parameter (which is generally 0.8 for 80%).

      \[ M_{\text{battery}} = \frac{\frac{E_{\text{req}}}{\text{DoD}}}{\text{SoH}_{\text{EoL}} \cdot \text{Density}} \]

      (Explanation: This massive oversizing guarantees that, even on its "worst day" before being retired from the aircraft (End of Life, when it has lost 20% of its nominal capacity), the battery will still have enough energy reserve and voltage to complete the flight in full regulatory safety).

  • flight_degradation(actual_dod, max_c_rate, base_cycle_life)

    • Role: Calculate the irreversible loss of state of health (\(\Delta \text{SoH}\)) caused by the wear of a single flight.
    • Mathematics: Aging depends exponentially on the battery's stress level. The empirical severity coefficients are chosen as \(k_{\text{DoD}} = 2.0\) (deep discharge stress) and \(k_C = 0.5\) (thermal stress from high currents, or C-rate). The number of equivalent cycles the battery could endure if all flights were identical to this one is:

      \[ N_{\text{cycles}} = N_{\text{base}} \cdot \left( \frac{\text{DoD}_{\text{nom}}}{\text{DoD}_{\text{act}}} \right)^2 \cdot \left( \frac{C_{\text{ref}}}{C_{\text{max}}} \right)^{0.5} \]

      The industry considers aeronautical end of life (EoL) at 80% remaining SoH, which represents a total wear of 20%. The microscopic SoH loss for this single flight is therefore the total wear distributed over the possible number of cycles:

      \[ \Delta \text{SoH} = \frac{0.20}{N_{\text{cycles}}} \]