#include <iostream>
#include "stdlib.h"
#include "math.h"
#include "time.h"
#include "mpi.h"
using namespace std;
int main( int argc,char * argv[ ] )
{
int nPerNode,rank,size;
MPI_Init( & argc,& argv) ;
MPI_Comm_rank( MPI_COMM_WORLD,& rank) ;
MPI_Comm_size( MPI_COMM_WORLD,& size) ;
int N,D,S;
N= atoi ( argv[ 1 ] ) ;
D= atoi ( argv[ 2 ] ) ;
S= atoi ( argv[ 3 ] ) ;
if ( rank== 0 ) {
cout << "N:" << N<< endl;
cout << "D:" << D<< endl;
cout << "seed:" << S<< endl;
cout << "The Distance data is using a simulated dynamic array" << endl;
cout << "The Distance data is row-major" << endl;
}
int MPIbegin,MPIend;
double Xsquare= 0 ,Ysquare= 0 ,Zsquare= 0 ; //store to compute distance
int temp2;
double temp1;
double Sign;
double ** XYZ= new double * [ N] ;
for ( int i= 0 ; i< N; i++ )
{
XYZ[ i] = new double [ 3 ] ;
}
double * Dist,* AllDist;
Dist= new double [ N* N] ; //center to center distance
AllDist= new double [ N* N] ;
for ( int i= 0 ; i< N* N; i++ ) {
Dist[ i] = 0.0 ;
AllDist[ i] = 0.0 ; }
if ( rank== 0 ) {
srand ( S) ; //random seed
}
if ( rank== 0 ) {
for ( int i= 0 ; i< N; i++ )
{
temp1= ( rand ( ) ) ;
temp2= ( rand ( ) % 2 ) ;
Sign= pow ( - 1 ,temp2) ; //get sign
XYZ[ i] [ 0 ] = temp1* D/ RAND_MAX * Sign; // get x
temp1= ( rand ( ) ) ;
temp2= ( rand ( ) % 2 ) ;
Sign= pow ( - 1 ,temp2) ; //get sign
XYZ[ i] [ 1 ] = temp1* D/ RAND_MAX * Sign; //get y
temp1= ( rand ( ) ) ;
temp2= ( rand ( ) % 2 ) ;
Sign= pow ( - 1 ,temp2) ; //get sign
XYZ[ i] [ 2 ] = temp1* D/ RAND_MAX * Sign; //get z
}
}
for ( int i= 0 ; i< N; i++ )
MPI_Bcast( & XYZ[ i] [ 0 ] ,3 ,MPI_DOUBLE,0 ,MPI_COMM_WORLD) ;
MPI_Bcast( & Dist,N* N,MPI_DOUBLE,0 ,MPI_COMM_WORLD) ;
MPI_Bcast( & AllDist,N* N,MPI_DOUBLE,0 ,MPI_COMM_WORLD) ;
MPI_Bcast( & Xsquare,1 ,MPI_DOUBLE,0 ,MPI_COMM_WORLD) ;
MPI_Bcast( & Ysquare,1 ,MPI_DOUBLE,0 ,MPI_COMM_WORLD) ;
MPI_Bcast( & Zsquare,1 ,MPI_DOUBLE,0 ,MPI_COMM_WORLD) ;
nPerNode= N/ size;
MPIbegin= rank* nPerNode+ 1 ;
MPIend= MPIbegin+ nPerNode- 1 ;
if ( rank== ( size- 1 ) ) {
MPIend= N- 1 ;
}
for ( int j= MPIbegin; j< MPIend; j++ )
{
for ( int i= 0 ; i<= N; i++ ) //compute distance
{
Xsquare= ( XYZ[ j] [ 0 ] * XYZ[ j] [ 0 ] + XYZ[ i] [ 0 ] * XYZ[ i] [ 0 ] - 2 * XYZ[ i] [ 0 ] * XYZ[ j] [ 0 ] ) ; //x^2=(x1-x2)^2
Ysquare= ( XYZ[ j] [ 1 ] * XYZ[ j] [ 1 ] + XYZ[ i] [ 1 ] * XYZ[ i] [ 1 ] - 2 * XYZ[ i] [ 1 ] * XYZ[ j] [ 1 ] ) ;
Zsquare= ( XYZ[ j] [ 2 ] * XYZ[ j] [ 2 ] + XYZ[ i] [ 2 ] * XYZ[ i] [ 2 ] - 2 * XYZ[ i] [ 2 ] * XYZ[ j] [ 2 ] ) ;
Dist[ j* N+ i] = sqrt ( Xsquare+ Ysquare+ Zsquare) ;
}
}
for ( int i= 0 ; i< N* N ; i++ )
MPI_Reduce( & Dist[ i] ,& AllDist[ i] ,1 ,MPI_DOUBLE,MPI_SUM,0 ,MPI_COMM_WORLD) ;
MPI_Finalize( ) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSAic3RkbGliLmgiCiNpbmNsdWRlICJtYXRoLmgiCiNpbmNsdWRlICJ0aW1lLmgiCiNpbmNsdWRlICJtcGkuaCIKCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKQp7CmludCBuUGVyTm9kZSxyYW5rLHNpemU7Ck1QSV9Jbml0KCZhcmdjLCZhcmd2KTsKTVBJX0NvbW1fcmFuayhNUElfQ09NTV9XT1JMRCwmcmFuayk7Ck1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsJnNpemUpOwoKaW50IE4sRCxTOwpOPWF0b2koYXJndlsxXSk7CkQ9YXRvaShhcmd2WzJdKTsKUz1hdG9pKGFyZ3ZbM10pOwppZihyYW5rPT0wKXsKY291dDw8Ik46Ijw8Tjw8ZW5kbDsJICAKY291dDw8IkQ6Ijw8RDw8ZW5kbDsKY291dDw8InNlZWQ6Ijw8Uzw8ZW5kbDsKY291dDw8IlRoZSBEaXN0YW5jZSBkYXRhIGlzIHVzaW5nIGEgc2ltdWxhdGVkIGR5bmFtaWMgYXJyYXkiPDxlbmRsOwpjb3V0PDwiVGhlIERpc3RhbmNlIGRhdGEgaXMgcm93LW1ham9yIjw8ZW5kbDsKfQoKCQoJaW50IE1QSWJlZ2luLE1QSWVuZDsKCglkb3VibGUgWHNxdWFyZT0wLFlzcXVhcmU9MCxac3F1YXJlPTA7Ly9zdG9yZSB0byBjb21wdXRlIGRpc3RhbmNlCglpbnQgdGVtcDI7Cglkb3VibGUgdGVtcDE7Cglkb3VibGUgU2lnbjsKCglkb3VibGUgKipYWVo9bmV3IGRvdWJsZSAqW05dOwoJZm9yKGludCBpPTA7aTxOO2krKykKCXsKCQlYWVpbaV09bmV3IGRvdWJsZVszXTsKCX0KCglkb3VibGUgKkRpc3QsKkFsbERpc3Q7CQkKCURpc3Q9bmV3IGRvdWJsZVtOKk5dOyAvL2NlbnRlciB0byBjZW50ZXIgZGlzdGFuY2UJCglBbGxEaXN0PW5ldyBkb3VibGVbTipOXTsKCglmb3IoaW50IGk9MDtpPE4qTjtpKyspewoJCURpc3RbaV09MC4wOwoJCUFsbERpc3RbaV09MC4wO30KCmlmKHJhbms9PTApewkJCglzcmFuZChTKTsvL3JhbmRvbSBzZWVkCn0KCQoKaWYocmFuaz09MCl7Cglmb3IoIGludCBpPTA7aTxOO2krKykKCXsJCQoJCXRlbXAxPShyYW5kKCkpOwoJCXRlbXAyPShyYW5kKCklMik7CgkJU2lnbj1wb3coLTEsdGVtcDIpOy8vZ2V0IHNpZ24JCQoJCVhZWltpXVswXT10ZW1wMSpEL1JBTkRfTUFYKlNpZ247Ly8gZ2V0IHgKCgkJdGVtcDE9KHJhbmQoKSk7CgkJdGVtcDI9KHJhbmQoKSUyKTsKCQlTaWduPXBvdygtMSx0ZW1wMik7Ly9nZXQgc2lnbgkJCgkJWFlaW2ldWzFdPXRlbXAxKkQvUkFORF9NQVgqU2lnbjsvL2dldCB5CgoJCXRlbXAxPShyYW5kKCkpOwoJCXRlbXAyPShyYW5kKCklMik7CgkJU2lnbj1wb3coLTEsdGVtcDIpOy8vZ2V0IHNpZ24JCQoJCVhZWltpXVsyXT10ZW1wMSpEL1JBTkRfTUFYKlNpZ247Ly9nZXQgegoKCX0KfSAgICAKCQogICBmb3IoaW50IGk9MDtpPE47aSsrKQoJTVBJX0JjYXN0KCZYWVpbaV1bMF0sMyxNUElfRE9VQkxFLDAsTVBJX0NPTU1fV09STEQpOwkKCgogICBNUElfQmNhc3QoJkRpc3QsTipOLE1QSV9ET1VCTEUsMCxNUElfQ09NTV9XT1JMRCk7CiAgIE1QSV9CY2FzdCgmQWxsRGlzdCxOKk4sTVBJX0RPVUJMRSwwLE1QSV9DT01NX1dPUkxEKTsKICAgTVBJX0JjYXN0KCZYc3F1YXJlLDEsTVBJX0RPVUJMRSwwLE1QSV9DT01NX1dPUkxEKTsKICAgTVBJX0JjYXN0KCZZc3F1YXJlLDEsTVBJX0RPVUJMRSwwLE1QSV9DT01NX1dPUkxEKTsKICAgTVBJX0JjYXN0KCZac3F1YXJlLDEsTVBJX0RPVUJMRSwwLE1QSV9DT01NX1dPUkxEKTsKCgoJblBlck5vZGU9Ti9zaXplOwoJTVBJYmVnaW49cmFuaypuUGVyTm9kZSsxOwoJTVBJZW5kPU1QSWJlZ2luK25QZXJOb2RlLTE7CglpZihyYW5rPT0oc2l6ZS0xKSl7CgkJTVBJZW5kPU4tMTsKCX0KCglmb3IoaW50IGo9TVBJYmVnaW47ajxNUEllbmQ7aisrKQoJewoKCQlmb3IoaW50IGk9MDtpPD1OO2krKykvL2NvbXB1dGUgZGlzdGFuY2UKCQl7CgkJCVhzcXVhcmU9KFhZWltqXVswXSpYWVpbal1bMF0rWFlaW2ldWzBdKlhZWltpXVswXS0yKlhZWltpXVswXSpYWVpbal1bMF0pOyAvL3heMj0oeDEteDIpXjIKCQkJWXNxdWFyZT0oWFlaW2pdWzFdKlhZWltqXVsxXStYWVpbaV1bMV0qWFlaW2ldWzFdLTIqWFlaW2ldWzFdKlhZWltqXVsxXSk7CgkJCVpzcXVhcmU9KFhZWltqXVsyXSpYWVpbal1bMl0rWFlaW2ldWzJdKlhZWltpXVsyXS0yKlhZWltpXVsyXSpYWVpbal1bMl0pOwoJCQlEaXN0W2oqTitpXT1zcXJ0KFhzcXVhcmUrWXNxdWFyZStac3F1YXJlKTsKCQkJCgkJfQoJfQoJZm9yKGludCBpPTA7aTxOKk4gO2krKykKICAgIE1QSV9SZWR1Y2UoJkRpc3RbaV0sJkFsbERpc3RbaV0sMSxNUElfRE9VQkxFLE1QSV9TVU0sMCxNUElfQ09NTV9XT1JMRCk7CgoJTVBJX0ZpbmFsaXplKCk7CgkKCXJldHVybiAwOwp9