Add _script/README and fix _script/math.sh documentation.
[parallel_computing.git] / src / hamiltonian_expectation_value / sparse_matrix_setup.c
1
2                    //  PHYS 405                                                 //
3
4                    //  code to generate a sparse Hamiltonian matrix             //
5                    //  H matrix filled with random numbers at random locations  //
6
7                    //  assignment 2 - part b               //
8
9                                          // Michel Vallieres, Fall 2007 //
10
11 #include <stdio.h>
12 #include <math.h>
13 #include <stdlib.h>
14
15                                            /* matrix size */
16 #define N 1000000
17                                            /* # non-zero elements */
18 #define Nelements   1012717
19
20
21 int main( int argc, char * argv[] )
22 {
23   double Hij;
24   int    i, j, k, element;
25   int    scan, repeat, kepti[Nelements], keptj[Nelements];
26   FILE   *fp;
27                                           /* data file size */
28   fp = fopen( "sparse_Hamiltonian_size", "w" );
29   fprintf( fp, "%d %d\n", N, Nelements);
30   fclose( fp );
31                                           /* data file */
32   fp = fopen( "sparse_Hamiltonian", "w" );
33                                           /* initialize random numbers */
34   srand( 1.0 );
35                                           /* loop over non-zero Hij */
36   element =0;
37   while ( element<Nelements )
38     {
39                                           /* random location */
40       i = N * (float)rand() / (float)RAND_MAX;
41       j = N * (float)rand() / (float)RAND_MAX;
42
43                                          /* symmetric matrix */
44       if ( j > i ) 
45         {
46           k = i;
47           i = j;
48           j = k;
49         }
50
51                                         /* avoid repetition */
52       repeat = 0;
53       if ( element > 0 )
54         {
55           scan = 0;
56           while ( scan < element )
57             {
58               if ( i == kepti[scan] && j == keptj[scan] )
59                 {
60                   repeat = 1;
61                 }
62               scan++;
63               if ( repeat == 1 )
64                 break;
65             }
66         }
67
68       if ( repeat == 0 )
69         {
70                                          /* random value */
71            Hij = (float)rand() / (float)RAND_MAX;
72
73                                          /* store element */
74            kepti[element] = i;
75            keptj[element] = j;
76            fprintf( fp, "%d %d %f\n", i, j, Hij );
77            element++;
78         }
79     }
80
81   fclose( fp );
82
83 }
84
85