Heat Exchanger Calcs

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:

image-20251023-155923.png

 

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:

    1. 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).

    2. R_wall (through tube):

      • How fast heat conducts through the thin copper tube walls.

      • Standard conduction calc: R=t/(k*A)

    3. 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??

  1. add time loop around solver

  2. add m*cp energy balance to update T_cell each step

  3. drive with speed/current/SOC profiles

  4. make R_internal (SOC,T) and dS (SOC,T) functions (start simple)

  5. 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

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:

  1. Get I(t), SOC(t), and speed(t) from profiles.

  2. Update fluid properties (CoolProp) → Re, f, dp, UA.

  3. Compute Qgen and Qrej

  4. Update cell temperature using energy balance.

  5. 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 losses

  • Internal 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:

  1. Read current, speed, and inlet temp

  2. Compute SOC update from coulomb count

  3. Evaluate OCV, R_int, and dU/dT from lookup functions

  4. Compute Q_pack from ohmic and entropic heat sources

  5. Solve fluid flow (coolant and air) and compute Q_reject

  6. Update cell temperature using lumped energy balance.

  7. 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