Heat Radiative
Quick Start
The amount of heat that flows radiatively depends on temperature and emissivity - and on the temperature difference between emitter and receiver.
Credits
This app is part of the trio of Conductive (Insulation and Flow), Convective and Radiative heat transfer.
Heat Radiative
//One universal basic required here to get things going once loaded
window.onload = function () {
//restoreDefaultValues(); //Un-comment this if you want to start with defaults
const queryString = window.location.search
if (queryString.length>0){
const urlParams = new URLSearchParams(queryString)
const T1 = urlParams.get('T1')
if (! isNaN(T1)) sliders.SlideT1.value=T1
const T2 = urlParams.get('T2')
if (! isNaN(T2)) sliders.SlideT2.value=T2
const eta1 = urlParams.get('eta1')
if (! isNaN(eta1)) sliders.Slideeta1.value=eta1
const eta2 = urlParams.get('eta2')
if (! isNaN(eta2)) sliders.Slideeta2.value=eta2
}
Main();
};
//Main() is hard wired as THE place to start calculating when inputs change
//It does no calculations itself, it merely sets them up, sends off variables, gets results and, if necessary, plots them.
function Main() {
//Save settings every time you calculate, so they're always ready on a reload
saveSettings();
//Send all the inputs as a structured object
//If you need to convert to, say, SI units, do it here!
const inputs = {
T1: sliders.SlideT1.value,
T2: sliders.SlideT2.value,
eta1: sliders.Slideeta1.value,
eta2: sliders.Slideeta2.value,
};
//Send inputs off to CalcIt where the names are instantly available
//Get all the resonses as an object, result
const result = CalcIt(inputs);
//Set all the text box outputs
document.getElementById('Peak1').value = result.Peak1;
document.getElementById('Emitted1').value = result.Emitted1;
document.getElementById('Peak2').value = result.Peak2;
document.getElementById('Emitted2').value = result.Emitted2;
document.getElementById('Flow').value = result.Flow;
//Do all relevant plots by calling plotIt - if there's no plot, nothing happens
//plotIt is part of the app infrastructure in app.new.js
if (result.plots) {
for (let i = 0; i < result.plots.length; i++) {
plotIt(result.plots[i], result.canvas[i]);
}
}
//You might have some other stuff to do here, but for most apps that's it for Main!
}
//Here's the app calculation
function CalcIt({T1, T2, eta1, eta2 }) {
const h=6.63E-34, c=3.00E+08,k=1.38E-23, Stefan=5.6703e-8
const kT1=k*T1, kT2=k*T2, hc2=2*h*c*c
const Emitted1=eta1*Stefan*Math.pow(T1,4)/1000 //to kW
const Emitted2=eta2*Stefan*Math.pow(T2,4)/1000 //to kW
const Flow=Stefan*Math.abs(Math.pow(T1,4)-Math.pow(T2,4))/(1/eta1+1/eta2-1) //keep in W
let Bz1um=[],Bz2um=[],Bz1,Bz2,v, Peak1=0,Max1=0, Peak2=0,Max2=0, iinc=0.01
for (i=0.2;i<=25;i+=iinc){ //Do the primary scan in μm
lambda=i/1e6
l5=Math.pow(lambda,5)
v=c/lambda
Bz1=eta1*hc2/l5/(Math.exp(h*v/kT1)-1)
if (Bz1>Max1){
Peak1=lambda
Max1=Bz1
}
Bz1um.push({x:lambda*1e6,y:Bz1})
Bz2=eta2*hc2/l5/(Math.exp(h*v/kT2)-1)
if (Bz2>Max2){
Peak2=lambda
Max2=Bz2
}
Bz2um.push({x:lambda*1e6,y:Bz2})
if (i > 1) iinc=0.1
}
const Max=Math.max(Max1,Max2)
for (i=0;i < Bz1um.length;i++){
Bz1um[i].y/=Max
Bz2um[i].y/=Max
}
//Integrated/=Bzcm.length
const plotData = [Bz1um,Bz2um]
const lineLabels = ["T1","T2"]
const myColors = T1 > T2 ?["orange","blue"]: ["blue","orange"]
const borderWidth = [2]
//Now set up all the graphing data detail by detail.
const prmap = {
plotData: plotData, //An array of 1 or more datasets
lineLabels: lineLabels, //An array of labels for each dataset
colors: myColors, //An array of colors for each dataset
hideLegend: false,
borderWidth: borderWidth,
xLabel: 'λ&μm', //Label for the x axis, with an & to separate the units
yLabel: 'Relative emission& ', //Label for the y axis, with an & to separate the units
y2Label: null, //Label for the y2 axis, null if not needed
yAxisL1R2: [], //Array to say which axis each dataset goes on. Blank=Left=1
logX: false, //Is the x-axis in log form?
xTicks: undefined, //We can define a tick function if we're being fancy
logY: false, //Is the y-axis in log form?
yTicks: undefined, //We can define a tick function if we're being fancy
legendPosition: 'top', //Where we want the legend - top, bottom, left, right
xMinMax: [,], //Set min and max, e.g. [-10,100], leave one or both blank for auto
yMinMax: [,], //Set min and max, e.g. [-10,100], leave one or both blank for auto
y2MinMax: [,], //Set min and max, e.g. [-10,100], leave one or both blank for auto
xSigFigs: 'F0', //These are the sig figs for the Tooltip readout. A wide choice!
ySigFigs: 'F2', //F for Fixed, P for Precision, E for exponential
};
//Now we return everything - text boxes, plot and the name of the canvas, which is 'canvas' for a single plot
return {
plots: [prmap],
canvas: ['canvas'],
Peak1: (Peak1*1e6).toFixed(1) + " μm",
Emitted1: Emitted1.toPrecision(3),
Peak2: (Peak2*1e6).toFixed(1) + " μm",
Emitted2: Emitted2.toPrecision(3),
Flow: Flow.toPrecision(3),
};
}
Wavelength-dependent emission
As the graph shows, the relative amount of energy emitted at any wavelength, λ, depends on the temperature of the emitter and its emissivity ε. The T-dependence is described by Planck's law which is best described by the frequency of the radiation, `ν=c/λ`. With the speed of light, c, Boltmann's constant k and Planck's constant h we have the frequency dependence of intensity, Iν at temperature T in °K:
`I_ν=ε((2hν^3)/c^2)1/(e^((hν)/(kT))-1)`
We show the curves for your two chosen temperatures and emissivities. As an approximate guide, anything dull and/or rough will have ε ~ 1 and anything shiny and smooth will be closer to ε = 0.02.
Radiative heat flow
The total heat flux Q in W/m² is given by the Stefan-Boltzmann equation, using Stefan's constant σ = 5.67e-8:
`Q=εσT^4`
The flux between two (planar) surfaces at T1 and T2 with ε1 and ε2 is given by:
`Q=(σ(T_1^4-T_2^4))/(1/ε_1+1/ε_2-1)`