Index: /issm/trunk-jpl/src/c/toolkits/mpi/patches/DetermineRowRankFromLocalSize.cpp
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/mpi/patches/DetermineRowRankFromLocalSize.cpp	(revision 14706)
+++ /issm/trunk-jpl/src/c/toolkits/mpi/patches/DetermineRowRankFromLocalSize.cpp	(revision 14706)
@@ -0,0 +1,45 @@
+/* \file DetermineRowRankFromLocalSize.cpp
+ * \brief: routine to determine, from local size of a matrix or vector (in terms of number 
+ * of rows), a vector of global size  which for each row of the matrix or vector, determines
+ * what cpu this row belong to.
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include "../../../shared/shared.h"
+#include "../../../include/types.h"
+
+int* DetermineRowRankFromLocalSize(int global_size,int localsize,COMM comm){
+
+	/*intermediary: */
+	int i,j;
+	int my_rank=0;
+	int num_procs=0;
+	int lower_row,upper_row;
+
+	/*output: */
+	int* RowRank=NULL;
+
+	MPI_Comm_rank(comm,&my_rank);
+	MPI_Comm_size(comm,&num_procs);
+
+	/*allocate: */
+	RowRank=xNew<int>(global_size);
+
+	/*Gather all local_size values into alllocalsizes, for all cpus*/
+	int* alllocalsizes=xNew<int>(num_procs);
+	MPI_Allgather(&localsize,1,MPI_INT,alllocalsizes,1,MPI_INT,comm);
+
+	/*From all localsizes, get lower row and upper row*/
+	lower_row=0;
+	upper_row=lower_row+alllocalsizes[0];
+	for(j=lower_row;j<upper_row;j++)RowRank[j]=0;
+
+	for(i=1;i<num_procs;i++){
+		lower_row=lower_row+alllocalsizes[i-1];
+		upper_row=upper_row+alllocalsizes[i];
+		for(j=lower_row;j<upper_row;j++)RowRank[j]=i;
+	}
+
+	return RowRank;
+}
Index: /issm/trunk-jpl/src/c/toolkits/mpi/patches/GetOwnershipBoundariesFromRange.cpp
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/mpi/patches/GetOwnershipBoundariesFromRange.cpp	(revision 14706)
+++ /issm/trunk-jpl/src/c/toolkits/mpi/patches/GetOwnershipBoundariesFromRange.cpp	(revision 14706)
@@ -0,0 +1,44 @@
+/*! \file:  GetOwnershipBoundariesFromRange.cpp
+ *  \brief from a local range on each cpu, we determine what 
+ *  lower row and upper row from a matrix a cpu owns.
+ */
+
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include <stdio.h>
+#include "../../../shared/Alloc/alloc.h"
+
+void GetOwnershipBoundariesFromRange(int* plower_row,int* pupper_row,int range,COMM comm){
+
+	/*externals :*/
+	int my_rank;
+	int num_procs;
+
+	/*recover my_rank and num_procs:*/
+	MPI_Comm_size(comm,&num_procs);
+	MPI_Comm_rank(comm,&my_rank);
+
+	/*output: */
+	int lower_row,upper_row;
+
+	/*Gather all range values into allranges, for all nodes*/
+	int* allranges=xNew<int>(num_procs);
+	MPI_Allgather(&range,1,MPI_INT,allranges,1,MPI_INT,comm);
+
+	/*From all ranges, get lower row and upper row*/
+	lower_row=0;
+	upper_row=lower_row+allranges[0];
+	for(int i=1;i<=my_rank;i++){
+		lower_row=lower_row+allranges[i-1];
+		upper_row=upper_row+allranges[i];
+	}
+
+	/*Assign output*/
+	*plower_row=lower_row;
+	*pupper_row=upper_row;
+	xDelete<int>(allranges);
+}
Index: /issm/trunk-jpl/src/c/toolkits/mpi/patches/mpipatches.h
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/mpi/patches/mpipatches.h	(revision 14705)
+++ /issm/trunk-jpl/src/c/toolkits/mpi/patches/mpipatches.h	(revision 14706)
@@ -9,4 +9,6 @@
 
 int DetermineLocalSize(int global_size,COMM comm);
+int* DetermineRowRankFromLocalSize(int global_size,int localsize,COMM comm);
+void GetOwnershipBoundariesFromRange(int* plower_row,int* pupper_row,int range,COMM comm);
 
 #endif
