Thread: MPI-nparticles

  1. #1
    Registered User
    Join Date
    Jun 2011
    Posts
    2

    MPI-nparticles

    The program that i wrote must calculate n changes of position on n particles, but the program doesn't work if number of position to calculate >1. Please tell me where i wrong


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

  2. #2
    and the Hat of Guessing tabstop's Avatar
    Join Date
    Nov 2007
    Posts
    14,336
    What "doesn't work" about it? Does it hold up picket signs? Does it crash? Does it give erroneous output? Does it just run forever? What?

  3. #3
    Registered User
    Join Date
    Jun 2011
    Posts
    2
    Program return result only if must calculate only one change of position. If i use loop to calculate more then one changing program doesn't return result.

  4. #4
    and the Hat of Guessing tabstop's Avatar
    Join Date
    Nov 2007
    Posts
    14,336
    This makes me nervous:
    Code:
    MPI_Recv( &n, 1, MPI_FLOAT, 0, 123, MPI_COMM_WORLD, &status);
    n is not a float. True, you're sending it as a float, but that doesn't really help; and sizeof float doesn't have to equal sizeof int.

Popular pages Recent additions subscribe to a feed