Sid 1 (6) Värmedistribution i plåt Introduktion Om vi med konstant temperatur värmer kanterna på en jämntjock plåt så kommer värmen att sprida sig och temperaturen i plåten så småningom stabilisera sig. I den här obligatoriska uppgiften ska du givet utseendet på en plåt och temperaturerna i kanterna av plåten beräkna temperaturerna i ett antal punkter på plåten. Formen på plåten är begränsad till att vara en rektangel. Den obligatoriska uppgiften ska lösas enskilt. Syfte Syftet med uppgiften är att träna på: Flerdimensionella arrayer Loopar Funktioner Dynamisk minnesallokering Egendefinierade datastrukturer Läsa data från filer Att använda programparametrar Uppgift Din uppgift är att skriva ett program som beräknar temperaturen i de inre punkterna i en rektangulär plåt, se exempel nedan. 3 3 3 3 3 5 1 t1 t2 t3 t4 5 1 t5 t6 t7 t8 5 1 t9 t10 t11 t12 5 1 t13 t14 t15 t16 5 1 4 4 4 4 4 Storleken på plåten och temperaturen i ytterkanterna ska kunna varieras. Vidare ska det vara möjligt att variera hur noggrant de inre temperaturerna ska beräknas, det ska ske via ett gränsvärde (se nedanstående algoritm för förtydligande). Samtliga parametrar ska läsas in från en fil, filens namn ska skickas in som en parameter till programmet. Förutom de slutliga temperaturerna ska det redovisas hur många iterationer som krävdes för att uppnå specificerad noggrannhet.
Sid 2 (6) Algoritm Temperaturen i de inre punkterna ska beräknas på följande sätt (tips: jämför med exempelutskrifterna sist i dokumentet): Öppna filen vars namn är givet som en programparameter Läs in värden från filen Skapa och initiera plåten, stoppa in yttertemperaturer samt ge alla inre punkter värdet 0 Skriv ut plåten med starttemperaturer Iterera sedan över varje inre punkt och låt varje punkt få en temperatur som är medelvärdet av de fyra närliggande punkterna (dvs. punkten ovan, punkten till höger, punkten under, punkten till vänster), beräkningar ska ske synkroniserat (dvs. samtliga punkters temperatur ska beräknas innan någon punkts temperatur uppdateras) Upprepa denna iteration tills den största skillnaden mellan två iterationssteg för någon punkt är mindre än eller lika med ett specificerat gränsvärde. Gränsvärdet är en övre gräns för hur stort fel du har i din lösning Skriv ut plåten med sluttemperaturer samt antalet iterationer som krävdes Inläsning av värden från fil De filer som ska läsas in har följande format: Varje fil består av sju rader med text. Varje rad inleds med ett namn på parametern direkt följt av ett kolon. Sist på raden står värdet på aktuell parameter. Värdet separeras från parameternamnet och kolonet med ett mellanslag. Nedan beskrivs parametrarna (i den ordning som de står i en fil) med avseende på namn, betydelse, godkända intervall för värdet, samt typ: rows antal rader, positivt heltal > 2 columns antal kolumner, positivt heltal > 2 northtemp temperatur i norr (-273 9999), decimaltal easttemp temperatur i öst (-273 9999), decimaltal southtemp temperatur i syd (-273 9999), decimaltal westtemp temperatur i väst (-273 9999), decimaltal limit gränsvärde (1 * 10-20 1), decimaltal En typisk fil kan se ut så här: rows: 5 columns: 7 northtemp: 4.3 easttemp: 3.1 southtemp: 2.7 westtemp: 0.9 limit: 0.00005
Sid 3 (6) För att förtydliga användandet av de fyra variablerna för kanttemperaturer (som aldrig ändras i beräkningarna) se figuren nedan (N = northtemp, E = easttemp, S = southtemp, W = westtemp). Det innebär till exempel att alla N här nedan har samma konstanta kanttemperatur northtemp. N N N N N E W t1 t2 t3 t4 E W t5 t6 t7 t8 E W S S S S S För att representera en plåt ska följande datatyper användas: typedef struct { double current; /* Aktuellt värde */ double next; /* Värde i nästa iteration */ } temperature; typedef struct { int rows; /* Antal rader i matrisen */ int columns; /* Antal kolumner i matrisen */ temperature ** matrix; /* Plåten med temperaturer */ double limit; /* Gränsvärde */ int iterations; /* Antal iterationer innan gränsvärdet nåtts */ } plate; Datatypen temperature ska användas för att representera temperaturer i plåten. current ska användas för att lagra punktens nuvarande temperatur, medan next används endast som en mellanlagringsplats när nästa iterations temperaturer håller på att beräknas. I datatypen plate ska matrix peka på en tvådimensionell array av temperature som har rows rader och columns kolumner (använd dynamisk minnesallokering för att skapa denna). Sist i detta dokument finns exempel på körning av programmet. Krav på lösningen Här nedan finns det ett antal krav som programmet ska uppfylla: Om plate1.txt är en fil med parametrar ska programmet kunna köras genom att plate1.txt används som en parameter till programmet ou3. Källkoden ska vara kommenterad. Kommentarerna ska tydliggöra hur programmet fungerar. Det ska finnas beskrivande text som förklarar programmets syfte och funktion, förväntad indata och utdata ska beskrivas. I den beskrivande texten ska du även skriva ditt namn och din cs-användare. Vidare ska det finnas beskrivande text för varje enskild funktion som förklarar vad funktionen gör, vad som krävs för att funktionen ska fungera korrekt och vilken effekt funktionen har. Källkoden ska vara väl indenterad. All utskrift på skärm ska se ut enligt nedanstående exempel (varje värde skrivs ut med %9.4f). De givna datatyperna får inte ändras och ska användas för att representera en plåt.
Sid 4 (6) Minne för matrisen i plåten ska allokeras dynamiskt med calloc eller malloc. Allt allokerat minne ska avallokeras, förslagsvis just innan programmet avslutas. Öppnade filer ska stängas, detta görs så fort filen inte ska användas mer. Programmet ska vara uppdelat i funktioner som har klart avgränsade ansvarsområden. Kommandona goto och longjmp får ej användas. Källkodsfilen ska heta ou3.c. Programmet ska kompileras med kompilatorn gcc med flaggorna Wall och std=c99. Resurser Till ert förfogande för att lösa uppgiften finns det ett antal datorer och ett antal handledningstillfällen i laborationssal (tider framgår i respektive grupps schema). Det är tillåtet att lösa laborationen på annan plats, till exempel hemma, men tänk på att programmet ska kompileras och vara körbart på institutionens linuxdatorer. Redovisning Uppgiften redovisas genom att lämna in källkodsfilen via webbgränssnittet, se adress på kursens hemsida, senast måndag den 29 oktober 17.00. Tips Här följer några tips som kan hjälpa till: Börja med att förstå uppgiften, vad ska göras, vilka krav finns det, vad ska lämnas in, etc. Skapa en algoritm för hela programmet. Utveckla programmet stegvis, en funktion/funktionalitet i taget. Fundera på i vilken ordning du ska implementera de olika delarna. Försök att testa varje steg utförligt innan nästa steg tas och kom ihåg att testa att tidigare steg fortfarande fungerar när nästa steg testas. När du vill ha hjälp av handledare, var beredd på att först förklara vad du vill uppnå/göra och hur du tänkt göra det i koden. För följande uppgifter är det lämpligt att skapa fristående funktioner: Givet ett filnamn, läsa in parametrarna från filen. Givet ett antal rader och kolumner skapa och returnera en datastruktur som representerar en tom plåt. Initiera plåten med starttemperaturer. Skriva ut temperaturerna i plåten. Uppdatera en datastruktur som representerar en plåt till att representera nästa iterations temperaturer. Avallokera det dynamiska minne en plåt använt.
Sid 5 (6) Exempel på utskrift Filerna som används i nedanstående exempel, plate1.txt, plate2.txt, plate3.txt och plate4.txt finns att ladda ned på kursens hemsida. ou3 plate1.txt 4.3000 4.3000 4.3000 4.3000 4.3000 4.3000 3.1000 0.9000 0.0000 0.0000 0.0000 0.0000 0.0000 3.1000 0.9000 0.0000 0.0000 0.0000 0.0000 0.0000 3.1000 0.9000 0.0000 0.0000 0.0000 0.0000 0.0000 3.1000 0.9000 2.7000 2.7000 2.7000 2.7000 2.7000 2.7000 4.3000 4.3000 4.3000 4.3000 4.3000 4.3000 3.1000 0.9000 2.6629 3.3427 3.6128 3.6843 3.5784 3.1000 0.9000 2.1090 2.7950 3.1243 3.2460 3.2295 3.1000 0.9000 2.0783 2.6042 2.8436 2.9458 2.9938 3.1000 0.9000 2.7000 2.7000 2.7000 2.7000 2.7000 2.7000 Antal iterationer = 43 ou3 plate2.txt 9999.0000 9999.0000 9999.0000 9999.0000 9999.0000 34.1000-273.0000-46.8000-46.8000-46.8000-46.8000-46.8000 9999.0000 9999.0000 9999.0000 9999.0000 9999.0000 34.1000-273.0000 4436.9571 5913.5143 5949.2775 4564.0803 34.1000-273.0000 2108.3143 3268.8223 3320.5156 2273.9436 34.1000-273.0000 1000.4778 1732.9452 1790.0188 1177.0787 34.1000-273.0000 433.6515 872.4620 929.5356 610.2525 34.1000-273.0000 134.6663 393.7157 445.4090 300.2957 34.1000-273.0000-15.7020 122.3257 158.0890 111.4212 34.1000-273.0000-46.8000-46.8000-46.8000-46.8000-46.8000 Antal iterationer = 186
Sid 6 (6) ou3 plate3.txt -46.3000-46.3000-46.3000-46.3000-46.3000-46.3000-3.1000-0.9000 0.0000 0.0000 0.0000 0.0000 0.0000-3.1000-0.9000 0.0000 0.0000 0.0000 0.0000 0.0000-3.1000-0.9000 0.0000 0.0000 0.0000 0.0000 0.0000-3.1000-0.9000-272.7000-272.7000-272.7000-272.7000-272.7000-272.7000-46.3000-46.3000-46.3000-46.3000-46.3000-46.3000-3.1000-0.9000-47.1652-69.7377-76.5460-70.0793-48.0808-3.1000-0.9000-71.7233-108.9395-120.0670-109.3904-72.8438-3.1000-0.9000-129.8883-174.2300-185.3921-174.5716-130.8038-3.1000-0.9000-272.7000-272.7000-272.7000-272.7000-272.7000-272.7000 Antal iterationer = 77 ou3 plate4.txt Antal iterationer = 1