Index: /issm/trunk/src/c/modules/ModelProcessorx/Control/UpdateElementsControl.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Control/UpdateElementsControl.cpp	(revision 4381)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Control/UpdateElementsControl.cpp	(revision 4382)
@@ -29,5 +29,5 @@
 	IoModelFetchData(&iomodel->vy_obs,NULL,NULL,iomodel_handle,"vy_obs");
 	IoModelFetchData(&iomodel->weights,NULL,NULL,iomodel_handle,"weights");
-	IoModelFetchData(&control_parameter,NULL,NULL,iomodel_handle,iomodel->control_type);
+	IoModelFetchData(&iomodel->control_parameter,NULL,NULL,iomodel_handle,iomodel->control_type); //copy the control parameter in iomodel
 
 	/*Update elements: */
@@ -47,4 +47,4 @@
 	xfree((void**)&iomodel->vy_obs);
 	xfree((void**)&iomodel->weights);
-	xfree((void**)&control_parameter);
+	xfree((void**)&iomodel->control_parameter);
 }
Index: /issm/trunk/src/c/objects/Elements/Penta.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 4381)
+++ /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 4382)
@@ -1582,5 +1582,5 @@
 }
 /*}}}*/
-/*FUNCTION Penta::Update(IoModel* iomodel,int analysis_counter,int analysis_type) {{{1*/
+/*FUNCTION Penta::Update {{{1*/
 void Penta::Update(int index,IoModel* iomodel,int analysis_counter,int analysis_type){ 
 
@@ -1632,4 +1632,12 @@
 		this->inputs->AddInput(new IntInput(DragTypeEnum,iomodel->drag_type));
 
+	}
+	if (iomodel->rheology_B) {
+		for(i=0;i<6;i++)nodeinputs[i]=iomodel->rheology_B[penta_vertex_ids[i]-1];
+		this->inputs->AddInput(new PentaVertexInput(RheologyBEnum,nodeinputs));
+	}
+	if (iomodel->control_parameter) {
+		for(i=0;i<6;i++)nodeinputs[i]=iomodel->control_parameter[penta_vertex_ids[i]-1];
+		this->inputs->AddInput(new PentaVertexInput(ControlParameterEnum,nodeinputs));
 	}
 	if (iomodel->melting_rate) {
Index: /issm/trunk/src/c/objects/Elements/Tria.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 4381)
+++ /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 4382)
@@ -992,6 +992,8 @@
 	if (analysis_type==DiagnosticHorizAnalysisEnum)
 		GetSolutionFromInputsDiagnosticHoriz(solution);
+	else if (analysis_type==AdjointAnalysisEnum)
+	 GetSolutionFromInputsAdjoint(solution);
 	else
-	 ISSMERROR("%s%i%s\n","analysis: ",analysis_type," not supported yet");
+	 ISSMERROR("analysis: %s not supported yet",EnumAsString(analysis_type));
 
 }
@@ -2237,4 +2239,8 @@
 		this->inputs->AddInput(new TriaVertexInput(RheologyBEnum,nodeinputs));
 	}
+	if (iomodel->control_parameter) {
+		for(i=0;i<3;i++)nodeinputs[i]=iomodel->control_parameter[tria_vertex_ids[i]-1];
+		this->inputs->AddInput(new TriaVertexInput(ControlParameterEnum,nodeinputs));
+	}
 	if (iomodel->melting_rate) {
 		for(i=0;i<3;i++)nodeinputs[i]=iomodel->melting_rate[tria_vertex_ids[i]-1]/iomodel->yts;
@@ -5174,4 +5180,40 @@
 }
 /*}}}*/
+/*FUNCTION Tria::GetSolutionFromInputsAdjoint(Vec solution){{{1*/
+void  Tria::GetSolutionFromInputsAdjoint(Vec solution){
+
+	int i;
+
+	const int    numvertices=3;
+	const int    numdofpervertex=2;
+	const int    numdof=numdofpervertex*numvertices;
+	double       gauss[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
+
+	int          doflist[numdof];
+	double       values[numdof];
+	double       lambdax;
+	double       lambday;
+
+	int          dummy;
+
+	/*Get dof list: */
+	GetDofList(&doflist[0],&dummy);
+
+	/*Ok, we have lambdax and lambday in values, fill in lambdax and lambday arrays: */
+	/*P1 element only for now*/
+	for(i=0;i<numvertices;i++){
+
+		/*Recover lambdax and lambday*/
+		inputs->GetParameterValue(&lambdax,&gauss[i][0],VxEnum);
+		inputs->GetParameterValue(&lambday,&gauss[i][0],VyEnum);
+		values[i*numdofpervertex+0]=lambdax;
+		values[i*numdofpervertex+1]=lambday;
+	}
+
+	/*Add value to global vector*/
+	VecSetValues(solution,numdof,doflist,(const double*)values,INSERT_VALUES);
+
+}
+/*}}}*/
 /*FUNCTION Tria::GradjDragStokes {{{1*/
 void  Tria::GradjDragStokes(Vec gradient){
Index: /issm/trunk/src/c/objects/Elements/Tria.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.h	(revision 4381)
+++ /issm/trunk/src/c/objects/Elements/Tria.h	(revision 4382)
@@ -151,4 +151,5 @@
 		void	  GetParameterValue(double* pp, double* plist, double* gauss_l1l2l3);
 		void	  GetSolutionFromInputsDiagnosticHoriz(Vec solution);
+		void	  GetSolutionFromInputsAdjoint(Vec solution);
 		void	  GradjDragStokes(Vec gradient);
 		void	  InputUpdateFromSolutionAdjoint( double* solution);
Index: /issm/trunk/src/c/objects/IoModel.cpp
===================================================================
--- /issm/trunk/src/c/objects/IoModel.cpp	(revision 4381)
+++ /issm/trunk/src/c/objects/IoModel.cpp	(revision 4382)
@@ -104,4 +104,5 @@
 	
 	xfree((void**)&this->control_type);
+	xfree((void**)&this->control_parameter);
 	
 	/*exterior data: */
@@ -230,4 +231,5 @@
 	this->qmu_analysis=0;
 	this->control_analysis=0;
+	this->control_parameter=NULL;
 	this->solverstring=NULL;
 	this->numberofresponses=0;
Index: /issm/trunk/src/c/objects/IoModel.h
===================================================================
--- /issm/trunk/src/c/objects/IoModel.h	(revision 4381)
+++ /issm/trunk/src/c/objects/IoModel.h	(revision 4382)
@@ -124,4 +124,5 @@
 		/*control methods: */
 		char*	control_type;
+		double*	control_parameter;
 
 		/*solution parameters: */
