Index: /issm/trunk-jpl/src/c/toolkits/issm/IssmMpiSparseMat.h
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/issm/IssmMpiSparseMat.h	(revision 16429)
+++ /issm/trunk-jpl/src/c/toolkits/issm/IssmMpiSparseMat.h	(revision 16430)
@@ -194,4 +194,10 @@
 			int*          numvalues_perrow    = NULL;
 			int           row;
+			
+			doubletype**  values_perrow       = NULL;
+			int**         cols_perrow         = NULL;
+			int**         mods_perrow         = NULL;
+			int*          counters_perrow     = NULL;
+			int           counter;
 
 			/*Early exit: */
@@ -284,41 +290,37 @@
 			}
 
-			
-			/*Deal with sparse row one at a time: */
-			for(row=0;row<this->m;row++){
-
-				/*Allocate: */
-				this_row_numvalues=numvalues_perrow[row];
-				this_row_cols=xNew<int>(this_row_numvalues);
-				this_row_values=xNew<doubletype>(this_row_numvalues);
-				this_row_mods=xNew<int>(this_row_numvalues);
-
-				/*Collect: */
-				count=0;
-				for(i=0;i<num_procs;i++){
-					int  numvalues=numvalues_fromcpu[i];
-					int* rows=row_indices_fromcpu[i];
-					int* cols=col_indices_fromcpu[i];
-					doubletype* values=values_fromcpu[i];
-					int* mods=modes_fromcpu[i];
-
-					for(j=0;j<numvalues;j++){
-						if((rows[j]-lower_row)==row){
-							this_row_cols[count]=cols[j];
-							this_row_values[count]=values[j];
-							this_row_mods[count]=mods[j];
-							count++;
-						}
-					}
-				}
-				if(count!=this_row_numvalues)_error_("counter error during assembly of values!");
-
-				/*Now fill in the sparse row: */
-				this->matrix[row]->SetValues(this_row_numvalues,this_row_cols,this_row_values,this_row_mods);
-
-				/*Free ressources: */
-				xDelete<int>(this_row_cols);
-				xDelete<doubletype>(this_row_values);
-				xDelete<int>(this_row_mods);
+			/*Allocate all the values, cols and mods from each cpu: */
+			values_perrow=xNew<doubletype*>(this->m);
+			cols_perrow=xNew<int*>(this->m);
+			mods_perrow=xNew<int*>(this->m);
+			counters_perrow=xNewZeroInit<int>(this->m);
+
+			for(i=0;i<this->m;i++){
+				values_perrow[i]=xNewZeroInit<doubletype>(numvalues_perrow[i]);
+				cols_perrow[i]=xNewZeroInit<int>(numvalues_perrow[i]);
+				mods_perrow[i]=xNewZeroInit<int>(numvalues_perrow[i]);
+			}
+
+			/*collect:*/
+			for(i=0;i<num_procs;i++){
+				int  numvalues=numvalues_fromcpu[i];
+				int* rows=row_indices_fromcpu[i];
+				int* cols=col_indices_fromcpu[i];
+				doubletype* values=values_fromcpu[i];
+				int* mods=modes_fromcpu[i];
+
+				for(j=0;j<numvalues;j++){
+					row=rows[j]-lower_row;
+					counter=counters_perrow[row];
+					values_perrow[row][counter]=values[j];
+					cols_perrow[row][counter]=cols[j];
+					mods_perrow[row][counter]=mods[j];
+					counter=counters_perrow[row]++;
+				}
+			}
+					
+			/*Plug into matrix: */
+			for(i=0;i<this->m;i++){
+				this->matrix[i]->SetValues(numvalues_perrow[i],cols_perrow[i],values_perrow[i],mods_perrow[i]);
 			}
 			/*}}}*/
@@ -358,4 +360,14 @@
 			xDelete<int>(sendcnts);
 			xDelete<int>(displs);
+			
+			for(i=0;i<this->m;i++){
+				doubletype* values=values_perrow[i]; xDelete<doubletype>(values);
+				int* cols=cols_perrow[i]; xDelete<int>(cols);
+				int* mods=mods_perrow[i]; xDelete<int>(mods);
+			}
+			xDelete<int>(counters_perrow);
+			xDelete<doubletype*>(values_perrow);
+			xDelete<int*>(cols_perrow);
+			xDelete<int*>(mods_perrow);
 			/*}}}*/
 
