Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 15463)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 15464)
@@ -254,4 +254,5 @@
 					./modules/ModelProcessorx/CreateNumberNodeToElementConnectivity.cpp\
 					./modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp\
+					./modules/ModelProcessorx/CreateNodes.cpp\
 					./modules/ParseToolkitsOptionsx/ParseToolkitsOptionsx.h\
 					./modules/ParseToolkitsOptionsx/ParseToolkitsOptionsx.cpp\
Index: /issm/trunk-jpl/src/c/classes/Node.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Node.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/classes/Node.cpp	(revision 15464)
@@ -22,6 +22,6 @@
 }
 /*}}}*/
-/*FUNCTION Node::Node(int node_id,int node_sid,int vertex_id,int io_index, IoModel* iomodel,int analysis_type) {{{*/
-Node::Node(int node_id,int node_sid,int vertex_id,int io_index, IoModel* iomodel,int analysis_type){
+/*FUNCTION Node::Node(int node_id,int node_sid,int io_index, IoModel* iomodel,int analysis_type) {{{*/
+Node::Node(int node_id,int node_sid,int io_index, IoModel* iomodel,int analysis_type){
 
 	/*Intermediary*/
Index: /issm/trunk-jpl/src/c/classes/Node.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Node.h	(revision 15463)
+++ /issm/trunk-jpl/src/c/classes/Node.h	(revision 15464)
@@ -40,5 +40,5 @@
 		/*Node constructors, destructors {{{*/
 		Node();
-		Node(int node_id,int node_sid, int vertex_id,int io_index, IoModel* iomodel,int analysis_type);
+		Node(int node_id,int node_sid,int io_index, IoModel* iomodel,int analysis_type);
 		~Node();
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateNodesBalancethickness.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateNodesBalancethickness.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateNodesBalancethickness.cpp	(revision 15464)
@@ -11,20 +11,7 @@
 void	CreateNodesBalancethickness(Nodes** pnodes, IoModel* iomodel){
 
-	/*Intermediary*/
-	int  i,j;
-	int  node_id;
-	int  vertex_id;
-	int  io_index;
+	/*Fetch parameters: */
 	int  stabilization;
-	bool *my_nodes=NULL;
-
-	/*Fetch parameters: */
 	iomodel->Constant(&stabilization,BalancethicknessStabilizationEnum);
-
-	/*Recover pointer: */
-	Nodes* nodes=*pnodes;
-
-	/*Create nodes if they do not exist yet*/
-	if(!nodes) nodes = new Nodes();
 
 	/*Check in 3d*/
@@ -33,47 +20,10 @@
 	/*First fetch data: */
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
 	if(stabilization!=3){
-
-		/*Build Nodes dataset (Continuous Galerkin)*/
-		for (i=0;i<iomodel->numberofvertices;i++){
-			if(iomodel->my_vertices[i]){
-
-				/*Add node to nodes dataset: */
-				nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i+1,i,iomodel,BalancethicknessAnalysisEnum));
-
-			}
-		}
+		CreateNodes(pnodes,iomodel,BalancethicknessAnalysisEnum,P1Enum);
 	}
 	else{
-
-		/*Build Nodes dataset -> 3 for each element (Discontinuous Galerkin)*/
-		NodesPartitioning(&my_nodes,iomodel->my_elements,iomodel->my_vertices,iomodel,false);
-		for (i=0;i<iomodel->numberofelements;i++){
-			for (j=0;j<3;j++){
-
-				if(my_nodes[3*i+j]){ 
-
-					//Get index of the vertex on which the current node is located
-					vertex_id=iomodel->elements[3*i+j]; //(Matlab indexing)
-					io_index=vertex_id-1;               //(C indexing)
-					_assert_(vertex_id>0 && vertex_id<=iomodel->numberofvertices);
-
-					//Compute Node id
-					node_id=iomodel->nodecounter+3*i+j+1;
-
-					/*Add node to nodes dataset: */
-					nodes->AddObject(new Node(node_id,node_id-1,vertex_id,io_index,iomodel,BalancethicknessAnalysisEnum));
-
-				}
-			}
-		}
+		CreateNodes(pnodes,iomodel,BalancethicknessAnalysisEnum,P1DGEnum);
 	}
-
-	/*Clean fetched data: */
 	iomodel->DeleteData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-	xDelete<bool>(my_nodes);
-
-	/*Assign output pointer: */
-	*pnodes=nodes;
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/BedSlope/CreateNodesBedSlope.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/BedSlope/CreateNodesBedSlope.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/BedSlope/CreateNodesBedSlope.cpp	(revision 15464)
@@ -11,26 +11,6 @@
 void	CreateNodesBedSlope(Nodes** pnodes, IoModel* iomodel){
 
-	/*Recover pointer: */
-	Nodes* nodes=*pnodes;
-
-	/*Create nodes if they do not exist yet*/
-	if(!nodes) nodes = new Nodes();
-
-	/*First fetch data: */
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
-	for(int i=0;i<iomodel->numberofvertices;i++){
-		if(iomodel->my_vertices[i]){
-
-			/*Add node to nodes dataset: */
-			nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i+1,i,iomodel,BedSlopeAnalysisEnum));
-
-		}
-	}
-
-	/*Clean fetched data: */
+	CreateNodes(pnodes,iomodel,BedSlopeAnalysisEnum,P1Enum);
 	iomodel->DeleteData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
