Index: /issm/trunk-jpl/src/c/toolkits/issm/IssmMpiSparseMat.h
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/issm/IssmMpiSparseMat.h	(revision 16423)
+++ /issm/trunk-jpl/src/c/toolkits/issm/IssmMpiSparseMat.h	(revision 16424)
@@ -192,4 +192,5 @@
 			int*          this_row_mods       = NULL;
 			doubletype*   this_row_values     = NULL;
+			int*          numvalues_perrow    = NULL;
 			int           row;
 
@@ -274,18 +275,19 @@
 			/*Plug values into global matrix. To do so, we are going to first figure out how many overall values each sparse row is going to get, then we fill up these values, and give it to each sparse row: {{{*/
 			GetOwnershipBoundariesFromRange(&lower_row,&upper_row,m,comm);
+
+			/*Figure out how many values each row is going to get: */
+			numvalues_perrow=xNewZeroInit<int>(this->m);
+			for(i=0;i<num_procs;i++){ 
+				int  numvalues=numvalues_fromcpu[i];
+				int* rows=row_indices_fromcpu[i];
+				for(j=0;j<numvalues;j++)numvalues_perrow[rows[j]-lower_row]++;
+			}
+
 			
 			/*Deal with sparse row one at a time: */
 			for(row=0;row<this->m;row++){
 
-				/*figure out how many values this row is going to get: */
-				count=0;
-				for(i=0;i<num_procs;i++){ 
-					int  numvalues=numvalues_fromcpu[i];
-					int* rows=row_indices_fromcpu[i];
-					for(j=0;j<numvalues;j++)if((rows[j]-lower_row)==row)count++;
-				}
-
 				/*Allocate: */
-				this_row_numvalues=count;
+				this_row_numvalues=numvalues_perrow[row];
 				this_row_cols=xNew<int>(this_row_numvalues);
 				this_row_values=xNew<doubletype>(this_row_numvalues);
@@ -323,4 +325,5 @@
 
 			/*Free ressources:{{{*/
+			xDelete<int>(numvalues_perrow);
 			xDelete<int>(RowRank);
 			xDelete<int>(row_indices_forcpu);
