Index: /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18057)
@@ -123,5 +123,5 @@
 	_error_("not implemented yet");
 }/*}}}*/
-void AdjointBalancethickness2Analysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void AdjointBalancethickness2Analysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h	(revision 18057)
@@ -27,5 +27,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.cpp	(revision 18057)
@@ -150,5 +150,5 @@
 	_error_("not implemented yet");
 }/*}}}*/
-void AdjointBalancethicknessAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void AdjointBalancethicknessAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.h	(revision 18057)
@@ -27,5 +27,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 18057)
@@ -900,6 +900,103 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void AdjointHorizAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
-	_error_("Not implemented yet");
+void AdjointHorizAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+	/*The gradient of the cost function is calculated in 2 parts.
+	 *
+	 * dJ    \partial J   \partial lambda^T(KU-F)
+	 * --  = ---------- + ------------------------
+	 * dk    \partial k   \parial k                  
+	 *
+	 * */
+
+	/*If on water, grad = 0: */
+	if(!element->IsIceInElement()) return;
+
+	/*Get Approximation*/
+	int approximation;
+	element->GetInputValue(&approximation,ApproximationEnum);
+
+	/*Get list of cost functions*/
+	int *responses = NULL;
+	int num_responses,resp;
+	element->FindParam(&num_responses,InversionNumCostFunctionsEnum);
+	element->FindParam(&responses,NULL,InversionCostFunctionsEnum);
+
+	/*Check that control_type is supported*/
+	if(control_type!=MaterialsRheologyBbarEnum || control_type!=FrictionCoefficientEnum || control_type!=DamageDbarEnum){
+		_error_("Control "<<EnumToStringx(control_type)<<" not supported");
+	}
+
+	/*Deal with first part (partial derivative a J with respect to k)*/
+	for(resp=0;resp<num_responses;resp++) switch(responses[resp]){
+		case SurfaceAbsVelMisfitEnum:     /*Nothing, \partial J/\partial k = 0*/ break;
+		case SurfaceRelVelMisfitEnum:     /*Nothing, \partial J/\partial k = 0*/ break;
+		case SurfaceLogVelMisfitEnum:     /*Nothing, \partial J/\partial k = 0*/ break;
+		case SurfaceLogVxVyMisfitEnum:    /*Nothing, \partial J/\partial k = 0*/ break;
+		case SurfaceAverageVelMisfitEnum: /*Nothing, \partial J/\partial k = 0*/ break;
+		case DragCoefficientAbsGradientEnum: GradientJDragGradient(element,gradient,control_index); break;
+		case RheologyBbarAbsGradientEnum:    GradientJBGradient(element,gradient,control_index);    break;
+		default: _error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
+	}
+
+	/*Deal with second term*/
+	switch(control_type){
+		case FrictionCoefficientEnum:
+			switch(approximation){
+				case SSAApproximationEnum: GradientJDragSSA(element,gradient,control_index); break;
+				case HOApproximationEnum:  GradientJDragHO( element,gradient,control_index); break;
+				case FSApproximationEnum:  GradientJDragFS( element,gradient,control_index); break;
+				case NoneApproximationEnum: /*Gradient is 0*/                    break;
+				default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet");
+			}
+			break;
+		case MaterialsRheologyBbarEnum:
+			switch(approximation){
+				case SSAApproximationEnum: GradientJBbarSSA(element,gradient,control_index); break;
+				case HOApproximationEnum:  GradientJBbarHO( element,gradient,control_index); break;
+				case FSApproximationEnum:  GradientJBbarFS( element,gradient,control_index); break;
+				case NoneApproximationEnum: /*Gradient is 0*/                    break;
+				default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet");
+			}
+			break;
+		case DamageDbarEnum:
+			switch(approximation){
+				case SSAApproximationEnum: GradientJDSSA(element,gradient,control_index); break;
+				case NoneApproximationEnum: /*Gradient is 0*/                 break;
+				default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet");
+			}
+			break;
+		default: _error_("control type not supported yet: " << EnumToStringx(control_type));
+	}
+
+	/*Clean up and return*/
+	xDelete<int>(responses);
+                         
+}/*}}}*/
+void AdjointHorizAnalysis::GradientJDragGradient(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+	_error_("not implemented yet");
+}/*}}}*/
+void AdjointHorizAnalysis::GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+	_error_("not implemented yet");
+}/*}}}*/
+void AdjointHorizAnalysis::GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+	_error_("not implemented yet");
+}/*}}}*/
+void AdjointHorizAnalysis::GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+	_error_("not implemented yet");
+}/*}}}*/
+void AdjointHorizAnalysis::GradientJDragFS(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+	_error_("not implemented yet");
+}/*}}}*/
+void AdjointHorizAnalysis::GradientJBbarSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+	_error_("not implemented yet");
+}/*}}}*/
+void AdjointHorizAnalysis::GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+	_error_("not implemented yet");
+}/*}}}*/
+void AdjointHorizAnalysis::GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+	_error_("not implemented yet");
+}/*}}}*/
+void AdjointHorizAnalysis::GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+	_error_("not implemented yet");
 }/*}}}*/
 void AdjointHorizAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
