Index: /issm/trunk/src/c/parallel/ProcessResults.cpp
===================================================================
--- /issm/trunk/src/c/parallel/ProcessResults.cpp	(revision 674)
+++ /issm/trunk/src/c/parallel/ProcessResults.cpp	(revision 675)
@@ -46,4 +46,5 @@
 	int ismacayealpattyn;
 	int isstokes;
+	int dim;
 
 	/*intermediary: */
@@ -83,4 +84,5 @@
 	
 		/*some flags needed: */
+		fem_dh->parameters->FindParam((void*)&dim,"dim");
 		fem_dhu->parameters->FindParam((void*)&ishutter,"ishutter");
 		fem_ds->parameters->FindParam((void*)&isstokes,"isstokes");
@@ -91,5 +93,4 @@
 		fem_p=fems+0;
 	}
-	
 
 	for(n=0;n<results->Size();n++){
@@ -98,10 +99,11 @@
 		
 		if(strcmp(result->GetFieldName(),"u_g")==0){
-			/*Ok, are we dealing with velocities coming from MacAyeal, Pattyin, Hutter, on 2 dofs? or from 
+			/*Ok, are we dealing with velocities coming from MacAyeal, Pattyin, Hutter, on 2,3 dofs or
 			 *Stokes on 4 dofs: */
 			result->GetField(&u_g);
 			VecToMPISerial(&u_g_serial,u_g);
 
-			if(!isstokes){
+			//2d results -> 2 dofs per node
+			if (dim==2){
 				/*ok, 2 dofs, on number of nodes: */
 				if(ismacayealpattyn){
@@ -126,20 +128,49 @@
 					vel[i]=sqrt(pow(vx[i],2)+pow(vy[i],2)+pow(vz[i],2));
 				}
-
-			}
+			}
+
+			//3d results -> 3 or 4 (stokes) dofs per node
 			else{
-				/* 4 dofs on number of nodes. discard pressure: */
-				fem_ds->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
-				VecToMPISerial(&partition,fem_ds->partition);
-				fem_ds->parameters->FindParam((void*)&yts,"yts");
-				vx=(double*)xmalloc(numberofnodes*sizeof(double));
-				vy=(double*)xmalloc(numberofnodes*sizeof(double));
-				vz=(double*)xmalloc(numberofnodes*sizeof(double));
-				vel=(double*)xmalloc(numberofnodes*sizeof(double));
-				for(i=0;i<numberofnodes;i++){
-					vx[i]=u_g_serial[4*(int)partition[i]+0]*yts;
-					vy[i]=u_g_serial[4*(int)partition[i]+1]*yts;
-					vz[i]=u_g_serial[4*(int)partition[i]+2]*yts;
-					vel[i]=sqrt(pow(vx[i],2)+pow(vy[i],2)+pow(vz[i],2));
+
+				if(!isstokes){
+					/*ok, 3 dofs, on number of nodes: */
+					if(ismacayealpattyn){
+						fem_dh->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
+						VecToMPISerial(&partition,fem_dh->partition);
+						fem_dh->parameters->FindParam((void*)&yts,"yts");
+					}
+					else{
+						fem_dhu->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
+						VecToMPISerial(&partition,fem_dhu->partition);
+						fem_dhu->parameters->FindParam((void*)&yts,"yts");
+					}
+					vx=(double*)xmalloc(numberofnodes*sizeof(double));
+					vy=(double*)xmalloc(numberofnodes*sizeof(double));
+					vz=(double*)xmalloc(numberofnodes*sizeof(double)); 
+					vel=(double*)xmalloc(numberofnodes*sizeof(double)); 
+
+					for(i=0;i<numberofnodes;i++){
+						vx[i]=u_g_serial[3*(int)partition[i]+0]*yts;
+						vy[i]=u_g_serial[3*(int)partition[i]+1]*yts;
+						vz[i]=u_g_serial[3*(int)partition[i]+2]*yts;
+						vel[i]=sqrt(pow(vx[i],2)+pow(vy[i],2)+pow(vz[i],2));
+					}
+				}
+
+				else{
+					/* 4 dofs on number of nodes. discard pressure: */
+					fem_ds->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
+					VecToMPISerial(&partition,fem_ds->partition);
+					fem_ds->parameters->FindParam((void*)&yts,"yts");
+					vx=(double*)xmalloc(numberofnodes*sizeof(double));
+					vy=(double*)xmalloc(numberofnodes*sizeof(double));
+					vz=(double*)xmalloc(numberofnodes*sizeof(double));
+					vel=(double*)xmalloc(numberofnodes*sizeof(double));
+					for(i=0;i<numberofnodes;i++){
+						vx[i]=u_g_serial[4*(int)partition[i]+0]*yts;
+						vy[i]=u_g_serial[4*(int)partition[i]+1]*yts;
+						vz[i]=u_g_serial[4*(int)partition[i]+2]*yts;
+						vel[i]=sqrt(pow(vx[i],2)+pow(vy[i],2)+pow(vz[i],2));
+					}
 				}
 			}
@@ -162,4 +193,5 @@
 			xfree((void**)&partition);
 		}
+
 		else if(strcmp(result->GetFieldName(),"p_g")==0){
 			/*easy, p_g is of size numberofnodes, on 1 dof, just repartition: */
@@ -196,4 +228,5 @@
 			xfree((void**)&partition);
 		}
+
 		else if(strcmp(result->GetFieldName(),"h_g")==0){
 			/*easy, h_g is of size numberofnodes, on 1 dof, just repartition: */
@@ -217,4 +250,5 @@
 			xfree((void**)&partition);
 		}
+
 		else if(strcmp(result->GetFieldName(),"param_g")==0){
 			/*easy, param_g is of size numberofnodes, on 1 dof, just repartition: */
@@ -238,4 +272,5 @@
 			xfree((void**)&partition);
 		}
+
 		else{
 			/*Just copy the result into the new results dataset: */
