Umu logo

Umeå universitet
Teknisk-naturvetenskaplig fakultet
Institutionen för datavetenskap

Programmeringsteknik - Obligatorisk Uppgift 4: Tillämpning - Simulering av värmespridning i en metallplåt


Programmeringsteknik, 4p vt00

Introduktion

Denna obligatoriska uppgift går ut på att simulera hur värme sprider sig i en fyrkantig plåtbit. Man värmer (eller kyler) plåten från dess fyra kanter -- North, East, West och South (NEWS). Värmen sprider sig sedan genom plåten med olika hastighet beroende på bland annat hur mycket man värmer/kyler, vilket material plåten är gjord av och dess tjocklek.
Plåten är i sin tur gjord av fyra stycken mindre plåtbitar av olika material som har satts ihop. De olika materialen reagerar olika på värme och därför kommer värmen inte att sprida sig likformigt över hela plåten. Värmespridningen kommer också att påverkas av att plåtens fyra delar är olika tjocka -- värmen kommer att sprida sig långsammare där plåten är tjockare (eftersom vi inte tar hänsyn till att kontaktytan mellan två tjocka plåtar är större än mellan två tunna - i verkligheten sprider sig värme fortare genom en tjock plåt).


Teori

Värmeflödet i vår plåt är ganska svårt att beskriva analytiskt, däremot går det bra att simulera genom att dela upp plåten i många små delar (rutor), och behandla varje del som om den har ett visst värmeinnehåll och en enda temperatur. Energiinnehållet i en ruta beror på materialets specifika värmekapacitet, dess temperatur och dess massa, och flödet mellan två rutor beror på temperaturskillnaden dem emellan (här förenklar vi verkligheten en smula). När värmeflödet simuleras är det lämpligt att utöra detta i ett antal diskreta tidssteg, där man i varje tidssteg går igenom alla rutor och för varje ruta beräknar hur mycket energi som finns (mha massa, material och temperatur), hur mycket värmeenergi som försvinner/kommer in via de omgivande rutorna (mha temperaturskillnaden) och till sist den nya temperaturen (mha energiinnehåll, material och massa). Anta att temperaturen ändrar sig så lite vid varje steg att det inte spelar någon roll att en del rutor simuleras före de andra. Observera att temperatur i in- och utdatafiler anges i grader Celsius, så du måste ta hänsyn till detta när du räknar.

Bra formler att ha:

Värmeenergi i en ruta E = V * d * c * T
Värmeöverföring mellan rutor dE = k * dT * dt

där

E är en rutas värmeinnehåll [Joule]
c är materialets specifika värmekapacitet (en konstant som beror på materialet) [Joule/(Kg *Kelvin)]
T är rutans temperatur i Kelvin (Celcius + 273)
V är rutans volym [m3]
d är materialets densitet [Kg/m3]
dE är den mängd energi som förs över vid varje steg [Joule]
dT är temperaturskillnaden mellan rutorna [Kelvin]
dt är tidssteget i simuleringen [sekunder]
k är en konstant som beskriver 'motståndet' för värmen vid övergången [Joule/Kelvin] ( = 1.0 )

Exempel på plåt, 6 x 6 rutor med fyra olika material

 

N

 

E

           
           
           
           
           
           

W

 

S

 


Representation av plåten / datatyper

Plåten skall representeras av en m x n matris (m rader, n kolumner). Varje element i matrisen skall innehålla den nuvarande temperaturen i den delen av plåten, vilken värmekapacitet och densitet materialet har och hur tjock plåten är på det stället. Varje element i matrisen skall bestå av denna datatyp:

typedef struct
{
   double temperatur; /* nuvarande temperatur i "rutan", i grader Celsius */
   double varmeKapacitet; /* specifik värmekapacitet, Joule/(Kg *Kelvin) */
   double densitet;     /* materialets densitet, Kg/m3 */
   double tjocklek; /* tjockleken på "rutan", mm */
} Ruta;

Eftersom du kommer att läsa in hur stor matrisen kommer att vara från en fil måste du kunna spara matrisen oberoende av storlek (läs: du får inte använda en tvådimensionell array, matrisen skall representeras dynamiskt). Lämpligt är att även representera hela plåten i en struct, på så vis följs matris och dimensioner mm genom hela programmet.


Indata


Du kommer alltså att läsa in allt indata från en fil. Filen kommer att ha detta format (text i fet stil är kommentarer och hör inte till filen):

