Index: ../trunk-jpl/src/c/modules/AutodiffDriversx/AutodiffDriversx.cpp
===================================================================
--- ../trunk-jpl/src/c/modules/AutodiffDriversx/AutodiffDriversx.cpp	(revision 13506)
+++ ../trunk-jpl/src/c/modules/AutodiffDriversx/AutodiffDriversx.cpp	(revision 13507)
@@ -55,6 +55,10 @@
 			/*Branch according to AD driver: */
 			parameters->FindParam(&driver,AutodiffDriverEnum);
 
+			/* these are always needed regardless of the interpreter */
+                        anEDF_for_solverx_p->dp_x=xNew<double>(anEDF_for_solverx_p->max_n);
+                        anEDF_for_solverx_p->dp_y=xNew<double>(anEDF_for_solverx_p->max_m);
+
 			if (strcmp(driver,"fos_forward")==0){
 				
 				int     anIndepIndex;
@@ -65,43 +69,33 @@
 				/*retrieve direction index: */
 				parameters->FindParam(&anIndepIndex,AutodiffFosForwardIndexEnum);
 				
+				if (anIndepIndex<0 || anIndepIndex>=num_independents) _error_("index value for AutodiffFosForwardIndexEnum should be in [0,num_independents-1]");
+
 				tangentDir=xNewZeroInit<double>(num_independents);
 				tangentDir[anIndepIndex]=1.0;
 			
 				jacTimesTangentDir=xNew<double>(num_dependents);
 				theOutput=xNew<double>(num_dependents);
 				
-				/*set the forward method function pointers: */
-				anEDF_for_solverx_p->zos_forward=EDF_for_solverx;
+				/*set the forward method function pointer: */
 				anEDF_for_solverx_p->fos_forward=EDF_fos_forward_for_solverx;
-				anEDF_for_solverx_p->fos_reverse=EDF_fos_reverse_for_solverx;
 
-				/*allocate the space for the parameters to invoke the forward methods:*/
-				anEDF_for_solverx_p->dp_x=xNew<double>(anEDF_for_solverx_p->max_n);
+                                /*allocate the space for the parameters to invoke the EDF fos_forward:*/
 				anEDF_for_solverx_p->dp_X=xNew<double>(anEDF_for_solverx_p->max_n);
-				anEDF_for_solverx_p->dpp_X=xNew<double>(anEDF_for_solverx_p->max_n, 1);
-				anEDF_for_solverx_p->dp_y=xNew<double>(anEDF_for_solverx_p->max_m);
 				anEDF_for_solverx_p->dp_Y=xNew<double>(anEDF_for_solverx_p->max_m);
-				anEDF_for_solverx_p->dpp_Y=xNew<double>(anEDF_for_solverx_p->max_m, 1);
 
-				/*allocate the space for the parameters to invoke the reverse methods:*/
-				anEDF_for_solverx_p->dp_U=xNew<double>(anEDF_for_solverx_p->max_m);
-				anEDF_for_solverx_p->dpp_U=xNew<double>(num_dependents,anEDF_for_solverx_p->max_m);
-				anEDF_for_solverx_p->dp_Z=xNew<double>(anEDF_for_solverx_p->max_n);
-				anEDF_for_solverx_p->dpp_Z=xNew<double>(num_dependents,anEDF_for_solverx_p->max_n);
-
 				/*call driver: */
 				fos_forward(1,num_dependents,num_independents, 0, xp, tangentDir, theOutput, jacTimesTangentDir );
 
 				/*add to results*/
 				results->AddObject(new GenericExternalResult<IssmPDouble*>(results->Size()+1,AutodiffJacobianEnum,jacTimesTangentDir,num_dependents,1,1,0.0));
 				
-				/*free ressources :*/
+				/*free resources :*/
 				xDelete(theOutput);
 				xDelete(jacTimesTangentDir);
 				xDelete(tangentDir);
 			}