-	/*Assign output pointer: */
-	*pnodes=nodes;
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateDataSets.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateDataSets.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateDataSets.cpp	(revision 15464)
@@ -16,5 +16,4 @@
 void CreateDataSets(Elements** pelements,Nodes** pnodes, Vertices** pvertices, Materials** pmaterials, Constraints** pconstraints, Loads** ploads,Parameters** pparameters,IoModel* iomodel,char* rootpath,const int solution_type,const int analysis_type,const int nummodels,int analysis_counter){
 
-	bool        continuous = true;
 	Elements   *elements   = NULL;
 	Materials  *materials  = NULL;
@@ -30,6 +29,9 @@
 
 	/*Recover elements and materials, for future update: */
-	elements=*pelements;
-	materials=*pmaterials;
+	elements  = *pelements;
+	materials = *pmaterials;
+
+	/*Creates Nodes dataset if empty*/
+	if(!*pnodes) *pnodes = new Nodes();
 
 	/*Now, branch onto analysis dependent model generation: */
@@ -169,5 +171,6 @@
 	SortDataSets(pelements,pnodes,pvertices, ploads, pmaterials, pconstraints, pparameters);
 
-	/*Update counters, because we have created more nodes, loads and constraints, and ids for objects created in next call to CreateDataSets
+	/* Update counters, because we have created more nodes, loads and
+	 * constraints, and ids for objects created in next call to CreateDataSets
 	 * will need to start at the end of the updated counters: */
 	UpdateCounters(iomodel,pnodes,ploads,pconstraints);
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp	(revision 15464)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp	(revision 15464)
@@ -0,0 +1,69 @@
+/*
+ * CreateNodes.c:
+ */
+
+#include "../../toolkits/toolkits.h"
+#include "../../classes/classes.h"
+#include "../../shared/shared.h"
+#include "../MeshPartitionx/MeshPartitionx.h"
+#include "./ModelProcessorx.h"
+
+void CreateNodes(Nodes** pnodes, IoModel* iomodel,int analysis,int finite_element){
+
+	/*Intermediaries*/
+	int   i,j;
+	bool *my_edges = NULL;
+	bool *my_nodes = NULL;
+
+	/*Recover pointer: */
+	Nodes* nodes=*pnodes;
+
+	/*First create nodes*/
+	if(!nodes) nodes = new Nodes();
+
+	switch(finite_element){
+		case P1Enum:
+			for(i=0;i<iomodel->numberofvertices;i++){
+				if(iomodel->my_vertices[i]){
+					nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i,iomodel,analysis));
+				}
+			}
+			break;
+
+		case P1DGEnum:
+			NodesPartitioning(&my_nodes,iomodel->my_elements,iomodel->my_vertices,iomodel,false);
+			for(i=0;i<iomodel->numberofelements;i++){
+				for(j=0;j<3;j++){
+					if(my_nodes[3*i+j]){ 
+						nodes->AddObject(new Node(iomodel->nodecounter+3*i+j+1,iomodel->nodecounter+3*i+j,iomodel->elements[+3*i+j]-1,iomodel,analysis));
+
+					}
+				}
+			}
+			break;
+
+		case P2Enum:
+			EdgesPartitioning(&my_edges,iomodel);
+			CreateElementToEdgeConnectivity(iomodel);
+			for(i=0;i<iomodel->numberofvertices;i++){
+				if(iomodel->my_vertices[i]){
+					nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i,iomodel,analysis));
+				}
+			}
+			for(i=0;i<iomodel->numberofedges;i++){
+				if(my_edges[i]){
+					nodes->AddObject(new Node(iomodel->nodecounter+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,0,iomodel,analysis));
+				}
+			}
+			break;
+
+		default:
+			_error_("Finite element "<<EnumToStringx(finite_element)<<" not supported yet");
+	}
+
+	/*Clean up*/
+	xDelete<bool>(my_edges);
+
+	/*Assign output pointer: */
+	*pnodes=nodes;
+}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp	(revision 15464)
@@ -21,50 +21,20 @@
 	iomodel->Constant(&finiteelementssa,FlowequationFeSsaEnum);
 
