/* * Sample code for the DIS Matrix Stressmark * * This source code is the completely correct source code based on * the example codes provided by Atlantic Aerospace Division, Titan * Systems Corporation, 2000. * * If you just compile and generate the executables from this source * code, this code would be enough. However, if you wish to get a complete * understanding of this stressmark, it is strongly suggested that you * read the Benchmark Analysis and Specifications Document Version 1.0 * before going on since the detailed comments are given in this documents. * the comments are not repeated here. */ /* * The Sparse Matrix Storage is implemented by Compact Row Storage Scheme * In the code, the data is first generated by randomNonzeroFloat() * the data is first stored in a full-space matrix with size of dim*dim * then the data is transfered to the Compact Row Matrix, * the data value is kept in *value, * the columns corresponding to the value are stored in *col_ind, * the start element of each row is stored in *row_start. */ /* * Please note: * the total number of data is numberNonzero +dim * among which, NumberNonzero because this is symmetric matrix * dim because the diagonal elements */ #include #include #include #include #include #include "DISstressmarkRNG.h" #define MIN_SEED -2147483647 #define MAX_SEED -1 #define MIN_DIM 1 #define MAX_DIM 32768 #define MAX_ITERATIONS 65536 #define MIN_TOLERANCE 0.000007 #define MAX_TOLERANCE 0.5 #define MIN_NUMBER -3.4e10/dim #define MAX_NUMBER 3.4e10/dim #define EPSI 1.0e-10 #define MIN_DIG_NUMBER 1.0e-10 #define MAX_DIG_NUMBER 3.4e10 /* * External variable, dimension */ static int dim; /* * matrix * vector */ double *matrixMulvector(double *value, int *col_ind, int *row_start, double *vector) { int l, ll; double *out; double sum; int tmp_rs, tmp_re; out = (double *)malloc(dim*sizeof(double)); for (l=0; l */ double *valueMulvector(double value, double *vector){ int l; double *vect; int lll; double sum; vect = (double *) malloc(dim * sizeof(double )); for (l=0; l errorTolerance)){ /* * alpha = (transpose(vectorR) * vectorR) / * (transpose(vectorP) * (matrixA * vectorP) */ temp1 = matrixMulvector(value, col_ind, row_start, vectorP); temp3 = transpose(vectorR); temp4 = transpose(vectorP); temp5 = vectorMul(temp4, temp1); temp6 = vectorMul(temp3, vectorR); alpha = temp6/temp5; /* * nextVectorR = vectorR - alpha*(matrixA * vectorP) */ temp7 = valueMulvector(alpha, temp1); temp8 = vectorSub(vectorR, temp7); nextVectorR = equalVector(temp8); /* * beta = (transpose(nextVectorR) * nextVectorR) / * (transpose(vectorR) * vectorR) */ temp9 = transpose(nextVectorR); temp10 = vectorMul(temp9, nextVectorR); temp11 = transpose(vectorR); temp12 = vectorMul(temp11, vectorR); beta = temp10/temp12; /* * vectorX = vectorX + alpha * vectorP */ temp13 = valueMulvector(alpha, vectorP); vectorX = vectorAdd(vectorX,temp13); /* *vectorP = nextVectorR + beta*vectorP */ temp14 = valueMulvector(beta, vectorP); temp17 = vectorAdd(nextVectorR, temp14); for (ll=0; ll MIN_SEED) && (seed < MAX_SEED)); assert((dim > MIN_DIM) && (dim < MAX_DIM)); assert((numberNonzero > dim) && (numberNonzero < dim*dim)); assert((maxIterations > 0) && (maxIterations < MAX_ITERATIONS)); assert((errorTolerance > MIN_TOLERANCE) && (errorTolerance < MAX_TOLERANCE)); matrixA = (double *)malloc(dim*dim*sizeof(double )); vectorB = (double *)malloc(dim*sizeof(double)); vectorX = (double *)malloc(dim*sizeof(double)); value = (double *)malloc((numberNonzero+dim)*sizeof(double)); col_ind = (int *)malloc((numberNonzero+dim)*sizeof(int)); row_start = (int *)malloc((dim+1)*sizeof(int)); randInit(seed); initMatrix(matrixA, dim, numberNonzero); create_CRS(matrixA, value, col_ind, row_start, dim, numberNonzero); initVector(vectorB, dim); zeroVector(vectorX, dim); printf(" after init\n"); beginTime = time(NULL); actualError = 0; actualIteration = 0; biConjugateGradient(value, col_ind, row_start, vectorB, vectorX, errorTolerance, maxIterations, &actualError, &actualIteration, dim); endTime = time(NULL) - beginTime; sum = 0; for (k=1; k