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