General Question Simulate heat shield

marcogavazzeni

Addon Developer
Addon Developer
Joined
Jan 5, 2009
Messages
216
Reaction score
0
Points
16
Location
Near Verona
Website
orbiteritalia.forumotion.com
Hi guys
I have an idea,and want to know if i can achieve it.

Orbiter gives us the ability to use the spot light or point light by varying the intensity:

LightEmitter *le = AddPointLight (_V(0,-2.0,-29), 200, 1e-3, 0, 2e-3, col_d, col_s, col_a);
le->SetIntensityRef (&th_main_level);

It would be possible to transform the dynamic pressure in a level to simulate the heating of the shield?

double i20;

i20=GetDynPressure();

if (i20 < 0 ) i20= 0;
if (i20 > 100 ) i20= 1;

SpotLight *le1 = (SpotLight*)AddSpotLight (_V(0.0,-10.0,20), _V(0,0.3,-1.0), 150, 1e-3, 0, 1e-3, RAD*45, RAD*80, col_r, col_r, col_a);
le1->SetIntensity (i20);

But that does not work:facepalm:




 
Last edited:
aerodynamic Heatflux in W/m² is the product of dynamic pressure and velocity.

The light emission is in the best case just a black body radiation case of the heat flux, assuming the heat shield to be in equilibrium.
 
Marco, una pressione dinamica di 110000 pascal equivale sull'Eridanus ad una temperatura dello scudo termicodi 1200 gradi circa. che è il limite.. l'avevo calcolato tempo fa .. quindi la temperatura è uguale alla pressione dinamica diviso 91.6666!
 
That sounds awesome! Would be cool if anyone manages to solve this tricky stuff (unfortunatlay my programming-skills are just enough to install Orbiter :lol:)
 
Marco, una pressione dinamica di 110000 pascal equivale sull'Eridanus ad una temperatura dello scudo termicodi 1200 gradi circa. che è il limite.. l'avevo calcolato tempo fa .. quindi la temperatura è uguale alla pressione dinamica diviso 91.6666!
Si ma il mio problema è trasformare un certo range di pressione dinamica ad uno che venga usato per settare l'intensità da lvl o a lvl 1 o 10 non sò

---------- Post added 11-03-10 at 01:51 AM ---------- Previous post was 11-02-10 at 03:52 PM ----------

double heat=GetDynPressure();
if(heat<1000)shield_proc=0;
if(heat>5500)shield_proc=0.05;
if(heat>11000)shield_proc=0.1;
if(heat>16500)shield_proc=0.15;
if(heat>22000)shield_proc=0.20;
if(heat>27500)shield_proc=0.25;
if(heat>33000)shield_proc=0.30;
if(heat>38500)shield_proc=0.35;
if(heat>44000)shield_proc=0.40;
if(heat>49500)shield_proc=0.45;
if(heat>55000)shield_proc=0.50;
if(heat>60500)shield_proc=0.55;
if(heat>66000)shield_proc=0.60;
if(heat>71500)shield_proc=0.65;
if(heat>77000)shield_proc=0.70;
if(heat>82500)shield_proc=0.75;
if(heat>88000)shield_proc=0.80;
if(heat>93500)shield_proc=0.85;
if(heat>99000)shield_proc=0.90;
if(heat>104500)shield_proc=0.95;
if(heat>110000)shield_proc=1.0;

SpotLight* le1 =(SpotLight*)AddSpotLight(_V(0.0,-12.0,20), _V(0,0.5,-1.0), 50, 1e-3, 0, 1e-3, RAD*75, RAD*80, col_r, col_d, col_d);
le1->SetIntensityRef (&shield_proc);

:feedback:
 
I don't understand your Italian, but instead of all those if statements, why not:
Code:
shield_proc = min(heat/110000.0, 1.0);
 
Why don't you use a Q value (Enthalpy)?

This formula here:

aeroheatflux.png


gives you how much energy you get per second (J/s = Watt) per square meter (cross section), for a section of the heat shield. The variable [math]T_w[/math] is the outside wall temperature of the section. [math]T_\infty[/math] is the ambient air temperature, etc.

The complete heat balance of a volume cell (voxel) at the heat shield is:
heatbalance.png


Nothing surprising.

If you integrate the [math]\dot{Q}_{voxel}[/math] of the voxel over time (eg by RK4), you get the stored energy Q in the voxel, which you can then use for calculating temperature and thus, for calculating the spectrum of the radiative heat: from black body temperature, you can use a simple look-up table for getting the color and intensity of the radiation.

if you pay attention, the heating is not proportional to the dynamic pressure, but the heat flux.

Code:
hflux = 0.5*GetDynamicPressure() * velocity;


For the colors, see this one about the theory:

[ame="http://en.wikipedia.org/wiki/Black_body"]Black body - Wikipedia, the free encyclopedia[/ame]

The intensity of the light is not proportional to temperature, but proportional to [math]T_{w}^4[/math]
 
Last edited:
I don't understand your Italian, but instead of all those if statements, why not:
Code:
shield_proc = min(heat/110000.0, 1.0);

This formula is much better!:thumbup:
If i want from a higher value than zero?