-	/*Recover pointer: */
-	Nodes* nodes=*pnodes;
-
-	/*First create nodes*/
-	if(!nodes) nodes = new Nodes();
-
 	/*Now, is the flag macayaealpattyn on? otherwise, do nothing: */
-	if(!ismacayealpattyn & !isstokes & !isl1l2){
-		*pnodes=nodes;
-		return;
-	}
+	if(!ismacayealpattyn & !isstokes & !isl1l2) return;
 
 	/*Create nodes: */
 	iomodel->FetchData(9,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,FlowequationBordermacayealEnum,FlowequationBorderstokesEnum,
 				MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,MaskVertexonwaterEnum,FlowequationVertexEquationEnum,DiagnosticReferentialEnum);
-
-	for(int i=0;i<iomodel->numberofvertices;i++){
-
-		if(iomodel->my_vertices[i]){
-
-			/*Add node to nodes dataset: */
-			nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i+1,i,iomodel,DiagnosticHorizAnalysisEnum));
-		}
+	if(finiteelementssa==0){
+		CreateNodes(pnodes,iomodel,DiagnosticHorizAnalysisEnum,P1Enum);
 	}
-
-	if(finiteelementssa==1){
-
-		/*Quadratic element*/
-		bool *my_edges = NULL;
-		EdgesPartitioning(&my_edges,iomodel);
-		CreateElementToEdgeConnectivity(iomodel);
-
-		for(int i=0;i<iomodel->numberofedges;i++){
-			if(my_edges[i]){
-				nodes->AddObject(new Node(iomodel->nodecounter+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,0,0,iomodel,DiagnosticHorizAnalysisEnum));
-			}
-		}
-		/*Clean up*/
-		xDelete<bool>(my_edges);
+	else if(finiteelementssa==1){
+		CreateNodes(pnodes,iomodel,DiagnosticHorizAnalysisEnum,P2Enum);
 	}
-
-	/*Clean fetched data: */
+	else{
+		_error_("finite element not supported yet");
+	}
 	iomodel->DeleteData(9,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,FlowequationBordermacayealEnum,FlowequationBorderstokesEnum,
 				MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,MaskVertexonwaterEnum,FlowequationVertexEquationEnum,DiagnosticReferentialEnum);
-
-	/*Assign output pointer: */
-	*pnodes=nodes;
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/CreateNodesDiagnosticHutter.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/CreateNodesDiagnosticHutter.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/CreateNodesDiagnosticHutter.cpp	(revision 15464)
@@ -11,38 +11,13 @@
 void	CreateNodesDiagnosticHutter(Nodes** pnodes, IoModel* iomodel){
 
-	/*Intermediary*/
+	/*Fetch parameters: */
 	bool ishutter;
-
-	/*Fetch parameters: */
 	iomodel->Constant(&ishutter,FlowequationIshutterEnum);
 
-	/*Recover pointer: */
-	Nodes* nodes=*pnodes;
+	/*Now, is the flag ishutter on? otherwise, do nothing: */
+	if(!ishutter) return;
 
-	/*Create nodes if they do not exist yet*/
-	if(!nodes) nodes = new Nodes();
-
-	/*Now, is the flag ishutter on? otherwise, do nothing: */
-	if(!ishutter){
-		*pnodes=nodes;
-		return;
-	}
-
-	/*First fetch data: */
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
-	for(int i=0;i<iomodel->numberofvertices;i++){
-		if(iomodel->my_vertices[i]){
-
-			/*Add node to nodes dataset: */
-			nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i+1,i,iomodel,DiagnosticHutterAnalysisEnum));
-
-		}
-	}
-
-	/*Clean fetched data: */
+	CreateNodes(pnodes,iomodel,DiagnosticHutterAnalysisEnum,P1Enum);
 	iomodel->DeleteData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
