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