3
//gcc -o heat heat.c -fopenmp
// ./heat 4
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<string.h>
#include<unistd.h>
#include<malloc.h>
#include<omp.h>
int main(int argc,char** argv){
/*打开文件*/
FILE* fp = fopen("input.csv", "r");
if (fp == NULL) {
fprintf(stderr, "fopen() failed.\n");
exit(EXIT_FAILURE);
}
/*读取数据
将上方数据读入arry[0][]中,其他以此类推*/
char row[800];
char* token;
double arry[4][2000];
//fgets是一行一行来读取csv文件 读到row中
for (int i = 0; fgets(row, 80, fp) != NULL; i++) {
//char* strtok(char* restrict str, const char* restrict delim) 函数可以把字符串 str 按照给定的分隔符 delim 进行分隔
token = strtok(row, ",");
for (int j = 0; token != NULL; j++) {
//读取的是字符串,要的是double 用atof转化过来
arry[j][i] = atof(token);
//printf("%0.2f\n",arry[j][i]);
token = strtok(NULL, ",");
}
}
fclose(fp);
//热传导
//double t[2002][2002];
double **t;
t = ( double **) malloc ( sizeof ( double *) *2002); /*申请一组一维指针空间*/
for (int i = 0; i < 2002; i ++)
t[i] = ( double *) malloc ( sizeof ( double ) * 2002); /*对于每个一维指针,申请一行数据的空间*/
clock_t startTime, endTime; //并行时间
startTime = clock();
//初始化
for (int i = 0; i < 2002; i++) {
for (int j = 0; j < 2002; j++) {
if (i == 0 && j != 0 && j != 2001) { //上方
t[i][j] = arry[0][j-1];
}
else if (i == 2001 && j != 0 && j != 2001) {//下方
t[i][j] = arry[1][j-1];
}
else if (j == 0 && i != 0 && i != 2001) {//左方
t[i][j] = arry[2][i-1];
}
else if (j == 2001 && i != 0 && i != 2001) {//右方
t[i][j] = arry[3][i-1];
}
else {
t[i][j] = 0;
}
}
}
int thread_count = strtol(argv[1],NULL,10);
//计算
int k = 1;
while (k <= 200) {
#pragma omp parallel for num_threads(thread_count) schedule(dynamic) shared(t)
for (int i = 1; i < 2001; i++) {
for (int j = 1; j < 2001; j++) {
t[i][j] = (t[i - 1][j] + t[i + 1][j] + t[i][j - 1] + t[i][j + 1]) / 4;
}
}
k++;
}
endTime = clock();
printf("Time: %fs\n\n", (double)(endTime - startTime)/CLOCKS_PER_SEC); //输出并行时间
FILE *op = fopen("output.csv", "w+");
if (op == NULL) {
fprintf(stderr, "fopen() failed.\n");
exit(EXIT_FAILURE);
}
for (int i = 1; i < 2001; i++) {
for (int j = 1; j < 2001; j++) {
fprintf(op, " %0.2f ", t[i][j]);
}
fprintf(op, "\n");
}
fclose(op);
return 1;
}