-			else if ((strcmp(driver,"fov_forward")==0) || (strcmp(driver,"jacobian")==0)){
+			else if ((strcmp(driver,"fov_forward")==0) || (strcmp(driver,"fov_forward_all")==0)){
 				
 				int* indepIndices=NULL;
 				int tangentDirNum;
@@ -113,7 +107,7 @@
 
 					
 				/*retrieve directions:*/
-				if (strcmp(driver,"jacobian")==0){
+				if (strcmp(driver,"fov_forward_all")==0){
 					tangentDirNum=num_independents;
 					indepIndices=xNewZeroInit<int>(tangentDirNum);
 					for(i=0;i<num_independents;i++)indepIndices[i]=1;
@@ -129,24 +123,13 @@
 				jacTimesSeed=xNew<double>(num_dependents,tangentDirNum);
 				
 				/*set the forward method function pointers: */
-				anEDF_for_solverx_p->zos_forward=EDF_for_solverx;
 				anEDF_for_solverx_p->fov_forward=EDF_fov_forward_for_solverx;
 				// anEDF_for_solverx_p->fov_reverse=EDF_fov_reverse_for_solverx;
 
-				/*allocate the space for the parameters to invoke the forward methods:*/
-				anEDF_for_solverx_p->dp_x=xNew<double>(anEDF_for_solverx_p->max_n);
-				anEDF_for_solverx_p->dp_X=xNew<double>(anEDF_for_solverx_p->max_n);
+				/*allocate the space for the parameters to invoke EDF fov_forward:*/
 				anEDF_for_solverx_p->dpp_X=xNew<double>(anEDF_for_solverx_p->max_n, tangentDirNum);
-				anEDF_for_solverx_p->dp_y=xNew<double>(anEDF_for_solverx_p->max_m);
-				anEDF_for_solverx_p->dp_Y=xNew<double>(anEDF_for_solverx_p->max_m);
 				anEDF_for_solverx_p->dpp_Y=xNew<double>(anEDF_for_solverx_p->max_m, tangentDirNum);
 
-				/*allocate the space for the parameters to invoke the reverse methods:*/
-				anEDF_for_solverx_p->dp_U=xNew<double>(anEDF_for_solverx_p->max_m);
-				anEDF_for_solverx_p->dpp_U=xNew<double>(num_dependents,anEDF_for_solverx_p->max_m);
-				anEDF_for_solverx_p->dp_Z=xNew<double>(anEDF_for_solverx_p->max_n);
-				anEDF_for_solverx_p->dpp_Z=xNew<double>(num_dependents,anEDF_for_solverx_p->max_n);
-
 				/*seed matrix: */
 				seed=xNewZeroInit<double>(num_independents,tangentDirNum);
 
@@ -169,14 +152,8 @@
 				theOutput=xNew<double>(num_dependents);
 
 				/*call driver: */
-				if (strcmp(driver,"fov_forward")==0){
-					fov_forward(1,num_dependents,num_independents, tangentDirNum, xp, seed, theOutput, jacTimesSeed );
-				}
-				else{
-					jacobian(1,num_dependents,num_independents,xp,jacTimesSeed);
-				}
-
-				/*Free ressources: */
+				fov_forward(1,num_dependents,num_independents, tangentDirNum, xp, seed, theOutput, jacTimesSeed );
+				/*Free resources: */
 				xDelete(theOutput);
 				xDelete(indepIndices);
 				xDelete(seed);
@@ -184,10 +161,49 @@
 				/*add to results: */
 				results->AddObject(new GenericExternalResult<IssmPDouble*>(results->Size()+1,AutodiffJacobianEnum,*jacTimesSeed,num_dependents*tangentDirNum,1,1,0.0));
 
-				/*Free ressources: */
+				/*Free resources: */
 				xDelete(jacTimesSeed);
-				xDelete<int>(indepIndices);
+				xDelete(indepIndices);
 			}
+			else if (strcmp(driver,"fos_reverse")==0) {
+
+				int     aDepIndex=0;
+				double *aWeightVector=NULL;
+				double *weightVectorTimesJac=NULL;
+
+				/*retrieve direction index: */
+				parameters->FindParam(&aDepIndex,AutodiffFosReverseIndexEnum);
+
+				if (aDepIndex<0 || aDepIndex>=num_dependents) _error_("index value for AutodiffFosReverseIndexEnum should be in [0,num_dependents-1]");
+
+				aWeightVector=xNewZeroInit<double>(num_dependents);
+				aWeightVector[aDepIndex]=1.0;
+
+				weightVectorTimesJac=xNew<double>(num_independents);
+
+				/*set the forward method function pointer: */
+				anEDF_for_solverx_p->fos_reverse=EDF_fos_reverse_for_solverx;
+
+				/*allocate the space for the parameters to invoke the EDF fos_reverse :*/
+				anEDF_for_solverx_p->dp_U=xNew<double>(anEDF_for_solverx_p->max_m);
+				anEDF_for_solverx_p->dp_Z=xNew<double>(anEDF_for_solverx_p->max_n);
+
+				/*call driver: */
+				fos_reverse(1,num_dependents,num_independents, aWeightVector, weightVectorTimesJac );
+
+				/*add to results*/
+				results->AddObject(new GenericExternalResult<IssmPDouble*>(results->Size()+1,AutodiffJacobianEnum,weightVectorTimesJac,num_independents,1,1,0.0));
+
+				/*free resources :*/
+				xDelete(weightVectorTimesJac);
+				xDelete(aWeightVector);
+			}
+			else if (strcmp(driver,"fov_reverse")==0) {
+				/*allocate the space for the parameters to invoke the EDF fos_reverse :*/
+				anEDF_for_solverx_p->dpp_U=xNew<double>(num_dependents,anEDF_for_solverx_p->max_m);
+				anEDF_for_solverx_p->dpp_Z=xNew<double>(num_dependents,anEDF_for_solverx_p->max_n);
+				_error_("driver: " << driver << " not yet supported!");
+			}
 			else _error_("driver: " << driver << " not yet supported!");
 
 			/* delete the allocated space for the parameters:*/
@@ -202,7 +218,7 @@
 			xDelete(anEDF_for_solverx_p->dp_Z);
 			xDelete(anEDF_for_solverx_p->dpp_Z);
 
-			/*Free ressources: */
+			/*Free resources: */
 			xDelete(xp);
 			xDelete(axp); 
 			
