Index: /issm/trunk-jpl/src/c/classes/Node.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Node.cpp	(revision 15532)
+++ /issm/trunk-jpl/src/c/classes/Node.cpp	(revision 15533)
@@ -28,4 +28,5 @@
 	int k,l;
 	int gsize;
+	int node_type;
 
 	/*id: */
@@ -39,9 +40,10 @@
 
 	/*indexing:*/
-	DistributeNumDofs(&this->indexing,analysis_type,iomodel->Data(FlowequationVertexEquationEnum)+io_index); //number of dofs per node
+	node_type = reCast<int>(iomodel->Data(FlowequationVertexEquationEnum)[io_index]);
+	DistributeNumDofs(&this->indexing,analysis_type,node_type); //number of dofs per node
 	gsize=this->indexing.gsize;
 
-	if (analysis_type==DiagnosticHorizAnalysisEnum)
-	 this->approximation=reCast<int>(iomodel->Data(FlowequationVertexEquationEnum)[io_index]);
+	if(analysis_type==DiagnosticHorizAnalysisEnum)
+	 this->approximation=reCast<int>(node_type);
 	else
 	 this->approximation=0;
@@ -49,15 +51,15 @@
 	//intialize inputs, and add as many inputs per element as requested: 
 	this->inputs=new Inputs();
-	if (iomodel->Data(MaskVertexonfloatingiceEnum))
+	if(iomodel->Data(MaskVertexonfloatingiceEnum))
 	 this->inputs->AddInput(new BoolInput(MaskVertexonfloatingiceEnum,reCast<bool>(iomodel->Data(MaskVertexonfloatingiceEnum)[io_index])));
-	if (iomodel->Data(MaskVertexongroundediceEnum))
+	if(iomodel->Data(MaskVertexongroundediceEnum))
 	  this->inputs->AddInput(new BoolInput(MaskVertexongroundediceEnum,reCast<bool>(iomodel->Data(MaskVertexongroundediceEnum)[io_index])));
-	if (analysis_type==DiagnosticHorizAnalysisEnum)
-	 this->approximation=reCast<int>(iomodel->Data(FlowequationVertexEquationEnum)[io_index]);
+	if(analysis_type==DiagnosticHorizAnalysisEnum)
+	 this->approximation=reCast<int>(node_type);
 	/*set single point constraints: */
 
 	/*spc all nodes on water*/
