Index: /issm/trunk-jpl/src/c/classes/Elements/Element.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18883)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18884)
@@ -944,5 +944,5 @@
 	return z;
 }/*}}}*/
-void       Element::GradientIndexing(int* indexing,int control_index){/*{{{*/
+void       Element::GradientIndexing(int* indexing,int control_index,bool onsid){/*{{{*/
 
 	/*Get number of controls*/
@@ -954,6 +954,13 @@
 
 	/*get gradient indices*/
-	for(int i=0;i<numvertices;i++){
-		indexing[i]=num_controls*this->vertices[i]->Pid() + control_index;
+	if(onsid){
+		for(int i=0;i<numvertices;i++){
+			indexing[i]=num_controls*this->vertices[i]->Sid() + control_index;
+		}
+	}
+	else{
+		for(int i=0;i<numvertices;i++){
+			indexing[i]=num_controls*this->vertices[i]->Pid() + control_index;
+		}
 	}
 
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 18883)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 18884)
@@ -104,5 +104,5 @@
 		IssmDouble GetYcoord(IssmDouble* xyz_list,Gauss* gauss);
 		IssmDouble GetZcoord(IssmDouble* xyz_list,Gauss* gauss);
-		void       GradientIndexing(int* indexing,int control_index);
+		void       GradientIndexing(int* indexing,int control_index,bool onsid=false);
 		bool       HasNodeOnBase();
 		bool       HasNodeOnSurface();
@@ -288,5 +288,5 @@
 		virtual void   ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index)=0;
 		virtual void   ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum)=0;
-		virtual void   GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data)=0;
+		virtual void   GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid)=0;
 		virtual void   SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index)=0;
 		virtual void   InputControlUpdate(IssmDouble scalar,bool save_parameter)=0;
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18883)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18884)
@@ -3197,7 +3197,7 @@
 }
 /*}}}*/
-void       Penta::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data){/*{{{*/
-
-	int vertexpidlist[NUMVERTICES];
+void       Penta::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data,bool onsid){/*{{{*/
+
+	int vertexidlist[NUMVERTICES];
 
 	/*Get out if this is not an element input*/
@@ -3205,5 +3205,5 @@
 
 	/*Prepare index list*/
-	GradientIndexing(&vertexpidlist[0],control_index);
+	GradientIndexing(&vertexidlist[0],control_index,onsid);
 
 	/*Get input (either in element or material)*/
@@ -3217,5 +3217,5 @@
 	}
 
-	((ControlInput*)input)->GetVectorFromInputs(vector,&vertexpidlist[0],data);
+	((ControlInput*)input)->GetVectorFromInputs(vector,&vertexidlist[0],data);
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18883)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18884)
@@ -126,5 +126,5 @@
 		#endif
 
-		void   GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data);
+		void   GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid);
 		void   SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index);
 		void   ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index);
Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18883)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18884)
@@ -164,5 +164,5 @@
 #endif
 
-		void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data){_error_("not implemented yet");};
+		void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid){_error_("not implemented yet");};
 		void       SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){_error_("not implemented yet");};
 		void       ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Tetra.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18883)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18884)
@@ -170,5 +170,5 @@
 		IssmDouble DragCoefficientAbsGradient(void){_error_("not implemented yet");};
 		void       GradientIndexing(int* indexing,int control_index){_error_("not implemented yet");};
-		void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data){_error_("not implemented yet");};
+		void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid){_error_("not implemented yet");};
 		void       SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){_error_("not implemented yet");};
 		void       ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18883)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18884)
@@ -3034,7 +3034,7 @@
 
 }/*}}}*/
-void       Tria::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data){/*{{{*/
-
-	int vertexpidlist[NUMVERTICES];
+void       Tria::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data,bool onsid){/*{{{*/
+
+	int vertexidlist[NUMVERTICES];
 	Input *input=NULL;
 
@@ -3043,5 +3043,5 @@
 
 	/*Prepare index list*/
-	GradientIndexing(&vertexpidlist[0],control_index);
+	GradientIndexing(&vertexidlist[0],control_index,onsid);
 
 	/*Get input (either in element or material)*/
@@ -3053,5 +3053,5 @@
 	}
 
-	((ControlInput*)input)->GetVectorFromInputs(vector,&vertexpidlist[0],data);
+	((ControlInput*)input)->GetVectorFromInputs(vector,&vertexidlist[0],data);
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18883)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18884)
@@ -132,5 +132,5 @@
 		#endif
 
-		void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data);
+		void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid);
 		void       SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index);
 		void       ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index);
