Physics Simulation & Visualization Tool 0.1
A C++ physics simulation engine with real-time 3D visualization
Loading...
Searching...
No Matches
ThermalUtils.h
Go to the documentation of this file.
1#pragma once
2
3#include <algorithm>
4#include <cmath>
6
7namespace Physics::Thermal {
8
9constexpr double kMinTemperatureK = 0.0;
10constexpr double kMaxTemperatureK = 1.0e8;
11constexpr double kMinConductionDistance = 1.0e-9;
12constexpr double kMaxThermalStepSeconds = 60.0;
13constexpr double kMaxTemperatureStepK = 25.0;
14constexpr double kMaxTemperatureStepFraction = 0.02;
15
16double fourthPower(double value);
17double clampTemperature(double tempK);
18double linearTemperatureFactor(double coeffPerK, double tempK, double referenceTempK);
19double effectiveSpecificHeat(const ThermalProperties& props, double tempK);
20double effectiveConductivity(const ThermalProperties& props, double tempK);
21double effectiveEmissivity(const ThermalProperties& props, double tempK);
22double effectiveAbsorptivity(const ThermalProperties& props, double tempK);
23double effectiveDensity(const ThermalProperties& props, double tempK);
24double activeThermalMass(double massKg, const ThermalProperties& props);
25double heatCapacity(double massKg, const ThermalProperties& props);
26double thermalDiffusivity(const ThermalProperties& props, double tempK);
27double biotNumber(const ThermalProperties& props, double characteristicLengthM);
28double fourierNumber(const ThermalProperties& props, double characteristicLengthM, double elapsedSeconds);
29double carnotEfficiency(double hotTempK, double coldTempK);
30double specificEntropyChange(double specificHeatJPerKgK, double fromTempK, double toTempK);
31double convectionHeatRate(const ThermalProperties& props, double areaM2, double ambientTempK);
32double ambientRadiationHeatRate(const ThermalProperties& props, double areaM2, double ambientTempK);
33double externalHeatFluxRate(const ThermalProperties& props, double areaM2);
34double conductiveHeatRate(double conductivityA, double conductivityB, double areaM2, double distanceM, double tempAK, double tempBK);
35void applyThermalEnergy(ThermalProperties& props, double massKg, double energyJ);
36void applyConductiveExchange(ThermalProperties& a, double massA, ThermalProperties& b, double massB, double areaM2, double distanceM, double dt);
37
38template <typename HeatRateFn>
39void integrateTemperature(ThermalProperties& props, double massKg, double dt, HeatRateFn&& heatRateAtTemp) {
40 if (dt <= 0.0) return;
41 const double capacity = heatCapacity(massKg, props);
42 if (capacity <= 0.0) return;
43
44 double remaining = dt;
45 int guard = 0;
46 while (remaining > 0.0 && guard++ < 4096) {
47 const double rate = heatRateAtTemp(props.tempK);
48 if (!std::isfinite(rate) || rate == 0.0) break;
49
50 const double maxDelta = std::max(kMaxTemperatureStepK, std::abs(props.tempK) * kMaxTemperatureStepFraction);
51 const double stepByTemp = maxDelta * capacity / std::abs(rate);
52 const double subDt = std::min({remaining, kMaxThermalStepSeconds, stepByTemp});
53 if (subDt <= 0.0 || !std::isfinite(subDt)) break;
54
55 applyThermalEnergy(props, massKg, rate * subDt);
56 remaining -= subDt;
57 }
58}
59
60}
double specificEntropyChange(double specificHeatJPerKgK, double fromTempK, double toTempK)
double conductiveHeatRate(double conductivityA, double conductivityB, double areaM2, double distanceM, double tempAK, double tempBK)
double effectiveConductivity(const ThermalProperties &props, double tempK)
constexpr double kMaxTemperatureStepFraction
double effectiveAbsorptivity(const ThermalProperties &props, double tempK)
double convectionHeatRate(const ThermalProperties &props, double areaM2, double ambientTempK)
constexpr double kMaxThermalStepSeconds
void applyConductiveExchange(ThermalProperties &a, double massA, ThermalProperties &b, double massB, double areaM2, double distanceM, double dt)
constexpr double kMaxTemperatureK
void integrateTemperature(ThermalProperties &props, double massKg, double dt, HeatRateFn &&heatRateAtTemp)
double heatCapacity(double massKg, const ThermalProperties &props)
constexpr double kMinTemperatureK
Definition ThermalUtils.h:9
double activeThermalMass(double massKg, const ThermalProperties &props)
double effectiveSpecificHeat(const ThermalProperties &props, double tempK)
void applyThermalEnergy(ThermalProperties &props, double massKg, double energyJ)
double effectiveDensity(const ThermalProperties &props, double tempK)
constexpr double kMinConductionDistance
double externalHeatFluxRate(const ThermalProperties &props, double areaM2)
double thermalDiffusivity(const ThermalProperties &props, double tempK)
double ambientRadiationHeatRate(const ThermalProperties &props, double areaM2, double ambientTempK)
double biotNumber(const ThermalProperties &props, double characteristicLengthM)
double clampTemperature(double tempK)
double effectiveEmissivity(const ThermalProperties &props, double tempK)
constexpr double kMaxTemperatureStepK
double carnotEfficiency(double hotTempK, double coldTempK)
double fourthPower(double value)
double linearTemperatureFactor(double coeffPerK, double tempK, double referenceTempK)
double fourierNumber(const ThermalProperties &props, double characteristicLengthM, double elapsedSeconds)