Index: /issm/trunk/src/c/Container/Nodes.cpp
===================================================================
--- /issm/trunk/src/c/Container/Nodes.cpp	(revision 5113)
+++ /issm/trunk/src/c/Container/Nodes.cpp	(revision 5114)
@@ -44,5 +44,5 @@
 /*Numerics*/
 /*FUNCTION Nodes::DistributeDofs{{{1*/
-void  Nodes::DistributeDofs(int numberofobjects,int numberofdofsperobject,int analysis_type){
+void  Nodes::DistributeDofs(int analysis_type){
 
 	extern int num_procs;
@@ -52,9 +52,11 @@
 	
 	int  dofcount=0;
+	int  maxdofspernode=0;
 	int* alldofcount=NULL;
 	int* truedofs=NULL;
 	int* alltruedofs=NULL;
-
-	/*Go through objects, and distribute dofs locally, from 0 to numberofdofsperobject: */
+	int  numnodes=0;
+
+	/*Go through objects, and distribute dofs locally, from 0 to numberofdofs: */
 	for (i=0;i<this->Size();i++){
 		Node* node=(Node*)this->GetObjectByOffset(i);
@@ -65,4 +67,6 @@
 		}
 	}
+
+
 
 	/*Ok, now every object has distributed dofs, but locally, and with a dof count starting from 
@@ -86,5 +90,4 @@
 	}
 
-
 	/*Ok, now every cpu knows where his dofs should start. Update the dof count: */
 	for (i=0;i<this->Size();i++){
@@ -101,6 +104,9 @@
 	 * object that is not a clone, tell them to show their dofs, so that later on, they can get picked 
 	 * up by their clones: */
-	truedofs=(int*)xcalloc(numberofobjects*numberofdofsperobject,sizeof(int));
-	alltruedofs=(int*)xcalloc(numberofobjects*numberofdofsperobject,sizeof(int));
+	maxdofspernode=this->MaxNumDofs(analysis_type);
+	numnodes=this->NumberOfNodes(analysis_type);
+
+	truedofs=(int*)xcalloc(numnodes*maxdofspernode,sizeof(int)); //initialize to 0, so that we can pick up the max
+	alltruedofs=(int*)xcalloc(numnodes*maxdofspernode,sizeof(int));
 
 	for (i=0;i<this->Size();i++){
@@ -108,9 +114,9 @@
 		Node* node=(Node*)this->GetObjectByOffset(i);
 		if (node->InAnalysis(analysis_type)){
-			node->ShowTrueDofs(truedofs);
-		}
-	}
-	
-	MPI_Allreduce ( (void*)truedofs,(void*)alltruedofs,numberofobjects*numberofdofsperobject,MPI_INT,MPI_MAX,MPI_COMM_WORLD);
+			node->ShowTrueDofs(truedofs,maxdofspernode);//give maxdofspernode, column size, so that nodes can index into truedofs
+		}
+	}
+
+	MPI_Allreduce ( (void*)truedofs,(void*)alltruedofs,numnodes*maxdofspernode,MPI_INT,MPI_MAX,MPI_COMM_WORLD);
 
 	/*Ok, now every cpu knows the true dofs of everyone else that is not a clone. Let the clones recover those true dofs: */
@@ -119,5 +125,5 @@
 		Node* node=(Node*)this->GetObjectByOffset(i);
 		if (node->InAnalysis(analysis_type)){
-			node->UpdateCloneDofs(alltruedofs);
+			node->UpdateCloneDofs(alltruedofs,maxdofspernode); //give maxdofspernode, column size, so that nodes can index into alltruedofs
 		}
 	}
@@ -128,8 +134,9 @@
 	xfree((void**)&alltruedofs);
 
+
 }
 /*}}}*/
 /*FUNCTION Nodes::FlagClones{{{1*/
