欢迎光临散文网 会员登陆 & 注册

3

2023-06-22 16:04 作者:释o怀灬  | 我要投稿

//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;

}


3的评论 (共 条)

分享到微博请遵守国家法律