Index: /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h	(revision 5285)
+++ /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h	(revision 5286)
@@ -198,4 +198,5 @@
 	KflagEnum,
 	MassFluxEnum,
+	ThicknessAbsMisfitEnum,
 	SurfaceAbsVelMisfitEnum,
 	SurfaceRelVelMisfitEnum,
Index: /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp	(revision 5285)
+++ /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp	(revision 5286)
@@ -172,4 +172,5 @@
 		case KflagEnum : return "Kflag";
 		case MassFluxEnum : return "MassFlux";
+		case ThicknessAbsMisfitEnum : return "ThicknessAbsMisfit";
 		case SurfaceAbsVelMisfitEnum : return "SurfaceAbsVelMisfit";
 		case SurfaceRelVelMisfitEnum : return "SurfaceRelVelMisfit";
Index: /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp	(revision 5285)
+++ /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp	(revision 5286)
@@ -170,4 +170,5 @@
 	else if (strcmp(name,"Kflag")==0) return KflagEnum;
 	else if (strcmp(name,"MassFlux")==0) return MassFluxEnum;
+	else if (strcmp(name,"ThicknessAbsMisfit")==0) return ThicknessAbsMisfitEnum;
 	else if (strcmp(name,"SurfaceAbsVelMisfit")==0) return SurfaceAbsVelMisfitEnum;
 	else if (strcmp(name,"SurfaceRelVelMisfit")==0) return SurfaceRelVelMisfitEnum;
Index: /issm/trunk/src/c/Makefile.am
===================================================================
--- /issm/trunk/src/c/Makefile.am	(revision 5285)
+++ /issm/trunk/src/c/Makefile.am	(revision 5286)
@@ -443,4 +443,6 @@
 					./modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.h\
 					./modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp\
+					./modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.h\
+					./modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp\
 					./modules/CostFunctionx/CostFunctionx.h\
 					./modules/CostFunctionx/CostFunctionx.cpp\
@@ -986,4 +988,6 @@
 					./modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.h\
 					./modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp\
+					./modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.h\
+					./modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp\
 					./modules/CostFunctionx/CostFunctionx.h\
 					./modules/CostFunctionx/CostFunctionx.cpp\
Index: /issm/trunk/src/c/modules/Responsex/Responsex.cpp
===================================================================
--- /issm/trunk/src/c/modules/Responsex/Responsex.cpp	(revision 5285)
+++ /issm/trunk/src/c/modules/Responsex/Responsex.cpp	(revision 5286)
@@ -51,4 +51,7 @@
 		MaxAbsVzx( presponse, elements,nodes, vertices, loads, materials, parameters,process_units);
 	}
+	else if(strncmp(response_descriptor,"MassFlux",8)==0){
+		MassFluxx(presponse,elements,nodes,vertices,loads,materials,parameters,response_descriptor,process_units);
+	}
 	else if(strcmp(response_descriptor,"SurfaceAbsVelMisfit")==0){
 		SurfaceAbsVelMisfitx( presponse, elements,nodes, vertices, loads, materials, parameters,process_units);
@@ -66,6 +69,6 @@
 		SurfaceAverageVelMisfitx( presponse, elements,nodes, vertices, loads, materials, parameters,process_units);
 	}
-	else if(strncmp(response_descriptor,"MassFlux",8)==0){
-		MassFluxx(presponse,elements,nodes,vertices,loads,materials,parameters,response_descriptor,process_units);
+	else if(strcmp(response_descriptor,"ThicknessAbsMisfit")==0){
+		ThicknessAbsMisfitx( presponse, elements,nodes, vertices, loads, materials, parameters,process_units);
 	}
 	else{
Index: /issm/trunk/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp
===================================================================
--- /issm/trunk/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp	(revision 5286)
+++ /issm/trunk/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp	(revision 5286)
@@ -0,0 +1,35 @@
+/*!\file ThicknessAbsMisfitx
+ * \brief: compute misfit between observations and model
+ */
+
+#include "./ThicknessAbsMisfitx.h"
+
+#include "../../shared/shared.h"
+#include "../../include/include.h"
+#include "../../toolkits/toolkits.h"
+#include "../../EnumDefinitions/EnumDefinitions.h"
+
+void ThicknessAbsMisfitx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
+
+	/*Intermediary*/
+	int i;
+	Element* element=NULL;
+
+	/*output: */
+	double J=0;
+	double J_sum;
+
+	/*Compute Misfit: */
+	for (i=0;i<elements->Size();i++){
+		element=(Element*)elements->GetObjectByOffset(i);
+		J+=element->ThicknessAbsMisfit(process_units);
+	}
+
+	/*Sum all J from all cpus of the cluster:*/
+	MPI_Reduce (&J,&J_sum,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD );
+	MPI_Bcast(&J_sum,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
+	J=J_sum;
+
+	/*Assign output pointers: */
+	*pJ=J;
+}
Index: /issm/trunk/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.h
===================================================================
--- /issm/trunk/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.h	(revision 5286)
+++ /issm/trunk/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.h	(revision 5286)
@@ -0,0 +1,14 @@
+/*!\file:  ThicknessAbsMisfitx.h
+ * \brief header file for inverse methods misfit computation
+ */ 
+
+#ifndef _THICKNESSABSMISFITX_H
+#define _THICKNESSABSMISFITX_H
+
+#include "../../Container/Container.h"
+#include "../../objects/objects.h"
+
+/* local prototypes: */
+void ThicknessAbsMisfitx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
+
+#endif
Index: /issm/trunk/src/c/modules/modules.h
===================================================================
--- /issm/trunk/src/c/modules/modules.h	(revision 5285)
+++ /issm/trunk/src/c/modules/modules.h	(revision 5286)
@@ -55,4 +55,5 @@
 #include "./MinVyx/MinVyx.h"
 #include "./MinVzx/MinVzx.h"
+#include "./ThicknessAbsMisfitx/ThicknessAbsMisfitx.h"
 #include "./SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.h"
 #include "./SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.h"
Index: /issm/trunk/src/c/objects/Elements/Element.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Element.h	(revision 5285)
+++ /issm/trunk/src/c/objects/Elements/Element.h	(revision 5286)
@@ -42,4 +42,5 @@
 		virtual void   GradjDrag(Vec gradient)=0;
 		virtual void   GradjB(Vec gradient)=0;
+		virtual double ThicknessAbsMisfit(bool process_units)=0;
 		virtual double SurfaceAbsVelMisfit(bool process_units)=0;
 		virtual double SurfaceRelVelMisfit(bool process_units)=0;
Index: /issm/trunk/src/c/objects/Elements/Penta.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 5285)
+++ /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 5286)
@@ -1597,6 +1597,6 @@
 }
 /*}}}*/