-void  Nodes::FlagClones(int numberofobjects,int analysis_type){
+void  Nodes::FlagClones(int analysis_type){
 
 	int i;
@@ -138,10 +145,15 @@
 	int* ranks=NULL;
 	int* minranks=NULL;
+	int  numnodes;
+
+
+	/*Figure out number of nodes for this analysis: */
+	numnodes=this->NumberOfNodes(analysis_type);
 
 	/*Allocate ranks: */
-	ranks=(int*)xmalloc(numberofobjects*sizeof(int));
-	minranks=(int*)xmalloc(numberofobjects*sizeof(int));
-
-	for(i=0;i<numberofobjects;i++)ranks[i]=num_procs; //no cpu can have rank num_procs. This is the maximum limit.
+	ranks=(int*)xmalloc(numnodes*sizeof(int));
+	minranks=(int*)xmalloc(numnodes*sizeof(int));
+
+	for(i=0;i<numnodes;i++)ranks[i]=num_procs; //no cpu can have rank num_procs. This is the maximum limit.
 
 	/*Now go through all our objects and ask them to report to who they belong (which rank): */
@@ -152,5 +164,5 @@
 	 * dealt with by another cpu. We take the minimum because we are going to manage dof assignment in increasing 
 	 * order of cpu rank. This is also why we initialized this array to num_procs.*/
-	MPI_Allreduce ( (void*)ranks,(void*)minranks,numberofobjects,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
+	MPI_Allreduce ( (void*)ranks,(void*)minranks,numnodes,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
 
 	/*Now go through all objects, and use minranks to flag which objects are cloned: */
@@ -236,4 +248,6 @@
 int Nodes::NumberOfNodes(void){
 
+	/*Careful! only use once all clones have been setup for all nodes!: */
+
 	int i;
 	
@@ -260,5 +274,5 @@
 	int i;
 
-	int max_sid=0;
+	int max_sid=-1;
 	int sid;
 	int node_max_sid;
@@ -276,15 +290,20 @@
 	}
 
-#ifdef _PARALLEL_
-	MPI_Reduce (&max_sid,&node_max_sid,1,MPI_INT,MPI_MAX,0,MPI_COMM_WORLD );
-	MPI_Bcast(&node_max_sid,1,MPI_INT,0,MPI_COMM_WORLD);
-	max_sid=node_max_sid;
-#endif 
-
-	/*sid starts at 0*/
-	max_sid++;
-
-	/*return*/
-	return max_sid;
+	#ifdef _PARALLEL_
+		MPI_Reduce (&max_sid,&node_max_sid,1,MPI_INT,MPI_MAX,0,MPI_COMM_WORLD );
+		MPI_Bcast(&node_max_sid,1,MPI_INT,0,MPI_COMM_WORLD);
+		max_sid=node_max_sid;
+	#endif 
+
+	if(max_sid==1){
+		return 0;
+	}
+	else{
+		/*sid starts at 0*/
+		max_sid++;
+	
+		/*return*/
+		return max_sid;
+	}
 }
 /*}}}*/
@@ -315,2 +334,32 @@
 }
 /*}}}*/
+/*FUNCTION Nodes::MaxNumDofs{{{1*/
+int   Nodes::MaxNumDofs(int analysis_type){
+
+	int i;
+	int   max=0;
+	int   allmax;
+	int   numdofs=0;
+
+	/*Now go through all nodes, and get how many dofs they own, unless they are clone nodes: */
+	for(i=0;i<this->Size();i++){
+
+		Node* node=(Node*)this->GetObjectByOffset(i);
+
+		/*Check that this node corresponds to our analysis currently being carried out: */
+		if (node->InAnalysis(analysis_type)){
+
+			numdofs=node->GetNumberOfDofs();
+			if (numdofs>max)max=numdofs;
+		}
+	}
+
+	#ifdef _PARALLEL_
+	/*Grab max of all cpus: */
+	MPI_Allreduce ( (void*)&max,(void*)&allmax,1,MPI_INT,MPI_MAX,MPI_COMM_WORLD);
+	max=allmax;
+	#endif
+
+	return max;
+}
+/*}}}*/
Index: /issm/trunk/src/c/Container/Nodes.h
===================================================================
--- /issm/trunk/src/c/Container/Nodes.h	(revision 5113)
+++ /issm/trunk/src/c/Container/Nodes.h	(revision 5114)
@@ -19,6 +19,6 @@
 		/*}}}*/
 		/*numerics: {{{1*/
-		void  DistributeDofs(int numberofnodes,int numdofspernode,int analysis_type);
-		void  FlagClones(int numberofnodes,int analysis_type);
+		void  DistributeDofs(int analysis_type);
+		void  FlagClones(int analysis_type);
 		void  FlagNodeSets(Vec pv_g, Vec pv_f, Vec pv_s,int analysis_type);
 		int   NumberOfDofs(int analysis_type);
@@ -26,4 +26,5 @@
 		int   NumberOfNodes(void);
 		void  Ranks(int* ranks,int analysis_type);
+		int   MaxNumDofs(int analysis_type);
 		/*}}}*/
 
Index: /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h	(revision 5113)
+++ /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h	(revision 5114)
@@ -321,5 +321,4 @@
 	NumOutputEnum,
 	NumRiftsEnum,
-	NumberOfDofsPerNodeEnum,
 	NumberOfElementsEnum,
 	NumberOfNodesEnum,
Index: /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp	(revision 5113)
+++ /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp	(revision 5114)
@@ -284,5 +284,4 @@
 		case NumOutputEnum : return "NumOutput";
 		case NumRiftsEnum : return "NumRifts";
-		case NumberOfDofsPerNodeEnum : return "NumberOfDofsPerNode";
 		case NumberOfElementsEnum : return "NumberOfElements";
 		case NumberOfNodesEnum : return "NumberOfNodes";
Index: /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp	(revision 5113)
+++ /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp	(revision 5114)
@@ -282,5 +282,4 @@
 	else if (strcmp(name,"NumOutput")==0) return NumOutputEnum;
 	else if (strcmp(name,"NumRifts")==0) return NumRiftsEnum;
-	else if (strcmp(name,"NumberOfDofsPerNode")==0) return NumberOfDofsPerNodeEnum;
 	else if (strcmp(name,"NumberOfElements")==0) return NumberOfElementsEnum;
 	else if (strcmp(name,"NumberOfNodes")==0) return NumberOfNodesEnum;
Index: /issm/trunk/src/c/Makefile.am
===================================================================
--- /issm/trunk/src/c/Makefile.am	(revision 5113)
+++ /issm/trunk/src/c/Makefile.am	(revision 5114)
@@ -233,5 +233,4 @@
 					./shared/Dofs/dofs.h\
 					./shared/Dofs/dofsetgen.cpp\
-					./shared/Dofs/DistributeNumDofs.cpp\
 					./shared/Numerics/numerics.h\
 					./shared/Numerics/isnan.h\
@@ -340,4 +339,5 @@
 					./modules/ModelProcessorx/ModelProcessorx.h\
 					./modules/ModelProcessorx/ModelProcessorx.cpp\
+					./modules/ModelProcessorx/DistributeNumDofs.cpp\
 					./modules/ModelProcessorx/ElementsAndVerticesPartitioning.cpp\
 					./modules/ModelProcessorx/NodesPartitioning.cpp\
@@ -768,5 +768,4 @@
 					./shared/Dofs/dofs.h\
 					./shared/Dofs/dofsetgen.cpp\
-					./shared/Dofs/DistributeNumDofs.cpp\
 					./shared/Numerics/numerics.h\
 					./shared/Numerics/IsInputConverged.cpp\
@@ -872,4 +871,5 @@
 					./modules/ModelProcessorx/ModelProcessorx.h\
 					./modules/ModelProcessorx/ModelProcessorx.cpp\
+					./modules/ModelProcessorx/DistributeNumDofs.cpp\
 					./modules/ModelProcessorx/ElementsAndVerticesPartitioning.cpp\
 					./modules/ModelProcessorx/NodesPartitioning.cpp\
Index: /issm/trunk/src/c/modules/ModelProcessorx/Balancedthickness/CreateNodesBalancedthickness.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Balancedthickness/CreateNodesBalancedthickness.cpp	(revision 5113)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Balancedthickness/CreateNodesBalancedthickness.cpp	(revision 5114)
@@ -47,4 +47,5 @@
 	IoModelFetchData(&iomodel->gridonicesheet,NULL,NULL,iomodel_handle,"gridonicesheet");
 	IoModelFetchData(&iomodel->gridoniceshelf,NULL,NULL,iomodel_handle,"gridoniceshelf");
+	IoModelFetchData(&iomodel->vertices_type,NULL,NULL,iomodel_handle,"vertices_type");
 
 	if(continuous_galerkin){
@@ -92,4 +93,5 @@
 	xfree((void**)&iomodel->gridonicesheet);
 	xfree((void**)&iomodel->gridoniceshelf);
+	xfree((void**)&iomodel->vertices_type);
 
 	/*Assign output pointer: */
Index: /issm/trunk/src/c/modules/ModelProcessorx/Balancedvelocities/CreateNodesBalancedvelocities.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Balancedvelocities/CreateNodesBalancedvelocities.cpp	(revision 5113)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Balancedvelocities/CreateNodesBalancedvelocities.cpp	(revision 5114)
@@ -39,5 +39,5 @@
 	IoModelFetchData(&iomodel->gridonicesheet,NULL,NULL,iomodel_handle,"gridonicesheet");
 	IoModelFetchData(&iomodel->gridoniceshelf,NULL,NULL,iomodel_handle,"gridoniceshelf");
-
+	IoModelFetchData(&iomodel->vertices_type,NULL,NULL,iomodel_handle,"vertices_type");
 	for (i=0;i<iomodel->numberofvertices;i++){
 
@@ -56,5 +56,6 @@
 	xfree((void**)&iomodel->gridonicesheet);
 	xfree((void**)&iomodel->gridoniceshelf);
-	
+	xfree((void**)&iomodel->vertices_type);	
+
 	/*Assign output pointer: */
 	*pnodes=nodes;
Index: /issm/trunk/src/c/modules/ModelProcessorx/BedSlope/CreateNodesBedSlope.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/BedSlope/CreateNodesBedSlope.cpp	(revision 5113)
+++ /issm/trunk/src/c/modules/ModelProcessorx/BedSlope/CreateNodesBedSlope.cpp	(revision 5114)
@@ -39,4 +39,5 @@
 	IoModelFetchData(&iomodel->gridonicesheet,NULL,NULL,iomodel_handle,"gridonicesheet");
 	IoModelFetchData(&iomodel->gridoniceshelf,NULL,NULL,iomodel_handle,"gridoniceshelf");
+	IoModelFetchData(&iomodel->vertices_type,NULL,NULL,iomodel_handle,"vertices_type");
 
 	for (i=0;i<iomodel->numberofvertices;i++){
@@ -56,4 +57,5 @@
 	xfree((void**)&iomodel->gridonicesheet);
 	xfree((void**)&iomodel->gridoniceshelf);
+	xfree((void**)&iomodel->vertices_type);	
 	
 	/*Assign output pointer: */
Index: /issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 5113)
+++ /issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 5114)
@@ -17,5 +17,4 @@
 	
 	Parameters* parameters = NULL;
-	int      numberofdofspernode;
 	char**   parameteroutput=NULL;
 	char*    descriptor=NULL;
@@ -67,7 +66,4 @@
 
 	/*Deal with more complex parameters*/
-	DistributeNumDofs(&numberofdofspernode,analysis_type);
-	parameters->AddObject(new IntParam(NumberOfDofsPerNodeEnum,numberofdofspernode));
-
 	IoModelFetchData(&iomodel->riftinfo,&iomodel->numrifts,NULL,iomodel_handle,"riftinfo");
 	parameters->AddObject(new IntParam(NumRiftsEnum,iomodel->numrifts));
Index: /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp	(revision 5113)
+++ /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp	(revision 5114)
@@ -40,4 +40,5 @@
 	IoModelFetchData(&iomodel->gridonicesheet,NULL,NULL,iomodel_handle,"gridonicesheet");
 	IoModelFetchData(&iomodel->gridoniceshelf,NULL,NULL,iomodel_handle,"gridoniceshelf");
+	IoModelFetchData(&iomodel->vertices_type,NULL,NULL,iomodel_handle,"vertices_type");
 	if (iomodel->dim==3){
 		IoModelFetchData(&iomodel->deadgrids,NULL,NULL,iomodel_handle,"deadgrids");
@@ -60,4 +61,5 @@
 	xfree((void**)&iomodel->gridoniceshelf);
 	xfree((void**)&iomodel->deadgrids);
+	xfree((void**)&iomodel->vertices_type);	
 
 	cleanup_and_return:
Index: /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHutter/CreateNodesDiagnosticHutter.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHutter/CreateNodesDiagnosticHutter.cpp	(revision 5113)
+++ /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHutter/CreateNodesDiagnosticHutter.cpp	(revision 5114)
@@ -44,4 +44,6 @@
 	IoModelFetchData(&iomodel->gridoniceshelf,NULL,NULL,iomodel_handle,"gridoniceshelf");
 	IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,"elements");
+	IoModelFetchData(&iomodel->vertices_type,NULL,NULL,iomodel_handle,"vertices_type");
+
 	CreateNumberNodeToElementConnectivity(iomodel);
 
@@ -65,4 +67,5 @@
 	xfree((void**)&iomodel->elements);
 	xfree((void**)&iomodel->numbernodetoelementconnectivity);
+	xfree((void**)&iomodel->vertices_type);	
 
 	cleanup_and_return:
Index: /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticStokes/CreateNodesDiagnosticStokes.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticStokes/CreateNodesDiagnosticStokes.cpp	(revision 5113)
+++ /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticStokes/CreateNodesDiagnosticStokes.cpp	(revision 5114)
@@ -43,4 +43,5 @@
 	IoModelFetchData(&iomodel->gridonstokes,NULL,NULL,iomodel_handle,"gridonstokes");
 	IoModelFetchData(&iomodel->borderstokes,NULL,NULL,iomodel_handle,"borderstokes");
+	IoModelFetchData(&iomodel->vertices_type,NULL,NULL,iomodel_handle,"vertices_type");
 
 	for (i=0;i<iomodel->numberofvertices;i++){
@@ -62,4 +63,5 @@
 	xfree((void**)&iomodel->gridonicesheet);
 	xfree((void**)&iomodel->gridoniceshelf);
+	xfree((void**)&iomodel->vertices_type);	
 
 	cleanup_and_return:
Index: /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticVert/CreateNodesDiagnosticVert.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticVert/CreateNodesDiagnosticVert.cpp	(revision 5113)
+++ /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticVert/CreateNodesDiagnosticVert.cpp	(revision 5114)
@@ -40,4 +40,5 @@
 	IoModelFetchData(&iomodel->gridonicesheet,NULL,NULL,iomodel_handle,"gridonicesheet");
 	IoModelFetchData(&iomodel->gridoniceshelf,NULL,NULL,iomodel_handle,"gridoniceshelf");
+	IoModelFetchData(&iomodel->vertices_type,NULL,NULL,iomodel_handle,"vertices_type");
 
 	for (i=0;i<iomodel->numberofvertices;i++){
@@ -57,4 +58,5 @@
 	xfree((void**)&iomodel->gridonicesheet);
 	xfree((void**)&iomodel->gridoniceshelf);
+	xfree((void**)&iomodel->vertices_type);	
 	
 	cleanup_and_return:
Index: /issm/trunk/src/c/modules/ModelProcessorx/DistributeNumDofs.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/DistributeNumDofs.cpp	(revision 5114)
+++ /issm/trunk/src/c/modules/ModelProcessorx/DistributeNumDofs.cpp	(revision 5114)
@@ -0,0 +1,52 @@
+/*!\file:  DistributeNumDofs.cpp
+ * \brief: figure out the maximum number of dofs per grid.
+ */ 
+
+#include "../../shared/shared.h"
+#include "../../include/include.h"
+#include "../../EnumDefinitions/EnumDefinitions.h"
+	
+void DistributeNumDofs(int* pnumdofs,int analysis_type,double* vertices_type){
+
+	/*For now, we distribute by analysis_type, later, we will distribute using the analysis_type,
+	 * but also the vertices_type: */
+
+	int numdofs=2; //default numdofs
+	int i;
+
+	/*ok, according to analysis type: */
+	if (analysis_type==DiagnosticHorizAnalysisEnum){
+		numdofs=2;
+	}
+	else if (analysis_type==DiagnosticVertAnalysisEnum){
+		numdofs=1;
+	}
+	else if (analysis_type==DiagnosticStokesAnalysisEnum){
+		numdofs=4;
+	}
+	else if (analysis_type==DiagnosticHutterAnalysisEnum){
+		numdofs=2;
+	}
+	else if (analysis_type==BedSlopeAnalysisEnum || analysis_type==SurfaceSlopeAnalysisEnum){
+		numdofs=1;
+	}
+	else if (analysis_type==ThermalAnalysisEnum){
+		numdofs=1;
+	}
+	else if (analysis_type==MeltingAnalysisEnum){
+		numdofs=1;
+	}
+	else if (analysis_type==PrognosticAnalysisEnum){
+		numdofs=1;
+	}
+	else if (analysis_type==BalancedthicknessAnalysisEnum){
+		numdofs=1;
+	}
+	else if (analysis_type==BalancedvelocitiesAnalysisEnum){
+		numdofs=1;
+	}
+	else ISSMERROR("analysis type: %i (%s) not implemented yet",analysis_type,EnumToString(analysis_type));
+
+	/*Assign output pointers:*/
+	*pnumdofs=numdofs;;
+}
Index: /issm/trunk/src/c/modules/ModelProcessorx/Melting/CreateNodesMelting.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Melting/CreateNodesMelting.cpp	(revision 5113)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Melting/CreateNodesMelting.cpp	(revision 5114)
@@ -39,4 +39,5 @@
 	IoModelFetchData(&iomodel->gridonicesheet,NULL,NULL,iomodel_handle,"gridonicesheet");
 	IoModelFetchData(&iomodel->gridoniceshelf,NULL,NULL,iomodel_handle,"gridoniceshelf");
+	IoModelFetchData(&iomodel->vertices_type,NULL,NULL,iomodel_handle,"vertices_type");
 
 	for (i=0;i<iomodel->numberofvertices;i++){
@@ -56,4 +57,5 @@
 	xfree((void**)&iomodel->gridonicesheet);
 	xfree((void**)&iomodel->gridoniceshelf);
+	xfree((void**)&iomodel->vertices_type);	
 
 	/*Assign output pointer: */
Index: /issm/trunk/src/c/modules/ModelProcessorx/ModelProcessorx.h
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 5113)
+++ /issm/trunk/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 5114)
@@ -102,3 +102,7 @@
 void  UpdateCounters(IoModel* iomodel,Nodes** pnodes,Loads** ploads, Constraints** pconstraints);
 
+
+/*Distribution of dofs: */
+void DistributeNumDofs(int* pnumdofs,int analysis_type,double* vertices_type);
+
 #endif
Index: /issm/trunk/src/c/modules/ModelProcessorx/Prognostic/CreateNodesPrognostic.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Prognostic/CreateNodesPrognostic.cpp	(revision 5113)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Prognostic/CreateNodesPrognostic.cpp	(revision 5114)
@@ -47,4 +47,5 @@
 	IoModelFetchData(&iomodel->gridonicesheet,NULL,NULL,iomodel_handle,"gridonicesheet");
 	IoModelFetchData(&iomodel->gridoniceshelf,NULL,NULL,iomodel_handle,"gridoniceshelf");
+	IoModelFetchData(&iomodel->vertices_type,NULL,NULL,iomodel_handle,"vertices_type");
 
 	if(continuous_galerkin){
@@ -92,4 +93,5 @@
 	xfree((void**)&iomodel->gridoniceshelf);
 	xfree((void**)&iomodel->elements);
+	xfree((void**)&iomodel->vertices_type);	
 
 	/*Assign output pointer: */
Index: /issm/trunk/src/c/modules/ModelProcessorx/SurfaceSlope/CreateNodesSurfaceSlope.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/SurfaceSlope/CreateNodesSurfaceSlope.cpp	(revision 5113)
+++ /issm/trunk/src/c/modules/ModelProcessorx/SurfaceSlope/CreateNodesSurfaceSlope.cpp	(revision 5114)
@@ -39,4 +39,5 @@
 	IoModelFetchData(&iomodel->gridonicesheet,NULL,NULL,iomodel_handle,"gridonicesheet");
 	IoModelFetchData(&iomodel->gridoniceshelf,NULL,NULL,iomodel_handle,"gridoniceshelf");
+	IoModelFetchData(&iomodel->vertices_type,NULL,NULL,iomodel_handle,"vertices_type");
 
 	for (i=0;i<iomodel->numberofvertices;i++){
@@ -56,4 +57,5 @@
 	xfree((void**)&iomodel->gridonicesheet);
 	xfree((void**)&iomodel->gridoniceshelf);
+	xfree((void**)&iomodel->vertices_type);	
 	
 	/*Assign output pointer: */
Index: /issm/trunk/src/c/modules/ModelProcessorx/Thermal/CreateNodesThermal.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Thermal/CreateNodesThermal.cpp	(revision 5113)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Thermal/CreateNodesThermal.cpp	(revision 5114)
@@ -39,4 +39,5 @@
 	IoModelFetchData(&iomodel->gridonicesheet,NULL,NULL,iomodel_handle,"gridonicesheet");
 	IoModelFetchData(&iomodel->gridoniceshelf,NULL,NULL,iomodel_handle,"gridoniceshelf");
+	IoModelFetchData(&iomodel->vertices_type,NULL,NULL,iomodel_handle,"vertices_type");
 
 	for (i=0;i<iomodel->numberofvertices;i++){
@@ -56,4 +57,5 @@
 	xfree((void**)&iomodel->gridonicesheet);
 	xfree((void**)&iomodel->gridoniceshelf);
+	xfree((void**)&iomodel->vertices_type);	
 	
 	/*Assign output pointer: */
Index: /issm/trunk/src/c/modules/NodesDofx/NodesDofx.cpp
===================================================================
--- /issm/trunk/src/c/modules/NodesDofx/NodesDofx.cpp	(revision 5113)
+++ /issm/trunk/src/c/modules/NodesDofx/NodesDofx.cpp	(revision 5114)
@@ -16,25 +16,17 @@
 	int i;
 	
-	/*intermediary: */
-	int  numberofnodes;
-	int  numberofdofspernode;
+	/*Do we have any nodes for this analysis type? :*/
+	if(nodes->NumberOfNodes(analysis_type)){ 
 
-	/*First, recover number nodes associated th this analysis: */
-	numberofnodes=nodes->NumberOfNodes(analysis_type);
+		/*Ensure that only for each cpu, the partition border nodes only will be taken into account once 
+		 * across the cluster. To do so, we flag all the clone nodes: */
+		nodes->FlagClones(analysis_type);
 
-	/*Recover number of dofs per node: */
-	found=parameters->FindParam(&numberofdofspernode,NumberOfDofsPerNodeEnum);
-	if(!found)ISSMERROR("could not find numberofdofspernode in parameters");
-	/*WARNING: THERE IS A BUG HERE TO BE FIXED (see wiki)*/
-	DistributeNumDofs(&numberofdofspernode,analysis_type);
+		/*Go through all nodes, and build degree of freedom lists. Each node gets a fixed number of dofs. When 
+		 *a  node has already been distributed dofs on one cpu, all other cpus with the same node cannot distribute it 
+		 *anymore. Use clone field to be sure of that: */
+		nodes->DistributeDofs(analysis_type);
 
-	/*Ensure that only for each cpu, the partition border nodes only will be taken into account once 
-	 * across the cluster. To do so, we flag all the clone nodes: */
-	nodes->FlagClones(numberofnodes,analysis_type);
-
-	/*Go through all nodes, and build degree of freedom lists. Each node gets a fixed number of dofs. When 
-	 *a  node has already been distributed dofs on one cpu, all other cpus with the same node cannot distribute it 
-	 *anymore. Use clone field to be sure of that: */
-	nodes->DistributeDofs(numberofnodes,numberofdofspernode,analysis_type);
+	}
 
 }
Index: /issm/trunk/src/c/modules/SystemMatricesx/SystemMatricesx.cpp
===================================================================
--- /issm/trunk/src/c/modules/SystemMatricesx/SystemMatricesx.cpp	(revision 5113)
+++ /issm/trunk/src/c/modules/SystemMatricesx/SystemMatricesx.cpp	(revision 5114)
@@ -33,8 +33,10 @@
 	/*Recover parameters: */
 	parameters->FindParam(&connectivity,ConnectivityEnum);
-	parameters->FindParam(&numberofdofspernode,NumberOfDofsPerNodeEnum);
 
 	/*Get size of matrix: */
 	gsize=nodes->NumberOfDofs(configuration_type);
+
+	/*Get numberofdofspernode: */
+	numberofdofspernode=nodes->MaxNumDofs(analysis_type);
 
 	/*Compute stiffness matrix*/
@@ -84,4 +86,5 @@
 		VecAssemblyEnd(pg);
 	}
+
 	
 	/*Assign output pointers: */
Index: /issm/trunk/src/c/objects/DofIndexing.cpp
===================================================================
--- /issm/trunk/src/c/objects/DofIndexing.cpp	(revision 5113)
+++ /issm/trunk/src/c/objects/DofIndexing.cpp	(revision 5114)
@@ -53,9 +53,5 @@
 /*}}}*/
 /*FUNCTION DofIndexing::~DofIndexing() {{{1*/
-DofIndexing::~DofIndexing(){
-
-	xfree((void**)&f_set);
-	xfree((void**)&s_set);
-	xfree((void**)&doflist);
+DofIndexing::~DofIndexing(){ //destructor
 }
 /*}}}*/
Index: /issm/trunk/src/c/objects/Node.cpp
===================================================================
--- /issm/trunk/src/c/objects/Node.cpp	(revision 5113)
+++ /issm/trunk/src/c/objects/Node.cpp	(revision 5114)
@@ -17,4 +17,5 @@
 #include "../shared/shared.h"
 #include "../include/include.h"
+#include "../modules/modules.h"
 /*}}}*/
 
@@ -70,5 +71,5 @@
 
 	/*indexing:*/
-	DistributeNumDofs(&numdofs,analysis_type); //number of dofs per node
+	DistributeNumDofs(&numdofs,analysis_type,iomodel->vertices_type+2*io_index); //number of dofs per node
 	this->indexing.Init(numdofs);
 
@@ -190,5 +191,5 @@
 	hvertex->DeepEcho();
 	printf("   inputs\n");
-	inputs->DeepEcho();
+
 
 }
@@ -630,5 +631,5 @@
 /*}}}*/
 /*FUNCTION Node::ShowTrueDofs{{{1*/
-void  Node::ShowTrueDofs(int* truedofs){
+void  Node::ShowTrueDofs(int* truedofs, int ncols){
 
 	int j;
@@ -640,11 +641,10 @@
 	/*Ok, we are not a clone, just plug our dofs into truedofs: */
 	for(j=0;j<this->indexing.numberofdofs;j++){
-		*(truedofs+this->indexing.numberofdofs*sid+j)=indexing.doflist[j];
-	}
-
+		*(truedofs+ncols*sid+j)=indexing.doflist[j];
+	}
 }
 /*}}}*/
 /*FUNCTION Node::UpdateCloneDofs{{{1*/
-void  Node::UpdateCloneDofs(int* alltruedofs){
+void  Node::UpdateCloneDofs(int* alltruedofs,int ncols){
 
 	int j;
@@ -654,9 +654,11 @@
 	if(indexing.clone==0)return;
 
-	/*Ok, we are a clone node, but we did not create the dofs for this node. 
-	 * Therefore, our doflist is garbage right now. Go pick it up in the alltruedofs: */
+
+	/*Ok, we are a clone node, but we did not create the dofs for this node.
+	 *      * Therefore, our doflist is garbage right now. Go pick it up in the alltruedofs: */
 	for(j=0;j<this->indexing.numberofdofs;j++){
-		indexing.doflist[j]=*(alltruedofs+this->indexing.numberofdofs*sid+j);
-	}
+		indexing.doflist[j]=*(alltruedofs+ncols*sid+j);
+	}
+
 }
 /*}}}*/
Index: /issm/trunk/src/c/objects/Node.h
===================================================================
--- /issm/trunk/src/c/objects/Node.h	(revision 5113)
+++ /issm/trunk/src/c/objects/Node.h	(revision 5114)
@@ -90,6 +90,6 @@
 		void  DistributeDofs(int* pdofcount);
 		void  OffsetDofs(int dofcount);
-		void  ShowTrueDofs(int* borderdofs);
-		void  UpdateCloneDofs(int* allborderdofs);
+		void  ShowTrueDofs(int* truerows,int ncols);
+		void  UpdateCloneDofs(int* alltruerows,int ncols);
 		void  SetClone(int* minranks);
 		void  CreatePartition(Vec partition);
Index: sm/trunk/src/c/shared/Dofs/DistributeNumDofs.cpp
===================================================================
--- /issm/trunk/src/c/shared/Dofs/DistributeNumDofs.cpp	(revision 5113)
+++ 	(revision )
@@ -1,51 +1,0 @@
-/*!\file:  DistributeNumDofs.cpp
- * \brief: figure out the maximum number of dofs per grid.
- */ 
-
-#include "../../include/include.h"
-#include "../../EnumDefinitions/EnumDefinitions.h"
-#include "../shared.h"
-
-int DistributeNumDofs(int *pnumdofs,int analysis_type){
-
-	int numdofs=2; //default numdofs
-	int i;
-
-	/*ok, according to analysis type: */
-	if (analysis_type==DiagnosticHorizAnalysisEnum){
-		numdofs=2;
-	}
-	else if (analysis_type==DiagnosticVertAnalysisEnum){
-		numdofs=1;
-	}
-	else if (analysis_type==DiagnosticStokesAnalysisEnum){
-		numdofs=4;
-	}
-	else if (analysis_type==DiagnosticHutterAnalysisEnum){
-		numdofs=2;
-	}
-	else if (analysis_type==BedSlopeAnalysisEnum || analysis_type==SurfaceSlopeAnalysisEnum){
-		numdofs=1;
-	}
-	else if (analysis_type==ThermalAnalysisEnum){
-		numdofs=1;
-	}
-	else if (analysis_type==MeltingAnalysisEnum){
-		numdofs=1;
-	}
-	else if (analysis_type==PrognosticAnalysisEnum){
-		numdofs=1;
-	}
-	else if (analysis_type==BalancedthicknessAnalysisEnum){
-		numdofs=1;
-	}
-	else if (analysis_type==BalancedvelocitiesAnalysisEnum){
-		numdofs=1;
-	}
-	else ISSMERROR("analysis type: %i (%s) not implemented yet",analysis_type,EnumToString(analysis_type));
-
-	/*Assign output pointers:*/
-	*pnumdofs=numdofs;;
-
-	return 1;
-}
Index: /issm/trunk/src/c/shared/Dofs/dofs.h
===================================================================
--- /issm/trunk/src/c/shared/Dofs/dofs.h	(revision 5113)
+++ /issm/trunk/src/c/shared/Dofs/dofs.h	(revision 5114)
@@ -7,5 +7,4 @@
 
 double* dofsetgen(int numdofs,int* doflist,int dofspernode,int totaldofs);
-int DistributeNumDofs(int *pnumdofs,int analysis_type);
 
 
Index: /issm/trunk/src/m/enum/EnumToString.m
===================================================================
--- /issm/trunk/src/m/enum/EnumToString.m	(revision 5113)
+++ /issm/trunk/src/m/enum/EnumToString.m	(revision 5114)
@@ -279,5 +279,4 @@
 	case NumOutputEnum(), string='NumOutput'; return
 	case NumRiftsEnum(), string='NumRifts'; return
-	case NumberOfDofsPerNodeEnum(), string='NumberOfDofsPerNode'; return
 	case NumberOfElementsEnum(), string='NumberOfElements'; return
 	case NumberOfNodesEnum(), string='NumberOfNodes'; return
Index: sm/trunk/src/m/enum/NumberOfDofsPerNodeEnum.m
===================================================================
--- /issm/trunk/src/m/enum/NumberOfDofsPerNodeEnum.m	(revision 5113)
+++ 	(revision )
@@ -1,11 +1,0 @@
-function macro=NumberOfDofsPerNodeEnum()
-%NUMBEROFDOFSPERNODEENUM - Enum of NumberOfDofsPerNode
-%
-%   WARNING: DO NOT MODIFY THIS FILE
-%            this file has been automatically generated by src/c/SynchronizeMatlabEnum
-%            Please read src/c/README for more information
-%
-%   Usage:
-%      macro=NumberOfDofsPerNodeEnum()
-
-macro=268;
Index: /issm/trunk/src/m/enum/NumberOfElementsEnum.m
===================================================================
--- /issm/trunk/src/m/enum/NumberOfElementsEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/NumberOfElementsEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=NumberOfElementsEnum()
 
-macro=269;
+macro=268;
Index: /issm/trunk/src/m/enum/NumberOfNodesEnum.m
===================================================================
--- /issm/trunk/src/m/enum/NumberOfNodesEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/NumberOfNodesEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=NumberOfNodesEnum()
 
-macro=270;
+macro=269;
Index: /issm/trunk/src/m/enum/NumberOfVerticesEnum.m
===================================================================
--- /issm/trunk/src/m/enum/NumberOfVerticesEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/NumberOfVerticesEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=NumberOfVerticesEnum()
 
-macro=271;
+macro=270;
Index: /issm/trunk/src/m/enum/OptScalEnum.m
===================================================================
--- /issm/trunk/src/m/enum/OptScalEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/OptScalEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=OptScalEnum()
 
-macro=272;
+macro=271;
Index: /issm/trunk/src/m/enum/OutputFilePointerEnum.m
===================================================================
--- /issm/trunk/src/m/enum/OutputFilePointerEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/OutputFilePointerEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=OutputFilePointerEnum()
 
-macro=273;
+macro=272;
Index: /issm/trunk/src/m/enum/ParameterOutputEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ParameterOutputEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/ParameterOutputEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=ParameterOutputEnum()
 
-macro=274;
+macro=273;
Index: /issm/trunk/src/m/enum/PenaltyMeltingEnum.m
===================================================================
--- /issm/trunk/src/m/enum/PenaltyMeltingEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/PenaltyMeltingEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=PenaltyMeltingEnum()
 
-macro=275;
+macro=274;
Index: /issm/trunk/src/m/enum/QmuAnalysisEnum.m
===================================================================
--- /issm/trunk/src/m/enum/QmuAnalysisEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/QmuAnalysisEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=QmuAnalysisEnum()
 
-macro=276;
+macro=275;
Index: /issm/trunk/src/m/enum/QmuErrNameEnum.m
===================================================================
--- /issm/trunk/src/m/enum/QmuErrNameEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/QmuErrNameEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=QmuErrNameEnum()
 
-macro=277;
+macro=276;
Index: /issm/trunk/src/m/enum/QmuInNameEnum.m
===================================================================
--- /issm/trunk/src/m/enum/QmuInNameEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/QmuInNameEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=QmuInNameEnum()
 
-macro=278;
+macro=277;
Index: /issm/trunk/src/m/enum/QmuMassFluxSegmentsEnum.m
===================================================================
--- /issm/trunk/src/m/enum/QmuMassFluxSegmentsEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/QmuMassFluxSegmentsEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=QmuMassFluxSegmentsEnum()
 
-macro=279;
+macro=278;
Index: /issm/trunk/src/m/enum/QmuNPartEnum.m
===================================================================
--- /issm/trunk/src/m/enum/QmuNPartEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/QmuNPartEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=QmuNPartEnum()
 
-macro=280;
+macro=279;
Index: /issm/trunk/src/m/enum/QmuOutNameEnum.m
===================================================================
--- /issm/trunk/src/m/enum/QmuOutNameEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/QmuOutNameEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=QmuOutNameEnum()
 
-macro=281;
+macro=280;
Index: /issm/trunk/src/m/enum/QmuPartEnum.m
===================================================================
--- /issm/trunk/src/m/enum/QmuPartEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/QmuPartEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=QmuPartEnum()
 
-macro=282;
+macro=281;
Index: /issm/trunk/src/m/enum/ResponseDescriptorsEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ResponseDescriptorsEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/ResponseDescriptorsEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=ResponseDescriptorsEnum()
 
-macro=283;
+macro=282;
Index: /issm/trunk/src/m/enum/SolverStringEnum.m
===================================================================
--- /issm/trunk/src/m/enum/SolverStringEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/SolverStringEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=SolverStringEnum()
 
-macro=284;
+macro=283;
Index: /issm/trunk/src/m/enum/SparsityEnum.m
===================================================================
--- /issm/trunk/src/m/enum/SparsityEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/SparsityEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=SparsityEnum()
 
-macro=285;
+macro=284;
Index: /issm/trunk/src/m/enum/StringToEnum.m
===================================================================
--- /issm/trunk/src/m/enum/StringToEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/StringToEnum.m	(revision 5114)
@@ -277,5 +277,4 @@
 elseif (strcmpi(name,'NumOutput')), enum=NumOutputEnum(); return
 elseif (strcmpi(name,'NumRifts')), enum=NumRiftsEnum(); return
-elseif (strcmpi(name,'NumberOfDofsPerNode')), enum=NumberOfDofsPerNodeEnum(); return
 elseif (strcmpi(name,'NumberOfElements')), enum=NumberOfElementsEnum(); return
 elseif (strcmpi(name,'NumberOfNodes')), enum=NumberOfNodesEnum(); return
Index: /issm/trunk/src/m/enum/TolXEnum.m
===================================================================
--- /issm/trunk/src/m/enum/TolXEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/TolXEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=TolXEnum()
 
-macro=286;
+macro=285;
Index: /issm/trunk/src/m/enum/VariableDescriptorsEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VariableDescriptorsEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/VariableDescriptorsEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=VariableDescriptorsEnum()
 
-macro=287;
+macro=286;
Index: /issm/trunk/src/m/enum/VerboseEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VerboseEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/VerboseEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=VerboseEnum()
 
-macro=288;
+macro=287;
Index: /issm/trunk/src/m/enum/WaitOnLockEnum.m
===================================================================
--- /issm/trunk/src/m/enum/WaitOnLockEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/WaitOnLockEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=WaitOnLockEnum()
 
-macro=289;
+macro=288;
Index: /issm/trunk/src/m/enum/YtsEnum.m
===================================================================
--- /issm/trunk/src/m/enum/YtsEnum.m	(revision 5113)
+++ /issm/trunk/src/m/enum/YtsEnum.m	(revision 5114)
@@ -9,3 +9,3 @@
 %      macro=YtsEnum()
 
-macro=290;
+macro=289;
