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);
? ? }
? ? /*讀取數(shù)據(jù)
? ? 將上方數(shù)據(jù)讀入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) 函數(shù)可以把字符串 str 按照給定的分隔符 delim 進(jìn)行分隔
? ? ? ? token = strtok(row, ",");
? ? ? ? for (int j = 0; token != NULL; j++) {
? ? ? ? ? ? //讀取的是字符串,要的是double 用atof轉(zhuǎn)化過來
? ? ? ? ? ? arry[j][i] = atof(token);
? ? ? ? ? ? //printf("%0.2f\n",arry[j][i]);
? ? ? ? ? ? token = strtok(NULL, ",");
? ? ? ? }
? ? }
? ? fclose(fp);
? ??
? ? //熱傳導(dǎo)
? ? //double t[2002][2002];
? ? double **t;
? ? t = ( double? **)? malloc ( sizeof ( double? *) *2002); /*申請(qǐng)一組一維指針空間*/
? ? for (int i = 0; i < 2002; i ++)
? ? ? ? t[i] = ( double? *) malloc ( sizeof ( double ) * 2002);? /*對(duì)于每個(gè)一維指針,申請(qǐng)一行數(shù)據(jù)的空間*/
? ? clock_t startTime, endTime;? ?//并行時(shí)間
? ? 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);
? ? //計(jì)算
? ? 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);? //輸出并行時(shí)間
? ??
? ? 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;
}