Index: /issm/trunk/src/c/objects/Elements/Element.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Element.h	(revision 8642)
+++ /issm/trunk/src/c/objects/Elements/Element.h	(revision 8643)
@@ -41,6 +41,4 @@
 		virtual void   GetParameterValue(double* pvalue,Node* node,int enumtype)=0;
 		virtual void   Gradj(Vec gradient,int control_type)=0;
-		virtual void   GradjDrag(Vec gradient)=0;
-		virtual void   GradjB(Vec gradient)=0;
 		virtual double ThicknessAbsMisfit(bool process_units  ,int weight_index)=0;
 		virtual double SurfaceAbsVelMisfit(bool process_units ,int weight_index)=0;
Index: /issm/trunk/src/c/objects/Elements/Penta.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 8642)
+++ /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 8643)
@@ -3877,92 +3877,90 @@
 void  Penta::Gradj(Vec gradient,int control_type){
 
+	int              i,approximation;
+	Tria*            tria=NULL;
+
 	/*If on water, skip grad (=0): */
 	if(IsOnWater())return;
 
-	if (control_type==DragCoefficientEnum){
-		GradjDrag(gradient);
-	}
-	else if (control_type==RheologyBbarEnum){
-		GradjB(gradient);
-	}
-	else _error_("control type %s not supported yet: ",EnumToStringx(control_type));
-}
-/*}}}*/
-/*FUNCTION Penta::GradjB {{{1*/
-void  Penta::GradjB(Vec gradient){
-
-	int              i;
-	int              approximation;
-	Tria*            tria           =NULL;
-	TriaVertexInput* triavertexinput=NULL;
-
-	/*If on water, skip: */
-	if(IsOnWater())return;
-	inputs->GetParameterValue(&approximation,ApproximationEnum);
-
-	if (approximation==MacAyealApproximationEnum){
-		/*Bail out element if MacAyeal (2d) and not on bed*/
-		if (!IsOnBed()) return;
-
-		/*This element should be collapsed into a tria element at its base. Create this tria element, 
-		 * and compute gardj*/
-
-		/*Depth Average B*/
-		this->InputDepthAverageAtBase(RheologyBEnum,RheologyBbarEnum,MaterialsEnum);
-
-		tria=(Tria*)SpawnTria(0,1,2); //nodes 0, 1 and 2 make the new tria (lower face).
-		tria->GradjB(gradient);
-		delete tria->matice; delete tria;
-
-		/*delete B average*/
-		this->matice->inputs->DeleteInput(RheologyBbarEnum);
-	}
-	else{
-		/*Gradient is computed on bed only (Bbar)*/
-		if (!IsOnBed()) return;
-
-		/*Depth Average B*/
-		this->InputDepthAverageAtBase(RheologyBEnum,RheologyBbarEnum,MaterialsEnum);
-
-		/*B is a 2d field, use MacAyeal(2d) gradient even if it is Stokes or Pattyn*/
-		tria=(Tria*)SpawnTria(0,1,2); //nodes 0, 1 and 2 make the new tria (lower face).
-		tria->GradjB(gradient);
-		delete tria->matice; delete tria;
-
-		/*delete B average*/
-		this->matice->inputs->DeleteInput(RheologyBbarEnum);
-	}
-}
-/*}}}*/
-/*FUNCTION Penta::GradjDrag {{{1*/
-void  Penta::GradjDrag(Vec gradient){
-
-	int              i,approximation;
-	double           temp_gradient[6]={0,0,0,0,0,0};
-	Tria*            tria=NULL;
-	TriaVertexInput* triavertexinput=NULL;
-
-	/*retrieve inputs :*/
-	inputs->GetParameterValue(&approximation,ApproximationEnum);
-
-	/*If on water, on shelf or not on bed, skip: */
-	if(IsOnWater()|| IsOnShelf() || !IsOnBed())return;
-
-	if (approximation==MacAyealApproximationEnum || approximation==PattynApproximationEnum){
-		/*MacAyeal or Pattyn*/
-		tria=(Tria*)SpawnTria(0,1,2); //nodes 0, 1 and 2 make the new tria.
-		tria->GradjDrag(gradient);
-		delete tria->matice; delete tria;
-	}
-	else if (approximation==StokesApproximationEnum){
-		/*Stokes*/
-		tria=(Tria*)SpawnTria(0,1,2); //nodes 0, 1 and 2 make the new tria.
-		tria->GradjDragStokes(gradient);
-		delete tria->matice; delete tria;
-	}
-	else if (approximation==NoneApproximationEnum){
-		return;
-	}
-	else _error_("approximation %s not supported yet",EnumToStringx(approximation));
+	switch(control_type){
+
+		case DragCoefficientEnum:
+
+			inputs->GetParameterValue(&approximation,ApproximationEnum);
+			if(IsOnShelf() || !IsOnBed()) return;
+
+			switch(approximation){
+				case MacAyealApproximationEnum:
+					tria=(Tria*)SpawnTria(0,1,2); //nodes 0, 1 and 2 make the new tria.
+					tria->GradjDragMacAyeal(gradient);
+					delete tria->matice; delete tria;
+					break;
+				case PattynApproximationEnum:
+					tria=(Tria*)SpawnTria(0,1,2); //nodes 0, 1 and 2 make the new tria.
+					tria->GradjDragMacAyeal(gradient);
+					delete tria->matice; delete tria;
+					//GradjDragPattyn(gradient);
+					break;
+				case StokesApproximationEnum:
+					tria=(Tria*)SpawnTria(0,1,2); //nodes 0, 1 and 2 make the new tria.
+					tria->GradjDragStokes(gradient);
+					delete tria->matice; delete tria;
+					//GradjDragStokes(gradient);
+					break;
+				case NoneApproximationEnum:
+					/*Gradient is 0*/
+					break;
+				default:
+					_error_("approximation %s not supported yet",EnumToStringx(approximation));
+			}
+			break;
+
+		case RheologyBbarEnum:
+			inputs->GetParameterValue(&approximation,ApproximationEnum);
+			switch(approximation){
+
+				case MacAyealApproximationEnum:
+
+					/*This element should be collapsed into a tria element at its base*/
+					if (!IsOnBed()) return; 
+
+					/*Depth Average B*/
+					this->InputDepthAverageAtBase(RheologyBEnum,RheologyBbarEnum,MaterialsEnum);
+
+					tria=(Tria*)SpawnTria(0,1,2); //nodes 0, 1 and 2 make the new tria (lower face).
+					tria->GradjBMacAyeal(gradient);
+					delete tria->matice; delete tria;
+
+					/*delete B average*/
+					this->matice->inputs->DeleteInput(RheologyBbarEnum);
+					break;
+				case PattynApproximationEnum: case StokesApproximationEnum:
+
+					/*Gradient is computed on bed only (Bbar)*/
+					if (!IsOnBed()) return;
+
+					/*Depth Average B*/
+					this->InputDepthAverageAtBase(RheologyBEnum,RheologyBbarEnum,MaterialsEnum);
+
+					/*B is a 2d field, use MacAyeal(2d) gradient even if it is Stokes or Pattyn*/
+					tria=(Tria*)SpawnTria(0,1,2); //nodes 0, 1 and 2 make the new tria (lower face).
+					tria->GradjBMacAyeal(gradient);
+					delete tria->matice; delete tria;
+
+					/*delete B average*/
+					this->matice->inputs->DeleteInput(RheologyBbarEnum);
+					break;
+
+				case NoneApproximationEnum:
+					/*Gradient is 0*/
+					break;
+				default:
+					_error_("approximation %s not supported yet",EnumToStringx(approximation));
+			}
+			break;
+
+		default:
+			_error_("control type %s not supported yet: ",EnumToStringx(control_type));
+	}
 }
 /*}}}*/
