22#ifndef DOXYGEN_SHOULD_SKIP_THIS
23#define Rnd64_A 6364136223846793005ULL
25#define RndF_Mul 5.4210108624275222e-20f
26#define RndD_Mul 5.4210108624275222e-20
48static inline unsigned long long int
50 unsigned long long int seed )
52 unsigned long long int a_k, c_k, ran;
59 for (i = 0; n; n >>= 1, ++i) {
61 ran = a_k * ran + c_k;
70#ifndef DOXYGEN_SHOULD_SKIP_THIS
71#if defined(PRECISION_z) || defined(PRECISION_c)
100 unsigned long long int *ran )
102 *val = (0.5f - (*ran) * RndF_Mul);
103 *ran = Rnd64_A * (*ran) + Rnd64_C;
104#if defined(PRECISION_z) || defined(PRECISION_c)
105 *val += I * (0.5f - (*ran) * RndF_Mul);
106 *ran = Rnd64_A * (*ran) + Rnd64_C;
155 unsigned long long int seed )
158 int64_t i, j, m = spm->
nexp;
159 unsigned long long int ran, jump = shift;
164 for (j=0; j<n; ++j) {
166 for (i = 0; i < m; ++i) {
171 tmp += lda - spm->
nexp;
221 unsigned long long int seed )
226 unsigned long long int ran, jump;
238 for (j=0, col=0; j<n; j++, col++) {
241 for (i=0; i<spm->
n; i++, l2g++ ) {
243 if ( spm->
dof > 0 ) {
248 dofi = dofs[ig+1] - dofs[ig];
249 row = dofs[ig] - baseval;
252 jump = row + col * (
unsigned long long int)(spm->
gNexp) + shift;
255 for( k=0; k<dofi; k++, tmp++ ) {
309 unsigned long long int seed )
317 unsigned long long int ran, jump;
327 vertice = spm->
rowptr + 1;
328 for( j=1; j<spm->
nnz; j++, vertice++ )
331 if ( vertice[0] > vertice[1] ) {
344 for ( col=0; col<n; col++)
347 vertice = verticeptr;
349 for ( j=0; j<spm->
nnz; j++, vertice++ )
351 ig = *vertice - baseval;
353 if( ig == previous ) {
357 if( ig < previous ) {
358 fprintf(stderr,
"The spm isn't sorted for GenRnd, we leave the routine now\n");
362 if ( spm->
dof > 0 ) {
367 dofi = dofs[ig+1] - dofs[ig];
368 row = dofs[ig] - baseval;
370 jump = row + col * (
unsigned long long int)(spm->
gNexp) + shift;
373 for( k=0; k<dofi; k++, tmp++ ) {
428 unsigned long long int seed )
476 int64_t i, j, m = spm->
nexp;
481 for( i=0; i<m; i++, tmp++ )
483#if defined(PRECISION_z) || defined(PRECISION_c)
484 *tmp = (double)(alpha + alpha * I);
486 *tmp = (double)alpha;
490 for (j=1; j<n; ++j) {
491 memcpy( tmp, A, spm->
nexp *
sizeof(
double) );
542 for( i=0; i<spm->
n; i++, loc2glob++ )
544 ig = spm->
replicated ? i : *loc2glob - baseval;
545 if ( spm->
dof > 0 ) {
550 dofi = dofs[ig+1] - dofs[ig];
551 row = dofs[ig] - baseval;
555 for( k=0; k<dofi; k++, row++, tmp++ )
557#if defined(PRECISION_z) || defined(PRECISION_c)
558 *tmp = (double)(row + row * I) * alpha;
560 *tmp = (double)row * alpha;
564 tmp += lda - spm->
nexp;
566 for( j = 1; j < n; j++ ) {
567 memcpy( tmp, A, spm->
nexp *
sizeof(
double) );
630 vertice = spm->
rowptr + 1;
631 for( i=1; i<spm->
nnz; i++, vertice++ )
634 if ( vertice[0] > vertice[1] ) {
643 if( vertice == NULL ) {
644 fprintf( stderr,
"Problem in distribution detection\n" );
649 for( i=0; i<spm->
nnz; i++, vertice++ )
651 ig = *vertice - baseval;
653 if( ig == previous ) {
657 if( ig < previous ) {
658 fprintf(stderr,
"The spm isn't sorted for GenI, we leave the routine now\n");
662 if ( spm->
dof > 0 ) {
667 dofi = dofs[ig+1] - dofs[ig];
668 row = dofs[ig] - baseval;
672 for( k=0; k<dofi; k++, row++, tmp++ )
674#if defined(PRECISION_z) || defined(PRECISION_c)
675 *tmp = (double)(row + row * I) * alpha;
677 *tmp = (double)row * alpha;
683 for( j = 1; j < n; j++ ) {
684 memcpy( tmp, A, spm->
nexp *
sizeof(
double) );
787 unsigned long long int seed,
791 double *Aptr = (
double*)A;
792 double alpha = *((
double*)alphaptr);
795 if( (nrhs > 1) && (lda < spm->
nexp) ) {
812 Aptr, lda, 1, seed );
816 Aptr, lda, 1, seed );
static int d_spm_rhs_dist_genRnd_ijv(const spmatrix_t *spm, double alpha, spm_int_t n, double *A, spm_int_t lda, int shift, unsigned long long int seed)
Generate a set of vectors of random values in distributed memory for IJV format.
static int d_spm_rhs_dist_genRnd_csx(const spmatrix_t *spm, double alpha, spm_int_t n, double *A, spm_int_t lda, int shift, unsigned long long int seed)
Generate a set of vectors of random values in distributed memory for CSX format.
static int d_spm_rhs_genI_csx(const spmatrix_t *spm, double alpha, spm_int_t n, double *A, spm_int_t lda)
Generate a set of vectors x[i] = alpha * ( i [+ i* I ] ) for CSC format.
static int d_spm_rhs_genI_ijv(const spmatrix_t *spm, double alpha, spm_int_t n, double *A, spm_int_t lda)
Generate a set of vectors x[i] = alpha * ( i [+ i* I ] ) for IJV format.
static unsigned long long int Rnd64_jump(unsigned long long int n, unsigned long long int seed)
Random generator from the HPL library.
enum spm_rhstype_e spm_rhstype_t
How to generate RHS.
#define SpmDistByColumn
Distribution of the matrix storage.
static int d_spmRhsGenI(const spmatrix_t *spm, double alpha, spm_int_t n, double *A, spm_int_t lda)
Generate a set of vectors x[i] = alpha * ( i [+ i* I ] ).
int d_spmRhsGenRndShm(const spmatrix_t *spm, double scale, spm_int_t n, double *A, spm_int_t lda, int shift, unsigned long long int seed)
Generate a set of vectors of random values in shared memory.
int d_spmGenMat(spm_rhstype_t type, int nrhs, const spmatrix_t *spm, void *alpha, unsigned long long int seed, void *A, int lda)
Generate nrhs right hand side vectors associated to a given matrix to test a problem with a solver.
int d_spmRhsGenRndDist(const spmatrix_t *spm, double scale, spm_int_t n, double *A, spm_int_t lda, int shift, unsigned long long int seed)
Generate a set of vectors of random values in distributed memory.
static void d_updateRndVal(double scale, double *val, unsigned long long int *ran)
Generate a value of the RHS.
static int d_spmRhsGenOne(const spmatrix_t *spm, double alpha, spm_int_t n, double *A, spm_int_t lda)
Generate a set of vectors of constant values.
int spm_int_t
The main integer datatype used in spm arrays.
The sparse matrix data structure.
int spm_get_distribution(const spmatrix_t *spm)
Search the distribution pattern used in the spm structure.