Index: /issm/trunk/src/c/DataSet/DataSet.cpp
===================================================================
--- /issm/trunk/src/c/DataSet/DataSet.cpp	(revision 1184)
+++ /issm/trunk/src/c/DataSet/DataSet.cpp	(revision 1185)
@@ -1243,5 +1243,5 @@
 
 
-void  DataSet::Du(Vec du_g,double*  u_g,void* inputs,int analysis_type,int sub_analysis_type){
+void  DataSet::Du(Vec du_g,void* inputs,int analysis_type,int sub_analysis_type){
 
 
@@ -1254,12 +1254,12 @@
 
 			element=(Element*)(*object);
-			element->Du(du_g,u_g,inputs,analysis_type,sub_analysis_type);
-		}
-	}
-
-
-}
-
-void  DataSet::Gradj(Vec grad_g,double*  u_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type,char* control_type){
+			element->Du(du_g,inputs,analysis_type,sub_analysis_type);
+		}
+	}
+
+
+}
+
+void  DataSet::Gradj(Vec grad_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type,char* control_type){
 
 
@@ -1272,5 +1272,5 @@
 
 			element=(Element*)(*object);
-			element->Gradj(grad_g,u_g,lambda_g,inputs,analysis_type,sub_analysis_type,control_type);
+			element->Gradj(grad_g,lambda_g,inputs,analysis_type,sub_analysis_type,control_type);
 		}
 	}
@@ -1279,5 +1279,5 @@
 }		
 		
