/* Please note: * This code is the optimized version of the first version of Matrix * Stressmark. It uses less temporary vectors and vsariables, thus reduce * memory allocation/deallocation overhead. the simulation is faster */ /* * 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" #include "extra.h" #define MIN_SEED -2147483647 #define MAX_SEED -1 #define MIN_DIM 1 #define MAX_DIM 32768 #define MAX_ITERATIONS 65536 #define MIN_TOLERANCE 1e-7//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 */ void matrixMulvector(double *value, int *col_ind, int *row_start, double *vector, double *out) { int l, ll; double sum; int tmp_rs, tmp_re; for (l=0; l */ void valueMulvector(double value, double *vector, double *vect){ int l; int lll, i; double tmp; for (l=0; l errorTolerance)){ /* * alpha = (transpose(vectorR) * vectorR) / * (transpose(vectorP) * (matrixA * vectorP) */ matrixMulvector(value, col_ind, row_start, vectorP, tmpVector1); transpose(vectorR, tmpVector2); transpose(vectorP, tmpVector3); tmpValue1 = vectorMul(tmpVector3, tmpVector1); tmpValue2 = vectorMul(tmpVector2, vectorR); alpha = tmpValue2/tmpValue1; /* * nextVectorR = vectorR - alpha*(matrixA * vectorP) */ valueMulvector(alpha, tmpVector1, tmpVector2); vectorSub(vectorR, tmpVector2, tmpVector1); equalVector(tmpVector1, nextVectorR); /* * beta = (transpose(nextVectorR) * nextVectorR) / * (transpose(vectorR) * vectorR) */ transpose(nextVectorR, tmpVector3); tmpValue1 = vectorMul(tmpVector3, nextVectorR); transpose(vectorR, tmpVector2); tmpValue2 = vectorMul(tmpVector2, vectorR); beta = tmpValue1/tmpValue2; /* * vectorX = vectorX + alpha * vectorP */ valueMulvector(alpha, vectorP, tmpVector1); vectorAdd(vectorX,tmpVector1, vectorX); /* *vectorP = nextVectorR + beta*vectorP */ valueMulvector(beta, vectorP, tmpVector1); vectorAdd(nextVectorR, tmpVector1, tmpVector1); 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)); // Internal matricies for biConj vectorP = (double *)malloc(dim*sizeof(double)); vectorR = (double *)malloc(dim*sizeof(double)); nextVectorR = (double *)malloc(dim*sizeof(double)); tmpVector1 = (double *)malloc(dim*sizeof(double)); tmpVector2 = (double *)malloc(dim*sizeof(double)); tmpVector3 = (double *)malloc(dim*sizeof(double)); randInit(seed); START_LOOP initMatrix(matrixA, dim, numberNonzero); create_CRS(matrixA, value, col_ind, row_start, dim, numberNonzero); initVector(vectorB, dim); zeroVector(vectorX, dim); beginTime = time(NULL); actualError = 0; actualIteration = 0; biConjugateGradient(value, col_ind, row_start, vectorB, vectorX, errorTolerance, maxIterations, &actualError, &actualIteration, dim, vectorP, vectorR, nextVectorR, tmpVector1, tmpVector2, tmpVector3); STOP_LOOP endTime = time(NULL); sum = 0; for (k=1; k