Index: /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h	(revision 18057)
@@ -33,5 +33,14 @@
 		ElementVector* CreatePVectorFS(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+		void GradientJDragGradient(Element* element,Vector<IssmDouble>* gradient,int control_index);
+		void GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_index);
+		void GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
+		void GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
+		void GradientJDragFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
+		void GradientJBbarSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
+		void GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
+		void GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
+		void GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/Analysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/Analysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/Analysis.h	(revision 18057)
@@ -40,5 +40,5 @@
 		virtual ElementVector* CreatePVector(Element* element)=0;
 		virtual void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element)=0;
-		virtual void GradientJ(Vector<IssmDouble>* gradient,int control_index)=0;
+		virtual void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index)=0;
 		virtual void InputUpdateFromSolution(IssmDouble* solution,Element* element)=0;
 		virtual void UpdateConstraints(FemModel* femmodel)=0;
Index: /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18057)
@@ -196,5 +196,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void Balancethickness2Analysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void Balancethickness2Analysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.h	(revision 18057)
@@ -29,5 +29,5 @@
 		ElementVector* CreatePVectorBoundary(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.cpp	(revision 18057)
@@ -479,5 +479,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void BalancethicknessAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void BalancethicknessAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.h	(revision 18057)
@@ -33,5 +33,5 @@
 		void GetBprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/BalancethicknessSoftAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/BalancethicknessSoftAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/BalancethicknessSoftAnalysis.cpp	(revision 18057)
@@ -45,5 +45,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void BalancethicknessSoftAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void BalancethicknessSoftAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/BalancethicknessSoftAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/BalancethicknessSoftAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/BalancethicknessSoftAnalysis.h	(revision 18057)
@@ -27,5 +27,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.cpp	(revision 18057)
@@ -241,5 +241,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void BalancevelocityAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void BalancevelocityAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.h	(revision 18057)
@@ -27,5 +27,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp	(revision 18057)
@@ -383,5 +383,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void DamageEvolutionAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void DamageEvolutionAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h	(revision 18057)
@@ -29,5 +29,5 @@
 		void GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/DepthAverageAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/DepthAverageAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/DepthAverageAnalysis.cpp	(revision 18057)
@@ -160,5 +160,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void DepthAverageAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void DepthAverageAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/DepthAverageAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/DepthAverageAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/DepthAverageAnalysis.h	(revision 18057)
@@ -28,5 +28,5 @@
 		void GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18057)
@@ -780,5 +780,5 @@
 	element->GetSolutionFromInputsOneDof(solution,EnthalpyEnum);
 }/*}}}*/
-void EnthalpyAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void EnthalpyAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.h	(revision 18057)
@@ -35,5 +35,5 @@
 		void GetBAdvecprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/EnumToAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/EnumToAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/EnumToAnalysis.h	(revision 18057)
@@ -22,5 +22,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp	(revision 18057)
@@ -240,5 +240,5 @@
 	_error_("not implemented yet");
 }/*}}}*/
-void ExtrapolationAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void ExtrapolationAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.h	(revision 18057)
@@ -27,5 +27,5 @@
 	ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 	void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 	void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.cpp	(revision 18057)
@@ -222,5 +222,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void ExtrudeFromBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void ExtrudeFromBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.h	(revision 18057)
@@ -31,5 +31,5 @@
 		void GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.cpp	(revision 18057)
@@ -222,5 +222,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void ExtrudeFromTopAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void ExtrudeFromTopAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.h	(revision 18057)
@@ -31,5 +31,5 @@
 		void GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp	(revision 18057)
@@ -364,5 +364,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void FreeSurfaceBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void FreeSurfaceBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.h	(revision 18057)
@@ -29,5 +29,5 @@
 		void GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.cpp	(revision 18057)
@@ -367,5 +367,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void FreeSurfaceTopAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void FreeSurfaceTopAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.h	(revision 18057)
@@ -29,5 +29,5 @@
 		void GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/GiaAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/GiaAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/GiaAnalysis.cpp	(revision 18057)
