Index: /issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp	(revision 27731)
+++ /issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp	(revision 27732)
@@ -208,6 +208,6 @@
 	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
 
-	/*In transient, we need to make sure we do not modify femmodel at each iteration, make a copy*/
-	if(solution_type == TransientSolutionEnum) femmodel = input_struct->femmodel->copy();
+	/*we need to make sure we do not modify femmodel at each iteration, make a copy*/
+	femmodel = input_struct->femmodel->copy();
 
 	IssmPDouble*  Jlist  = input_struct->Jlist;
@@ -313,5 +313,4 @@
 
 		/*Get Dependents*/
-		IssmDouble   output_value;
 		int          num_dependents;
 		IssmPDouble *dependents;
@@ -333,25 +332,22 @@
 			dep->RecordResponsex(femmodel);
 			IssmDouble output_value = dep->GetValue();
-
-			#if defined(_HAVE_CODIPACK_)
-			tape_codi.registerOutput(output_value);
 			dependents[i] = output_value.getValue();
-			#if _CODIPACK_MAJOR_==2
-			codi_global.output_indices.push_back(output_value.getIdentifier());
-			#elif _CODIPACK_MAJOR_==1
-			codi_global.output_indices.push_back(output_value.getGradientData());
-			#else
-			#error "_CODIPACK_MAJOR_ not supported"
+			#if defined(_HAVE_ADOLC_)
+			output_value>>=dependents[i];
 			#endif
 
-			#elif defined(_HAVE_ADOLC_)
-			output_value>>=dependents[i];
-
-			#else
-			_error_("not suppoted");
-			#endif
-
 			J+=output_value;
 		}
+
+		#if defined(_HAVE_CODIPACK_)
+		tape_codi.registerOutput(J);
+		#if _CODIPACK_MAJOR_==2
+		codi_global.output_indices.push_back(J.getIdentifier());
+		#elif _CODIPACK_MAJOR_==1
+		codi_global.output_indices.push_back(J.getGradientData());
+		#else
+		#error "_CODIPACK_MAJOR_ not supported"
+		#endif
+		#endif
 
 		/*Turning off trace tape*/
@@ -423,31 +419,11 @@
 		/*Get gradient for CoDiPack{{{*/
 		if(VerboseAutodiff())_printf0_("   CoDiPack fos_reverse\n");
-
-		/* call the fos_reverse in a loop on the index, from 0 to num_dependents, so
-		 * as to generate num_dependents gradients: */
-		for(int dep_index=0;dep_index<num_dependents_old;dep_index++){
-
-			/*initialize direction index in the weights vector: */
-			if(my_rank==0){
-				if(dep_index<0 || dep_index>=num_dependents || codi_global.output_indices.size() <= dep_index){
-					_error_("index value for dependent index should be in [0,num_dependents-1]");
-				}
-				tape_codi.setGradient(codi_global.output_indices[dep_index],1.0);
-			}
-			//feclearexcept(FE_ALL_EXCEPT);
-			//feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
-			tape_codi.evaluate();
-
-			/*Get gradient for this dependent */
-			weightVectorTimesJac=xNew<IssmPDouble>(num_independents);
-			auto in_size = codi_global.input_indices.size();
-			for(size_t i = 0; i < in_size; ++i){
-				_assert_(i<num_independents);
-				weightVectorTimesJac[i] = tape_codi.getGradient(codi_global.input_indices[i]);
-			}
-			if(my_rank==0) for(int i=0;i<num_independents;i++){
-				totalgradient[i]+=weightVectorTimesJac[i];
-			}
-			xDelete(weightVectorTimesJac);
+		if(my_rank==0) tape_codi.setGradient(codi_global.output_indices[0],1.0);
+		tape_codi.evaluate();
+
+		auto in_size = codi_global.input_indices.size();
+		for(size_t i = 0; i < in_size; ++i){
+			_assert_(i<num_independents);
+			totalgradient[i] = tape_codi.getGradient(codi_global.input_indices[i]);
 		}
 
@@ -520,5 +496,5 @@
 
 	/*Clean-up and return*/
-	if(solution_type == TransientSolutionEnum) delete femmodel;
+	delete femmodel;
 	*Jlisti = (*Jlisti) +1;
 	xDelete<double>(XU);
Index: /issm/trunk-jpl/src/c/cores/transient_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 27731)
+++ /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 27732)
@@ -399,13 +399,4 @@
 		J += output_value;
 
-		tape_codi.registerOutput(J);
-		#if _CODIPACK_MAJOR_==2
-		codi_global.output_indices.push_back(J.getIdentifier());
-		#elif _CODIPACK_MAJOR_==1
-		codi_global.output_indices.push_back(J.getGradientData());
-		#else
-		#error "_CODIPACK_MAJOR_ not supported"
-		#endif
-
 		/*Keep track of output for printing*/
 		Jlist[count] = output_value.getValue();
@@ -415,11 +406,20 @@
 	_assert_(count == num_responses);
 
+	#if defined(_HAVE_CODIPACK_)
+	tape_codi.registerOutput(J);
+	#if _CODIPACK_MAJOR_==2
+	codi_global.output_indices.push_back(J.getIdentifier());
+	#elif _CODIPACK_MAJOR_==1
+	codi_global.output_indices.push_back(J.getGradientData());
+	#else
+	#error "_CODIPACK_MAJOR_ not supported"
+	#endif
+	#endif
+
 	tape_codi.setPassive();
 
 	if(VerboseAutodiff())_printf0_("   CoDiPack fos_reverse\n");
-	for(int i=0;i<num_responses;i++){
-		if(my_rank==0) tape_codi.setGradient(codi_global.output_indices[i],1.0);
-		tape_codi.evaluate();
-	}
+	if(my_rank==0) tape_codi.setGradient(codi_global.output_indices[0],1.0);
+	tape_codi.evaluate();
 
 	/*Initialize Xb and Yb*/