-	/*Assign output pointer: */
-	*pnodes=nodes;
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/CreateNodesDiagnosticVert.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/CreateNodesDiagnosticVert.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/CreateNodesDiagnosticVert.cpp	(revision 15464)
@@ -11,32 +11,9 @@
 void	CreateNodesDiagnosticVert(Nodes** pnodes, IoModel* iomodel){
 
-	/*Recover pointer: */
-	Nodes* nodes=*pnodes;
+	/*Now, is the flag macayaealpattyn on? otherwise, do nothing: */
+	if(iomodel->dim==2) return;
 
-	/*Create nodes if they do not exist yet*/
-	if(!nodes) nodes = new Nodes();
-
-	/*Now, is the flag macayaealpattyn on? otherwise, do nothing: */
-	if(iomodel->dim==2){
-		*pnodes=nodes;
-		return;
-	}
-
-	/*First fetch data: */
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
-	for(int i=0;i<iomodel->numberofvertices;i++){
-		if(iomodel->my_vertices[i]){
-
-			/*Add node to nodes dataset: */
-			nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i+1,i,iomodel,DiagnosticVertAnalysisEnum));
-
-		}
-	}
-
-	/*Clean fetched data: */
+	CreateNodes(pnodes,iomodel,DiagnosticVertAnalysisEnum,P1Enum);
 	iomodel->DeleteData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
-	/*Assign output pointer: */
-	*pnodes=nodes;
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ElementsAndVerticesPartitioning.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ElementsAndVerticesPartitioning.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ElementsAndVerticesPartitioning.cpp	(revision 15464)
@@ -21,22 +21,22 @@
 	int my_rank;
 	int num_procs;
-	int    numberofelements2d;
-	int    numberofvertices2d;
-	int    numlayers;
-	int    numrifts;
-	int    numvertex_pairing;
+	int numberofelements2d;
+	int numberofvertices2d;
+	int numlayers;
+	int numrifts;
+	int numvertex_pairing;
 
 	/*output: */
-	bool* my_elements=NULL;
-	int* my_vertices=NULL;
+	bool *my_elements = NULL;
+	int  *my_vertices = NULL;
 
 	/*intermediary: */
