Index: /issm/trunk-jpl/src/c/toolkits/issm/SparseRow.h
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/issm/SparseRow.h	(revision 16449)
+++ /issm/trunk-jpl/src/c/toolkits/issm/SparseRow.h	(revision 16450)
@@ -72,45 +72,35 @@
 			if(!numvalues)return;
 
-			/*Figure out number of non-zero values ncols: */
-			for(i=0;i<numvalues;i++)buffer[i]=0;
-			
-			ncols=0;
+			/*Go through cols and resolve duplicates: */
 			for(i=0;i<numvalues;i++){
-				if(!buffer[cols[i]])ncols++;
-				if(mods[i]==ADD_VAL){
-					if(buffer[cols[i]]!=2)buffer[cols[i]]=1;
+				for(j=i+1;j<numvalues;j++){
+					if (cols[j]==cols[i]){
+						if (mods[j]==ADD_VAL){
+							vals[i]+=vals[j];
+						}
+						else vals[i]=vals[j];
+						cols[j]=-1;
+					}
+					/*Ensure that this value will not be used anymore: */
 				}
-				else buffer[cols[i]]=2;
 			}
 
-			/*Allocate:*/
+			/*Now go through cols once more, and retrieve only what we need: */
+			ncols=0;
+			for(i=0;i<numvalues;i++)if(cols[i]>=0)ncols++;
+
+			/*Allocate and fill: */
 			indices=xNew<int>(ncols); _assert_(indices);
 			values=xNewZeroInit<doubletype>(ncols);  _assert_(values);
-
-			/*Go through buffer and add values: */
+			
 			count=0;
-			for(i=0;i<M;i++){
-				if(buffer[i]==1){
-					indices[count]=i;
-					
-					/*ADD_VALUE: chase all values with row index i*/
-					for(j=0;j<numvalues;j++){
-						if (cols[j]==i)values[count]+=vals[j];
-					}
-					count++;
-				}
-				else if(buffer[i]==2){
-					indices[count]=i;
-					
-					/*INS_VALUE: chase first value with row index i*/
-					for(j=0;j<numvalues;j++){
-						if (cols[j]==i){
-							values[count]=vals[j]; 
-							break;
-						}
-					}
+			for(i=0;i<numvalues;i++){
+				if(cols[i]>=0){
+					indices[count]=cols[i];
+					values[count]=vals[i];
 					count++;
 				}
 			}
+		
 			if(count!=ncols)_error_("counter problem during set values operations");
 		} /*}}}*/
