www.pudn.com > seidel.rar > seidel.c


#include "stdio.h"
#include "stdlib.h"
#include "mpi.h"
#include "math.h"
#define E 0.0001
#define a(x,y) a[x*size+y]
#define b(x) b[x]
#define v(x) v[x]
/*A为size*size的系数矩阵*/
#define A(x,y) A[x*size+y]
#define B(x) B[x]
#define V(x) V[x]
#define intsize sizeof(int)
#define floatsize sizeof(float)
#define charsize sizeof(char)

int size,N;
int m;
float *B;
float *A;
float *V;
int my_rank;
int p;
MPI_Status status;
FILE *fdA,*fdB,*fdB1;
int i,j,my_rank,group_size;
int k;
float *sum;
float *b;
float *v;
float *a;
float *differ;
float temp;
int iteration,total,loop;
int r,q;

/*
 * 函数名:Environment_Finalize
 * 功能:释放各个进程的a,b,v
 */
void Environment_Finalize(float *a,float *b,float *v)
{
    free(a);
    free(b);
    free(v);
}

/*
 * 函数名: read_data()
 * 功能:读取数据
 */
void read_data()
{
    if(my_rank==0)
    {
        /*打开数据文件*/
        fdA=fopen("dataIn.txt","r");
        fscanf(fdA,"%d %d", &size, &N);
        if (size != N-1)
        {
            printf("the input is wrong\n");
            exit(1);
        }

        /*分配空间*/
        A=(float *)malloc(floatsize*size*size);
        B=(float *)malloc(floatsize*size);
        V=(float *)malloc(floatsize*size);

        /*初始化矩阵A和向量B*/
        for(i = 0; i < size; i++)
        {
            for(j = 0; j < size; j++)
                fscanf(fdA,"%f", A+i*size+j);
            fscanf(fdA,"%f", B+i);
        }

        /*初始化向量V*/
        for(i = 0; i < size; i ++)
            fscanf(fdA,"%f", V+i);

        /*关闭数据文件*/
        fclose(fdA);

        /*输出数据文件信息*/
        printf("Input of file \"dataIn.txt\"\n");
        printf("%d\t%d\n", size, N);

        /*输出矩阵A和向量B的值*/
        for(i = 0; i < size; i ++)
        {
            for(j = 0; j < size; j ++)
                printf("%f\t",A(i,j));
            printf("%f\n",B(i));
        }

        printf("\n");

        /*输出解向量V的值*/
        for(i = 0; i < size; i ++)
            printf("%f\t", V(i));

        printf("\n\n");
        printf("\nOutput of result\n");
    }
}

/*
 * 函数名: broadcast_data()
 * 功能:广播数据
 */
void broadcast_data()
{
    /*0号进程将size广播给所有进程*/
    MPI_Bcast(&size,1,MPI_INT,0,MPI_COMM_WORLD);
    m=size/p;
    if (size%p!=0) m++;

    /*为每个进程分配需要的空间*/
    v=(float *)malloc(floatsize*size);
    a=(float *)malloc(floatsize*m*size);
    b=(float *)malloc(floatsize*m);
    sum=(float *)malloc(floatsize*m);

    /*判断是否分配成功*/
    if (a==NULL||b==NULL||v==NULL)
    {
        printf("allocate space  fail!");
        exit(1);
    }

    /*如果是0号进程,就将本进程的解向量初始化为问题的解向量*/
    if (my_rank==0)
    {
        for(i=0;i(my_rank*m+i))
                sum[i]=sum[i]+a(i,j)*v(j);
    }
}


/*
 * 函数名: die_dai_cal()
 * 功能:各个进程并行迭代求解
 */
void die_dai_cal()
{
    /*total为新旧值之差小于E的x的分量的个数*/
    while (total