-	int* epart=NULL; //element partitioning.
-	int* npart=NULL; //node partitioning.
-	int  elements_width; //number of columns in elements (2d->3, 3d->6)
-	int  el1,el2;
-	int* elements2d=NULL;
-	int* vertex_pairing=NULL;
-	IssmDouble* riftinfo=NULL;
+	int        *epart          = NULL; //element partitioning.
+	int        *npart          = NULL; //node partitioning.
+	int         elements_width;        //number of columns in elements (2d->3, 3d->6)
+	int         el1,el2;
+	int        *elements2d     = NULL;
+	int        *vertex_pairing = NULL;
+	IssmDouble *riftinfo       = NULL;
 
 	/*Get my_rank:*/
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/CreateNodesEnthalpy.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/CreateNodesEnthalpy.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/CreateNodesEnthalpy.cpp	(revision 15464)
@@ -11,26 +11,6 @@
 void	CreateNodesEnthalpy(Nodes** pnodes, IoModel* iomodel){
 
-	/*Recover pointer: */
-	Nodes* nodes=*pnodes;
-
-	/*Create nodes if they do not exist yet*/
-	if(!nodes) nodes = new Nodes();
-
-	/*Create nodes and vertices: */
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
-	for(int i=0;i<iomodel->numberofvertices;i++){
-		if(iomodel->my_vertices[i]){
-
-			/*Add node to nodes dataset: */
-			nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i+1,i,iomodel,EnthalpyAnalysisEnum));
-
-		}
-	}
-
-	/*Clean fetched data: */
+	CreateNodes(pnodes,iomodel,EnthalpyAnalysisEnum,P1Enum);
 	iomodel->DeleteData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
-	/*Assign output pointer: */
-	*pnodes=nodes;
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Gia/CreateNodesGia.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Gia/CreateNodesGia.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Gia/CreateNodesGia.cpp	(revision 15464)
@@ -11,27 +11,6 @@
 void	CreateNodesGia(Nodes** pnodes, IoModel* iomodel){
 
-	/*Recover pointer: */
-	Nodes* nodes=*pnodes;
-
-	/*Create nodes if they do not exist yet*/
-	if(!nodes) nodes = new Nodes();
-
-	/*First fetch data: */
 	iomodel->FetchData(1,MaskVertexonwaterEnum);
-
-	/*First fetch data: */
-	for(int i=0;i<iomodel->numberofvertices;i++){
-		if(iomodel->my_vertices[i]){
-
-			/*Add node to nodes dataset: */
-			nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i+1,i,iomodel,GiaAnalysisEnum));
-
-		}
-	}
-
-	/*Clean fetched data: */
+	CreateNodes(pnodes,iomodel,GiaAnalysisEnum,P1Enum);
 	iomodel->DeleteData(1,MaskVertexonwaterEnum);
-
-	/*Assign output pointer: */
-	*pnodes=nodes;
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCEfficient/CreateNodesHydrologyDCEfficient.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCEfficient/CreateNodesHydrologyDCEfficient.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCEfficient/CreateNodesHydrologyDCEfficient.cpp	(revision 15464)
@@ -11,41 +11,16 @@
 void	CreateNodesHydrologyDCEfficient(Nodes** pnodes, IoModel* iomodel){
 
-	/*Intermediary*/
-	bool isefficientlayer;
+	/*Now, do we really want DC?*/
 	int  hydrology_model;
-
-	/*Recover pointer: */
-	Nodes* nodes=*pnodes;
-
-	/*Create nodes if they do not exist yet*/
-	if(!nodes) nodes = new Nodes();
-
-	/*Now, do we really want DC?*/
 	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
-	if(hydrology_model!=HydrologydcEnum){
-		*pnodes=nodes;
-		return;
-	}
+	if(hydrology_model!=HydrologydcEnum) return;
 
 	/*Do we want an efficient layer*/
+	bool isefficientlayer;
 	iomodel->Constant(&isefficientlayer,HydrologydcIsefficientlayerEnum);
-	if(!isefficientlayer){
-		*pnodes=nodes;
-		return;
-	}
+	if(!isefficientlayer) return;
 
-	/*Create nodes and vertices: */
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-	for(int i=0;i<iomodel->numberofvertices;i++){
-
-		if(iomodel->my_vertices[i]){
-			/*Add node to nodes dataset: */
-			nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i+1,i,iomodel,HydrologyDCEfficientAnalysisEnum));
-
-		}
-	}
+	CreateNodes(pnodes,iomodel,HydrologyDCEfficientAnalysisEnum,P1Enum);
 	iomodel->DeleteData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
