From 38e7c35937f0d62d803a6351823dd54ef04aeae7 Mon Sep 17 00:00:00 2001 From: Kai Chappell Date: Sat, 29 Mar 2025 17:04:13 +0000 Subject: [PATCH] Add self-heating visualisation --- src/py_dvt_ate/app/dashboard/app.py | 66 +++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/src/py_dvt_ate/app/dashboard/app.py b/src/py_dvt_ate/app/dashboard/app.py index df6a06e..1630d9d 100644 --- a/src/py_dvt_ate/app/dashboard/app.py +++ b/src/py_dvt_ate/app/dashboard/app.py @@ -89,6 +89,68 @@ def display_thermal_chart() -> None: ) +def display_self_heating_panel() -> None: + """Display self-heating demonstration panel.""" + engine: PhysicsEngine = st.session_state.engine + history: SimulationHistory = st.session_state.history + + thermal = engine.get_thermal_state() + electrical = engine.get_electrical_state() + + # Calculate temperature rises + delta_t_jc = thermal.junction_temperature - thermal.case_temperature + delta_t_ca = thermal.case_temperature - thermal.chamber_temperature + + col1, col2 = st.columns(2) + + with col1: + st.markdown("#### Self-Heating Analysis") + + # Display thermal resistance info + st.markdown( + f""" + | Parameter | Value | + |-----------|-------| + | Junction-Case Rise (ΔT_jc) | **{delta_t_jc:.2f} °C** | + | Case-Ambient Rise (ΔT_ca) | **{delta_t_ca:.2f} °C** | + | Power Dissipation | {electrical.power_dissipation * 1000:.1f} mW | + | θ_jc (junction-case) | 15 °C/W | + | θ_ca (case-ambient) | 5 °C/W | + """ + ) + + st.markdown( + """ + **Thermal Coupling:** The junction temperature rises above the case + temperature due to power dissipation. This is governed by: + + `T_junction = T_case + P_diss × θ_jc` + + Try increasing the load current or input voltage to see + self-heating effects! + """ + ) + + with col2: + st.markdown("#### Power Dissipation") + + if len(history.time) < 2: + st.info("Start the simulation to see power data") + return + + power_data = { + "Time (s)": list(history.time), + "Power (mW)": [p * 1000 for p in history.power_dissipation], + } + + st.line_chart( + power_data, + x="Time (s)", + y="Power (mW)", + color="#2ca02c", + ) + + def display_current_state() -> None: """Display current simulation state metrics.""" engine: PhysicsEngine = st.session_state.engine @@ -222,6 +284,10 @@ def main() -> None: st.subheader("Temperature History") display_thermal_chart() + # Self-heating demonstration + st.subheader("Self-Heating Demonstration") + display_self_heating_panel() + # Auto-refresh when running if st.session_state.running: step_simulation(steps=10)