blob: e02da1edf0c8ee377f17ca715892c3d188281716 [file] [log] [blame]
#include "hotspot.h"
#include <glibc_compat_rand.h>
#include <stdio.h>
#include <stdlib.h>
/* instead of printing all the values, we only print a part of array (every
100th value) */
#define PRINT_GAP 100
/* chip parameters */
double t_chip = 0.0005;
double chip_height = 0.016;
double chip_width = 0.016;
double amb_temp = 80.0;
void hotspotKernel(double result[grid_rows][grid_cols],
double temp[grid_rows][grid_cols],
double power[grid_rows][grid_cols], double Cap, double Rx,
double Ry, double Rz, double step, double ambTemp);
/* Transient solver driver routine: simply converts the heat
* transfer differential equations to difference equations
* and solves the difference equations by iterating
*/
void compute_tran_temp(double result[grid_rows][grid_cols],
double temp[grid_rows][grid_cols],
double power[grid_rows][grid_cols]) {
double grid_height = chip_height / grid_rows;
double grid_width = chip_width / grid_cols;
double Cap = FACTOR_CHIP * SPEC_HEAT_SI * t_chip * grid_width * grid_height;
double Rx = grid_width / (2.0 * K_SI * t_chip * grid_height);
double Ry = grid_height / (2.0 * K_SI * t_chip * grid_width);
double Rz = t_chip / (K_SI * grid_height * grid_width);
double max_slope = MAX_PD / (FACTOR_CHIP * t_chip * SPEC_HEAT_SI);
double step = PRECISION / max_slope;
hotspotKernel(result, temp, power, Cap, Rx, Ry, Rz, step, amb_temp);
}
int main(int argc, char **argv) {
/* allocate memory for the temperature and power array */
double(*temp)[grid_rows][grid_cols] =
malloc(grid_rows * grid_cols * sizeof(double));
double(*power)[grid_rows][grid_cols] =
malloc(grid_rows * grid_cols * sizeof(double));
double(*result)[grid_rows][grid_cols] =
malloc(grid_rows * grid_cols * sizeof(double));
if (!temp || !power || !result)
fprintf(stderr, "Unable to allocate memory");
glibc_compat_srand(SEED);
/* read initial temperatures and input power */
for (int i = 0; i < grid_rows; i++) {
double x = ((glibc_compat_rand()) % 512);
double y = ((glibc_compat_rand()) % 128) * 1e-6;
for (int j = 0; j < grid_cols; j++) {
(*temp)[i][j] = x + ((glibc_compat_rand()) % 128) * 1e-3;
(*power)[i][j] = y;
(*result)[i][j] = 0.0;
}
}
compute_tran_temp(*result, *temp, *power);
/* output results */
for (int i = 0; i < grid_rows; i++) {
for (int j = 0; j < grid_cols; j++) {
if ((i * grid_cols + j) % PRINT_GAP == 0) {
fprintf(stdout, "%g\n", (*result)[i][j]);
}
}
}
free(temp);
free(power);
return 0;
}