Heat Exchanger Calcs
Model:
- Cleaned
- update, figuring out how battery works
CoolProp –> library used to obtain temp-dependent thermophysical properties (density, viscosity, thermal cond, cp, etc.) for both coolant and air.
Hand calcs (pretty messy):
Structure:
Setup & Inputs
Geometry: all physical dims—>radiator FPI, core size, cold plate channel width/height. hose ID, etc.
Fluids → tells CoolProp what fluids to use (like MEG-30% and Air).
Fans/Pump: simple two-point linear curves (shutoff head H0 and free-flow Q0
Conditions: t_air_in_c, t_cool_in_c, mph list
Masses: weight of cells, plate, and coolant (for transient model)
Heat Generation: Calculates the total watts (Q gen) the system has to reject. Joule + reversible heating + I^2R from busbars and collectors.
Liquid Loop Solver:
Finds operating point where the pump "push" = loop "resistance"
Push: Calculated by pump_head_m linear (pump curve).
Resistance: Calculated by get_loop_head_m. Adds up the pressure drop from hose, cold plate, radiator, friction + minor losses
dp functions use the darcy weisbach eqn for pressure drop. Friction factor 'f' is found by colebrook friction factor.
Air Loop Solver:
Finds the air flow operating point (in CFM) where "push" = "resistance."
Push: fan pressure single pa at cfm (fan curve) + get ram dp
Resistance: air system split dp at cfm sums up all the air-side losses:
intake dp pa: Loss at the inlet scoop.
mesh dp pa ergun hole: Uses the Ergun equation for flow through the porous mesh.
air duct dp pa: Darcy-Weisbach again for the duct friction.
radiator core air dp pa: pressure drop through the fin stack.
Heat Transfer Calcs:
Stop 1: Cell -> Coolant (get_coldplate_ua)
First, heat goes through the TIM and plate (contact chain r k per w).
Then it gets into the coolant. The convection coefficient 'h' inside the cold plate channels is found using the Dittus-Boelter equation.
Stop 2: Coolant → Air (get rad ua overall finned)
This finds the total UA for the radiator. It's a sum of resistances: R_liquid + R_wall + R_air
R_liquid (get rad liq h): Uses Dittus-Boelter again to find 'h' for the coolant inside the rad tubes.
R_air (get air h from cfm): Finds the air-side 'h' by:
Calculating air Re and Pr inside fin gaps
Using a Nusselt number correlation for parallel plates to find h
ua air finned from h then applies fin efficiency to get the final air-side UA
Final Rejection (get_rad_q)
Takes the total radiator UA and uses the epsilon-NTU method
It finds C_min and effectiveness to get final Q_rej
Transient analysis:
Lumped-capacity model. It treats the whole system (cells, plate, coolant) as one big object with one thermal mass
Output:
Heat Exchanger (Radiator):
Core of the thermal model. The goal is to find the radiator's total UA value (overall heat transfer coefficient x area).
UA os the inverse of total thermal resistance (R_th). "Total heat-moving ability." Higher UA = better cooling.
Model builds UA by adding 3 main resistances in series:
R_liquid (coolant ->tube):
How fast heat gets from coolant to the inside of tube wall
Dittus-Boelter equation.
It finds Nu=f(Re, Pr) for the coolant flow, which gives us the liquid-side heat transfer coefficient (h).
R_wall (through tube):
How fast heat conducts through the thin copper tube walls.
Standard conduction calc: R=t/(k*A)
R_air (tube → air):
the main bottleneck in the whole system.
We calculate the air-side h based on actual fin geometry (17 FPI)
It finds the air's Reynolds number (Re) in the tiny fin gaps (using D_h =2*S)
It then uses Nusselt number (Nu) correlation for parallel plates to get the air-side h
Finally it applies fin efficiency (eta_f) because the fin tips are always cooler than at the base
This gives the final, effective air-side UA
Final Rejection (Q_rej):
Once we have the total UA for the radiator, we use the Epsilon-NTU (eps-NTU) method to find the actual watts of heat it rejects
Incropera, Ch. 11
It finds C_min (the lowest heat capacity rate, which is almost always the air) and eps (the radiator's "effectiveness").
The final calc is: Q_rej=eps*C_min*(T_cool_in-T_air_in)
Some Comments:
Fans are currently placed before the radiator -> this is a pusher setup.
-> switch to a puller configuration (fans mounted after the radiator).
Ram air from driving helps push air through the radiator → fans work less at speed
Air gets pulled evenly through the whole radiator → better cooling performance
Lower risk of recirculation (air looping backward into the intake)
Overall → better airflow, better cooling margin
when pushers (fans before radiator) might be better:
Not enough room behind radiator
Fans can’t handle hot air after radiator
Want fans protected from debris/water
Condensation Risk
Decision: No expected condensation
Why: Condensation occurs if any exposed surface temperature < ambient dew‑point.
With t_air_in =23 C and t_cool_in =40 C, radiator fins and cold‑plate externals will sit > 30–38 °C, which is above typical Austin dew‑points (~14–22 C at 50–90% RH)
Interior of battery and coolant loop cannot condense (no humid air exposure)
External surfaces only risk if T_surface < dew point
Battery pack exterior stays warm during operation → very low risk
Radiator fins might “sweat” only in cool, humid conditions (harmless)
Result: No risk; margin > ~8 in typical conditions.
Inside coolant loop: sealed liquid path → no humid air → internal condensation correlations do not apply.
Inside battery pack: no free moisture and parts are hotter than coolant → no internal condensation.
Two‑phase condensation inside tubes: not present in this water‑glycol loop → ignore Dobson–Chato / inside‑tube correlations.
References:
[1] Incropera, DeWitt, Bergman, Lavine. Fundamentals of Heat and Mass Transfer, 7th ed.
- Ch.2–3 thermal resistance networks & conduction
- Ch.5 lumped-capacitance transients
- Ch.6–8 convection basics, Re/Pr/Nu, internal correlations (Dittus–Boelter, laminar 4.36)
- Ch.11 heat exchangers, ε–NTU framework (crossflow charts)
- Ch.12 radiation (linearized hr ≈ 4 σε T̄^3)
[2] Crane Co. Flow of Fluids Through Valves, Fittings, and Pipe (TP-410)
[3] Kays, London. Compact Heat Exchangers
[4] Ergun, S. “Fluid Flow Through Packed Columns,” Chem. Eng. Prog. 48 (1952)
[5] 1130061074-MIT.pdf / FSAE Electric Vehicle Cooling System Design / nbnfioulu-202001181034.pdf / Zips Electric - Cooling System
note:
spent a while digging through Incropera/ME 339 notes for the right equations and piecing the workflow together. all calcs built using textbook. used chat to turn equations into working code and clean up the structure/printout style.
Design modifications to improve thermal performance (probably wont):
Air path (fans & ducting)
Add additional fans
directly increases total cfm
adds weight, cost, electrical complexity/load
Specify fans with higher static pressure
better ability to push air through the high-resistance radiator core, improving cfm
less efficient and consume more power
Optimize duct geometry (smoother bends/better sealing)
lowers air-side pressure drop, again, more cfm
major packaging and integration challenge. redesign would impact mechanical interfaces.
Heat exchanger (radiator)
Add a second radiator
doubles heat rejection surface area
significant added weight (radiator + coolant), cost, plumbing complexity, and doubled failure points (leaks)
Thicker radiator core
increases fin surface area
dramatically increases air-side deltaP. could "stall" the existing fans, leading to less cfm
Radiator with larger frontal area
more surface area
packaging constraint
Liquid path (pump/plumbing/cold-plate)
Stronger pump (higher head/flow)
increases L/min → improves h
more power consumption
Larger diameter hoses
lowers liquid-side deltaP -> higher flow rate.
weight. larger total coolant volume
Re-design cold plate/manifolds (more channels, CFD-optimized)
improve flow distribution/ increase the cold plate's internal surface area.
high CAD/CFD/manufacturing effort. more/smaller channels would increase liquid-side deltaP, could overwhelm the low-power pump and reduce flow rate.
Workday 10/25:
**update* – I did not think of time-dependency
Lithium-ion battery thermal modelling and characterisation: A comprehensive review - ScienceDirect
Assumptions:
battery heat → constant
coolant flow → constant
airflow → constant
UA air-side/liquid-side → constant (computed once based on fixed temps)
How evolve the ss model → dynamic
accounts for battery heat generation changing with SOC, current, and surface temp
updates coolant loop performance so cell surface stays < 80 C
What needs to change
battery heat gen q_gen changing so that changes temp of cell surface
what drives battery generation:
entropic coefficient → based on chemistry, SOC, T
internal resistance → based on SOC, cell temp, cycle aging
pack current → throttle/load, regen braking, grade, speed, HVAC, pikes/accel/ drive-cycle effects
fluid properties then change
hydraulics: Re, f, dP change
airflow I will assume to remain constant because air-side is not affected by changing cell surface temp changing
ua of radiator: Re, Nu => h since coolant side changing
Solution??
add time loop around solver
add m*cp energy balance to update T_cell each step
drive with speed/current/SOC profiles
make R_internal (SOC,T) and dS (SOC,T) functions (start simple)
add guards/controls and validate with a few canned scenarios
Battery + Electrical Info
Cell type: Samsung INR21700-50S (NMC)
Pack layout: 9P32S → 288 cells
Nominal pack voltage: ~115–120 V
Max allowable cell surface temp: 80C
Internal resistance reference: ≤14 mΩ @ mid-SOC
Max discharge limits:
25A continuous without cooling cutoff
45A with cutoff at high temps
Vehicle Integration Info
BPS provides CAN signals for:
Current (0x103)
SOC (0x106)
Pack voltage (0x10D)
Motor controller CAN publishes:
Vehicle velocity (0x243) → for ram-pressure airflow
“If the battery is discharging over 30 min, how does temperature actually change each second
when SOC drops + cooling varies + speed changes?”
Real Condition | What Changes |
|---|---|
Speed up | More heat + ram airflow incr |
Hairpin turn / slow section | Ram airflow decr, heat still up |
Regen braking | Current flips sign, heat decr or even cooling |
SOC decrease | DCIR incr → heat incr over time |
Pack warms | Electrical resistance incr → heat incr further |
Q_gen → Heat depends on:
current draw (I)
internal resistance (R changes with SOC & temp)
electrochemistry (entropic heat)
→ ohmic heating + reversible heat
Control loop??????
if battery temp is low → slow pump
if battery temp is rising → increase speed
if near 80C → full send
Cooling performance changes when:
coolant heats up → viscosity drops → pump flows more
car speeds up → ram pressure → fans do less work
coolant flow changes → UA changes → better/worse cooling
→ feeds back every second
If the battery produces more heat than cooling can remove → temperature rises
If cooling > heat generation → temperature drops
model like a thermal capacitor: New Temp = Old Temp + (Qgen – Qrej) / (thermal mass)
SOC → as battery drains:
internal resistance goes up
entropic heat changes
voltage & current shift
ram pressure → more air to radiator → cooler battery at higher speed
So: lower speeds → battery heats, higher speeds → battery cools
I(t), SOC(t), T(t), Speed(t)
Trying to understand battery heat generation:
Joule heating increases from “struggle” of:
battery almost empty
battery getting hot
battery pushing a ton of power
battery aging
Entropic heating → chemical reactions releasing/absorbing heat
discharging (accelerating) → heats up
Regen braking → cools
Interconnection heating → busbars and welds have electrical resistance
bad welds → more heat
busbars thin → more heat
SOC = State of Charge → how full is the battery
“low SOC means more heat” → “an empty battery “struggles” harder and gets hotter”
Regen = Regenerative Braking
acceleration: battery → motor → wheels → car moves → battery loses energy
acceleration → discharge → heat
braking: wheels → motor → battery → car slows → battery gains energy
regen → charge → slight cooling
motor sends electricity back into the battery
Purpose
Predict transient pack temperature during race operation
Ensure battery cell surface temperature remains < 80°C
Inform cooling system sizing (fans, pump, radiator, ducting)
Support control strategy development for safe power output
Modeling Approach: Lumped Capacitance Method
Treat the entire pack (cells + cooling plate + coolant mass) as a single thermal node with uniform temperature:
m*cp*dT(t)/dt=Q_gen(t)−Q_rej(t)
Time Integration Loop:
Get I(t), SOC(t), and speed(t) from profiles.
Update fluid properties (CoolProp) → Re, f, dp, UA.
Compute Qgen and Qrej
Update cell temperature using energy balance.
Log temperature, SOC, and power each timestep.
What heat sources we model
Joule Heating
Entropic Heating: reversible thermal term v soc & temperature
Interconnect Resistances: included in pack losses
All vary with SOC, T, and current → dynamic behavior.
What cooling mechanisms we model
Liquid cooling via cold plate convection to coolant
Radiator exchange to airflow using eps–NTU method
Pump and fan performance vs operating point
Ram pressure contribution from vehicle velocity
Battery runs so long as:
SOC > minimum cutoff
temperature < 80C
voltage > safe limit
current < BMS fault
Battery heat generation:
Heat depends on:
Pack current (from drive cycle):
→ I2R lossesInternal resistance (DCIR) varies with:
SOC (battery empties → R incr)
Temperature (warmer cells → R incr)
Entropic heat varies with:
SOC
Temperature (positive when discharging, negative during regen)
Coolant performance:
CoolProp recalculates fluid properties vs new temps
rho(T) —> density,
mu(T) —> viscosity,
k(T), cp(T) —> thermal performance
This changes:
reynolds number, pressure drops, pump curve intersection, coolant flow rate
UA updates on coolant-side changes
Airflow performance:
fan curve + ram pressure from vehicle velocity
Benefit:
Cooling improves on straights
Cooling collapses in slow corners
SOC tracking:
Each timestep:
Integrate current → energy used
SOC drop causes:
OCV changes
DCIR increases → heat ↑ (late-race)
CAN signals: current, SOC, velocity
Samsung INR21700-50S → references for:
DCIR behavior
thermal limits
DCIR vs SOC & Temp → using assumed curve
OCV vs SOC curve → using generic NMC curve
Coolant inlet/outlet temp location on CAN
Fan control strategy (currently fixed fan)
Dynamic sim :
Every time step: get current & speed from a profile → update fluid properties → solve flows (coolant + air) → compute UA → get Q_reject → compute battery heat → lumped-capacitance temperature step on the pack → coulomb-count SOC. Logs everything.
Model placeholders + assumptions/guesses:
Battery Placeholders
OCV curve: ocv_from_soc(SOC)
Internal resistance model: rint_from_soc_T(SOC, Tcell_C)
Entropic heating coefficient: dUdT_from_soc_T(SOC, Tcell_C)
Thermal Contact Placeholders
TIM conductivity: tim_k_w_per_m_k
Contact heat transfer coefficients:
h_contact1_w_m2k
h_contact2_w_m2k
Coolant Loop Placeholders
Hose minor loss coefficient: hose_k_minors
Cold plate inflow/outflow minor losses: cp_inlet_K, cp_exit_K
Radiator tube K-losses (inlet, exit, bends)
Pump curve simplified as straight line: pump_h0_m, pump_q0_lh
Coolant fluid selection and mix ratio (assumed MEG-30%)
Air Path Placeholders
Fan curve simplification: fan_p0_pa, fan_q0_cfm
Mesh properties:
mesh_open_area
mesh_hole_d_m
Intake and exit minor loss coefficients:
intake_K
K_exit_to_amb
Duct minor loss coefficients:
duct_k_minors
duct_k_minors_dn
Dynamic Simulation Placeholders
Fake drive cycle: example_profile(t)
Arbitrary sim duration & dt settings (engineering pick not data-driven)
No battery degradation model (aging ignored)
No coolant mass outside cold plate included in C_th (lumped node assumption)
Dynamic model
New state variables (updated each time step)
Pack state of charge (SOC): between 0 and 1
Cell surface temperature: the main temperature node being solved
Coolant temperature(s): either inlet/outlet or a single averaged coolant node
Inputs each step
Pack Current, I_pack(t): from CAN data
Positive = discharge (driving)
Negative = regeneration (braking)
Air Inlet Temperature, T_air_in(t): may rise slightly with vehicle speed
Vehicle Speed, V_vehicle(t): used for ram-pressure airflow and fan loading
Lookup Curves
Open-circuit voltage (OCV) v SOC: U_ocv(SOC)
Internal resistance (DCIR) v SOC and temp: R_int(SOC, T)
Entropic coefficient: dU_ocv/dT(SOC, T)
Heat generation per time step
Per cell:
Joule (ohmic) heating
q_ohmic_cell = I_cell&2 × R_int(SOC, T_cell)Entropic (reversible) heating
q_entropic_cell = I_cell × T_cell × (dU_ocv/dT)(SOC, T_cell)
Behavior by operating mode
During discharge (I > 0): both terms usually produce heat.
During regeneration (I < 0): Joule heating still produces heat but entropic term can become negative → cell cools slightly.
Total heat per cell:
q_cell = q_ohmic_cell + q_entropic_cell
Total pack heat:
Q_pack = (n_cells × q_cell) + Q_bus + Q_collectors
Updating SOC
Pack’s SOC is updated by Coulomb counting
Pack capacity can be estimated from cell data:
- C_pack = 5.0 Ah per cell × 9P × 32S = 1440 Wh / 3.6 V ≈ 400 Ah
Change in SOC over time:
dSOC = - (I_pack × dt) / (C_pack × 3600)
SOC_next = clamp(SOC + dSOC, 0 to 1)
A negative current (regen) increases SOC
Temp evolution (lumped-cap)
cell surface temp treated as single lumped thermal node
Energy balance each step:
C_th_cell × dT_cell/dt = Q_pack – Q_reject
Where:
C_th_cell is the combined thermal mass
Q_pack is the electrical heat gen
Q_reject is the cooling power predicted by UA / epsilon-NTU
Explicit update:
T_cell_next = T_cell + (Δt / C_th_cell) × (Q_pack – Q_reject)
If heat generation exceeds cooling, the cell temperature rises → if cooling exceeds generation, the temperature drops.
Regen handling
Keep current sign consistent:
Discharge: I_pack > 0
SOC decreases
Entropic term typically adds heat
Regen: I_pack < 0
SOC increases
Entropic term may remove heat if dU_ocv/dT is negative
Summary:
At every time step:
Read current, speed, and inlet temp
Compute SOC update from coulomb count
Evaluate OCV, R_int, and dU/dT from lookup functions
Compute Q_pack from ohmic and entropic heat sources
Solve fluid flow (coolant and air) and compute Q_reject
Update cell temperature using lumped energy balance.
Log SOC, T_cell, Q_pack, Q_reject, and power data.
Pending:
Battery electrical placeholders
OCV vs SOC mapping
DCIR vs SOC + Temp curve
Entropic coefficient curve
Cooling system placeholders
Linearized pump & fan curves
what it currently can be used for:
quantify thermal margin vs speed and fan/pump duty
rank sensitivities (which knob moves T_cell the most: cfm, L/min, fpi, mesh)
provide bcs for CFD (air mass flow target, face-averaged h, coolant dT)
Current findings (R1)
Air side is the primary bottleneck in UA, liquid side has headroom
Puller fan placement after radiator should improve core utilization and reduce recirculation risk
Ram pressure meaningfully boosts CFM at speed; low-speed thermal margin is worst case