-	/*Assign output pointer: */
-	*pnodes=nodes;
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCInefficient/CreateNodesHydrologyDCInefficient.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCInefficient/CreateNodesHydrologyDCInefficient.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCInefficient/CreateNodesHydrologyDCInefficient.cpp	(revision 15464)
@@ -11,35 +11,13 @@
 void	CreateNodesHydrologyDCInefficient(Nodes** pnodes, IoModel* iomodel){
 
-	/*Intermediary*/
+	/*Fetch parameters: */
 	int  hydrology_model;
-
-	/*Fetch parameters: */
 	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
 
-	/*Recover pointer: */
-	Nodes* nodes=*pnodes;
+	/*Now, do we really want DC?*/
+	if(hydrology_model!=HydrologydcEnum) return;
 
-	/*Create nodes if they do not exist yet*/
-	if(!nodes) nodes = new Nodes();
-
-	/*Now, do we really want DC?*/
-	if(hydrology_model!=HydrologydcEnum){
-		*pnodes=nodes;
-		return;
-	}
-
-	/*Create nodes and vertices: */
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-	for(int i=0;i<iomodel->numberofvertices;i++){
-
-		if(iomodel->my_vertices[i]){
-			/*Add node to nodes dataset: */
-			nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i+1,i,iomodel,HydrologyDCInefficientAnalysisEnum));
-
-		}
-	}
+	CreateNodes(pnodes,iomodel,HydrologyDCInefficientAnalysisEnum,P1Enum);
 	iomodel->DeleteData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
-	/*Assign output pointer: */
-	*pnodes=nodes;
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyShreve/CreateNodesHydrologyShreve.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyShreve/CreateNodesHydrologyShreve.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyShreve/CreateNodesHydrologyShreve.cpp	(revision 15464)
@@ -11,34 +11,13 @@
 void	CreateNodesHydrologyShreve(Nodes** pnodes, IoModel* iomodel){
 
-	/*Intermediary*/
+	/*Fetch parameters: */
 	int  hydrology_model;
-
-	/*Fetch parameters: */
 	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
 
-	/*Recover pointer: */
-	Nodes* nodes=*pnodes;
+	/*Now, do we really want Shreve?*/
+	if(hydrology_model!=HydrologyshreveEnum) return;
 
-	/*Create nodes if they do not exist yet*/
-	if(!nodes) nodes = new Nodes();
-
-	/*Now, do we really want Shreve?*/
-	if(hydrology_model!=HydrologyshreveEnum){
-		*pnodes=nodes;
-		return;
-	}
-
-	/*Create nodes and vertices: */
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-	for(int i=0;i<iomodel->numberofvertices;i++){
-
-		if(iomodel->my_vertices[i]){
-			/*Add node to nodes dataset: */
-			nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i+1,i,iomodel,HydrologyShreveAnalysisEnum));
-		}
-	}
+	CreateNodes(pnodes,iomodel,HydrologyShreveAnalysisEnum,P1Enum);
 	iomodel->DeleteData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
-	/*Assign output pointer: */
-	*pnodes=nodes;
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/CreateNodesMelting.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/CreateNodesMelting.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/CreateNodesMelting.cpp	(revision 15464)
@@ -11,24 +11,6 @@
 void	CreateNodesMelting(Nodes** pnodes, IoModel* iomodel){
 
-	/*Recover pointer: */
-	Nodes* nodes=*pnodes;
-
-	/*Create nodes if they do not exist yet*/
-	if(!nodes) nodes = new Nodes();
-
-	/*First fetch data: */
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-	for(int i=0;i<iomodel->numberofvertices;i++){
-
-		if(iomodel->my_vertices[i]){
-
-			/*Add node to nodes dataset: */
-			nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i+1,i,iomodel,MeltingAnalysisEnum));
-
-		}
-	}
+	CreateNodes(pnodes,iomodel,MeltingAnalysisEnum,P1Enum);
 	iomodel->DeleteData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