Index: /issm/trunk/src/c/objects/Elements/Penta.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.h	(revision 8642)
+++ /issm/trunk/src/c/objects/Elements/Penta.h	(revision 8643)
@@ -89,6 +89,4 @@
 		void   GetVectorFromInputs(Vec vector,int NameEnum);
 		void   Gradj(Vec gradient,int control_type);
-		void   GradjB(Vec gradient);
-		void   GradjDrag(Vec gradient);
 		int    Sid();
 		void   InputControlUpdate(double scalar,bool save_parameter);
Index: /issm/trunk/src/c/objects/Elements/Tria.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 8642)
+++ /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 8643)
@@ -2882,17 +2882,17 @@
 	switch(control_type){
 		case DragCoefficientEnum:
-			GradjDrag(gradient);
+			GradjDragMacAyeal(gradient);
 			break;
 		case RheologyBbarEnum:
-			GradjB(gradient);
+			GradjBMacAyeal(gradient);
 			break;
 		case DhDtEnum:
-			GradjDhDt(gradient);
+			GradjDhDtBalancedthickness(gradient);
 			break;
 		case VxEnum:
-			GradjVx(gradient);
+			GradjVxBalancedthickness(gradient);
 			break;
 		case VyEnum:
-			GradjVy(gradient);
+			GradjVyBalancedthickness(gradient);
 			break;
 		default:
@@ -2901,6 +2901,6 @@
 }
 /*}}}*/
