Code:
#include "stdafx.h"
#include <stdio.h>
#include "mpi.h"
#include <time.h>
#define part 3
#define poz 2
int main(int argc, char *argv[])
{
int i, j, k, numprocs, myrank, id, f, n=0, t;
float X[part], F[part],F1[part], F_all[part] , Fij=0.0;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
if(myrank==0)
{
n=part;
for(i=0;i<n;i++)
{
X[i]= i+1.0;
}
for(t=0;t<poz;t++)
{
for ( id = 1; id < numprocs; id++ )
{
MPI_Send( &n, 1, MPI_FLOAT, id, 123, MPI_COMM_WORLD );
MPI_Send( &X, n, MPI_FLOAT, id, 123, MPI_COMM_WORLD );
}
for(k=0;k<n;k++)
F[k]=0.0;
for(i=0+myrank;i<n-1;i+=numprocs)
for(j=i+1;j<n;j++)
{
Fij=1.0/(X[j]-X[i]);
F[i]=F[i]+Fij;
F[j]=F[j]-Fij;
}
for(i=0;i<n;i++)
{
F1[i]=0.0;
F1[i]=F[i];
}
for(i=0;i<n;i++)
F_all[i]=0.0;
for ( id= 1; id< numprocs; id++ )
{
MPI_Recv ( &F, n, MPI_FLOAT, id, 123 , MPI_COMM_WORLD, &status );
for(f=0;f<n;f++)
F_all[f] = F_all[f]+F[f];
}
for(i=0;i<n;i++)
{
F_all[i] = F_all[i]+F1[i];
printf("F_all[%d]=%f\n",i , F_all[i]);
}
for(i=0;i<n;i++)
{
X[i]= X[i]+F_all[i];
printf("X[%d]=%f\n",i, X[i]);
}
}
}
else
{
MPI_Recv( &n, 1, MPI_FLOAT, 0, 123, MPI_COMM_WORLD, &status);
MPI_Recv( &X, n, MPI_FLOAT, 0, 123, MPI_COMM_WORLD, &status);
for(k=0;k<n;k++)
F[k]=0.0;
for(i=0+myrank;i<n-1;i+=numprocs)
for(j=i+1;j<n;j++)
{
Fij=1.0/(X[j]-X[i]);
F[i]=F[i]+Fij;
F[j]=F[j]-Fij;
}
MPI_Send ( &F, n, MPI_FLOAT, 0, 123, MPI_COMM_WORLD );
}
MPI_Finalize();
return 0;
}