-	/*Assign output pointer: */
-	*pnodes=nodes;
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 15464)
@@ -23,4 +23,5 @@
 void CreateParametersHydrologyDCEfficient(Parameters** pparameters,IoModel* iomodel,int solution_type,int analysis_type);
 void UpdateElementsAndMaterialsControl(Elements* elements,Materials* materials, IoModel* iomodel);
+void CreateNodes(Nodes** pnodes, IoModel* iomodel,int analysis,int finite_element);
 
 /*Creation of fem datasets: specialised drivers: */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/CreateNodesPrognostic.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/CreateNodesPrognostic.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/CreateNodesPrognostic.cpp	(revision 15464)
@@ -11,69 +11,19 @@
 void	CreateNodesPrognostic(Nodes** pnodes, IoModel* iomodel){
 
-	/*Intermediary*/
-	int  i,j;
-	int  node_id;
-	int  vertex_id;
-	int  io_index;
+	/*Fetch parameters: */
 	int  stabilization;
-	bool *my_nodes = NULL;
-
-	/*Fetch parameters: */
 	iomodel->Constant(&stabilization,PrognosticStabilizationEnum);
-
-	/*Recover pointer: */
-	Nodes* nodes=*pnodes;
-
-	/*Create nodes if they do not exist yet*/
-	if(!nodes) nodes = new Nodes();
 
 	/*Check in 3d*/
 	if(stabilization==3 && iomodel->dim==3) _error_("DG 3d not implemented yet");
 
-	/*First fetch data: */
+	/*Create Nodes either DG or CG depending on stabilization*/
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
 	if(stabilization!=3){
-
-		/*Build Nodes dataset (Continuous Galerkin)*/
-		for (i=0;i<iomodel->numberofvertices;i++){
-
-			if(iomodel->my_vertices[i]){
-
-				/*Add node to nodes dataset: */
-				nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i+1,i,iomodel,PrognosticAnalysisEnum));
-
-			}
-		}
+		CreateNodes(pnodes,iomodel,PrognosticAnalysisEnum,P1Enum);
 	}
 	else{
-
-		/*Build Nodes dataset -> 3 for each element (Discontinuous Galerkin)*/
-		NodesPartitioning(&my_nodes,iomodel->my_elements,iomodel->my_vertices,iomodel,false);
-		for (i=0;i<iomodel->numberofelements;i++){
-			for (j=0;j<3;j++){
-
-				if(my_nodes[3*i+j]){ 
-
-					//Get index of the vertex on which the current node is located
-					vertex_id=iomodel->elements[+3*i+j]; //(Matlab indexing)
-					io_index=vertex_id-1;                //(C indexing)
-					_assert_(vertex_id>0 && vertex_id<=iomodel->numberofvertices);
-
-					//Compute Node id
-					node_id=iomodel->nodecounter+3*i+j+1;
-
-					/*Add node to nodes dataset: */
-					nodes->AddObject(new Node(node_id,node_id-1,vertex_id,io_index,iomodel,PrognosticAnalysisEnum));
-
-				}
-			}
-		}
+		CreateNodes(pnodes,iomodel,PrognosticAnalysisEnum,P1DGEnum);
 	}
-
-	/*Clean fetched data: */
 	iomodel->DeleteData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-	xDelete<bool>(my_nodes);