Why don't you use a Q value (Enthalpy)?

This formula here:

aeroheatflux.png


gives you how much energy you get per second (J/s = Watt) per square meter (cross section), for a section of the heat shield. The variable [math]T_w[/math] is the outside wall temperature of the section. [math]T_\infty[/math] is the ambient air temperature, etc.

The complete heat balance of a volume cell (voxel) at the heat shield is:
heatbalance.png


Nothing surprising.

If you integrate the [math]\dot{Q}_{voxel}[/math] of the voxel over time (eg by RK4), you get the stored energy Q in the voxel, which you can then use for calculating temperature and thus, for calculating the spectrum of the radiative heat: from black body temperature, you can use a simple look-up table for getting the color and intensity of the radiation.

if you pay attention, the heating is not proportional to the dynamic pressure, but the heat flux.

Code:
hflux = 0.5*GetDynamicPressure() * velocity;


For the colors, see this one about the theory:

Black body - Wikipedia, the free encyclopedia

The intensity of the light is not proportional to temperature, but proportional to [math]T_{w}^4[/math]

I try changing the texture alpha channel to be able to find a right shade :rolleyes:


double heat = (0.5*GetDynPressure() * (GetAirspeed()))/100000;
shield_proc = min(heat/1200.0, 1.0);

SpotLight* le1 =(SpotLight*)AddSpotLight(_V(0.0,-12.0,20), _V(0,0.5,-1.0), 50, 1e-3, 0, 1e-3, RAD*75, RAD*80, col_r, col_d, col_d);
le1->SetIntensityRef (&shield_proc);
 
Alpha channel is just the transparency. You have to transform temperature to wavelength through the black body curve, and then wavelength to RGB triplet (see here http://www.magnetkern.de/spektrum.html)

EDIT: while the BBC gives out the whole emission spectrum, you can actually use the maximum by Wien's law.
 
Last edited:
This formula is much better!:thumbup:
If i want from a higher value than zero?
Many ways but an example:
Code:
const double max_proc = 1.0; // should always be 1.0
const double min_proc = 0.1; // range from 0 to max_proc
const double heat_at_min_proc = 1e3;
const double heat_at_max_proc = 1e5;

shield_proc = min_proc;
if (heat > heat_at_min_proc)
    shield_proc += min( (heat - heat_at_min_proc) * (max_proc - min_proc)/(heat_at_max_proc - heat_at_minproc), max_proc - min_proc;);
 
I don't understand your Italian, but instead of all those if statements, why not:
Code:
shield_proc = min(heat/110000.0, 1.0);

Because in Italian it sounds better. I mean, try whispering "una pressione dinamica di 110000 pascal equivale sull'Eridanus ad una temperatura dello scudo termico di 1200 gradi circa" in a girl's ear (provided she doesn't speak Italian). Success guaranteed!

... Or maybe you get your heatshield whacked. Whatever.
 
Because in Italian it sounds better. I mean, try whispering "una pressione dinamica di 110000 pascal equivale sull'Eridanus ad una temperatura dello scudo termico di 1200 gradi circa" in a girl's ear (provided she doesn't speak Italian). Success guaranteed!

... Or maybe you get your heatshield whacked. Whatever.
:lol:

depends on what you do with the girl

double heat = (0.5*GetDynPressure() * (GetAirspeed()))/100000;
if (heat>300)shield_proc=0.01;
if (heat<1200) shield_proc=1.0;
shield_proc = min(heat/1200.0, 1.0);
 
:lol: I'll try it with my wife tonight. She does talk French, but not Italian ;)
...code snipped...
You have a problem there for heat<300. I think you meant something like this...
Code:
if (heat<300) shield_proc=0.01;
else shield_proc = min(heat/1200.0, 1.0);
...or...
Code:
if (heat<300)shield_proc=0.01;
else if (heat>1200) shield_proc=1.0;
else shield_proc = heat/1200.0;
 
The light emission is in the best case just a black body radiation case of the heat flux, assuming the heat shield to be in equilibrium.


I haven't done any research into the matter, but off the top of the head I wouldn't just say it's a blackbody. The heatshild itself would be a blackbody due to obvious high thermal energies... but you have a lot of plasma around that might act like gasses that radiate when excited...

So I'd be careful with the guess...
 
The OP was talking about the heatshield. The dissociation of air and resultant nitrous oxides are quite well (for a sim) modelled by the orbiter itself...
 
Code:
hflux = 0.5*GetDynamicPressure() * velocity;

I thought velocity was cubed. In any case, for simulating "heat" in Orbiter you are going to end up with simplistic/semi-realistic results at best. Make good assumptions about your model and with fuzzy logic you should end up with a believable model to most.
 
i agree, computerex! I computed Antares capsule heat shield temperature by extracting it from a fraction of dynamic pressure!
 
I thought velocity was cubed. In any case, for simulating "heat" in Orbiter you are going to end up with simplistic/semi-realistic results at best. Make good assumptions about your model and with fuzzy logic you should end up with a believable model to most.

Dynamic Pressure is already [math]p_d = \frac{1}{2} \cdot \rho \cdot v^2[/math]
 
Back
Top