-	if (!iomodel->Data(MaskVertexonwaterEnum)) _error_("iomodel->nodeonwater is NULL");
-	if (reCast<bool>(iomodel->Data(MaskVertexonwaterEnum)[io_index])){
+	if(!iomodel->Data(MaskVertexonwaterEnum)) _error_("iomodel->nodeonwater is NULL");
+	if(reCast<bool>(iomodel->Data(MaskVertexonwaterEnum)[io_index])){
 		this->Deactivate();
 	}
@@ -65,5 +67,5 @@
 	/*Diagnostic Horiz*/
 	#ifdef _HAVE_DIAGNOSTIC_
-	if (analysis_type==DiagnosticHorizAnalysisEnum){
+	if(analysis_type==DiagnosticHorizAnalysisEnum){
 
 		/*Coordinate system provided, convert to coord_system matrix*/
@@ -75,16 +77,16 @@
 			_assert_(iomodel->Data(MeshVertexonbedEnum)); 
 			_assert_(iomodel->Data(FlowequationVertexEquationEnum));
-			if (iomodel->Data(FlowequationVertexEquationEnum)[io_index]==MacAyealApproximationEnum && !reCast<int>(iomodel->Data(MeshVertexonbedEnum)[io_index])){
+			if(node_type==MacAyealApproximationEnum && !reCast<int>(iomodel->Data(MeshVertexonbedEnum)[io_index])){
 				this->Deactivate();
 			}
-			if (iomodel->Data(FlowequationVertexEquationEnum)[io_index]==L1L2ApproximationEnum && !reCast<int>(iomodel->Data(MeshVertexonbedEnum)[io_index])){
+			if(node_type==L1L2ApproximationEnum && !reCast<int>(iomodel->Data(MeshVertexonbedEnum)[io_index])){
 				this->Deactivate();
 			}
-			if (iomodel->Data(FlowequationVertexEquationEnum)[io_index]==MacAyealPattynApproximationEnum && reCast<int>(iomodel->Data(FlowequationBordermacayealEnum)[io_index])){
+			if(node_type==MacAyealPattynApproximationEnum && reCast<int>(iomodel->Data(FlowequationBordermacayealEnum)[io_index])){
 				if(!reCast<int>(iomodel->Data(MeshVertexonbedEnum)[io_index])){
 					this->Deactivate();
 				}
 			}
-			if (iomodel->Data(FlowequationVertexEquationEnum)[io_index]==MacAyealStokesApproximationEnum && reCast<int>(iomodel->Data(FlowequationBordermacayealEnum)[io_index])){
+			if(node_type==MacAyealStokesApproximationEnum && reCast<int>(iomodel->Data(FlowequationBordermacayealEnum)[io_index])){
 				if(!reCast<int>(iomodel->Data(MeshVertexonbedEnum)[io_index])){
 					for(k=1;k<=2;k++) this->FreezeDof(k);
@@ -93,5 +95,5 @@
 		}
 		/*spc all nodes on hutter*/
-		if (iomodel->Data(FlowequationVertexEquationEnum)[io_index]==HutterApproximationEnum){
+		if(node_type==HutterApproximationEnum){
 			this->Deactivate();
 		}
@@ -100,8 +102,8 @@
 
 	/*Diagnostic Hutter*/
-	if (analysis_type==DiagnosticHutterAnalysisEnum){
+	if(analysis_type==DiagnosticHutterAnalysisEnum){
 		_assert_(iomodel->Data(FlowequationVertexEquationEnum));
 		/*Constrain all nodes that are not Hutter*/
-		if (reCast<int>(iomodel->Data(FlowequationVertexEquationEnum)[io_index])!=HutterApproximationEnum){
+		if(reCast<int>(node_type)!=HutterApproximationEnum){
 			this->Deactivate();
 		}
@@ -109,5 +111,5 @@
 
 	/*Prognostic/ Melting/ Slopecompute/ Balancethickness*/
-	if (
+	if(
 				analysis_type==PrognosticAnalysisEnum || 
 				analysis_type==MeltingAnalysisEnum || 
@@ -121,5 +123,5 @@
 			/*On a 3d mesh, we may have collapsed elements, hence dead nodes. Freeze them out: */
 			_assert_(iomodel->Data(MeshVertexonbedEnum));
-			if (!(reCast<bool>(iomodel->Data(MeshVertexonbedEnum)[io_index]))){
+			if(!(reCast<bool>(iomodel->Data(MeshVertexonbedEnum)[io_index]))){
 				this->Deactivate();
 			}
@@ -448,4 +450,6 @@
 	/*Put dof for this node into the s set (ie, this dof will be constrained 
 	 * to a fixed value during computations. */
+
+	_assert_(dof<this->indexing.gsize);
 
 	this->indexing.f_set[dof]=0; //n splits into f (for which we solve) and s (single point constraints)
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp	(revision 15532)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp	(revision 15533)
@@ -58,4 +58,19 @@
 			break;
 
+		case MINIcondensedEnum:
+			/*P1 velocity*/
+			for(i=0;i<iomodel->numberofvertices;i++){
+				if(iomodel->my_vertices[i]){
+					nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i,iomodel,analysis));
+				}
+			}
+			/*P1+ pressure statically condensed*/
+			for(i=0;i<iomodel->numberofvertices;i++){
+				if(iomodel->my_vertices[i]){
+					nodes->AddObject(new Node(iomodel->nodecounter+iomodel->numberofvertices+i+1,i,i,iomodel,analysis));
+				}
+			}
+			break;
+
 		default:
 			_error_("Finite element "<<EnumToStringx(finite_element)<<" not supported yet");
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DistributeNumDofs.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DistributeNumDofs.cpp	(revision 15532)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DistributeNumDofs.cpp	(revision 15533)
@@ -6,99 +6,109 @@
 #include "../../classes/classes.h"
 
-void DistributeNumDofs(DofIndexing* index,int analysis_type,IssmDouble* vertices_type){
+void DistributeNumDofs(DofIndexing* index,int analysis_type,int node_type){
 
 	/*For now, we distribute by analysis_type, later, we will distribute using the analysis_type,
-	 * but also the vertices_type: */
+	 * but also the node_type: */
 
-	int numdofs=2; //default numdofs
-	int* doftype=NULL;
+	int  numdofs = -1;   //default numdofs
+	int *doftype = NULL;
 
 	/*ok, according to analysis type: */
-	if (analysis_type==DiagnosticHorizAnalysisEnum){
-		if (vertices_type[0]==MacAyealApproximationEnum){
+	switch(analysis_type){
+		case DiagnosticHorizAnalysisEnum:
+			switch(node_type){
+				case MacAyealApproximationEnum:
+					numdofs=2;
+					break;
+				case L1L2ApproximationEnum:
+					numdofs=2;
+					break;
+				case PattynApproximationEnum:
+					numdofs=2;
+					break;
+				case HutterApproximationEnum:
+					numdofs=2;
+					break;
+				case StokesApproximationEnum:
+					numdofs=4;
+					break;
+				case NoneApproximationEnum:
+					numdofs=4;
+					break;
+				case MacAyealPattynApproximationEnum:
+					numdofs=4;
+					doftype=xNew<int>(numdofs);
+					doftype[0]=MacAyealApproximationEnum;
+					doftype[1]=MacAyealApproximationEnum;
+					doftype[2]=PattynApproximationEnum;
+					doftype[3]=PattynApproximationEnum;
+					break;
+				case PattynStokesApproximationEnum:
+					numdofs=6;
+					doftype=xNew<int>(numdofs);
+					doftype[0]=PattynApproximationEnum;
+					doftype[1]=PattynApproximationEnum;
+					doftype[2]=StokesApproximationEnum;
+					doftype[3]=StokesApproximationEnum;
+					doftype[4]=StokesApproximationEnum;
+					doftype[5]=StokesApproximationEnum;
+					break;
+				case MacAyealStokesApproximationEnum:
+					numdofs=6;
+					doftype=xNew<int>(numdofs);
+					doftype[0]=MacAyealApproximationEnum;
+					doftype[1]=MacAyealApproximationEnum;
+					doftype[2]=StokesApproximationEnum;
+					doftype[3]=StokesApproximationEnum;
+					doftype[4]=StokesApproximationEnum;
+					doftype[5]=StokesApproximationEnum;
+					break;
+				default:
+					_error_("Approximationtype " << node_type << " (" << EnumToStringx(node_type) << ") not implemented yet for DiagnosticHoriz");
+
+			}
+			break;
+		case DiagnosticVertAnalysisEnum:
+			numdofs=1;
+			break;
+		case DiagnosticHutterAnalysisEnum:
 			numdofs=2;
-		}
-		else if (vertices_type[0]==L1L2ApproximationEnum){
-			numdofs=2;
-		}
-		else if (vertices_type[0]==PattynApproximationEnum){
-			numdofs=2;
-		}
-		else if (vertices_type[0]==HutterApproximationEnum){
-			numdofs=2;
-		}
-		else if (vertices_type[0]==StokesApproximationEnum){
-			numdofs=4;
-		}
-		else if (vertices_type[0]==NoneApproximationEnum){
-			numdofs=4;
-		}
-		else if (vertices_type[0]==MacAyealPattynApproximationEnum){
-			numdofs=4;
-			doftype=xNew<int>(numdofs);
-			doftype[0]=MacAyealApproximationEnum;
-			doftype[1]=MacAyealApproximationEnum;
-			doftype[2]=PattynApproximationEnum;
-			doftype[3]=PattynApproximationEnum;
-		}
-		else if (vertices_type[0]==PattynStokesApproximationEnum){
-			numdofs=6;
-			doftype=xNew<int>(numdofs);
-			doftype[0]=PattynApproximationEnum;
-			doftype[1]=PattynApproximationEnum;
-			doftype[2]=StokesApproximationEnum;
-			doftype[3]=StokesApproximationEnum;
-			doftype[4]=StokesApproximationEnum;
-			doftype[5]=StokesApproximationEnum;
-		}
-		else if (vertices_type[0]==MacAyealStokesApproximationEnum){
-			numdofs=6;
-			doftype=xNew<int>(numdofs);
-			doftype[0]=MacAyealApproximationEnum;
-			doftype[1]=MacAyealApproximationEnum;
-			doftype[2]=StokesApproximationEnum;
-			doftype[3]=StokesApproximationEnum;
-			doftype[4]=StokesApproximationEnum;
-			doftype[5]=StokesApproximationEnum;
-		}
-		else _error_("Approximationtype " << reCast<int>(*vertices_type) << " (" << EnumToStringx(reCast<int>(*vertices_type)) << ") not implemented yet for DiagnosticHoriz");
+			break;
+		case BedSlopeAnalysisEnum:
+			numdofs=1;
+			break;
+		case SurfaceSlopeAnalysisEnum:
+			numdofs=1;
+			break;
+		case ThermalAnalysisEnum:
+			numdofs=1;
+			break;
+		case EnthalpyAnalysisEnum:
+			numdofs=1;
+			break;
+		case HydrologyDCInefficientAnalysisEnum:
+			numdofs=1;
+			break;
+		case HydrologyDCEfficientAnalysisEnum:
+			numdofs=1;
+			break;
+		case HydrologyShreveAnalysisEnum:
+			numdofs=1;
+			break;
+		case MeltingAnalysisEnum:
+			numdofs=1;
+			break;
+		case PrognosticAnalysisEnum:
+			numdofs=1;
+			break;
+		case GiaAnalysisEnum:
+			numdofs=1;
+			break;
+		case BalancethicknessAnalysisEnum:
+			numdofs=1;
+			break;
+		default:
+			_error_("analysis type: " << analysis_type << " (" << EnumToStringx(analysis_type) << ") not implemented yet");
 	}
-	else if (analysis_type==DiagnosticVertAnalysisEnum){
-		numdofs=1;
-	}
-	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==EnthalpyAnalysisEnum){
-		numdofs=1;
-	}
-	else if (analysis_type==HydrologyDCInefficientAnalysisEnum){
-		numdofs=1;
-	}
-	else if (analysis_type==HydrologyDCEfficientAnalysisEnum){
-		numdofs=1;
-	}
-	else if (analysis_type==HydrologyShreveAnalysisEnum){
-		numdofs=1;
-	}
-	else if (analysis_type==MeltingAnalysisEnum){
-		numdofs=1;
-	}
-	else if (analysis_type==PrognosticAnalysisEnum){
-		numdofs=1;
-	}
-	else if (analysis_type==GiaAnalysisEnum){
-		numdofs=1;
-	}
-	else if (analysis_type==BalancethicknessAnalysisEnum){
-		numdofs=1;
-	}
-	else _error_("analysis type: " << analysis_type << " (" << EnumToStringx(analysis_type) << ") not implemented yet");
 
 	/*Now initialize the index*/
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 15532)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 15533)
@@ -34,40 +34,40 @@
 
 /*diagnostic vertical*/
-void	CreateNodesDiagnosticVert(Nodes** pnodes,IoModel* iomodel);
-void	CreateConstraintsDiagnosticVert(Constraints** pconstraints,IoModel* iomodel);
-void  CreateLoadsDiagnosticVert(Loads** ploads, IoModel* iomodel);
-void	UpdateElementsDiagnosticVert(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+void CreateNodesDiagnosticVert(Nodes** pnodes,IoModel* iomodel);
+void CreateConstraintsDiagnosticVert(Constraints** pconstraints,IoModel* iomodel);
+void CreateLoadsDiagnosticVert(Loads** ploads, IoModel* iomodel);
+void UpdateElementsDiagnosticVert(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
 
 /*diagnostic hutter*/
-void	CreateNodesDiagnosticHutter(Nodes** pnodes,IoModel* iomodel);
-void	CreateConstraintsDiagnosticHutter(Constraints** pconstraints,IoModel* iomodel);
-void  CreateLoadsDiagnosticHutter(Loads** ploads, IoModel* iomodel);
-void	UpdateElementsDiagnosticHutter(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+void CreateNodesDiagnosticHutter(Nodes** pnodes,IoModel* iomodel);
+void CreateConstraintsDiagnosticHutter(Constraints** pconstraints,IoModel* iomodel);
+void CreateLoadsDiagnosticHutter(Loads** ploads, IoModel* iomodel);
+void UpdateElementsDiagnosticHutter(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
 
 #ifdef _HAVE_GIA_
 /*gia*/
-void	CreateNodesGia(Nodes** pnodes,IoModel* iomodel);
-void	CreateConstraintsGia(Constraints** pconstraints,IoModel* iomodel);
-void    CreateLoadsGia(Loads** ploads, IoModel* iomodel);
-void	UpdateElementsGia(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+void CreateNodesGia(Nodes** pnodes,IoModel* iomodel);
+void CreateConstraintsGia(Constraints** pconstraints,IoModel* iomodel);
+void CreateLoadsGia(Loads** ploads, IoModel* iomodel);
+void UpdateElementsGia(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
 #endif
 
 /*bed slope*/
-void	CreateNodesBedSlope(Nodes** pnodes,IoModel* iomodel);
-void	CreateConstraintsBedSlope(Constraints** pconstraints,IoModel* iomodel);
-void  CreateLoadsBedSlope(Loads** ploads, IoModel* iomodel);
-void	UpdateElementsBedSlope(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+void CreateNodesBedSlope(Nodes** pnodes,IoModel* iomodel);
+void CreateConstraintsBedSlope(Constraints** pconstraints,IoModel* iomodel);
+void CreateLoadsBedSlope(Loads** ploads, IoModel* iomodel);
+void UpdateElementsBedSlope(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
 
 /*surface slope*/
-void	CreateNodesSurfaceSlope(Nodes** pnodes,IoModel* iomodel);
-void	CreateConstraintsSurfaceSlope(Constraints** pconstraints,IoModel* iomodel);
-void  CreateLoadsSurfaceSlope(Loads** ploads, IoModel* iomodel);
-void	UpdateElementsSurfaceSlope(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+void CreateNodesSurfaceSlope(Nodes** pnodes,IoModel* iomodel);
+void CreateConstraintsSurfaceSlope(Constraints** pconstraints,IoModel* iomodel);
+void CreateLoadsSurfaceSlope(Loads** ploads, IoModel* iomodel);
+void UpdateElementsSurfaceSlope(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
 
 /*thermal:*/
-void	CreateNodesThermal(Nodes** pnodes,IoModel* iomodel);
-void	CreateConstraintsThermal(Constraints** pconstraints,IoModel* iomodel);
-void  CreateLoadsThermal(Loads** ploads, IoModel* iomodel);
-void	UpdateElementsThermal(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+void CreateNodesThermal(Nodes** pnodes,IoModel* iomodel);
+void CreateConstraintsThermal(Constraints** pconstraints,IoModel* iomodel);
+void CreateLoadsThermal(Loads** ploads, IoModel* iomodel);
+void UpdateElementsThermal(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
 
 /*enthalpy:*/
@@ -126,9 +126,9 @@
 
 /*Diverse: */
-void  SortDataSets(Elements** pelements,Nodes** pnodes,Vertices** pvertices, Loads** ploads, Materials** pmaterials, Constraints** pconstraints, Parameters** pparameters);
-void  UpdateCounters(IoModel* iomodel,Nodes** pnodes,Loads** ploads, Constraints** pconstraints);
+void SortDataSets(Elements** pelements,Nodes** pnodes,Vertices** pvertices, Loads** ploads, Materials** pmaterials, Constraints** pconstraints, Parameters** pparameters);
+void UpdateCounters(IoModel* iomodel,Nodes** pnodes,Loads** ploads, Constraints** pconstraints);
 
 /*Distribution of dofs: */
-void DistributeNumDofs(DofIndexing* index,int analysis_type,IssmDouble* vertices_type);
+void DistributeNumDofs(DofIndexing* index,int analysis_type,int node_type);
 
 #endif