@@ -57,5 +57,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void GiaAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void GiaAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/GiaAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/GiaAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/GiaAnalysis.h	(revision 18057)
@@ -27,5 +27,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18057)
@@ -317,5 +317,5 @@
 	element->GetSolutionFromInputsOneDof(solution,EplHeadEnum);
 }/*}}}*/
-void HydrologyDCEfficientAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void HydrologyDCEfficientAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h	(revision 18057)
@@ -28,5 +28,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18057)
@@ -393,5 +393,5 @@
 	element->GetSolutionFromInputsOneDof(solution,SedimentHeadEnum);
 }/*}}}*/
-void HydrologyDCInefficientAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void HydrologyDCInefficientAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h	(revision 18057)
@@ -28,5 +28,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp	(revision 18057)
@@ -292,5 +292,5 @@
 	element->GetSolutionFromInputsOneDof(solution,WatercolumnEnum);
 }/*}}}*/
-void HydrologyShreveAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void HydrologyShreveAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.h	(revision 18057)
@@ -27,5 +27,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp	(revision 18057)
@@ -199,5 +199,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void L2ProjectionBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void L2ProjectionBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.h	(revision 18057)
@@ -27,5 +27,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.cpp	(revision 18057)
@@ -229,5 +229,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void L2ProjectionEPLAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void L2ProjectionEPLAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.h	(revision 18057)
@@ -27,5 +27,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18057)
@@ -308,5 +308,5 @@
 	_error_("not implemented yet");
 }/*}}}*/
-void LevelsetAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void LevelsetAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.h	(revision 18057)
@@ -27,5 +27,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp	(revision 18057)
@@ -284,5 +284,5 @@
 
 }/*}}}*/
-void LsfReinitializationAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void LsfReinitializationAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.h	(revision 18057)
@@ -27,5 +27,5 @@
 	ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 	void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 	void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18057)
@@ -675,5 +675,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void MasstransportAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void MasstransportAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.h	(revision 18057)
@@ -33,5 +33,5 @@
 		void GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.cpp	(revision 18057)
@@ -151,5 +151,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void MeltingAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void MeltingAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.h	(revision 18057)
@@ -27,5 +27,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/MeshdeformationAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MeshdeformationAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/MeshdeformationAnalysis.cpp	(revision 18057)
@@ -45,5 +45,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void MeshdeformationAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void MeshdeformationAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/MeshdeformationAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MeshdeformationAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/MeshdeformationAnalysis.h	(revision 18057)
@@ -27,5 +27,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeXAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeXAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeXAnalysis.cpp	(revision 18057)
@@ -172,5 +172,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void SmoothedSurfaceSlopeXAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void SmoothedSurfaceSlopeXAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeXAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeXAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeXAnalysis.h	(revision 18057)
@@ -27,5 +27,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeYAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeYAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeYAnalysis.cpp	(revision 18057)
@@ -171,5 +171,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void SmoothedSurfaceSlopeYAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void SmoothedSurfaceSlopeYAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeYAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeYAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeYAnalysis.h	(revision 18057)
@@ -27,5 +27,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18057)
@@ -1040,5 +1040,5 @@
 	xDelete<int>(doflist);
 }/*}}}*/
-void StressbalanceAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void StressbalanceAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h	(revision 18057)
@@ -27,5 +27,5 @@
 		ElementVector* CreatePVector(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void GetSolutionFromInputsHoriz(Vector<IssmDouble>* solution,Element* element);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp	(revision 18057)
@@ -493,5 +493,5 @@
 	xDelete<IssmDouble>(values);
 }/*}}}*/
-void StressbalanceSIAAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void StressbalanceSIAAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.h	(revision 18057)
@@ -31,5 +31,5 @@
 		ElementVector* CreatePVector3D(Element* element);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp	(revision 18057)
@@ -357,5 +357,5 @@
 	element->GetSolutionFromInputsOneDof(solution,VzEnum);
 }/*}}}*/
-void StressbalanceVerticalAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void StressbalanceVerticalAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.h	(revision 18057)
@@ -33,5 +33,5 @@
 		void GetBprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp	(revision 18057)
@@ -654,5 +654,5 @@
 	xDelete<IssmDouble>(dbasis);
 }/*}}}*/
-void ThermalAnalysis::GradientJ(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+void ThermalAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.h	(revision 18056)
+++ /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.h	(revision 18057)
@@ -35,5 +35,5 @@
 		void GetBAdvecprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
-		void GradientJ(Vector<IssmDouble>* gradient,int control_index);
+		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void UpdateConstraints(FemModel* femmodel);