m n matrisens storlek
t tid mellan simuleringsomgångarna [sekunder]
N E W S temperaturen vid plåtens kanter [Celsius ]
T  plåtens temperatur vid simuleringens start [Celsius]
c1 d1 s1 specifik värmekapacitet, densitet, tjocklek i plåtdel 1 [Joule / (Kg * Kelvin)], [Kg / m3], [mm]
c2 d2 s2 specifik värmekapacitet, densitet, tjocklek i del 2
c3 d3 s3 specifik värmekapacitet, densitet, tjocklek i del 3
c4 d4 s4 specifik värmekapacitet, densitet, tjocklek i del 4

Exempel på indatafil:

10 10
1.0
40.0 30.0 45.0 15.5
25.0
449.0 7870.0 7.5
444.0 8900.0 10.8
903.0 2700.0 15.0
236.0 10500.0 8.0

Några värmekapacitetsvärden och densiteter för olika metaller

  [Joule / (Kg * Kelvin)] [Kg / m3]
Järn 449 7870
Nickel 444 8900
Bly 130 11350
Aluminium 903 2700
Silver 236 10500
Guld 129 19320
Koppar 385 8960
Magnesium 1024 1740
Titan 522 4540


Utdata

För att kunna se hur värmen sprider sig i plåten skulle det normalt behövas en hel del grafik-programmering, något som vi inte lär ut på kursen. Vi kommer därför att tillhandahålla ett 'visualiseringsprogram' skrivet i Java som kan läsa data från din simulering och visa temperaturfördelningen som en bild av plåten i färg. För att programmet skall fungera måste all temperaturdata från varje simuleringssteg sparas i en fil i ett visst format. Filen kan heta vad som helst, filnamnet anges som en parameter till Java-programmet. Se längst ned på sidan för instruktioner.

Filens format:

nsim antal simuleringssteg
t tid mellan simuleringsomgångarna [sekunder]
m n matrisens storlek
N E W S temperaturen vid plåtens kanter [Celsius]
T plåtens temperatur vid simuleringens start [Celsius]
t1 t2 ... tnm temperaturen för alla element i matrisen, radvis, innan simuleringen startar [Celsius]
t1 t2 ... tnm temperaturen för alla element i matrisen, radvis, efter simuleringsomgång 1
t1 t2 ... tnm temperaturen för alla element i matrisen, radvis, efter simuleringsomgång 2
...
t1 t2 ... tnm temperaturen för alla element i matrisen, radvis, efter simuleringsomgång nsim

(totalt i filen nsim+ 6 rader)

Exempel på utdatafil:

10
1.0
3 3
40.00 40.00 40.00 40.00
25.0
25.00 25.00 25.00 25.00 25.00 25.00 25.00 25.00 25.00
30.53 28.03 32.64 28.03 24.23 29.70 32.64 29.70 35.63
34.20 33.02 35.84 33.02 31.73 36.12 35.84 36.12 38.19
36.63 36.21 38.20 36.21 36.40 38.31 38.20 38.31 39.20
38.18 38.30 39.20 38.30 38.40 39.25 39.20 39.25 39.65
39.20 39.25 39.65 39.25 39.29 39.67 39.65 39.67 39.84
39.65 39.67 39.84 39.67 39.69 39.85 39.84 39.85 39.93
39.84 39.85 39.93 39.85 39.86 39.93 39.93 39.93 39.97
39.93 39.93 39.97 39.93 39.94 39.97 39.97 39.97 39.99
39.97 39.97 39.99 39.97 39.97 39.99 39.99 39.99 39.99
39.99 39.99 39.99 39.99 39.99 39.99 39.99 39.99 40.00


Uppgift


Tips


Rapport

Det finns en utförligare specifikation till rapporten här.

Lämna rapporten i röda brevlådan (märkt A-kurser) utanför institutionen eller i Tobias Vesterlunds / Rikard Skelanders brevfack.


För att titta på ditt simuleringsresultat måste du ha Java på den maskin du använder (finns installerat på datorerna i labben). Hämta följande filer och lägg dem i ett eget directory (mapp) tillsammans med din resultatfil

Öppna ett DOS-fönster (Start -> Programs -> Command prompt), gå till mappen med .class-filerna och skriv:

java Visa <filnamn (obs glöm inte '<' -tecknet)

där filnamn är namnet på din resultatfil (outfile.dat heter testfilen). Obs att Visa måste stavas med stor bokstav.



Det finns även ett excellent visningsprogram i matlab skrivet av

--> Niclas Wikström <--
--> Teknisk Fysik F98 <--
--> email: niclas_w@acc.umu.se

Hämta m-filen här och kör den i Matlab ! Instruktioner finns i filen.



Inlämnas senast: Fredag 10/3-00 klockan 12.00