Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 18008)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 18009)
@@ -418,4 +418,5 @@
 					./cores/controltao_core.cpp\
 					./cores/controlm1qn3_core.cpp\
+					./cores/controlvalidation_core.cpp\
 					./cores/gradient_core.cpp\
 					./cores/adjointstressbalance_core.cpp\
Index: /issm/trunk-jpl/src/c/cores/WrapperCorePointerFromSolutionEnum.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/WrapperCorePointerFromSolutionEnum.cpp	(revision 18008)
+++ /issm/trunk-jpl/src/c/cores/WrapperCorePointerFromSolutionEnum.cpp	(revision 18009)
@@ -46,4 +46,5 @@
 			case 1: solutioncore=controltao_core; break;
 			case 2: solutioncore=controlm1qn3_core; break;
+			case 3: solutioncore=controlvalidation_core; break;
 			default: _error_("control type not supported");
 		}
Index: /issm/trunk-jpl/src/c/cores/controlvalidation_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/controlvalidation_core.cpp	(revision 18009)
+++ /issm/trunk-jpl/src/c/cores/controlvalidation_core.cpp	(revision 18009)
@@ -0,0 +1,77 @@
+/*!\file: controlvalidation_core.cpp
+ * \brief: core of the control solution 
+ */ 
+
+#include "./cores.h"
+#include "../toolkits/toolkits.h"
+#include "../classes/classes.h"
+#include "../shared/shared.h"
+#include "../modules/modules.h"
+
+void controlvalidation_core(FemModel* femmodel){
+
+	int         solution_type,n;
+	IssmDouble  j0,j;
+	IssmDouble  Ialpha,alpha;
+	IssmDouble *G = NULL;
+	IssmDouble *X = NULL;
+	IssmDouble *X0= NULL;
+
+	/*Solution and Adjoint core pointer*/
+	void (*solutioncore)(FemModel*) = NULL;
+	void (*adjointcore)(FemModel*)  = NULL;
+
+	/*Recover parameters used throughout the solution*/
+	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
+	femmodel->parameters->SetParam(false,SaveResultsEnum);
+
+	/*Get initial guess*/
+	Vector<IssmDouble> *Xpetsc = NULL;
+	GetVectorFromControlInputsx(&Xpetsc,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value");
+	Xpetsc->GetSize(&n);
+	X0 = Xpetsc->ToMPISerial();
+	delete Xpetsc;
+
+	/*Allocate Gradient and current vector*/
+	G = xNew<double>(n);
+	X = xNew<double>(n);
+
+	/*out of solution_type, figure out solution core and adjoint function pointer*/
+	CorePointerFromSolutionEnum(&solutioncore,femmodel->parameters,solution_type);
+	AdjointCorePointerFromSolutionEnum(&adjointcore,solution_type);
+
+	if(VerboseControl()) _printf0_("   Compute Initial solution\n");
+	solutioncore(femmodel);
+	if(VerboseControl()) _printf0_("   Compute Adjoint\n");
+	adjointcore(femmodel);
+	if(VerboseControl()) _printf0_("   Compute Initial cost function\n");
+	femmodel->CostFunctionx(&j0,NULL,NULL);
+	if(VerboseControl()) _printf0_("   Compute Gradient\n");
+	Gradjx(&G,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
+	for(int i=0;i<n;i++) G[i] = -G[i];
+
+	_printf0_("j0 = "<<j0<<"\n");
+	for(IssmDouble exponent = 4.; exponent > -4. ; exponent-=0.2){
+	//for(IssmDouble exponent = -1.; exponent > -9. ; exponent-=0.2){
+
+		alpha = pow(10.,exponent);
+
+		/*Create new vector*/
+		for(int i=0;i<n;i++) X[i] = X0[i] + alpha;
+
+		/*Calculate j(k+alpha delta k) */
+		SetControlInputsFromVectorx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X);
+		solutioncore(femmodel);
+		femmodel->CostFunctionx(&j,NULL,NULL);
+
+		IssmDouble Den = 0.;
+		for(int i=0;i<n;i++) Den += alpha * G[i] * 1.;
+		Ialpha = fabs((j - j0)/Den - 1.);
+
+		//_printf0_("alpha = "<<alpha<<" Ialpha = "<<Ialpha<<"\n");
+		_printf0_(alpha<<" "<<Ialpha<<"\n");
+	}
+
+	/*Clean up and return*/
+	xDelete<IssmDouble>(G);
+}
Index: /issm/trunk-jpl/src/c/cores/cores.h
===================================================================
--- /issm/trunk-jpl/src/c/cores/cores.h	(revision 18008)
+++ /issm/trunk-jpl/src/c/cores/cores.h	(revision 18009)
@@ -30,4 +30,5 @@
 void controltao_core(FemModel* femmodel);
 void controlm1qn3_core(FemModel* femmodel);
+void controlvalidation_core(FemModel* femmodel);
 void masstransport_core(FemModel* femmodel);
 void depthaverage_core(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 18008)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 18009)
@@ -74,4 +74,6 @@
 				parameters->AddObject(iomodel->CopyConstantObject(InversionMaxiterEnum));
 				break;
+			case 3:/*Validation*/
+				break;
 			default:
 				_error_("not supported");
