4 // expectation expectation_value of a sparse Hamiltonian matrix //
5 // H matrix filled with random numbers at random locations //
8 // assignment 2 - part b //
10 // Michel Vallieres, Fall 2007 //
15 #include <mpi.h> /* MPI header file */
19 int main( int argc, char * argv[] )
21 double Hij, symm, local_value, expectation_value, norm, *v;
22 int N, Nelements, i, j, element, Nlocal, Nshift;
27 MPI_Init(&argc, &argv);
29 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
30 /* how many processes in the virtual machine */
31 MPI_Comm_size(MPI_COMM_WORLD, &size);
34 fp = fopen( "/tmp/michel_sparse_Hamiltonian_size", "r" );
35 fscanf( fp, "%d %d\n", &N, &Nelements);
39 Nlocal = Nelements / size;
40 Nshift = Nlocal * rank;
42 Nlocal = Nelements - Nshift;
43 fprintf( stderr, " Rank, size, H size, non-zero, Nlocal, Nshift: %d %d %d %d %d %d\n",
44 rank, size, N, Nelements, Nlocal, Nshift );
46 /* unit vector v*v = 1 */
47 v = (double *)malloc( N * sizeof(double) );
48 norm = 1.0 / sqrt( (float)N );
49 for ( i=0 ; i<N ; i++ )
53 fp = fopen( "/tmp/michel_sparse_Hamiltonian", "r" );
55 /* skip values not pertaining to rank */
58 for ( element=0 ; element<Nshift ; element++ )
59 fscanf( fp, "%d %d %lf", &i, &j, &Hij );
62 /* loop over non-zero Hij */
64 for ( element=0 ; element<Nlocal ; element++ )
67 fscanf( fp, "%d %d %lf", &i, &j, &Hij );
68 /* symmetric matrix -- 2 off-diag */
72 /* matrix multiplication */
73 local_value = local_value + symm * v[i] * Hij * v[j];
81 fprintf( stderr, " Local contribution in rank: %f %d\n",
84 // sum up the contributions
85 MPI_Reduce ( &local_value, &expectation_value, 1,
86 MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD );
90 fprintf( stderr, "\n Expectation value: %f\n\n", expectation_value );