-/*FUNCTION Penta::SurfaceAbsVelMisfit {{{1*/
-double Penta::SurfaceAbsVelMisfit(bool process_units){
+/*FUNCTION Penta::ThicknessAbsMisfit {{{1*/
+double Penta::ThicknessAbsMisfit(bool process_units){
 
 	double J;
@@ -1617,12 +1617,40 @@
 	/*If on water, return 0: */
 	if(onwater)return 0;
+	ISSMERROR("Not implemented yet");
+
+	tria=(Tria*)SpawnTria(3,4,5); //grids 3, 4 and 5 make the new tria (upper face).
+	J=tria->ThicknessAbsMisfit(process_units);
+	delete tria->matice; delete tria;
+	return J;
+}
+/*}}}*/
+/*FUNCTION Penta::SurfaceAbsVelMisfit {{{1*/
+double Penta::SurfaceAbsVelMisfit(bool process_units){
+
+	double J;
+	Tria* tria=NULL;
+
+	/*inputs: */
+	bool onwater;
+	bool onsurface;
+	bool onbed;
+	int  approximation;
+
+	/*retrieve inputs :*/
+	inputs->GetParameterValue(&onwater,ElementOnWaterEnum);
+	inputs->GetParameterValue(&onbed,ElementOnBedEnum);
+	inputs->GetParameterValue(&onsurface,ElementOnSurfaceEnum);
+	inputs->GetParameterValue(&approximation,ApproximationEnum);
+
+	/*If on water, return 0: */
+	if(onwater)return 0;
 
 	/*Bail out if this element if:
 	 * -> Non MacAyeal and not on the surface
 	 * -> MacAyeal (2d model) and not on bed) */
-	if ((approximation!=MacAyealApproximationEnum && !onsurface) || (MacAyealApproximationEnum && !onbed)){
+	if ((approximation!=MacAyealApproximationEnum && !onsurface) || (approximation==MacAyealApproximationEnum && !onbed)){
 		return 0;
 	}
-	else if (MacAyealApproximationEnum){
+	else if (approximation==MacAyealApproximationEnum){
 
 		/*This element should be collapsed into a tria element at its base. Create this tria element, 
Index: /issm/trunk/src/c/objects/Elements/Penta.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.h	(revision 5285)
+++ /issm/trunk/src/c/objects/Elements/Penta.h	(revision 5286)
@@ -104,4 +104,5 @@
 		void   MinVy(double* pminvy, bool process_units);
 		void   MinVz(double* pminvz, bool process_units);
+		double ThicknessAbsMisfit(bool process_units);
 		double SurfaceAbsVelMisfit(bool process_units);
 		double SurfaceRelVelMisfit(bool process_units);
Index: /issm/trunk/src/c/objects/Elements/Tria.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 5285)
+++ /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 5286)
@@ -573,6 +573,6 @@
 	double  gauss_weight;
 	double  gauss_l1l2l3[3];
-	double  k_gauss;
 	double  B_gauss;
+	double  dhdt_gauss;
 
 	/* parameters: */
@@ -627,4 +627,8 @@
 		else if (control_type==RheologyB2dEnum){
 			matice->inputs->GetParameterDerivativeValue(&dB[0], &xyz_list[0][0], &gauss_l1l2l3[0],RheologyB2dEnum);
+			Jelem+=cm_noisedmp*1/2*(pow(dB[0],2)+pow(dB[1],2))*Jdet*gauss_weight;
+		}
+		else if (control_type==DhDtEnum){
+			matice->inputs->GetParameterDerivativeValue(&dB[0], &xyz_list[0][0], &gauss_l1l2l3[0],DhDtEnum);
 			Jelem+=cm_noisedmp*1/2*(pow(dB[0],2)+pow(dB[1],2))*Jdet*gauss_weight;
 		}
@@ -1855,4 +1859,86 @@
 	*pminvz=minvz;
 
+}
+/*}}}*/
+/*FUNCTION Tria::ThicknessAbsMisfit {{{1*/
+double Tria::ThicknessAbsMisfit(bool process_units){
+
+	int i;
+
+	/* output: */
+	double Jelem=0;
+
+	/* node data: */
+	const int    numgrids=3;
+	const int    numdof=1*numgrids;
+	const int    NDOF=1;
+	double       xyz_list[numgrids][3];
+
+	/* gaussian points: */
+	int     num_gauss,ig;
+	double* first_gauss_area_coord  =  NULL;
+	double* second_gauss_area_coord =  NULL;
+	double* third_gauss_area_coord  =  NULL;
+	double* gauss_weights           =  NULL;
+	double  gauss_weight;
+	double  gauss_l1l2l3[3];
+	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
+
+	/* parameters: */
+	double  thickness,thicknessobs,weight;
+
+	/* Jacobian: */
+	double Jdet;
+
+	/*inputs: */
+	bool onwater;
+	Input* thickness_input=NULL;
+	Input* thicknessobs_input=NULL;
+	Input* weights_input=NULL;
+
+	/*retrieve inputs :*/
+	inputs->GetParameterValue(&onwater,ElementOnWaterEnum);
+
+	/*If on water, return 0: */
+	if(onwater)return 0;
+
+	/* Get node coordinates and dof list: */
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+
+	/*Retrieve all inputs we will be needing: */
+	thickness_input   =inputs->GetInput(ThicknessEnum);   ISSMASSERT(thickness_input);
+	thicknessobs_input=inputs->GetInput(ThicknessObsEnum);ISSMASSERT(thicknessobs_input);
+	weights_input     =inputs->GetInput(WeightsEnum);ISSMASSERT(weights_input);
+
+	/* Get gaussian points and weights (make this a statically initialized list of points? fstd): */
+	GaussTria( &num_gauss, &first_gauss_area_coord, &second_gauss_area_coord, &third_gauss_area_coord, &gauss_weights, 2);
+
+	/* Start  looping on the number of gaussian points: */
+	for (ig=0; ig<num_gauss; ig++){
+		/*Pick up the gaussian point: */
+		gauss_weight=*(gauss_weights+ig);
+		gauss_l1l2l3[0]=*(first_gauss_area_coord+ig); 
+		gauss_l1l2l3[1]=*(second_gauss_area_coord+ig);
+		gauss_l1l2l3[2]=*(third_gauss_area_coord+ig);
+
+		/* Get Jacobian determinant: */
+		GetJacobianDeterminant2d(&Jdet, &xyz_list[0][0],gauss_l1l2l3);
+
+		/*Get parameters at gauss point*/
+		thickness_input->GetParameterValue(&thickness, &gauss_l1l2l3[0]);
+		thicknessobs_input->GetParameterValue(&thicknessobs, &gauss_l1l2l3[0]);
+		weights_input->GetParameterValue(&weight, &gauss_l1l2l3[0]);
+
+		/*compute ThicknessAbsMisfit*/
+		Jelem+=0.5*pow(thickness_input-thicknessobs_input,2.0)*weight*Jdet*gauss_weight;
+	}
+
+	xfree((void**)&first_gauss_area_coord);
+	xfree((void**)&second_gauss_area_coord);
+	xfree((void**)&third_gauss_area_coord);
+	xfree((void**)&gauss_weights);
+
+	/*Return: */
+	return Jelem;
 }
 /*}}}*/
@@ -4805,5 +4891,5 @@
 	thickness_input   =inputs->GetInput(ThicknessEnum);   ISSMASSERT(thickness_input);
 	thicknessobs_input=inputs->GetInput(ThicknessObsEnum);ISSMASSERT(thicknessobs_input);
-	weights_input     =inputs->GetInput(ThicknessObsEnum);ISSMASSERT(weights_input);
+	weights_input     =inputs->GetInput(WeightsEnum);ISSMASSERT(weights_input);
 
 	/* Get gaussian points and weights (make this a statically initialized list of points? fstd): */
Index: /issm/trunk/src/c/objects/Elements/Tria.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.h	(revision 5285)
+++ /issm/trunk/src/c/objects/Elements/Tria.h	(revision 5286)
@@ -103,4 +103,5 @@
 		void   MinVy(double* pminvy, bool process_units);
 		void   MinVz(double* pminvz, bool process_units);
+		double ThicknessAbsMisfit(bool process_units);
 		double SurfaceAbsVelMisfit(bool process_units);
 		double SurfaceRelVelMisfit(bool process_units);