-void  DataSet::Misfit(double* pJ, double* u_g,void* inputs,int analysis_type,int sub_analysis_type){
+void  DataSet::Misfit(double* pJ,void* inputs,int analysis_type,int sub_analysis_type){
 
 	double J=0;;
@@ -1291,5 +1291,5 @@
 
 			element=(Element*)(*object);
-			J+=element->Misfit(u_g,inputs,analysis_type,sub_analysis_type);
+			J+=element->Misfit(inputs,analysis_type,sub_analysis_type);
 
 		}
Index: /issm/trunk/src/c/DataSet/DataSet.h
===================================================================
--- /issm/trunk/src/c/DataSet/DataSet.h	(revision 1184)
+++ /issm/trunk/src/c/DataSet/DataSet.h	(revision 1185)
@@ -73,7 +73,7 @@
 		void  MeltingConstraints(int* pnum_unstable_constraints,void* inputs,int analysis_type,int sub_analysis_type);
 		DataSet* Copy(void);
-		void  Du(Vec du_g,double*  u_g,void* inputs,int analysis_type,int sub_analysis_type);
-		void  Gradj(Vec grad_g,double*  u_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type,char* control_type);
-		void  Misfit(double* pJ, double* u_g,void* inputs,int analysis_type,int sub_analysis_type);
+		void  Du(Vec du_g,void* inputs,int analysis_type,int sub_analysis_type);
+		void  Gradj(Vec grad_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type,char* control_type);
+		void  Misfit(double* pJ, void* inputs,int analysis_type,int sub_analysis_type);
 		void  FieldDepthAverageAtBase(Vec field,double* field_serial,char* fieldname);
 		int   DeleteObject(Object* object);
Index: /issm/trunk/src/c/Dux/Dux.cpp
===================================================================
--- /issm/trunk/src/c/Dux/Dux.cpp	(revision 1184)
+++ /issm/trunk/src/c/Dux/Dux.cpp	(revision 1185)
@@ -14,5 +14,5 @@
 
 void Dux( Vec* pdu_g, DataSet* elements,DataSet* nodes, DataSet* loads, DataSet* materials, 
-		double* u_g,ParameterInputs* inputs,int analysis_type,int sub_analysis_type){
+			ParameterInputs* inputs,int analysis_type,int sub_analysis_type){
 
 	int i;
@@ -33,5 +33,5 @@
 
 	/*Compute velocity difference: */
-	elements->Du(du_g, u_g,inputs,analysis_type,sub_analysis_type);
+	elements->Du(du_g,inputs,analysis_type,sub_analysis_type);
 
 	/*Assemble vector: */
Index: /issm/trunk/src/c/Dux/Dux.h
===================================================================
--- /issm/trunk/src/c/Dux/Dux.h	(revision 1184)
+++ /issm/trunk/src/c/Dux/Dux.h	(revision 1185)
@@ -10,5 +10,5 @@
 /* local prototypes: */
 void Dux( Vec* pdu_g, DataSet* elements,DataSet* nodes, DataSet* loads, DataSet* materials, 
-		double* u_g,ParameterInputs* inputs,int analysis_type,int sub_analysis_type);
+			ParameterInputs* inputs,int analysis_type,int sub_analysis_type);
 
 #endif  /* _DUX_H */
Index: /issm/trunk/src/c/Gradjx/Gradjx.cpp
===================================================================
--- /issm/trunk/src/c/Gradjx/Gradjx.cpp	(revision 1184)
+++ /issm/trunk/src/c/Gradjx/Gradjx.cpp	(revision 1185)
@@ -14,5 +14,5 @@
 
 void Gradjx( Vec* pgrad_g, int numberofnodes, DataSet* elements,DataSet* nodes, DataSet* loads, DataSet* materials, 
-		double* u_g, double* lambda_g, ParameterInputs* inputs,int analysis_type,int sub_analysis_type,char* control_type){
+		double* lambda_g, ParameterInputs* inputs,int analysis_type,int sub_analysis_type,char* control_type){
 
 	/*output: */
@@ -26,5 +26,5 @@
 
 	/*Compute gradients: */
-	elements->Gradj(grad_g, u_g,lambda_g,inputs,analysis_type,sub_analysis_type,control_type);
+	elements->Gradj(grad_g,lambda_g,inputs,analysis_type,sub_analysis_type,control_type);
 
 	/*Assemble vector: */
Index: /issm/trunk/src/c/Gradjx/Gradjx.h
===================================================================
--- /issm/trunk/src/c/Gradjx/Gradjx.h	(revision 1184)
+++ /issm/trunk/src/c/Gradjx/Gradjx.h	(revision 1185)
@@ -10,5 +10,5 @@
 /* local prototypes: */
 void Gradjx( Vec* pgrad_g, int numberofnodes, DataSet* elements,DataSet* nodes, DataSet* loads, DataSet* materials, 
-		double* u_g, double* lambda_g, ParameterInputs* inputs,int analysis_type,int sub_analysis_type,char* control_type);
+			double* lambda_g, ParameterInputs* inputs,int analysis_type,int sub_analysis_type,char* control_type);
 
 #endif  /* _GRADJX_H */
Index: /issm/trunk/src/c/Misfitx/Misfitx.cpp
===================================================================
--- /issm/trunk/src/c/Misfitx/Misfitx.cpp	(revision 1184)
+++ /issm/trunk/src/c/Misfitx/Misfitx.cpp	(revision 1185)
@@ -14,5 +14,5 @@
 
 void Misfitx( double* pJ, DataSet* elements,DataSet* nodes, DataSet* loads, DataSet* materials, 
-		double* u_g, ParameterInputs* inputs,int analysis_type,int sub_analysis_type){
+			ParameterInputs* inputs,int analysis_type,int sub_analysis_type){
 	
 	/*output: */
@@ -24,5 +24,5 @@
 
 	/*Compute gradients: */
-	elements->Misfit(&J, u_g,inputs,analysis_type,sub_analysis_type);
+	elements->Misfit(&J,inputs,analysis_type,sub_analysis_type);
 
 	/*Sum all J from all cpus of the cluster:*/
Index: /issm/trunk/src/c/Misfitx/Misfitx.h
===================================================================
--- /issm/trunk/src/c/Misfitx/Misfitx.h	(revision 1184)
+++ /issm/trunk/src/c/Misfitx/Misfitx.h	(revision 1185)
@@ -10,5 +10,5 @@
 /* local prototypes: */
 void Misfitx( double* pJ, DataSet* elements,DataSet* nodes, DataSet* loads, DataSet* materials, 
-			double* u_g, ParameterInputs* inputs,int analysis_type,int sub_analysis_type);
+			ParameterInputs* inputs,int analysis_type,int sub_analysis_type);
 
 #endif  /* _MISFITX_H */
Index: /issm/trunk/src/c/objects/Beam.cpp
===================================================================
--- /issm/trunk/src/c/objects/Beam.cpp	(revision 1184)
+++ /issm/trunk/src/c/objects/Beam.cpp	(revision 1185)
@@ -566,25 +566,25 @@
 #undef __FUNCT__ 
 #define __FUNCT__ "Beam::Du"
-void  Beam::Du(_p_Vec*, double*, void*, int,int){
+void  Beam::Du(_p_Vec*,void*,int,int){
 	throw ErrorException(__FUNCT__," not supported yet!");
 }
 #undef __FUNCT__ 
 #define __FUNCT__ "Beam::Gradj"
-void  Beam::Gradj(_p_Vec*, double*, double*, void*, int, int,char*){
+void  Beam::Gradj(_p_Vec*, double*, void*, int, int,char*){
 	throw ErrorException(__FUNCT__," not supported yet!");
 }
 #undef __FUNCT__ 
 #define __FUNCT__ "Beam::GradjDrag"
-void  Beam::GradjDrag(_p_Vec*, double*, double*, void*, int,int ){
+void  Beam::GradjDrag(_p_Vec*, double*, void*, int,int ){
 	throw ErrorException(__FUNCT__," not supported yet!");
 }
 #undef __FUNCT__ 
 #define __FUNCT__ "Beam::GradjB"
-void  Beam::GradjB(_p_Vec*, double*, double*, void*, int, int){
+void  Beam::GradjB(_p_Vec*, double*, void*, int, int){
 	throw ErrorException(__FUNCT__," not supported yet!");
 }
 #undef __FUNCT__ 
 #define __FUNCT__ "Beam::Misfit"
-double Beam::Misfit(double*, void*, int,int ){
+double Beam::Misfit(void*,int,int ){
 	throw ErrorException(__FUNCT__," not supported yet!");
 }
Index: /issm/trunk/src/c/objects/Beam.h
===================================================================
--- /issm/trunk/src/c/objects/Beam.h	(revision 1184)
+++ /issm/trunk/src/c/objects/Beam.h	(revision 1185)
@@ -79,9 +79,9 @@
 		void  GetBedList(double*);
 		void  GetThicknessList(double* thickness_list);
-		void  Du(_p_Vec*, double*, void*, int,int);
-		void  Gradj(_p_Vec*, double*, double*, void*, int, int,char*);
-		void  GradjDrag(_p_Vec*, double*, double*, void*, int,int );
-		void  GradjB(_p_Vec*, double*, double*, void*, int,int );
-		double Misfit(double*, void*, int,int );
+		void  Du(_p_Vec*,void*, int,int);
+		void  Gradj(_p_Vec*, double*, void*, int, int,char*);
+		void  GradjDrag(_p_Vec*, double*, void*, int,int );
+		void  GradjB(_p_Vec*, double*, void*, int,int );
+		double Misfit(void*,int,int );
 		void  GetNodalFunctions(double* l1l2, double gauss_coord);
 		void  GetParameterValue(double* pvalue, double* value_list,double gauss_coord);
Index: /issm/trunk/src/c/objects/Element.h
===================================================================
--- /issm/trunk/src/c/objects/Element.h	(revision 1184)
+++ /issm/trunk/src/c/objects/Element.h	(revision 1185)
@@ -34,9 +34,9 @@
 		virtual void  GetThicknessList(double* thickness_list)=0;
 		virtual void  GetBedList(double* bed_list)=0;
-		virtual void  Du(Vec du_g,double* u_g,void* inputs,int analysis_type,int sub_analysis_type)=0;
-		virtual void  Gradj(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type,char* control_type)=0;
-		virtual void  GradjDrag(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type)=0;
-		virtual void  GradjB(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type)=0;
-		virtual double Misfit(double* u_g,void* inputs,int analysis_type,int sub_analysis_type)=0;
+		virtual void  Du(Vec du_g,void* inputs,int analysis_type,int sub_analysis_type)=0;
+		virtual void  Gradj(Vec grad_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type,char* control_type)=0;
+		virtual void  GradjDrag(Vec grad_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type)=0;
+		virtual void  GradjB(Vec grad_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type)=0;
+		virtual double Misfit(void* inputs,int analysis_type,int sub_analysis_type)=0;
 		virtual void  ComputePressure(Vec p_g)=0;
 
Index: /issm/trunk/src/c/objects/Penta.cpp
===================================================================
--- /issm/trunk/src/c/objects/Penta.cpp	(revision 1184)
+++ /issm/trunk/src/c/objects/Penta.cpp	(revision 1185)
@@ -1176,5 +1176,5 @@
 #undef __FUNCT__ 
 #define __FUNCT__ "Penta::Du"
-void  Penta::Du(Vec du_g,double* u_g,void* inputs,int analysis_type,int sub_analysis_type){
+void  Penta::Du(Vec du_g,void* inputs,int analysis_type,int sub_analysis_type){
 
 	int i;
@@ -1192,5 +1192,5 @@
 		 * and compute Du*/
 		tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria (lower face).
-		tria->Du(du_g,u_g,inputs,analysis_type,sub_analysis_type);
+		tria->Du(du_g,inputs,analysis_type,sub_analysis_type);
 		delete tria;
 		return;
@@ -1199,5 +1199,5 @@
 		
 		tria=(Tria*)SpawnTria(3,4,5); //grids 3, 4 and 5 make the new tria (upper face).
-		tria->Du(du_g,u_g,inputs,analysis_type,sub_analysis_type);
+		tria->Du(du_g,inputs,analysis_type,sub_analysis_type);
 		delete tria;
 		return;
@@ -1207,11 +1207,11 @@
 #undef __FUNCT__ 
 #define __FUNCT__ "Penta::Gradj"
-void  Penta::Gradj(Vec grad_g,double* velocity,double* adjoint,void* inputs,int analysis_type,int sub_analysis_type,char* control_type){
+void  Penta::Gradj(Vec grad_g,double* adjoint,void* inputs,int analysis_type,int sub_analysis_type,char* control_type){
 
 	if (strcmp(control_type,"drag")==0){
-		GradjDrag( grad_g,velocity,adjoint,inputs,analysis_type,sub_analysis_type);
+		GradjDrag( grad_g,adjoint,inputs,analysis_type,sub_analysis_type);
 	}
 	else if (strcmp(control_type,"B")==0){
-		GradjB( grad_g, velocity, adjoint, inputs,analysis_type,sub_analysis_type);
+		GradjB( grad_g,adjoint, inputs,analysis_type,sub_analysis_type);
 	}
 	else throw ErrorException(__FUNCT__,exprintf("%s%s","control type not supported yet: ",control_type));
@@ -1220,5 +1220,5 @@
 #undef __FUNCT__ 
 #define __FUNCT__ "Penta::GradjDrag"
-void  Penta::GradjDrag(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type){
+void  Penta::GradjDrag(Vec grad_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type){
 	
 	
@@ -1232,5 +1232,5 @@
 		
 		tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria.
-		tria->GradjDrag( grad_g,u_g,lambda_g,inputs,analysis_type,sub_analysis_type);
+		tria->GradjDrag( grad_g,lambda_g,inputs,analysis_type,sub_analysis_type);
 		delete tria;
 		return;
@@ -1240,5 +1240,5 @@
 #undef __FUNCT__ 
 #define __FUNCT__ "Penta::GradjB"
-void  Penta::GradjB(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type){
+void  Penta::GradjB(Vec grad_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type){
 	throw ErrorException(__FUNCT__," not supported yet!");
 }
@@ -1246,5 +1246,5 @@
 #undef __FUNCT__ 
 #define __FUNCT__ "Penta::Misfit"
-double Penta::Misfit(double* velocity,void* inputs,int analysis_type,int sub_analysis_type){
+double Penta::Misfit(void* inputs,int analysis_type,int sub_analysis_type){
 	
 	double J;
@@ -1262,5 +1262,5 @@
 		 * and compute Misfit*/
 		tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria (lower face).
-		J=tria->Misfit( velocity,inputs,analysis_type,sub_analysis_type);
+		J=tria->Misfit(inputs,analysis_type,sub_analysis_type);
 		delete tria;
 		return J;
@@ -1269,5 +1269,5 @@
 
 		tria=(Tria*)SpawnTria(3,4,5); //grids 3, 4 and 5 make the new tria (upper face).
-		J=tria->Misfit( velocity,inputs,analysis_type,sub_analysis_type);
+		J=tria->Misfit(inputs,analysis_type,sub_analysis_type);
 		delete tria;
 		return J;
Index: /issm/trunk/src/c/objects/Penta.h
===================================================================
--- /issm/trunk/src/c/objects/Penta.h	(revision 1184)
+++ /issm/trunk/src/c/objects/Penta.h	(revision 1185)
@@ -86,9 +86,9 @@
 		void  GetNodes(void** nodes);
 		int   GetOnBed();
-		void  Du(Vec du_g,double* u_g,void* inputs,int analysis_type,int sub_analysis_type);
-		void  Gradj(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type,char* control_type);
-		void  GradjDrag(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type);
-		void  GradjB(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type);
-		double Misfit(double* u_g,void* inputs,int analysis_type,int sub_analysis_type);
+		void  Du(Vec du_g,void* inputs,int analysis_type,int sub_analysis_type);
+		void  Gradj(Vec grad_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type,char* control_type);
+		void  GradjDrag(Vec grad_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type);
+		void  GradjB(Vec grad_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type);
+		double Misfit(void* inputs,int analysis_type,int sub_analysis_type);
 		
 		void          GetThicknessList(double* thickness_list);
Index: /issm/trunk/src/c/objects/Sing.cpp
===================================================================
--- /issm/trunk/src/c/objects/Sing.cpp	(revision 1184)
+++ /issm/trunk/src/c/objects/Sing.cpp	(revision 1185)
@@ -450,25 +450,25 @@
 #undef __FUNCT__ 
 #define __FUNCT__ "Sing::Du"
-void  Sing::Du(_p_Vec*, double*, void*, int,int){
+void  Sing::Du(_p_Vec*,void*,int,int){
 	throw ErrorException(__FUNCT__," not supported yet!");
 }
 #undef __FUNCT__ 
 #define __FUNCT__ "Sing::Gradj"
-void  Sing::Gradj(_p_Vec*, double*, double*, void*, int, int ,char*){
+void  Sing::Gradj(_p_Vec*, double*, void*, int, int ,char*){
 	throw ErrorException(__FUNCT__," not supported yet!");
 }
 #undef __FUNCT__ 
 #define __FUNCT__ "Sing::GradjDrag"
-void  Sing::GradjDrag(_p_Vec*, double*, double*, void*, int,int){
+void  Sing::GradjDrag(_p_Vec*, double*, void*, int,int){
 	throw ErrorException(__FUNCT__," not supported yet!");
 }
 #undef __FUNCT__ 
 #define __FUNCT__ "Sing::GradjB"
-void  Sing::GradjB(_p_Vec*, double*, double*, void*, int,int){
+void  Sing::GradjB(_p_Vec*, double*, void*, int,int){
 	throw ErrorException(__FUNCT__," not supported yet!");
 }
 #undef __FUNCT__ 
 #define __FUNCT__ "Sing::Misfit"
-double Sing::Misfit(double*, void*, int,int){
+double Sing::Misfit(void*, int,int){
 	throw ErrorException(__FUNCT__," not supported yet!");
 }
Index: /issm/trunk/src/c/objects/Sing.h
===================================================================
--- /issm/trunk/src/c/objects/Sing.h	(revision 1184)
+++ /issm/trunk/src/c/objects/Sing.h	(revision 1185)
@@ -74,9 +74,9 @@
 		void  GetBedList(double*);
 		void  GetThicknessList(double* thickness_list);
-		void  Du(_p_Vec*, double*, void*, int,int);
-		void  Gradj(_p_Vec*, double*, double*, void*, int, int,char*);
-		void  GradjDrag(_p_Vec*, double*, double*, void*, int,int);
-		void  GradjB(_p_Vec*, double*, double*, void*, int,int);
-		double Misfit(double*, void*, int,int);
+		void  Du(_p_Vec*,void*,int,int);
+		void  Gradj(_p_Vec*, double*, void*, int, int,char*);
+		void  GradjDrag(_p_Vec*, double*, void*, int,int);
+		void  GradjB(_p_Vec*, double*, void*, int,int);
+		double Misfit(void*,int,int);
 
 
Index: /issm/trunk/src/c/objects/Tria.cpp
===================================================================
--- /issm/trunk/src/c/objects/Tria.cpp	(revision 1184)
+++ /issm/trunk/src/c/objects/Tria.cpp	(revision 1185)
@@ -2007,5 +2007,5 @@
 #undef __FUNCT__ 
 #define __FUNCT__ "Tria::Du"
-void Tria::Du(Vec du_g,double* velocity,void* vinputs,int analysis_type,int sub_analysis_type){
+void Tria::Du(Vec du_g,void* vinputs,int analysis_type,int sub_analysis_type){
 
 	int i;
@@ -2080,16 +2080,13 @@
 		throw ErrorException(__FUNCT__,"missing velocity_obs input parameter");
 	}
+	if(!inputs->Recover("velocity",&vxvy_list[0][0],2,dofs2,numgrids,(void**)nodes)){
+		throw ErrorException(__FUNCT__,"missing velocity input parameter");
+	}
 
 	for(i=0;i<numgrids;i++){
 		obs_vx_list[i]=obs_vxvy_list[i][0];
 		obs_vy_list[i]=obs_vxvy_list[i][1];
-	}
-
-	/*Initialize velocities: */
-	for(i=0;i<numgrids;i++){
-		vx_list[i]=velocity[doflist[i*numberofdofspernode+0]];
-		vy_list[i]=velocity[doflist[i*numberofdofspernode+1]];
-		//obs_vx_list[i]=obs_velocity[doflist[i*numberofdofspernode+0]];
-		//obs_vy_list[i]=obs_velocity[doflist[i*numberofdofspernode+1]];
+		vx_list[i]=vxvy_list[i][0];
+		vy_list[i]=vxvy_list[i][1];
 	}
 
@@ -2220,11 +2217,11 @@
 #undef __FUNCT__ 
 #define __FUNCT__ "Tria::Gradj"
-void  Tria::Gradj(Vec grad_g,double* velocity,double* adjoint,void* inputs,int analysis_type,int sub_analysis_type,char* control_type){
+void  Tria::Gradj(Vec grad_g,double* adjoint,void* inputs,int analysis_type,int sub_analysis_type,char* control_type){
 
 	if (strcmp(control_type,"drag")==0){
-		GradjDrag( grad_g,velocity,adjoint,inputs,analysis_type,sub_analysis_type);
+		GradjDrag( grad_g,adjoint,inputs,analysis_type,sub_analysis_type);
 	}
 	else if (strcmp(control_type,"B")==0){
-		GradjB( grad_g, velocity, adjoint, inputs,analysis_type,sub_analysis_type);
+		GradjB( grad_g,adjoint,inputs,analysis_type,sub_analysis_type);
 	}
 	else throw ErrorException(__FUNCT__,exprintf("%s%s","control type not supported yet: ",control_type));
@@ -2233,5 +2230,5 @@
 #undef __FUNCT__ 
 #define __FUNCT__ "Tria::GradjDrag"
-void  Tria::GradjDrag(Vec grad_g,double* velocity,double* adjoint,void* vinputs,int analysis_type,int sub_analysis_type){
+void  Tria::GradjDrag(Vec grad_g,double* adjoint,void* vinputs,int analysis_type,int sub_analysis_type){
 
 
@@ -2253,7 +2250,9 @@
 	double adjx_list[numgrids];
 	double adjy_list[numgrids];
+	double adjxadjy_list[numgrids][2];
 
 	double drag;
-	int    dofs[1]={0};
+	int    dofs1[1]={0};
+	int    dofs2[2]={0,1};
 
 	/* gaussian points: */
@@ -2281,5 +2280,4 @@
 	double alpha_complement;
 
-
 	/*element vector at the gaussian points: */
 	double  grade_g[numgrids];
@@ -2309,14 +2307,22 @@
 
 	/* recover input parameters: */
-	inputs->Recover("drag",&k[0],1,dofs,numgrids,(void**)nodes);
-	inputs->Recover("bed",&b[0],1,dofs,numgrids,(void**)nodes);
-	inputs->Recover("thickness",&h[0],1,dofs,numgrids,(void**)nodes);
+	inputs->Recover("drag",&k[0],1,dofs1,numgrids,(void**)nodes);
+	inputs->Recover("bed",&b[0],1,dofs1,numgrids,(void**)nodes);
+	inputs->Recover("thickness",&h[0],1,dofs1,numgrids,(void**)nodes);
+	if(!inputs->Recover("velocity",&vxvy_list[0][0],2,dofs2,numgrids,(void**)nodes)){
+		throw ErrorException(__FUNCT__,"missing velocity input parameter");
+	}
+
+	for(i=0;i<numgrids;i++){
+		vx_list[i]=vxvy_list[i][0];
+		vy_list[i]=vxvy_list[i][1];
+	}
 
 	/*Initialize parameter lists: */
 	for(i=0;i<numgrids;i++){
-		vx_list[i]=velocity[doflist[i*numberofdofspernode+0]];
-		vy_list[i]=velocity[doflist[i*numberofdofspernode+1]];
-		vxvy_list[i][0]=vx_list[i];
-		vxvy_list[i][1]=vy_list[i];
+		//vx_list[i]=velocity[doflist[i*numberofdofspernode+0]];
+		//vy_list[i]=velocity[doflist[i*numberofdofspernode+1]];
+		//vxvy_list[i][0]=vx_list[i];
+		//vxvy_list[i][1]=vy_list[i];
 		adjx_list[i]=adjoint[doflist[i*numberofdofspernode+0]];
 		adjy_list[i]=adjoint[doflist[i*numberofdofspernode+1]];
@@ -2429,5 +2435,5 @@
 #undef __FUNCT__ 
 #define __FUNCT__ "Tria::GradjB"
-void  Tria::GradjB(Vec grad_g,double* velocity,double* adjoint,void* vinputs,int analysis_type,int sub_analysis_type){
+void  Tria::GradjB(Vec grad_g,double* adjoint,void* vinputs,int analysis_type,int sub_analysis_type){
 
 	int i;
@@ -2449,4 +2455,8 @@
 	double adjx_list[numgrids];
 	double adjy_list[numgrids];
+	double adjxadjy_list[numgrids][2];
+
+	int    dofs1[1]={0};
+	int    dofs2[2]={0,1};
 
 	/* gaussian points: */
@@ -2471,5 +2481,4 @@
 	/* strain rate: */
 	double epsilon[3]; /* epsilon=[exx,eyy,exy];*/
-
 
 	/* parameters: */
@@ -2499,11 +2508,19 @@
 	/* recover input parameters: */
 	inputs->Recover("thickness",&h[0],1,dofs,numgrids,(void**)nodes);
+	if(!inputs->Recover("velocity",&vxvy_list[0][0],2,dofs2,numgrids,(void**)nodes)){
+		throw ErrorException(__FUNCT__,"missing velocity input parameter");
+	}
+
+	for(i=0;i<numgrids;i++){
+		vx_list[i]=vxvy_list[i][0];
+		vy_list[i]=vxvy_list[i][1];
+	}
 
 	/*Initialize parameter lists: */
 	for(i=0;i<numgrids;i++){
-		vx_list[i]=velocity[doflist[i*numberofdofspernode+0]];
-		vy_list[i]=velocity[doflist[i*numberofdofspernode+1]];
-		vxvy_list[i][0]=vx_list[i];
-		vxvy_list[i][1]=vy_list[i];
+		//vx_list[i]=velocity[doflist[i*numberofdofspernode+0]];
+		//vy_list[i]=velocity[doflist[i*numberofdofspernode+1]];
+		//vxvy_list[i][0]=vx_list[i];
+		//vxvy_list[i][1]=vy_list[i];
 		adjx_list[i]=adjoint[doflist[i*numberofdofspernode+0]];
 		adjy_list[i]=adjoint[doflist[i*numberofdofspernode+1]];
@@ -2572,5 +2589,5 @@
 #undef __FUNCT__ 
 #define __FUNCT__ "Tria::Misfit"
-double Tria::Misfit(double* velocity,void* vinputs,int analysis_type,int sub_analysis_type){
+double Tria::Misfit(void* vinputs,int analysis_type,int sub_analysis_type){
 
 	int i;
@@ -2634,16 +2651,16 @@
 		throw ErrorException(__FUNCT__,"missing velocity_obs input parameter");
 	}
-
+	if(!inputs->Recover("velocity",&vxvy_list[0][0],2,dofs2,numgrids,(void**)nodes)){
+		throw ErrorException(__FUNCT__,"missing velocity input parameter");
+	}
+
+	/*Initialize velocities: */
 	for(i=0;i<numgrids;i++){
 		obs_vx_list[i]=obs_vxvy_list[i][0];
 		obs_vy_list[i]=obs_vxvy_list[i][1];
-	}
-
-	/*Initialize velocities: */
-	for(i=0;i<numgrids;i++){
-		vx_list[i]=velocity[doflist[i*numberofdofspernode+0]];
-		vy_list[i]=velocity[doflist[i*numberofdofspernode+1]];
-	}
-	
+		vx_list[i]=vxvy_list[i][0];
+		vy_list[i]=vxvy_list[i][1];
+	}
+
 	/*Compute Misfit at the 3 nodes (integration of the linearized function)*/
 	if(fit==0){
Index: /issm/trunk/src/c/objects/Tria.h
===================================================================
--- /issm/trunk/src/c/objects/Tria.h	(revision 1184)
+++ /issm/trunk/src/c/objects/Tria.h	(revision 1185)
@@ -93,9 +93,9 @@
 		void  GetJacobianInvert(double*  Jinv, double* xyz_list,double* gauss_l1l2l3);
 		void  GetJacobian(double* J, double* xyz_list,double* gauss_l1l2l3);
-		void  Du(Vec du_g,double* u_g,void* inputs,int analysis_type,int sub_analysis_type);
-		void  Gradj(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type,char* control_type);
-		void  GradjDrag(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type);
-		void  GradjB(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type);
-		double Misfit(double* u_g,void* inputs,int analysis_type,int sub_analysis_type);
+		void  Du(Vec du_g,void* inputs,int analysis_type,int sub_analysis_type);
+		void  Gradj(Vec grad_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type,char* control_type);
+		void  GradjDrag(Vec grad_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type);
+		void  GradjB(Vec grad_g,double* lambda_g,void* inputs,int analysis_type,int sub_analysis_type);
+		double Misfit(void* inputs,int analysis_type,int sub_analysis_type);
 
 		void  CreatePVectorDiagnosticHoriz(Vec pg,void* inputs,int analysis_type,int sub_analysis_type);
Index: /issm/trunk/src/c/parallel/GradJCompute.cpp
===================================================================
--- /issm/trunk/src/c/parallel/GradJCompute.cpp	(revision 1184)
+++ /issm/trunk/src/c/parallel/GradJCompute.cpp	(revision 1185)
@@ -52,7 +52,8 @@
 	diagnostic_core_nonlinear(&u_g,&K_ff0,&K_fs0,femmodel,inputs,analysis_type,sub_analysis_type);
 	VecToMPISerial(&u_g_double,u_g); VecFree(&u_g);
+	inputs->Add("velocity",u_g_double,2,numberofnodes);
 
 	_printf_("%s\n","      buid Du, difference between observed velocity and model velocity:");
-	Dux( &du_g, femmodel->elements,femmodel->nodes,femmodel->loads,femmodel->materials,u_g_double,inputs,analysis_type,sub_analysis_type);
+	Dux( &du_g, femmodel->elements,femmodel->nodes,femmodel->loads,femmodel->materials,inputs,analysis_type,sub_analysis_type);
 
 	_printf_("%s\n","      reduce adjoint load from g-set to f-set:");
@@ -72,5 +73,5 @@
 
 	Gradjx( &grad_g, numberofnodes,femmodel->elements,femmodel->nodes, femmodel->loads, femmodel->materials, 
-		u_g_double,lambda_g_double, inputs,analysis_type,sub_analysis_type,control_type);
+				lambda_g_double, inputs,analysis_type,sub_analysis_type,control_type);
 	
 	/*Free ressources:*/
Index: /issm/trunk/src/c/parallel/objectivefunctionC.cpp
===================================================================
--- /issm/trunk/src/c/parallel/objectivefunctionC.cpp	(revision 1184)
+++ /issm/trunk/src/c/parallel/objectivefunctionC.cpp	(revision 1185)
@@ -77,9 +77,10 @@
 	diagnostic_core_nonlinear(&u_g,NULL,NULL,femmodel,inputs,analysis_type,sub_analysis_type);
 	VecToMPISerial(&u_g_double,u_g); VecFree(&u_g);
+	inputs->Add("velocity",u_g_double,2,numberofnodes);
 
 	//Compute misfit for this velocity field. 
 	inputs->Add("fit",fit[n]);
 	Misfitx( &J, femmodel->elements,femmodel->nodes, femmodel->loads, femmodel->materials, 
-		u_g_double,inputs,analysis_type,sub_analysis_type);
+				inputs,analysis_type,sub_analysis_type);
 
 	/*Free ressources:*/
Index: /issm/trunk/src/m/solutions/cielo/GradJCompute.m
===================================================================
--- /issm/trunk/src/m/solutions/cielo/GradJCompute.m	(revision 1184)
+++ /issm/trunk/src/m/solutions/cielo/GradJCompute.m	(revision 1185)
@@ -4,8 +4,9 @@
 displaystring(m.parameters.debug,'%s','         computing velocities...');
 [u_g K_ff0 K_fs0 ]=diagnostic_core_nonlinear(m,inputs,analysis_type,sub_analysis_type);
+inputs=add(inputs,'velocity',u_g,'doublevec',2,m.parameters.numberofnodes);
 
 %Buid Du, difference between observed velocity and model velocity.
 displaystring(m.parameters.debug,'%s','          computing Du...');
-[Du_g]=Du(m.elements,m.nodes,m.loads,m.materials,m.parameters, u_g,inputs,analysis_type,sub_analysis_type);
+[Du_g]=Du(m.elements,m.nodes,m.loads,m.materials,m.parameters,inputs,analysis_type,sub_analysis_type);
 
 %Reduce adjoint load from g-set to f-set
@@ -18,5 +19,6 @@
 %Merge back to g set
 lambda_g= Mergesolutionfromftog( lambda_f, m.Gmn, m.ys0, m.nodesets ); 
+inputs=add(inputs,'adjoint',lambda_g,'doublevec',2,m.parameters.numberofnodes);
 
 %Compute gradJ 
-grad_g=Gradj(m.elements,m.nodes,m.loads,m.materials,m.parameters, u_g, lambda_g,inputs,analysis_type,sub_analysis_type);
+grad_g=Gradj(m.elements,m.nodes,m.loads,m.materials,m.parameters,lambda_g,inputs,analysis_type,sub_analysis_type);
Index: /issm/trunk/src/m/solutions/cielo/objectivefunctionC.m
===================================================================
--- /issm/trunk/src/m/solutions/cielo/objectivefunctionC.m	(revision 1184)
+++ /issm/trunk/src/m/solutions/cielo/objectivefunctionC.m	(revision 1185)
@@ -14,5 +14,6 @@
 %Run diagnostic with updated parameters.
 u_g=diagnostic_core_nonlinear(m,inputs,analysis_type,sub_analysis_type);
+inputs=add(inputs,'velocity',u_g,'doublevec',2,m.parameters.numberofnodes);
 
 %Compute misfit for this velocity field. 
-J=Misfit(m.elements,m.nodes,m.loads,m.materials,m.parameters, u_g,inputs,analysis_type,sub_analysis_type);
+J=Misfit(m.elements,m.nodes,m.loads,m.materials,m.parameters,inputs,analysis_type,sub_analysis_type);
Index: /issm/trunk/src/mex/Du/Du.cpp
===================================================================
--- /issm/trunk/src/mex/Du/Du.cpp	(revision 1184)
+++ /issm/trunk/src/mex/Du/Du.cpp	(revision 1185)
@@ -15,5 +15,4 @@
 	DataSet* loads=NULL;
 	DataSet* materials=NULL;
-	double*  u_g=NULL;
 	ParameterInputs* inputs=NULL;
 	char*             analysis_type_string=NULL;
@@ -37,5 +36,4 @@
 	FetchData((void**)&loads,NULL,NULL,LOADS,"DataSet",NULL);
 	FetchData((void**)&materials,NULL,NULL,MATERIALS,"DataSet",NULL);
-	FetchData((void**)&u_g,NULL,NULL,UG,"Vector","Vec");
 	FetchData((void**)&analysis_type_string,NULL,NULL,ANALYSIS,"String",NULL);
 	analysis_type=AnalysisTypeAsEnum(analysis_type_string);
@@ -48,5 +46,5 @@
 
 	/*!Call core code: */
-	Dux(&du_g, elements,nodes,loads,materials,u_g,inputs,analysis_type,sub_analysis_type);
+	Dux(&du_g, elements,nodes,loads,materials,inputs,analysis_type,sub_analysis_type);
 
 	/*write output : */
@@ -58,5 +56,4 @@
 	delete loads;
 	delete materials;
-	xfree((void**)&u_g);
 	VecFree(&du_g);
 	delete inputs;
@@ -71,5 +68,5 @@
 {
 	_printf_("\n");
-	_printf_("   usage: [du_g] = %s(lements, nodes,loads, materials, parameters, u_g,inputs);\n",__FUNCT__);
+	_printf_("   usage: [du_g] = %s(lements, nodes,loads, materials, parameters,inputs);\n",__FUNCT__);
 	_printf_("\n");
 }
Index: /issm/trunk/src/mex/Du/Du.h
===================================================================
--- /issm/trunk/src/mex/Du/Du.h	(revision 1184)
+++ /issm/trunk/src/mex/Du/Du.h	(revision 1185)
@@ -22,8 +22,7 @@
 #define MATERIALS (mxArray*)prhs[3]
 #define PARAMETERS (mxArray*)prhs[4]
-#define UG (mxArray*)prhs[5]
-#define INPUTS (mxArray*)prhs[6]
-#define ANALYSIS (mxArray*)prhs[7]
-#define SUBANALYSIS (mxArray*)prhs[8]
+#define INPUTS (mxArray*)prhs[5]
+#define ANALYSIS (mxArray*)prhs[6]
+#define SUBANALYSIS (mxArray*)prhs[7]
 
 /* serial output macros: */
@@ -34,5 +33,5 @@
 #define NLHS  1
 #undef NRHS
-#define NRHS  9
+#define NRHS  8
 
 
Index: /issm/trunk/src/mex/Gradj/Gradj.cpp
===================================================================
--- /issm/trunk/src/mex/Gradj/Gradj.cpp	(revision 1184)
+++ /issm/trunk/src/mex/Gradj/Gradj.cpp	(revision 1185)
@@ -16,5 +16,4 @@
 	DataSet* materials=NULL;
 	char*    control_type=NULL;
-	double*  u_g=NULL;
 	double*  lambda_g=NULL;
 	ParameterInputs* inputs=NULL;
@@ -42,5 +41,4 @@
 	FetchData((void**)&numberofnodes,NULL,NULL,mxGetField(PARAMETERS,0,"numberofnodes"),"Integer",NULL);
 	FetchData((void**)&control_type,NULL,NULL,mxGetField(PARAMETERS,0,"control_type"),"String",NULL);
-	FetchData((void**)&u_g,NULL,NULL,UG,"Vector","Vec");
 	FetchData((void**)&lambda_g,NULL,NULL,LAMBDAG,"Vector","Vec");
 	FetchData((void**)&analysis_type_string,NULL,NULL,ANALYSIS,"String",NULL);
@@ -54,5 +52,5 @@
 
 	/*!Call core code: */
-	Gradjx(&grad_g,numberofnodes,elements,nodes,loads,materials,u_g,lambda_g,inputs,analysis_type,sub_analysis_type,control_type);
+	Gradjx(&grad_g,numberofnodes,elements,nodes,loads,materials,lambda_g,inputs,analysis_type,sub_analysis_type,control_type);
 
 	/*write output : */
@@ -64,5 +62,4 @@
 	delete loads;
 	delete materials;
-	xfree((void**)&u_g);
 	xfree((void**)&lambda_g);
 	xfree((void**)&control_type);
@@ -79,5 +76,5 @@
 {
 	_printf_("\n");
-	_printf_("   usage: [grad_g] = %s(elements, nodes,loads, materials, parameters, u_g, lambda_g,inputs);\n",__FUNCT__);
+	_printf_("   usage: [grad_g] = %s(elements, nodes,loads, materials, parameters, lambda_g,inputs);\n",__FUNCT__);
 	_printf_("\n");
 }
Index: /issm/trunk/src/mex/Gradj/Gradj.h
===================================================================
--- /issm/trunk/src/mex/Gradj/Gradj.h	(revision 1184)
+++ /issm/trunk/src/mex/Gradj/Gradj.h	(revision 1185)
@@ -22,9 +22,8 @@
 #define MATERIALS (mxArray*)prhs[3]
 #define PARAMETERS (mxArray*)prhs[4]
-#define UG (mxArray*)prhs[5]
-#define LAMBDAG (mxArray*)prhs[6]
-#define INPUTS (mxArray*)prhs[7]
-#define ANALYSIS (mxArray*)prhs[8]
-#define SUBANALYSIS (mxArray*)prhs[9]
+#define LAMBDAG (mxArray*)prhs[5]
+#define INPUTS (mxArray*)prhs[6]
+#define ANALYSIS (mxArray*)prhs[7]
+#define SUBANALYSIS (mxArray*)prhs[8]
 
 /* serial output macros: */
@@ -35,5 +34,5 @@
 #define NLHS  1
 #undef NRHS
-#define NRHS  10
+#define NRHS  9
 
 
Index: /issm/trunk/src/mex/Misfit/Misfit.cpp
===================================================================
--- /issm/trunk/src/mex/Misfit/Misfit.cpp	(revision 1184)
+++ /issm/trunk/src/mex/Misfit/Misfit.cpp	(revision 1185)
@@ -15,5 +15,4 @@
 	DataSet* loads=NULL;
 	DataSet* materials=NULL;
-	double*  u_g=NULL;
 	ParameterInputs* inputs=NULL;
 	char*             analysis_type_string=NULL;
@@ -36,5 +35,4 @@
 	FetchData((void**)&loads,NULL,NULL,LOADS,"DataSet",NULL);
 	FetchData((void**)&materials,NULL,NULL,MATERIALS,"DataSet",NULL);
-	FetchData((void**)&u_g,NULL,NULL,UG,"Vector","Vec");
 	FetchData((void**)&analysis_type_string,NULL,NULL,ANALYSIS,"String",NULL);
 	analysis_type=AnalysisTypeAsEnum(analysis_type_string);
@@ -47,5 +45,5 @@
 
 	/*!Call core code: */
-	Misfitx(&J, elements,nodes,loads,materials,u_g,inputs,analysis_type,sub_analysis_type);
+	Misfitx(&J, elements,nodes,loads,materials,inputs,analysis_type,sub_analysis_type);
 
 	/*write output : */
@@ -57,5 +55,4 @@
 	delete loads;
 	delete materials;
-	xfree((void**)&u_g);
 	delete inputs;
 	xfree((void**)&analysis_type_string);
@@ -69,5 +66,5 @@
 {
 	_printf_("\n");
-	_printf_("   usage: [J] = %s(elements, nodes,loads, materials, parameters, u_g,inputs);\n",__FUNCT__);
+	_printf_("   usage: [J] = %s(elements, nodes,loads, materials, parameters, inputs);\n",__FUNCT__);
 	_printf_("\n");
 }
Index: /issm/trunk/src/mex/Misfit/Misfit.h
===================================================================
--- /issm/trunk/src/mex/Misfit/Misfit.h	(revision 1184)
+++ /issm/trunk/src/mex/Misfit/Misfit.h	(revision 1185)
@@ -22,8 +22,7 @@
 #define MATERIALS (mxArray*)prhs[3]
 #define PARAMETERS (mxArray*)prhs[4]
-#define UG (mxArray*)prhs[5]
-#define INPUTS (mxArray*)prhs[6]
-#define ANALYSIS (mxArray*)prhs[7]
-#define SUBANALYSIS (mxArray*)prhs[8]
+#define INPUTS (mxArray*)prhs[5]
+#define ANALYSIS (mxArray*)prhs[6]
+#define SUBANALYSIS (mxArray*)prhs[7]
 
 /* serial output macros: */
@@ -34,5 +33,5 @@
 #define NLHS  1
 #undef NRHS
-#define NRHS  9
+#define NRHS  8
 
 