-
-	/*Assign output pointer: */
-	*pnodes=nodes;
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/SortDataSets.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/SortDataSets.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/SortDataSets.cpp	(revision 15464)
@@ -15,31 +15,31 @@
 void SortDataSets(Elements** pelements,Nodes** pnodes,Vertices** pvertices, Loads** ploads, Materials** pmaterials, Constraints** pconstraints, Parameters** pparameters){
 
-	Elements* elements=NULL;
-	Nodes* nodes=NULL;
-	Vertices* vertices=NULL;
-	Loads* loads=NULL;
-	Materials* materials=NULL;
-	Constraints* constraints=NULL;
-	Parameters* parameters=NULL;
+	Elements    *elements    = NULL;
+	Nodes       *nodes       = NULL;
+	Vertices    *vertices    = NULL;
+	Loads       *loads       = NULL;
+	Materials   *materials   = NULL;
+	Constraints *constraints = NULL;
+	Parameters  *parameters  = NULL;
 
 	/*Recover pointers: */
-	elements=*pelements;
-	nodes=*pnodes;
-	vertices=*pvertices;
-	loads=*ploads;
-	materials=*pmaterials;
-	constraints=*pconstraints;
-	parameters=*pparameters;
+	elements    = *pelements;
+	nodes       = *pnodes;
+	vertices    = *pvertices;
+	loads       = *ploads;
+	materials   = *pmaterials;
+	constraints = *pconstraints;
+	parameters  = *pparameters;
 
-	/*All our datasets are already ordered by ids. Set presort flag so that later on, when sorting is requested on these 
-	 * datasets, it will not be redone: */
-
-	if(elements)elements->Presort();
-	if(nodes)nodes->Presort();
-	if(vertices)vertices->Presort();
-	if(loads)loads->Presort();
-	if(materials)materials->Presort();
-	if(constraints)constraints->Presort();
-	if(parameters)parameters->Presort();
+	/*All our datasets are already ordered by ids. Set presort flag so that
+	 * later on, when sorting is requested on these datasets, it will not be
+	 * redone: */
+	if(elements)    elements->Presort();
+	if(nodes)       nodes->Presort();
+	if(vertices)    vertices->Presort();
+	if(loads)       loads->Presort();
+	if(materials)   materials->Presort();
+	if(constraints) constraints->Presort();
+	if(parameters)  parameters->Presort();
 
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/SurfaceSlope/CreateNodesSurfaceSlope.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/SurfaceSlope/CreateNodesSurfaceSlope.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/SurfaceSlope/CreateNodesSurfaceSlope.cpp	(revision 15464)
@@ -11,26 +11,6 @@
 void	CreateNodesSurfaceSlope(Nodes** pnodes, IoModel* iomodel){
 
-	/*Recover pointer: */
-	Nodes* nodes=*pnodes;
-
-	/*Create nodes if they do not exist yet*/
-	if(!nodes) nodes = new Nodes();
-
-	/*First fetch data: */
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
-	for(int i=0;i<iomodel->numberofvertices;i++){
-		if(iomodel->my_vertices[i]){
-
-			/*Add node to nodes dataset: */
-			nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i+1,i,iomodel,SurfaceSlopeAnalysisEnum));
-
-		}
-	}
-
-	/*Clean fetched data: */
+	CreateNodes(pnodes,iomodel,SurfaceSlopeAnalysisEnum,P1Enum);
 	iomodel->DeleteData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
-	/*Assign output pointer: */
-	*pnodes=nodes;
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Thermal/CreateNodesThermal.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Thermal/CreateNodesThermal.cpp	(revision 15463)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Thermal/CreateNodesThermal.cpp	(revision 15464)
@@ -11,25 +11,6 @@
 void	CreateNodesThermal(Nodes** pnodes, IoModel* iomodel){
 
-	/*Recover pointer: */
-	Nodes* nodes=*pnodes;
-
-	/*Create nodes if they do not exist yet*/
-	if(!nodes) nodes = new Nodes();
-
-	/*Create nodes and vertices: */
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
-	for(int i=0;i<iomodel->numberofvertices;i++){
-		if(iomodel->my_vertices[i]){
-			/*Add node to nodes dataset: */
-			nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i+1,i,iomodel,ThermalAnalysisEnum));
-
-		}
-	}
-
-	/*Clean fetched data: */
+	CreateNodes(pnodes,iomodel,ThermalAnalysisEnum,P1Enum);
 	iomodel->DeleteData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-
-	/*Assign output pointer: */
-	*pnodes=nodes;
 }
