aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--csci5451/ass1p6.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/csci5451/ass1p6.c b/csci5451/ass1p6.c
new file mode 100644
index 0000000..3b4a1bb
--- /dev/null
+++ b/csci5451/ass1p6.c
@@ -0,0 +1,93 @@
+#include <stdio.h>
+#include <stdlib.h>
+// HEAT TRANSFER SIMULATION
+//
+// Simple physical simulation of a rod connected at the left and right
+// ends to constant temperature heat/cold sources. All positions on
+// the rod are set to an initial temperature. Each time step, that
+// temperature is altered by computing the difference between a cells
+// temperature and its left and right neighbors. A constant k
+// (thermal conductivity) adjusts these differences before altering
+// the heat at a cell. Use the following model to compute the heat
+// for a position on the rod according to the finite difference
+// method.
+//
+// left_diff = H[t][p] - H[t][p-1];
+// right_diff = H[t][p] - H[t][p+1];
+// delta = -k*( left_diff + right_diff )
+// H[t+1][p] = H[t][p] + delta
+//
+// Substituting the above, one can get the following
+//
+// H[t+1][p] = H[t][p] + k*H[t][p-1] - 2*k*H[t][p] + k*H[t][p+1]
+//
+// The matrix H is computed for all time steps and all positions on
+// the rod and displayed after running the simulation. The simulation
+// is run for a fixed number of time steps rather than until
+// temperatures reach steady state.
+
+int main(int argc, char **argv) {
+ int max_time = 50; // Number of time steps to simulate
+ int width = 20; // Number of cells in the rod
+ double initial_temp = 50.0; // Initial temp of internal cells
+ double L_bound_temp = 20.0; // Constant temp at Left end of rod
+ double R_bound_temp = 80.0; // Constant temp at Right end of rod
+ double k = 0.5; // thermal conductivity constant
+ double **H; // 2D array of temps at times/locations
+
+ // Allocate memory
+ H = malloc(sizeof(double *) * max_time);
+ int t, p;
+ for (t = 0; t < max_time; t++) {
+ H[t] = malloc(sizeof(double *) * width);
+ }
+
+ // Initialize constant left/right boundary temperatures
+ for (t = 0; t < max_time; t++) {
+ H[t][0] = L_bound_temp;
+ H[t][width - 1] = R_bound_temp;
+ }
+
+ // Initialize temperatures at time 0
+ t = 0;
+ for (p = 1; p < width - 1; p++) {
+ H[t][p] = initial_temp;
+ }
+
+ // Simulate the temperature changes for internal cells
+ for (t = 0; t < max_time - 1; t++) {
+ for (p = 1; p < width - 1; p++) {
+ double left_diff = H[t][p] - H[t][p - 1];
+ double right_diff = H[t][p] - H[t][p + 1];
+ double delta = -k * (left_diff + right_diff);
+ H[t + 1][p] = H[t][p] + delta;
+ }
+ }
+
+ // Print results
+ printf("Temperature results for 1D rod\n");
+ printf("Time step increases going down rows\n");
+ printf("Position on rod changes going accross columns\n");
+
+ // Column headers
+ printf("%3s| ", "");
+ for (p = 0; p < width; p++) {
+ printf("%5d ", p);
+ }
+ printf("\n");
+ printf("%3s+-", "---");
+ for (p = 0; p < width; p++) {
+ printf("------");
+ }
+ printf("\n");
+ // Row headers and data
+ for (t = 0; t < max_time; t++) {
+ printf("%3d| ", t);
+ for (p = 0; p < width; p++) {
+ printf("%5.1f ", H[t][p]);
+ }
+ printf("\n");
+ }
+
+ return 0;
+}