51 float *newval = spm->
values;
52 float *oldval = spm->
values;
59 spm_int_t k, idx, size, valsize, savedcolptr;
60#if !defined(PRECISION_p)
67 fprintf(stderr,
"Error : MergeDuplicate can only be called with SpmCSC or SpmCSR\n");
73 savedcolptr = colptr[0];
74 for (jl=0; jl<n; jl++, colptr++, loc2glob++)
76 jg = spm->
replicated ? jl : *loc2glob - baseval;
77 dofj = (spm->
dof > 0) ? spm->
dof : spm->
dofs[jg+1] - spm->
dofs[jg];
78 size = colptr[1] - savedcolptr;
79 savedcolptr = colptr[1];
81 for ( k=0; k<size; k++, idx++ )
83 ig = *newrow - baseval;
84 dofi = (spm->
dof > 0) ? spm->
dof : spm->
dofs[ig+1] - spm->
dofs[ig];
91 if ( newrow != oldrow ) {
92 newrow[0] = oldrow[0];
93#if !defined(PRECISION_p)
94 memcpy( newval, oldval, dof2 *
sizeof(
float) );
101 while( ((k+1) < size) && (newrow[0] == oldrow[1]) ) {
105#if !defined(PRECISION_p)
107 for ( d=0; d<dof2; d++ ) {
108 newval[d] += oldval[d];
120 assert( ( (merge == 0) && (colptr[1] == idx) ) ||
121 ( (merge != 0) && (colptr[1] > idx) ) );
125 assert( ((merge == 0) && (spm->
nnz == (idx-baseval))) ||
126 ((merge != 0) && (spm->
nnz - merge == (idx-baseval))) );
132 spm->
nnz = spm->
nnz - merge;
142#if !defined(PRECISION_p)
143 spm->
values = realloc( spm->
values, valsize *
sizeof(
float ) );