Mentions légales du service

Skip to content
Snippets Groups Projects

4 - Dist/SpmNorm

Merged Tony Delarue requested to merge tdelarue/spm:dist/spm_norm into master
All threads resolved!
1 file
+ 24
23
Compare changes
  • Side-by-side
  • Inline
+ 24
23
@@ -40,7 +40,7 @@ static inline spm_int_t
spm_compute_degrees( const spmatrix_t *spm,
spm_int_t *degrees )
{
spm_int_t i, j, k;
spm_int_t i, iglob, j, jglob, k;
spm_int_t *colptr = spm->colptr;
spm_int_t *rowptr = spm->rowptr;
spm_int_t baseval;
@@ -60,13 +60,14 @@ spm_compute_degrees( const spmatrix_t *spm,
case SpmCSC:
for(j=0; j<spm->n; j++, colptr++) {
jglob = (spm->loc2glob == NULL) ? j : spm->loc2glob[j];
for(k=colptr[0]; k<colptr[1]; k++, rowptr++) {
i = *rowptr - baseval;
iglob = *rowptr - baseval;
if ( i != j ) {
degrees[j] += 1;
if ( iglob != jglob ) {
degrees[jglob] += 1;
if ( spm->mtxtype != SpmGeneral ) {
degrees[i] += 1;
degrees[iglob] += 1;
}
}
else {
@@ -120,7 +121,7 @@ spm_add_diag( spmatrix_t *spm,
spm_int_t diagval )
{
spmatrix_t oldspm;
spm_int_t i, j, k;
spm_int_t i, iglob, j, jglob, k;
spm_int_t *oldcol = spm->colptr;
spm_int_t *oldrow = spm->rowptr;
spm_int_t *newrow, *newcol;
@@ -155,17 +156,17 @@ spm_add_diag( spmatrix_t *spm,
memcpy( newrow, oldrow, nbelt * sizeof(spm_int_t) );
newrow += nbelt;
jglob = (spm->loc2glob == NULL) ? j : spm->loc2glob[j];
for(k=0; k<nbelt; k++, oldrow++) {
i = *oldrow - baseval;
iglob = *oldrow - baseval;
if ( i == j ) {
if ( iglob == jglob ) {
diag = 1;
}
}
newcol[0] += diagval;
if ( !diag ) {
*newrow = j + baseval;
*newrow = jglob + baseval;
newrow++;
diagval++;
}
@@ -188,24 +189,23 @@ spm_add_diag( spmatrix_t *spm,
for(k=0; k<spm->n; k++, newrow++, newcol++)
{
*newrow = k + baseval;
*newcol = k + baseval;
iglob = (spm->loc2glob == NULL) ? k : spm->loc2glob[k];
*newrow = iglob + baseval;
*newcol = iglob + baseval;
}
for(k=0; k<spm->nnz; k++, oldrow++, oldcol++)
{
i = *oldrow - baseval;
j = *oldcol - baseval;
if ( i == j ) {
if ( *oldrow == *oldcol ) {
continue;
}
*newrow = i + baseval;
*newcol = j + baseval;
*newrow = *oldrow;
*newcol = *oldcol;
newrow++;
newcol++;
}
free( oldspm.colptr );
free( oldspm.rowptr );
}
@@ -236,7 +236,7 @@ spm_generate_fake_values( spmatrix_t *spm,
double alpha, double beta )
{
double *values;
spm_int_t i, j, k;
spm_int_t i, iglob, j, jglob, k;
spm_int_t *colptr = spm->colptr;
spm_int_t *rowptr = spm->rowptr;
spm_int_t baseval;
@@ -257,11 +257,12 @@ spm_generate_fake_values( spmatrix_t *spm,
case SpmCSC:
for(j=0; j<spm->n; j++, colptr++) {
jglob = (spm->loc2glob == NULL) ? j : spm->loc2glob[j];
for(k=colptr[0]; k<colptr[1]; k++, rowptr++, values++) {
i = *rowptr - baseval;
iglob = *rowptr - baseval;
if ( i == j ) {
*values = alpha * degrees[j];
if ( iglob == jglob ) {
*values = alpha * degrees[jglob];
}
else {
*values = - beta;
@@ -346,7 +347,7 @@ spmGenFakeValues( spmatrix_t *spm )
}
}
degrees = malloc( spm->n * sizeof(spm_int_t));
degrees = malloc( spm->gN * sizeof(spm_int_t));
diagval = spm_compute_degrees( spm, degrees );
if ( diagval != spm->n ) {
/* Diagonal elements must be added to the sparse matrix */
Loading