Index: /issm/trunk/src/c/ModelProcessorx/CreateElementsNodesAndMaterialsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk/src/c/ModelProcessorx/CreateElementsNodesAndMaterialsDiagnosticHoriz.cpp	(revision 86)
+++ /issm/trunk/src/c/ModelProcessorx/CreateElementsNodesAndMaterialsDiagnosticHoriz.cpp	(revision 87)
@@ -66,5 +66,4 @@
 	double tria_meanvel;/*!scaling ratio for velocities*/
 	double tria_epsvel; /*!minimum velocity to avoid infinite velocity ratios*/
-	double tria_viscosity_overshoot; 
 
 	/*matice constructor input: */
@@ -118,4 +117,5 @@
 	int node_onbed;
 	int node_onsurface;
+	int node_upper_node_id;
 	int node_numdofs;
 
@@ -274,9 +274,6 @@
 			tria_epsvel=model->epsvel;
 
-			/*viscosity_overshoot*/
-			tria_viscosity_overshoot=model->viscosity_overshoot;
-
 			/*Create tria element using its constructor:*/
-			tria=new Tria(tria_id, tria_mid, tria_mparid, tria_g, tria_h, tria_s, tria_b, tria_k, tria_friction_type, tria_p, tria_q, tria_shelf, tria_meanvel, tria_epsvel, tria_viscosity_overshoot);
+			tria=new Tria(tria_id, tria_mid, tria_mparid, tria_g, tria_h, tria_s, tria_b, tria_k, tria_friction_type, tria_p, tria_q, tria_shelf, tria_meanvel, tria_epsvel);
 
 			/*Add tria element to elements dataset: */
@@ -537,4 +534,5 @@
 	if (strcmp(model->meshtype,"3d")==0){
 		ModelFetchData((void**)&model->deadgrids,NULL,NULL,model_handle,"deadgrids","Matrix","Mat");
+		ModelFetchData((void**)&model->uppernodes,NULL,NULL,model_handle,"uppergrids","Matrix","Mat");
 	}
 	ModelFetchData((void**)&model->x,NULL,NULL,model_handle,"x","Matrix","Mat");
@@ -576,14 +574,27 @@
 		node_onbed=(int)model->gridonbed[i];
 		node_onsurface=(int)model->gridonsurface[i];
+		
+		if (strcmp(model->meshtype,"3d")==0){
+			if (isnan(model->uppernodes[i])){
+				node_upper_node_id=node_id;  //nodes on surface do not have upper nodes, only themselves.
+			}
+			else{
+				node_upper_node_id=(int)model->uppernodes[i];
+			}
+		}
+		else{
+			/*If we are running 2d, upper_node does not mean much. Just point towards itself!:*/
+			node_upper_node_id=node_id;
+		}
 
 		/*Create node using its constructor: */
-		node=new Node(node_id,node_partitionborder,node_numdofs,node_x,node_onbed,node_onsurface);
+		node=new Node(node_id,node_partitionborder,node_numdofs,node_x,node_onbed,node_onsurface,node_upper_node_id);
 
 		/*set single point constraints.: */
 		if (strcmp(model->meshtype,"3d")==0){
-			/*On a 3d mesh, we may have collapsed grids. Spc all their dofs: */
+			/*On a 3d mesh, we may have collapsed elements, hence dead grids. Freeze them out: */
 			if (model->deadgrids[i]){
-				for(k=0;k<node_numdofs;k++){
-					node->DofInSSet(k);
+				for(k=1;k<=node_numdofs;k++){
+					node->FreezeDof(k);
 				}
 			}
@@ -610,4 +621,5 @@
 	xfree((void**)&model->gridonbed);
 	xfree((void**)&model->gridonsurface);
+	xfree((void**)&model->uppernodes);
 		
 	cleanup_and_return:
