Index: /issm/trunk-jpl/src/c/toolkits/mpi/commops/DetermineGlobalSize.cpp
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/mpi/commops/DetermineGlobalSize.cpp	(revision 15834)
+++ /issm/trunk-jpl/src/c/toolkits/mpi/commops/DetermineGlobalSize.cpp	(revision 15834)
@@ -0,0 +1,20 @@
+/* \file DetermineGlobalSize.cpp
+ * \brief: routine to determine global size from local size 
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include "../../../shared/shared.h"
+#include "../../../shared/Numerics/types.h"
+
+int DetermineGlobalSize(int local_size,COMM comm){
+
+	/*output: */
+	int  global_size;
+
+	MPI_Reduce(&local_size, &global_size, 1, MPI_INT, MPI_SUM, 0, comm);
+	MPI_Bcast(&global_size,1,MPI_INT,0,comm);
+
+	return global_size;
+
+}
Index: /issm/trunk-jpl/src/c/toolkits/mpi/commops/DetermineLocalSize.cpp
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/mpi/commops/DetermineLocalSize.cpp	(revision 15834)
+++ /issm/trunk-jpl/src/c/toolkits/mpi/commops/DetermineLocalSize.cpp	(revision 15834)
@@ -0,0 +1,58 @@
+/* \file DetermineLocalSize.cpp
+ * \brief: routine to determine local size of a global petsc matrix or vector. 
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include "../../../shared/shared.h"
+
+int DetermineLocalSize(int global_size,COMM comm){
+
+	/*output: */
+	int  local_size;
+
+	/*intermediary: */
+	int  i;
+	int  row_rest;
+	int* num_local_rows=NULL;
+
+	/*from MPI: */
+	int num_procs;
+	int my_rank;
+
+	/*recover my_rank*/
+	MPI_Comm_rank(comm,&my_rank);
+	MPI_Comm_size(comm,&num_procs);
+
+	/* TODO replace the following with ->
+
+	local_size=global_size/num_procs; // integer division
+	if (global_size%num_procs>my_rank) local_size++; // distribute the remainder
+	return local_size;
+
+	<- to here  */
+
+	/*We are  not bound by any library, just use what seems most logical*/
+	num_local_rows=xNew<int>(num_procs);    
+
+	for (i=0;i<num_procs;i++){
+		/*Here, we use floor. We under distribute rows. The rows 
+		  left  are then redistributed, therefore resulting in a 
+		  more even distribution.*/
+		num_local_rows[i]=(int)floor((double)global_size/(double)num_procs); 
+	}
+
+	/*There may be some rows left. Distribute evenly.*/ 
+	row_rest=global_size - num_procs*(int)floor((double)global_size/(double)num_procs);
+	for (i=0;i<row_rest;i++){
+		num_local_rows[i]++;
+	}
+	local_size=num_local_rows[my_rank];
+
+	/*free ressources: */
+	xDelete<int>(num_local_rows);
+
+	/*return size: */
+	return local_size;
+
+}
Index: /issm/trunk-jpl/src/c/toolkits/mpi/commops/DetermineRowRankFromLocalSize.cpp
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/mpi/commops/DetermineRowRankFromLocalSize.cpp	(revision 15834)
+++ /issm/trunk-jpl/src/c/toolkits/mpi/commops/DetermineRowRankFromLocalSize.cpp	(revision 15834)
@@ -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 "../../../shared/Numerics/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/commops/GetOwnershipBoundariesFromRange.cpp
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/mpi/commops/GetOwnershipBoundariesFromRange.cpp	(revision 15834)
+++ /issm/trunk-jpl/src/c/toolkits/mpi/commops/GetOwnershipBoundariesFromRange.cpp	(revision 15834)
@@ -0,0 +1,45 @@
+/*! \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/MemOps/MemOps.h"
+#include "../../../shared/io/Comm/Comm.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/commops/commops.h
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/mpi/commops/commops.h	(revision 15834)
+++ /issm/trunk-jpl/src/c/toolkits/mpi/commops/commops.h	(revision 15834)
@@ -0,0 +1,16 @@
+/*! \file mpipatches.h
+ *  \brief: prototype header for all ISSM add-ons to MPI
+ */
+
+#ifndef MPI_PATCHES_H_ 
+#define MPI_PATCHES_H_
+
+#include "../../../shared/Numerics/types.h" 
+#include "../../../shared/io/Comm/Comm.h"
+
+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);
+int DetermineGlobalSize(int local_size,COMM comm);
+
+#endif
Index: /issm/trunk-jpl/src/c/toolkits/mpi/mpiincludes.h
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/mpi/mpiincludes.h	(revision 15833)
+++ /issm/trunk-jpl/src/c/toolkits/mpi/mpiincludes.h	(revision 15834)
@@ -18,5 +18,5 @@
 
 /*Patches: */
-#include "./patches/mpipatches.h"
+#include "./commops/commops.h"
 #endif
 