-/*FUNCTION Tria::GradjB{{{1*/
-void  Tria::GradjB(Vec gradient){
+/*FUNCTION Tria::GradjBMacAyeal{{{1*/
+void  Tria::GradjBMacAyeal(Vec gradient){
 
 	/*Intermediaries*/
@@ -2967,6 +2967,6 @@
 }
 /*}}}*/
-/*FUNCTION Tria::GradjDrag {{{1*/
-void  Tria::GradjDrag(Vec gradient){
+/*FUNCTION Tria::GradjDragMacAyeal {{{1*/
+void  Tria::GradjDragMacAyeal(Vec gradient){
 
 	int        i,ig;
@@ -3160,6 +3160,6 @@
 }
 /*}}}*/
-/*FUNCTION Tria::GradjDhDt{{{1*/
-void  Tria::GradjDhDt(Vec gradient){
+/*FUNCTION Tria::GradjDhDtBalancedthickness{{{1*/
+void  Tria::GradjDhDtBalancedthickness(Vec gradient){
 
 	/*Intermediaries*/
@@ -3177,6 +3177,6 @@
 }
 /*}}}*/
-/*FUNCTION Tria::GradjVx{{{1*/
-void  Tria::GradjVx(Vec gradient){
+/*FUNCTION Tria::GradjVxBalancedthickness{{{1*/
+void  Tria::GradjVxBalancedthickness(Vec gradient){
 
 	/*Intermediaries*/
@@ -3226,6 +3226,6 @@
 }
 /*}}}*/
-/*FUNCTION Tria::GradjVy{{{1*/
-void  Tria::GradjVy(Vec gradient){
+/*FUNCTION Tria::GradjVyBalancedthickness{{{1*/
+void  Tria::GradjVyBalancedthickness(Vec gradient){
 
 	/*Intermediaries*/
Index: /issm/trunk/src/c/objects/Elements/Tria.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.h	(revision 8642)
+++ /issm/trunk/src/c/objects/Elements/Tria.h	(revision 8643)
@@ -90,9 +90,10 @@
 		void   GetVectorFromInputs(Vec vector,int NameEnum);
 		void   Gradj(Vec gradient,int control_type);
-		void   GradjB(Vec gradient);
-		void   GradjDrag(Vec gradient);
-		void   GradjDhDt(Vec gradient);
-		void   GradjVx(Vec gradient);
-		void   GradjVy(Vec gradient);
+		void   GradjBMacAyeal(Vec gradient);
+		void   GradjDragMacAyeal(Vec gradient);
+		void   GradjDragStokes(Vec gradient);
+		void   GradjDhDtBalancedthickness(Vec gradient);
+		void   GradjVxBalancedthickness(Vec gradient);
+		void   GradjVyBalancedthickness(Vec gradient);
 		void   InputControlUpdate(double scalar,bool save_parameter);
 		void   InputArtificialNoise(int enum_type,double min, double max);
@@ -187,5 +188,4 @@
 		void	  GetSolutionFromInputsHydrology(Vec solution);
 		void    GetStrainRate2d(double* epsilon,double* xyz_list, GaussTria* gauss, Input* vx_input, Input* vy_input);
-		void	  GradjDragStokes(Vec gradient);
 		void	  InputUpdateFromSolutionAdjointBalancethickness( double* solution);
 		void	  InputUpdateFromSolutionAdjointHoriz( double* solution);
